• Esta dirección de correo electrónico está siendo protegida contra los robots de spam. Necesita tener JavaScript habilitado para poder verlo.

Control de servo-motor con Arduino

En este tutorial vamos a controlar un servomotor, usando para ello nuestro Arduino, antes de nada y si quieres documentarte un poco mejor sobre como funcionan los servomotores y los tipos que puedes encontrarte, te aconsejo que empieces por el tutorial de servomotores, te dará una visión global de este tipo de motores que seguro te ayuda a la hora de trabajar con los servos.

¿Qué servos vamos a utilizar en el tutorial?

En este tutorial nos vamos a cenrtar en los servomotores de giro limitado, que son los más utilizados a la hora de hacer pequeños proyectos con Arduino, en el mercado podemos encontrar una gran variedad, los hay desde unos pocos euros hasta motores que pueden llegar a valer miles de euros, todo depende del tamaño, fuerza y precisión que tengan. Los que nosotros vamos a usar normalmente son los baratos (la economía no está para gastarse el sueldo en servos... xD  ) Pero aunque su precio sea económico, se pueden llegar a hacer aplicaciones de bastante calidad. Yo os planteo aquí 3 servos, con los que podéis emprezar a trabajar según vuestras necesidades, usad uno u otro.

Servos

SG90

Se trata de uno de los servomotores más populares dentro del universo Arduino, lo que lo hace tan popular sobre todo es su bajo precio, pueden encontrarse por poco más de 1€. Son servomotores muy pequeños 26.7 × 11.8 × 22.5mm, suelen utilizarse a nivel educacional o como parte de pequeños robots. El problema que presenta este tipo de servos es que el sistema de engranajes que tiene es completamente de plástico, esto hace que se atasquen, vibren, se calienten y por todo ello se deterioren con mucha rapidez. Si es para hacer pruebas con servomotores, son ideales, para proyectos un poco más serios yo elegiría el siguiente servomotor.

MG90S

Este motor es práticamente idéntico al anterior, dimensionalmente no suelen variar mucho (depende del fabricante), la diferencia más notable entre ambos es que el MG90S cuenta con engranajes metálicos, algo que hace que sean más silenciosos, suaves y rápidos. Son mucho más robustos por tener este tipo de engranages y no suelen dar problemas de movimiento.

MG995

Este servomotor ya tiene una talla más que los dos anteriores, se trata de un servo de 40.7 × 19.7 × 42.9mm capaz de desarrollar una fuerza de hasta 10kgf×cm, suele utilizarse en modelismo o en pequeñas automatizaciones. Internamente cuenta con un sistema de engranajes metálicos muy robustos que hacen que este servo sea ideal para aplicaciones exigentes

Conexionado del circuito

servoCablesLos servos que vamos a utilizar son muy sencillos de conectar, tan solo tienen 3 cables, dos dedicados a alimentar el servo y un tercero para recibir la información de posición del servo que mandaremos desde nuestro Arduino.

Antes de conectar nada, hay que identificar cada uno de los cables para saber donde debemos conectar cada uno de ellos, esto puede ser algo complejo de primeras, ya que cada fabricante usa un estándar y es fácil confundirse, aqui os pongo una imagen con los colores más utilizados, en varios años utilizando este tipo de motores no me he encontrado nada diferente, por lo que creo que no tendréis problemas.

Otra cosa que debéis de tener en cuenta con la alimentación, es que la alimentación del Servomotor y la de Arduino pueden ser independientes, en este ejemplo se va a alimentar el servo desde la propia placa de Arduino, pero si necesitáis más potencia que la que puede suministrar esta placa, debéis saber que podéis alimentar desde otra fuente de alimentación diferente.

Información

Si alimentais desde una fuente de alimentación diferente, recordar unir las masas, si no lo hacéis apareceran ruidos, vibraciones y no funcionará el servo de forma correcta.

servomotor bb

Programa de control

En las primeras versiones de Arduino era algo más complicado trabajar con servos, ya que no existían librerías oficiales para poder mover estos motores, pero debido a que son elementos bastantes comunes y muy populares a la hora de hacer pequeños robots o aplicaciones que requieran de algún movimiento, se incorporó como estándar la librería servo.h en el IDE de Arduino, por lo que no tendréis que instalar ninguna librería.

