controlar-un-servo-de-rotacion-continua-con-arduino

Controlar un servo de rotación continua con Arduino

¿Qué es un servo de rotación continua?

Un servo de rotación continua es una variante de los servos normales, en los que la señal que enviamos al servo controla la velocidad de giro, en lugar de la posición angular como ocurre en los servos convencionales.

Otra diferencia con los servos convencionales, que tienen un rango limitado de movimiento de 0 a 180º, es que un servo de rotación continua puede girar 360 grados en ambos sentidos de forma continua.

Las características y el control de un servo de rotación continua son similares a los de un servo convencional De hecho es posible modificar un servo para convertirlo en rotación continua simplemente eliminado los topes internos y sustituyendo el potenciómetro interno por dos resistencias iguales. No obstante, el rendimiento será inferior a un servo de rotación continua comercial.

Muchos modelos de servo de rotación continua incluyen un potenciómetro de calibración que permite ajustar con precisión el punto neutro, es decir, el punto en el que el servo no gira en ninguno de los sentidos (siendo otra ventaja de usar un motor comercial en lugar de un servo convencional modificado).

Los servos de rotación continua, al igual que los servos convencionales, admiten tensiones de alimentación de entre 4,8V a 7,2V. También al igual que sus hermanos incorporan un reductor interno por lo que, en general, proporcionan un alto par y baja velocidad máxima, en torno a 1-2 rpm.

El control de un servo de rotación continua es idéntico al de un servo convencional, sólo varía el significado de la señal de control, que en lugar de transformarse en ángulo de posición se interpreta como velocidad angular, en ambos sentidos de giro.

arduino-servo-rotacion-continua-funcionamiento

Los servos de rotación continua son una forma sencilla de conseguir un motor con control de velocidad, sin tener que añadir dispositivos adicionales como controladores o encoders como ocurre en el caso en el caso de motores DC o paso a paso, ya que el control está integrado en el propio servo.

La principal desventaja de los servos de rotación continua es que sacrificamos el control de posición. Si queremos con precisión el ángulo girado tendremos que añadir un encoder.

Lamentablemente, pese a lo que podríamos pensar, tampoco disponemos de un control preciso de la velocidad de giro dado que la respuesta del sistema es fuertemente no lineal respecto a la entrada del servo. Si queremos un control de velocidad preciso deberemos calibrar el motor y corregir la señal enviada al servo, o nuevamente recurrir a añadir encoders.

arduino-servo-rotacion-continua-control

Los servos de rotación continua son una opción sencilla para construir robots de tamaño pequeño o mediano, especialmente cuando implican el movimiento de varias ruedas como en robots con omniwheel o mecanum wheel. También son útiles en otros sistemas donde necesitemos controlar de forma sencilla la velocidad de giro, como una plataforma para un escáner 3D.

Precio

En general, los servos de rotación continua son algo más caros que sus homólogos convencionales. Por ese motivo puede que decidamos

Como ejemplos de servo de rotación continua, tenemos el DM-S0090D, un servo de rotación continua de 9g, similar al servo SG90. Tiene un coste de 3,1€ (casi el doble que el SG90). Las características del DM-S0090D son,

  • Tensión: 3.7V ~ 6.0V
  • Torque: 1.5kg.cm (4.8V) a 1.6kg.cm (6V)
  • Velocidad: 0.10 seg/60º (4.8V) a 0.08 seg/60º (6.0 v)
  • Dimensiones: 22.9 x 12 x 22.5mm
  • Peso: 9g
  • Precio 7€

arduino-servo-rotacion-dm-s0090d

En un tamaño superior, tenemos el servo SM-S4306R y otros modelos de la misma familia, que son que son similares en características y dimensiones al MG-996R. En el caso del SM-S4306R las características son,

  • Tensión: 4.8V ~ 6.0V
  • Torque: 5kg•cm (4.8V) a 6.2kg•cm (6V)
  • Velocidad: 0.17 seg/60º (4.8V) a 0.13 seg/60º (6V)
  • Dimensiones: 40 x 19 x 43mm
  • Peso: 44g
  • Precio: 3.70€

arduino-servo-rotacion-sm-s4306r

Los otros modelos de la familia del SM-S4306R tienen características similares pero distinto par. Así, el SM-S4309R tiene un par de 7.9kg·cm (4.8V) a 8.7kg·cm (6V) y el SM-S4315R un par de 14.5kg·cm (4.8V) a 15.4kg·cm (6V).

Por último, veréis que también se venden servos modificados, como el SG90 o el MG996R. Como hemos dicho, incluso podemos modificar nosotros mismos estos servos. Sin embargo el rendimiento suele ser inferior a los servos de rotación continua, y carecen del potenciómetro para calibrar el punto neutro, por lo que tendremos algún tipo de deriva.

Esquema de montaje

La conexión es idéntica a la de un servo convencional. Alimentamos el servo aplicando una tensión de 4,8 a 7,2V. Excepto en el caso de servos muy pequeños, lo normal es que Arduino no disponga de potencia suficiente para accionar el servo, y deberemos usar una fuente de tensión externa.

arduino-servo-rotacion-continua-montaje

Por otro lado conectamos el pin de señal a una salida digital de Arduino.

arduino-servo-rotacion-continua-conexion

Al usar varias fuente de tensión recordar poner siempre en común todos los GND. De lo contrario podríais dañar algún componente.

Ejemplos de código

Como hemso dicho, el control de un servo de rotación continua es idéntico al control de un servo convencional, la única diferencia es el comportamiento del servo, que en el caso de un servo de rotación continua variará la velocidad en lugar de la posición.

por tanto, usamos la librería “servo.h”, incorporada en el IDE Standard, que nos permite controlar hasta 12 servos en Arduino Uno/Nano, y hasta 48 en Arduino Mega.

El siguiente ejemplo hace variar la velocidad del servo de rotación continua entre servo parado, servo al 100% de velocidad en un sentido, y servo al 100% en el sentido contrario, manteniendo cada velocidad 1.5 segundos.

#include <Servo.h>

Servo myservo;  // crea el objeto servo

int vel = 0;    // velocidad del servo

void setup() {
  myservo.attach(9);  // vincula el servo al pin digital 9
}

void loop() {
  //servo parado (equivalente a angulo 90º)
  vel = 90;
  myservo.write(vel);              
  delay(1500);    

  //servo 100% CW (equivalente a angulo 180º)
  vel = 180;
  myservo.write(vel);              
  delay(1500); 

  //servo 100% CCW (equivalente a angulo 0º)
  vel = 0;
  myservo.write(vel);              
  delay(1500); 
}

Descarga el código

Todo el código de esta entrada está disponible para su descarga en Github. github-full