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.

Esta entrada fue publicada en /Arduino, electronica y etiquetada , , . Guarda el enlace permanente.

7 respuestas a Servos de rotación continua en Arduino.

  1. Nano dijo:

    No logro decidirme por que motores usar para impulsar el robot… CC, PaP, servos…

  2. Pingback: Primer circuito: Control de los motores. | Trasteando

  3. Nano dijo:

    Tengo una duda, a ver si me puedes aconsejar sobre ella…

    Quiero hacer un robot velocista, es decir, que siga una linea negra sobre un fondo blanco en el menor tiempo posible. Y no me decido por que tipo de motores utilizar.

    Tengo la impresión de que los servos son muy lentos (no se si realmente pueden moverse a altas velocidades o no.) Los CC son rápidos, pero están limitados por la caja reductora que lleven y por mucho que juegues con los voltajes, siempre pierden mucha velocidad por la caja para lograr algo de fuerza. Y los PaP.. tienen un equilibrio muy sutil entre tener velocidad y tener par motor. Y no me gustaría descubrir que tengo que elegir entre que se mueva lento, o que no se mueva en absoluto.

    ¿tu que opinas? Estaríamos hablando de que los robot que normalmente compiten en esta categoría tienen una velocidad del orden de 1m/s ~ 2m/s, si no recuerdo mal.

    Salu2!

    • darkomen dijo:

      Hola! pues lo recomendable yo creo en estos casos es usar motores de CC. Siempre puedes comprarte un motor cc sin caja reductora, o si la coges con caja reductora, hay algunos modelos que se pueden modificar para ir modificando el par y la velocidad. Con estos motores no he trabajado, pero creo que es así. También puedes usar un puente H con un chip y usar una alimentación externa para darle un poco más de voltaje a los motores. La verdad que los servos con los que yo trabajo en tema de rapidez no destacan precisamente ;)

  4. Nano dijo:

    Muchas gracias!

    Me quedo con los CC y lo controlare con esto:
    http://trastejant.wordpress.com/2011/12/29/primer-circuito-control-de-los-motores/

    ¡Ya te comentare!

    • darkomen dijo:

      exacto! a ese circuito me refiero, el L293 no permite una alimentación a parte para los motores?yo creo que con eso y un motor decente puedes conseguir lo que quieres ;)

  5. Pedro dijo:

    Amigo, creo que los cálculos y el código del principio están mal. En un servo normal, para centrarlo, se requieren pulsos de 1.5 ms (que son 1500 useg) que se deben repetir cada 20 ms (20000 useg). Como la funcion delayMicroseconds no alcanza los 20000 hseg, puedes escribir ese código así:

    void loop()
    {
    digitalWrite(9, HIGH);
    delayMicroseconds(1500); // posicion central del servo
    digitalWrite(9, LOW);
    delayMicroseconds(10000 – 150);
    delayMicroseconds(10000); // 10000+10000 = 20000 ;-)
    }

    Por otro lado, la señal PWM que genera automáticamente el arduino no es util para manejar un servo, es otro tipo de pwm, o mejor diríamos que la que usa el servo no es propiamente pwm.

Deja un comentario

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s