Pantalla IDE servoEl IDE de Arduino trae incluso dos ejemplos de programa, "Know" y "Sweep", el primero moverá el servo según vayamos moviendo un potenciómetro asociado a una entrada analógica de Arduino y el segundo hará que el servo se mueva constantemente de la posición 0 a 180º y viceversa.

Ambos son muy buenos ejemplos para aprender como funciona un servo, pero nosotros vamos a empezar por algo más sencillo para explicar las insrtucciones básicas.

#include <Servo.h>  //Librería para usar sevos

Servo servo1;       //Crea un objeto servo que se llama servo1

int valor = 90;     //Variable para almacenar un valor

void setup() 
{
  servo1.attach(11); //Asociamos el servo a la patilla 11 de Arduino 
}

void loop() 
{
  servo1.write(valor); //Mueve el Servo a la posición definida en la variable                
}

En el ejemplo superior, vamos a mover el servo a una posición fija preestablecida en una variable, para mover el servo a diferentes posiciones, tan solo cambiar el valor de la variable de 90 a cualquier otro valor entre 0 y 180º (o el maximo ángulo que aguante vuestro servomotor).

La cabecera del programa

En la cabecera, encontramos la librería Servo.h que es la que contiene las funciones necesarias para usar las instrucciones asociadas al servo, como he comentado antes, esta librería ya está incluida en las versiones actuales del IDE de Arduino, por lo que no es necesario descargarla. Lo primero que debemos hacer es crear un objeto "servo" al que lo llamaremos como nosotros queramos, en mi caso lo he llamado "servo1", esto se hace con la instrucción Servo servo1; si queréis usar más servos en vuestro proyecto tan solo tendréis que crear tantos objetos como servo uséis.

También podemos encontrar en la cabecera, la variable que vamos a usar para fijar el valor del servo en un ángulo u otro, cambiando el valor "90" por cualquier otro valor complendido entre los ángulos maximo y minimo del servo, vamos a hacer que este se mueva.

#include <Servo.h>  //Librería para usar sevos
Servo servo1;       //Crea un objeto servo que se llama servo1
int valor = 90;     //Variable para almacenar un valor

Bloque setup()

En el bloque setup() lo que hacemos es indicar en que pin tenemos conectado nuestro servo, esto se hace con la función nombre_del_servo.attach(PIN); en mi caso esta instrucción quedaría así  servo1.attach(11);

void setup() 
{
  servo1.attach(11); //Asociamos el servo a la patilla 11 de Arduino 
}

Bloque loop()

En este caso el bloque loop() es muy sencillo, ya que tan solo vamos a escribir sobre el servo el valor al que queremos que se mueva, esto se hace con la instrucción nombre_del_servo.write(Posición); en mi caso quedaría servo1.write(valor);

void loop() 
{
  servo1.write(valor); //Mueve el Servo a la posición definida en la variable                
}

Otras instrucciones de la librería Servo.h

Las instrucciones que hemos visto son las más comunes y en el 90% de los casos son las que vamos a usar, pero hay que saber que la librería Servo.h tiene más instrucciones con las que podemos hacer alguna cosilla más...

Hasta ahora hemos visto attach(), con la que asociamos el servo a uno de los pines de Arduino y write() con el que le decimos el ángulo en el que queremos poner el eje del servo, pero también tenemos:

writteMicroseconds() --> Establece el punto medio del servo, el estándar está establecido en 1.5 μs (podéis encontrar más información de esto en el tutorial de servomotores), pero si el fabricante tiene otro estándar, podemos cambiarlo poniendo en el bloque setup() la instrucción

void setup()
{
nombre_del_servo.writeMicroseconds(1500);
}

read() --> Lee el valor actual del servo

valor =nombre_servo.read();

attached() --> Comprueba si el servo esta enlazado al PIN de Arduino, si está en lazado devolverá "TRUE", si no lo está devolverá "FALSE".

nombre_servo.attached();

detach() --> Desenlaza el Servo del PIN de Arduino, esta función es muy útil si queremos dejar de consumir corriente una vez llegado a la posición deseada. Tener en cuenta que aunque es difícil, al hacer un detach() el servo queda libre y puede moverse.

nombre_servo.detach();

A partir de aquí os recomiendo ensayar con los programas que trae el IDE de Arduino de ejemplo para ir cogiendo soltura. Probad usar las instrucciones que os he puesto al final, sobre todo la de detach(), desconectar el servo en ciertos momentos puede ser algo muy interesante.


Comentarios potenciados por CComment