Arduino: servos

En ocasiones nuestros proyectos necesitan algo que se mueva a un ángulo concreto cuando se lo digamos. Para eso podemos usar un servo, que mueve su eje entre 0 y 180º.

El servo común se compone de un pequeño motor que crea el movimiento, un conjunto de engranajes que transforma la velocidad de este movimiento en par, dándole más fuerza, y un sensor para conocer la posición angular en la que se encuentra el eje.

Para indicar al servo dónde se debe mover, se aplica un tren de pulsos PWM a una frecuencia de 50 Hz y variando el tiempo en estado alto (ciclo de trabajo) de la señal. Es decir:

  • El ciclo completo del pulso mide 20 milisegundos (1/50)
  • Con un tiempo en estado alto de 1 ms el servo se va a 0º
  • Con un tiempo en estado alto de 1.50 ms el servo se va a 90º
  • Con un tiempo en estado alto de 2 ms el servo se va a 180º

La información del pulso que enviamos se combina con la del sensor de posición para indicar al servo si debe moverse y hacia dónde. Esto se hace internamente, por lo que no consume más recursos del microcontrolador: es una comunicación unidireccional hacia el servo.

En el caso de Arduino, existe una librería que se encarga de controlar el servo de una forma muy simple. No tienes que preocuparte de la temporización. Sin embargo puede dar problemas con los delays, ya que requieren el uso del timer. Esta librería se llama Servo (qué sorpresa).

Lo mejor es usar las salidas digitales con PWM de la placa de Arduino que se esté usando, ya que estas son capaces de enviar la señal PWM con un gasto mínimo de los recursos del procesador.

Veamos el código de ejemplo que propone Arduino. Lo que hace es mover el servo continuamente de un lado a otro.


/* Sweep
by BARRAGAN http://barraganstudio.com;
This example code is in the public domain.

modified 8 Nov 2013
by Scott Fitzgerald
http://www.arduino.cc/en/Tutorial/Sweep

Traducido por jmth94
Para Electronicaengeneral.com
*/
#include <Servo.h>  //Incluir la librería servo

Servo miservo;  //crear el objeto servo para controlar un servo
// algunas placas Arduino pueden controlar hasta 12 a la vez

int pos=0;  // variable para almacenar la posición del servo

void setup(){
  miservo.attach(9); // asigna el pin número 9 al servo
}

void loop(){
  for(pos=0; pos;=180; pos+=1){  // va de 0 a 180 grados
  // en pasos de 1 grado
    miservo.write(pos);  // le dice al servo que vaya a la posicion "pos"
    delay(15);  // espera 15 milisegundos a que llegue a la posicion
  for(pos=180; pos>=0; pos-=1){  //va de 180 a 0 grados
    miservo.write(pos);  // le dice al servo que vaya a "pos"
    delay(15);  //espera 15ms
  }
}

Las funciones importantes son:

  • Incluir la librería <servo.h>
  • Crear el objeto servo mediante el tipo Servo
  • Asignar el número de pin mediante miservo.attach(numero)
  • Mover el servo con la función miservo.write(posición)

También existen unos servos especiales capaces de girar 360º, es decir servos de rotación continua. Estos se controlan de forma similar, pero en lugar de controlar la posición, se controla la velocidad.

Tienen la ventaja sobre los motores de continua comunes que al llevar engranajes son capaces de dar un mayor par. La velocidad se controla de la siguiente forma:

  • Mandando al servo a la posición 90º se quedaría quieto
  • Mandando al servo a 0º giraría en una dirección a máxima velocidad
  • Mandando al servo a 180º giraría en la otra dirección a máxima velocidad

Además entre estos valores se puede asignar cualquier otro entre 0 y 180º, que hará que se mueva en la dirección correspondiente pero a menor velocidad.

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *