Servos de rotación continua en Arduino.

Aunque muy poco a poco, voy avanzando con el robot. He decidido cambiar el chasis del coche teledirigido que compré en los chinos, por un chasis de plástico hecho con una impresora 3D, que, gracias a la UC3M tengo la posibilidad de usarla. Debido a ello, los motores que tengo que usar son unos servos. Los servos más baratos y los que se suelen usar, son los FUTABA S3003 que en ebay, tienen un precio de 3€ aproximadamente. Estos servos se caracterizan por tener un rango de acción de 180º por lo tanto, tendremos que modificarlos para poder usarlos como un motor normal.

Tenemos dos opciones de trucaje; convertir el servo en un motor de DC de 5v, lo cual, en la mayoría de los casos, deberíamos usar una etapa de potencia para poder usarlo con arduino, y otra aprovecharnos de la etapa de potencia del servo.

El primer caso es realmente sencillo Juan Gonzalez nos lo explica en el blog de iearobotics de la UC3M. Tener en cuenta que, de este modo, necesitaremos una etepa de potencia adicional para activar el motor. Es recomendable usar un puente H para poder tener inversión de giro.

El segundo caso, un poco más laborioso pero más efectivo, está explicado en este PDF, es muy importante seguir todos los pasos, incluido el de la calibración.

Básicamente, el funcionamiento de un servo es según una señal cuadrada que reciba a la entrada. El servo al recibir una señal cuadrada de 1,5ms de tiempo activo, se posicionará en el centro y en función de si ese tiempo es mayor o menor girara a derecha o izquierda.Por lo tanto, es muy importante el calibrarlo correctamente. En el PDF, el último paso, el número 8 nos indica que es necesario mandar una señal de 1,5ms al motor. Yo al usar arduino, tengo la posibilidad de usar las señales PWM que vienen integradas en la placa. Como no sabía muy bien cómo establecer una señal de esos 1,5ms, lo he hecho de una manera más artesanal. Este es el código que he usado.

void setup()
{
  pinMode(9, OUTPUT);
}

void loop()
{
  digitalWrite(9, HIGH);
  delayMicroseconds(150); // Approximately 10% duty cycle @ 1KHz
  digitalWrite(9, LOW);
  delayMicroseconds(1000 - 150);
}
De este modo, mantenemos la salida 9 activada ese 1,5ms que necesitamos. Es decir la manera de actuar es la siguiente:
  1. Conectamos el servo a la patilla 9 de arduino y a alimentación
  2. Cargamos el programa en arduino.
  3. El motor empezará a girar, no sabemos hacía que lado, en este momento, debemos girar el potenciómetro hasta que ser quede quieto del todo.
  4. Bloqueamos el potenciómetro para que se quede fijo en esta posición
Si no realizamos esto, el motor sólo girará hacía un lado, perdiendo la inversión de giro que queremos.
Una vez que ya tenemos nuestro servo operativo, podemos usar el código que nos facilita Discovery en su blog:
#define SERVO1 9
#define SERVO2 10
#define CEN 0

void setup()
{
}

void loop()
{
throttle(100,-100);
}

// Maneja el avance o retroceso, recibe la velocidad desde -100 a 100 %
void throttle(int Mot1, int Mot2)
{
  analogWrite(SERVO1,(Mot1> CEN || Mot1<-CEN) ? map(-Mot1,-100,100,135,225):0);
//Giro al contrario
  analogWrite(SERVO2,(-Mot2> CEN || -Mot2<-CEN) ? map(Mot2,-100,100,135,225):0);
}

Así podremos controlar varios motores, su velocidad y su sentido. Y esto es todo para poder tener un servo, os añado un video para que veáis cómo funcionan.

Servos de rotación continua en Arduino.