Control de Servomotor con Arduino - Conexión y Programación
¡Bienvenido al séptimo capítulo de este curso básico de Arduino! En el tutorial anterior te expliqué como utilizar un sensor de ultrasonidos para medir la distancia. Hoy vas a aprender cómo conectar y programar un servomotor con Arduino fácilmente, con el que podrás crear increíbles proyectos como por ejemplo un brazo robótico.
¿Qué es un servo?
Un servomotor es un tipo de motor especial porque permite controlar su posición. En vez de indicarle la velocidad de giro, le indicas directamente el ángulo deseado.
Normalmente tienen un rango de 0 a 180º, es decir, no puede dar una vuelta completa. De hecho tienen topes internos para evitar que puedan dar la vuelta completa. En Youtube hay muchos tutoriales de cómo quitar estos topes, aunque también existen servos de rotación continua que si son capaces de rotar 360º.
Modelos de servomotores más utilizados en proyectos DIY
SG90
El SG90 es el servo más pequeño. Suele venir incluido en la mayoría de los kits de iniciación. Es el modelo más económico pero también el menos potente.
- Precio: desde 1.10€
- Torque: 1.4 kg·cm
- Peso: 9g
- Velocidad: 0.1 seg/60º (4.8V) y 0.08 seg/60º (6V)
- Voltaje de trabajo: 4.8 V ~ 7.2 V

MG90S
El MG90S tiene un poco más de fuerza que el modelo anterior. Sin embargo, no hay tantos kits, como por ejemplo de brazos robóticos, preparados para utilizar este servomotor.
- Precio: desde 1.75€
- Torque: 1.8 kg·cm
- Peso: 13.5g
- Velocidad: 0.1 seg/60º (4.8V) y 0.08 seg/60º (6V)
- Voltaje de trabajo: 4.8 V ~ 7.2 V

MG996R
El MG996R es el más potente de los tres. Es con el que yo suelo trabajar habitualmente porque tiene la fuerza suficiente para hacer varios proyectos interesantes, mientras que los mencionados anteriormente suelen quedarse cortos.
- Precio: desde 3€
- Torque: 15kg·cm
- Peso: 56g
- Velocidad: 0.17 seg/60º (4.8V) y 0.13 seg/60º (6V)
- Voltaje de trabajo: 4.8 V ~ 7.2 V

Comentarte que los precios son aproximaciones ya que éstos dependen mucho de la página en que compres, los gastos de envío, tiempos de envío, etc.
Cómo funciona un servomotor - Señal PWM
Para saber cómo funciona un servo primero tienes que saber cómo funciona una señal PWM. Con la placa Arduino Uno puedes generar dicha señal con los pines 3, 5, 6, 9, 10 y 11. Si tienes otro modelo, fíjate en aquellos pines en los que al lado del número aparezca este símbolo » ~ «. Los pines con este símbolo son los que pueden generar una señal PWM.
Periodo y Duty Cycle
En la imagen de abajo hay 4 señales PWM diferentes y algunas palabras escritas interesantes. La primera de ellas es el periodo, que es el tiempo que hay entre pulso y pulso.
Como puedes ver, la señal PWM tiene subidas y bajadas. Estas subidas y bajadas hacen referencia a un 1 (5 Voltios) y a un 0 (0 Voltios) en la salida del pin digital. El Duty Cycle es el tiempo que el pulso está en 1 respecto al periodo. Por ejemplo si generas una señal PWM con un periodo de 1 segundo y un Duty Cycle del 10%, el pin digital pondrá un 1 en su salida durante 0,1 s y un 0 durante 0,9 s por cada pulso.

Para qué sirve la señal PWM
Gracias a la señal PWM podemos simular diferentes voltajes. Hasta este momento siempre hemos trabajado con 0 o 5 Voltios. ¿Qué ocurre cuando necesitas por ejemplo 1,7 o 2,5 Voltios? En este caso puedes utilizar la señal PWM. Por ejemplo para simular 2,5 V necesitas un Duty Cycle del 50%, y para 0,5 Voltios un 10%, ¿entiendes cómo funciona?
Control de un servomotor con la señal PWM
Generalmente un servo se controla a través de una señal PWM con un periodo de 20 milisegundos. Variando el Duty Cycle cambias la posición del servomotor. De todas formas, si esto te parece muy complicado no te preocupes porque gracias a la librería «Servo.h» la programación es muy sencilla y no necesitas trabajar directamente con la señal PWM
Conectar servomotor a Arduino
La conexión de un servo es muy sencilla. Simplemente tiene 3 cables. El rojo es el de alimentación, el marrón es el de GND (tierra) y por último el cable amarillo / naranja tienes que conectarlo a un pin digital que sea capaz de generar una señal PWM. En mi caso estoy utilizando el pin 9 de la placa Arduino Uno.
Con lo único con lo que tienes que tener cuidado es con la alimentación. Si estás utilizando un único servomotor SG90 puedes alimentarlo directamente con Arduino. En cambio, si utilizas más de un servo o algún modelo más potente, necesitas utilizar una alimentación externa que genere un voltaje entre 4.8 y 7.2 Voltios, ya que Arduino no puede proporciona la corriente suficiente.
En la imagen de abajo tienes la conexión para ambos casos. La pila utilizada es de 9 Voltios porque en el simulador no había una más pequeña, pero esto NO es correcto. Simplemente la he utilizado para que puedas ver como alimentar uno o varios servos con una alimentación externa.
Si quieres probar a crear este circuito en el mismo simulador que yo he utilizado, puedes hacerlo aquí: Tinkercad.

Código para servomotor con Arduino
Como puedes ver en el código, lo primero que tienes que hacer es incluir la librería «Servo.h». Gracias a ella vas a poder programar los servomotores fácilmente. Después tienes que crear un objeto de la clase «Servo». En la variable de tipo entero «pos» guardaré la posición del servomotor.
En la función «void setup()», lo único que hago es indicarle a Arduino con que pin digital estoy controlando el servo. Para ello utilizo la función «servo.attach()». El único parámetro que le tienes que pasar es el número del pin.
Para mover el servomotor simplemente tienes que utilizar la función «servo.write()». Lo único que le tienes que indicar es la posición a la que quieras que se mueva. Recuerda que tiene que ser un valor entre 0 y 180. Con este programa yo estoy moviendo el servo de 0 a 180º y después al revés, de 180 a 0º.
Si no entiendes los ciclos que aparecen el código puedes aprender a utilizarlos aquí: El bucle FOR en Arduino.
#include <Servo.h> Servo servo; int pos = 0; void setup() { // put your setup code here, to run once: servo.attach(9); } void loop() { // put your main code here, to run repeatedly: for (pos = 0; pos <= 180; pos += 1){ servo.write(pos); delay(10); } for (pos = 180; pos >= 0; pos -= 1){ servo.write(pos); delay(10); } }