controlar-un-servo-con-arduino

Controlar un servo con Arduino

¿Qué es un servo?

Un servo es un tipo de accionador ampliamente empleado en electrónica. A diferencia de otros tipos de motores en los que controlamos la velocidad de giro, en un servo indicamos directamente el ángulo deseado y el servo se encarga de posicionares en este ángulo.

Típicamente los servos disponen de un rango de movimiento de entre 0 a 180º. Es decir, no son capaces de dar la vuelta por completo (de hecho disponen de topes internos que limitan el rango de movimiento)

Internamente un servo frecuentemente consta de un mecanismo reductor. Por tanto proporcionan un alto par y un alto grado de precisión (incluso décimas de grado). Por contra, las velocidades de giro son pequeñas frente a los motores de corriente continua.

Los servos se admiten una tensión de alimentación entre 4,8V a 7,2V, siendo el valor más adecuado es 6V. Con tensiones inferiores el motor tiene menos fuerza y velocidad. Con tensiones superiores a 6,5V los servos empiezan a oscilar demasiado, lo cual los hace poco útiles.

Los servos son cómodos de emplear, ya que ellos mismos realizan el control de posición, que con otro tipo de motores debe hacerse de forma externa. Por este motivos son ampliamente empleados en proyectos de robótica, como brazos robóticos, robots con patas, controlar el giro de torretas, u orientar sensores como sensores de ultrasonidos o sensores de temperatura a distancia.

Precio

Existe una gran variedad de servos, que varían en tamaño, fuerza, velocidad, y precisión. Los servos que emplearemos en nuestros proyectos cuestan unos pocos euros pero, incluso dentro del campo de los hobbies podemos encontrar servos de 100-150€, y de miles de euros en el ámbito industrial.

Para nuestros proyectos caseros usaremos principalmente dos tamaños de servo. Dentro de los distintos modelos destacaremos tres por su calidad/precio. Podéis encontrarlos fácilmente en vendedores internacionales de eBay o AliExpress.

SG90

Es el servo de tamaño “pequeño” estándar dentro de los proyectos de electrónica. Es un servo pequeño, ligero, y barato, que dispone de engranajes de plástico. Muchos dispositivos, como torretas y partes de robots, están diseñados para instalar servos de este tamaño.

  • Torque: 1.4 kg·cm
  • Velocidad: 0.1 seg/60º (4.8V) y 0.08 seg/60º (6V)
  • Dimensiones: 21.5 x 11.8 x 22.7mm
  • Peso: 9g
  • Precio: 1.20€

arduino-servo-sg90

MG90S

El MG90S es similar al SG90 pero dispone de engranajes y el acoplamiento metálicos. A cambio pesa un poco más y es más caro. Físicamente es compatible con los accesorios del SG90.

Usaremos este servo como sustituto del SG90 cuando tengamos una aplicación en la que realmente necesitemos ejercer fuerza, y las partes de plástico podrían ceder y quedarse “redondas”.

  • Torque: 1.8 Kg·cm
  • Velocidad: 0.1 seg/60º (4.8V) y 0.08 seg/60º (6V)
  • Dimensiones: 22.8 x 12.2 x 28.5mm
  • Peso: 13.4g
  • Precio: 2€

arduino-servo-mg90s

MG996R

Este es el servo de tamaño “grande” que usaremos frecuentemente. Este tipo de servos es ampliamente utilizado en proyectos de robótica. Igual que con el SG90, muchos dispositivos y kits como brazos robóticos, hexápodos, están diseñados para instalar este tamaño de servo.

  • Torque: 13kg·cm (4.8V) a 15kg·cm (6V)
  • Velocidad: 0.17 seg/60º (4.8V) y 0.13 seg/60º (6V)
  • Dimensiones: 40 x 19 x 43mm
  • Peso: 56g
  • Precio: 3.70€

arduino-servo-mg996r

Conviene aclarar que estos servos, sobre todos los comprados en china, destacan por su calidad/precio. Pero, lógicamente, son modestos en sus características. Veréis en comparativas que otros modelos más caros también son más rápidos y precisos.

