Servomotores
En este artículo aprenderemos a utilizar un servomotor con Arduino. Antes de continuar es importante saber qué es un servomotor o, simplemente, un servo.

Aspecto típico de un servomotor.
Un servo puede pensarse como si fuese un motor eléctrico pero con algunas características especiales. Por un lado, un servo nos permite mantener una posición que indiquemos, siempre que esté dentro del rango de operación del propio dispositivo. Y por otro lado nos permite controlar la velocidad de giro, controlando el tiempo que transcurre antes de que se mueva a otra posición.
Detalles del servomotor
El interior de un servomotor es un motor de corriente contínua común y corriente. El eje del motor se acopla a una caja de engranajes similar a una transmisión. Esto se hace para aumentar el par del motor y permitir mantener una posición fija cuando se requiera. El circuito electrónico es el encargado de manejar el movimiento y la posición del motor.

Interior de un servomotor.
Para controlar el servomotor se le envía pulsos cada 20 ms (milésimas de segundo), que como veremos le permiten a la electrónica interna del servo fijar su posición. Por lo pronto, este dato nos indica la velocidad máxima a la que podemos mover el servomotor con Arduino: Solo podremos cambiar de posición cada 20 ms. Esto dependerá del tipo y marca de nuestro servomotor. El ancho del pulso es lo que codifica el angulo de giro, y aunque varia según el modelo concreto de servomotor que estemos empleando, normalmente se encuentra en el rango de los 0.5 a 2.5 ms.
Los servomotores comunes no giran su eje 360º (aunque unos pocos modelos lo permiten) como los motores normales, solo giran 180º hacia la izquierda o hacia la derecha (ida y vuelta).

Angulo de giro y ancho de pulso (en microsegundos).
Como se ve en las figuras, modificando el ancho del pulso, se modifica la posición del eje del servo. Aunque siempre en un ángulo que debe mantenerse entre los 0° y 180°.

Angulo de giro y ancho de pulso (en milisegundos).
El ancho del pulso varía, y con el la posición del eje. Pero la electrónica del servo espera que lleguen 50 pulsos por segundo. Este valor debe ser fijo.

Más posiciones del servo..
Resumiendo: para fijar la posición del eje del servo, se envian pulsos a una frecuencia constante de 50Hz. Estos pulsos pueden ser mas "anchos" o angostos, y dependiendo de ese parámetro la electrónica incluida en el servo se encargará de hacer girar el motor interno hasta que el eje alcance la posición deseada.
Ahora, veamos como hacer esto con Arduino.
Conexión de un servo con Arduino
La conexión es muy simple. Los servomotores poseen solamente tres cables, dos de ellos destinados a la alimentación y el tercero es el encargado de recibir los pulsos de control.
VCC: Este cable suele ser de color rojo, y se conecta a la tensión de alimentación. El valor de la tensión de alimentación depende del modelo del servo, suele ser de 4.5V a 6V en los modelos pequeños, pero siempre es recomendable buscar en los datos del fabricante el valor correcto.
GND: Unimos el pin GND del Arduino Nano con cable GND del servo, que normalmente es de color negro.
DATA: Este cable, que suele ser amarillo (nunca está de más comprobarlo) se conecta a uno de los pines de entrada/salida digital del Arduino.
Para nuestros ejemplos, vamos a conectar un servo pequeño (concretamente, el modelo Servo 9g SG90 de Tower Pro) a un Arduino Nano. Lo alimentaremos con el pin de 5V del Arduino (este servo es de 5V y tiene un consumo de corriente lo suficientemente pequeño como para poder ser alimentado de esta manera) y el pin de datos al pin 13 del Nano:

Conexiones en el protoboard.
Veamos ahora como escribir el software encargado de mover el servomotor,
Software
Ahora vamos a ir a lo interesante, la programación. Para ello tenemos que hacer uso de una librería externa para poder controlar el servo desde Arduino. Para incorporar la librería tenemos que ir a Programa/Include Library/Servo .
Esta libreria nos proporciona funciones que se encargan de generar los pulsos necesarios para mover el motor del servo. Nos evita tener que calcular la longitud de los pulsos y de enviar uno cada 20ms. Simplemente, le indicamos en que pin está el servo y que posición debe tener el motor, y la libreria hace todo el trabajo sucio por nosotros.
El siguiente programa es un ejemplo básico, que permite posicionar el servo en los ángulos 0°, 90° y 180°:
// Incluyo la libreria --------------------------------------------------------------
#include <Servo.h>
// Creamos el objeto servomotor------------------------------------------------------
Servo servoMotor;
// Seccion de configuracion----------------------------------------------------------
void setup() {
Serial.begin(9600); // Inicializamos la sonexión serie
servoMotor.attach(13); // Iniciamos el servo para trabajar con el pin 13
}
// Programa principal ---------------------------------------------------------------
void loop() {
servoMotor.write(0); // Desplazamos a la posición 0º
delay(1000); // Esperamos 1 segundo
servoMotor.write(90); // Desplazamos a la posición 90°
delay(1000); // Esperamos 1 segundo
servoMotor.write(180); // Desplazamos a la posición 180°
delay(1000); // Esperamos 1 segundo
}
De la librería Servo.h
hemos declarado un objeto o variable servoMotor
y hacemos uso de dos métodos. Por un lado el attach , que nos permite indicar en que pin tenemos conectado nuestro servo (servoMotor.attach(13);
), y por otro lado el servoMotor.write( angulo );
, donde indicamos en qué ángulo queremos posicionar nuestro
servomotor.
Copiamos el programa al Arduino IDE y desde allí lo grabamos en el Arduino Nano:

Programa en el Arduino Nano.
Vamos a realizar otro ejemplo un poco más complicado, en este caso queremos que el servo haga un barrido desde el 0 al 180º y luego en sentido contrario. Vamos a utilizar los mismos métodos pero incorporamos dos bucles for
, uno para cada sentido:
// Incluyo la libreria --------------------------------------------------------------
#include <Servo.h>
// Creamos el objeto servomotor------------------------------------------------------
Servo servoMotor;
// Seccion de configuracion----------------------------------------------------------
void setup() {
Serial.begin(9600); // Inicializamos la sonexión serie
servoMotor.attach(13); // Iniciamos el servo para trabajar con el pin 13
servoMotor.write(0); // Ponemos el servo en el ángulo 0°
}
// Programa principal ---------------------------------------------------------------
void loop() {
// Vamos a tener dos bucles uno para mover en sentido positivo y otro en sentido
// negativo
// Para el sentido positivo
for (int i = 0; i <= 180; i++) {
servoMotor.write(i); // Desplazamos al ángulo correspondiente
delay(25); // Hacemos una pausa de 25ms
}
// Para el sentido negativo
for (int i = 179; i > 0; i--) {
servoMotor.write(i); // Desplazamos al ángulo correspondiente
delay(25); // Hacemos una pausa de 25ms
}
}
Copiamos el programa al Arduino IDE y desde allí lo grabamos en el Arduino Nano:

Programa en el Arduino Nano.
Posiblemente aún no hayas usado bucles for
en tus programas. Su funcionamiento es muy sencillo. Por ejemplo, el bucle for (int i = 0; i <= 180; i++)
crea una variable entera llamada i y le asigna el valor 0 (la primer seccion, int i = 0;
). Luego, se indica que esta variable va a incrementar su valor en uno (la última seccion, i++
) mientras que su valor sea menor o igual que 180 (la segunda seccion, i <= 180;
)
Este bucle hace que el valor de la variable i vaya creciendo desde 0 hasta 180, de a una unidad por "pasada" por el bucle. Y dentro del bucle tenemos la instrucción servoMotor.write(i);
que le indiuca al servo que debe desplazarse hasta el ángulo indicado por el valor de la variable i.
Y el bucle for (int i = 179; i > 0; i--)
realiza una tarea similar, pero los valores de i comienzan en 179 y decrecen, uno a uno, hasta llegar a 1.
Con esto finaliza este capítulo. ¡Nos vemos en el siguiente!