Pero cuando hagamos proyectos como hexápodos o robots bípedos, que requieren entre 18 a 24 servos, la diferencia de usar servos de 1.2€-3.7€ a servos de 80-100€ supone pasar de un coste de 40-60€ por proyecto, a 2000-2400€, que es una diferencia enorme.

Por otro lado, usar servos baratos nos supondrá más problemas en calibración, repetibilidad, pruebas y trabajo adicional. Pero después de todo, hacer robots es sencillo, lo difícil es hacerlos baratos.

¿Cómo funciona un servo?

Internamente un servo está constituido por un motor de corriente continua, acoplado a un reductor para reducir la velocidad de giro, junto con la electrónica necesaria para controlar su posición.

arduino-servo-interior

Frecuentemente simplemente se dispone de un potenciómetro unido al eje del servo, que permite al servo para conocer la posición del eje. Esta información es tratada por un controlador integrado que se encarga de ajustar actuar sobre el motor para alcanzar la posición deseada.

La comunicación de la posición deseada se realiza mediante la transmisión de un señal pulsada con periodo de 20ms. El ancho del pulso determina la posición del servo.

arduino-servo-funcionamiento

La relación entre el ancho del pulso y el ángulo depende del modelo del motor. Por ejemplo, algunos modelos responden con 0º a un pulso de 500 ms, y otros a un pulso de 1000 ms

En general, en todos los modelos:

  • Un pulso entre 500-1000 us corresponde con 0º
  • Un pulso de 1500 ms corresponde con 90º (punto neutro)
  • Un pulso entre 2000-2500us corresponde con 180º

Por tanto, variando la señal en microsegundos podemos disponer de una precisión teórica de 0.18-0.36º, siempre que la mecánica del servo acompañe.

Esquema de montaje

Conectar un servo a Arduino es sencillo. El servo dispone de tres cables, dos de alimentación (GND y Vcc) y uno de señal (Sig).

El color de estos cables suele tener dos combinaciones:

  • Marrón (GND), Rojo (Vcc) y Naranja (Sig)

  • Negro (GND), Rojo (Vcc) y Blanco (Sig)

Por un lado, alimentamos el servo mediante el terminal GND ( Marrón / Negro) y Vcc (Rojo).

arduino-servo-montaje

En general, la alimentación a los servos se realizará desde una fuente de tensión externa (una batería o fuente de alimentación) a una tensión de 5V-6.5V, siendo 6V la tensión idónea.

Arduino puede llegar a proporcionar corriente suficiente para encender un servo pequeño (SG90), suficiente para hacer unos cuantos proyectos de prueba.

Sin embargo no dispone de corriente suficiente para actuar un servo grande (MG996R). Incluso varios servos pequeños, o hacer excesiva fuerza con ellos puede exceder la capacidad de corriente de Arduino, provocando su reinicio.

Por otro lado, finalmente, para el control conectamos el cable de señal (naranja / blanco) a cualquier pin digital de Arduino.

arduino-servo-esquema

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

El control de servos en Arduino es muy sencillo, ya que el IDE Standard proporciona la librería “servo.h”, que permite controlar simultáneamente hasta 12 servos en Arduino Uno/Nano y hasta 48 servos en Arduino Mega.

Entre los ejemplos típicos para ilustrar el funcionamiento de servos tenemos el Sketch “Sweep”, que realiza un barrido continuo con el servo.

Para ello incrementa el ángulo de 0 a 180º a razón de 1º cada 15ms, posteriormente realiza la operación contraria de 180º a 0º, para finalmente reiniciar el bucle.

#include <Servo.h>

Servo myservo;  // crea el objeto servo

int pos = 0;    // posicion del servo

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

void loop() {
  //varia la posicion de 0 a 180, con esperas de 15ms
  for (pos = 0; pos <= 180; pos += 1) 
  {
    myservo.write(pos);              
    delay(15);                       
  }

  //varia la posicion de 180 a 0, con esperas de 15ms
  for (pos = 180; pos >= 0; pos -= 1) 
  {
    myservo.write(pos);              
    delay(15);                       
  }
}

Descarga el código

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