Veamos entonces como podemos controlar un servo.
Cualquier aficionado al radiomodelismo de aviones, coches o buques, o bien aquellos que han trabajado en robótica o sistemas automáticos, saben que es un servo. En esencia es un dispositivo electromecánico que dispone de un brazo o actuador, el cual se moverá a una posición determinada mediante una señal de mando, y será capaz de abrir o cerrar válvulas, mover compuertas, controlar el timón de un pequeño buque o los planos de control de un aeromodelo. Los servos más comunes suelen ser del tipo denominado "proporcionales", porque su movimiento responde "en proporción" a un parámetro de la señal de control.
Servo proporcional de pequeño tamaño
A la vez, estos servos, incluso los de pequeño tamaño, son capaces de ejercer una fuerza considerable, con un brazo de palanca de 1 cm algunos pueden ejercer hasta 25 kilos de fuerza y moverse de un extremo a otro de su recorrido en una fracción de segundo.
Para su alimentación eléctrica los servos disponen de un conector hembra con tres cables, normalmente, negro, rojo y amarillo:
- El negro (o a veces marrón) es la masa, conectada al polo negativo.
- El rojo es el positivo de la corriente continua de alimentación, que los modelos normales va de los 4,5 a los 6 volts.
- El amarillo es la entrada de la señal de mando
La señal de mando tiene la forma de un impulso digital, con el 0 a tensión de masa y el 1 a 5 volts, siendo el parámetro que controla el servo la duración del tiempo en que dicha señal está en su estado alto. Salvo en el caso de servos muy especiales como los de control de escotas en veleros de radiocontrol, en los de uso habitual el arco de movimiento es de alrededlor de 180 grados (+90 y -90 a partir de un punto central), un impulso de 1 milisegundo provocará que el brazo mecánico se desplace a uno de sus extremos, mientras que un impulso de 2 milisegundos lo va a mover hacia el extremo contrario, adoptando entre estos dos valores todas las posiciones intermedias del brazo.
Impulsos de control del servo
A la vez, estos impulsos de mando no son únicos, es decir, el servo no tiene memoria del último impulso recibido y se queda en la posición, sino que debe refrescarse cada 20 milisegundos (50 veces por segundo), aunque este valor puede variar bastante hacia arriba o hacia abajo sin que el servo pierda su posición de referencia.
Por otra parte, debemos decir que el Arduino UNO tiene catorce pins (del 0 al 13) que pueden configurarse como entradas o como salidas digitales, pero hay seis de ellos que son especiales, se trata del 3,5,6,9,10 y 11, ya que aparte de actuar como entradas o salidas normales a todo o nada, son capaces de generar una señal PWM (Pulse-width modulation), o modulación por ancho de pulso. Esta señal, pasada a través de un sencillo circuito de filtro "paso bajo" formado por una resistencia y un condensador, permite simular una tensión continua de valor variable entre 0 y 5 volts, pero además, con las órdenes correspondientes puede generar el tipo de impulsos que se necesita para controlar un servo...
...Para conseguir esto deberemos incluir en le programa la librería <Servo.h>, que permite controlar 12 servos, aunque por las limitaciones del Arduino UNO respeto a los pins PWM, sólo podremos hacerlo con 6. Las órdenes principales, contando la inclusión, serán sólo tres:
#include <Servo.h> // librería de control de servos
Servo servomotor; // Nombre del servomotor (que declararemos al principio como si fuera una variable)
servomotor.write(posicion); // mueve el servo a la posición angular especificada entre 0 y 180 grados, metido en el programa loop()
Bien, llegados a este punto ya estamos en disposición de mover el servo al punto de recorrido que deseemos. Para ello asociaremos cinco teclas del mando a distancia que nos permitan:
CH- Mover el servo a su extremo bajo
CH Mover el servo al punto medio
CH+ Mover el servo a su extremo alto
<< Mover 5 grados hacia abajo
>> Mover 5 grados hacia arriba
El circuito que vamos a utilizar será el mismo de cuando leímos los códigos de las teclas, pero añadiendo el servo, cuyo terminal negro o marrón irá a la masa común (GND), el amarillo de señal al pin 3 y con el rojo de alimentación hay varias opciones...
...la alimentación de un servo tiene ciertos condicionantes, no sólo en referencia a la tensión (entre 4,5 y 6 volts), si no también a la intensidad que necesita, porque la acción mecánica del servo se basa en un pequeño motor eléctrico que ataca a una serie de engranajes desmultiplicadores de giro (y por tanto multiplicadores de fuerza), los cuales, a través del eje de salida mueven el brazo actuador, y su consumo depende de dos cosas: del pico de corriente al activarse, y del considerable aumento tanto de este pico como del consumo constante que se produce si este servo debe mover además algo que le oponga resistencia.
Para una prueba experimental con el servo libre (sin que tenga que ejercer ninguna fuerza mecánica), y siempre que sea del tipo pequeño llamado "de 9 gramos" (más o menos el peso del servo) que normalmente figura en los materiales del Arduino Starter Kit, podemos hacer varias cosas:
1) Si alimentamos la placa Arduino sólo a través del USB del ordenador, podemos conectar la alimentación del servo (cable rojo) a pin Vin, el cual recibirá algo más de cuatro voltios y medio. En este caso no cargamos la placa del Arduino aunque sí la salida USB del ordenador. Además, el brazo del servo se moverá algo lentamente con las órdenes
2) Si alimentamos la placa Arduino a través de su conector con 4 pilas de 1,5V, la tensión será de 6 volts. Podemos seguir tomando la corriente positiva del pin Vin, y en este caso, al recibir el servo los 6 volts, se moverá mucho más rápido.
3) Si alimentamos la placa Arduino a través de su conector con 6 pilas de 1,5V, la tensión será de 9 volts, demasiado alta para alimentar el servo en Vin, con lo cual deberemos enchufarlo a +5V, tensión que pasa a través del regulador AMS1117 de la placa y que puede estar al límite de su capacidad. Bien, también así va a funcionar, pero yo no lo aconsejo, porque nos podemos cargar el componente.
4) Para mí, la mejor opción y además autónoma, es fabricarnos un pack de pilas de alimentación, que puede llevar 6 unidades (6x1,5=9 volts), pero con una toma "intermedia" entre la cuarta y quinta pila, con lo cual dispondremos de salidas de 0 (masa), +6 y +9. El Arduino se alimentaría a través del +9 y el servo, de forma separada, a +6 volts.
Pack de pilas 0-6-9 volts
Además, en todos estos casos, colocaremos entre la masa y el terminal positivo del servo dos condensadores, uno electrolítico de cierta capacidad y uno de poliéster de baja capacidad. Dichos condensadores tiene la misión de eliminar o disminuir la caída de tensión brusca que produce el pico de arranque del servo. El electrolítico efectuará la mayor parte del filtrado, y el de poliéster se ocupará de los componentes de alta frecuencia que siempre se producen en los transitorios y que la impedancia del electrolítico le impide eliminar...
Montaje con el Arduino para mover el servo mediante el mando a distancia por infrarrojos
Enlace al programa "Arduino-Servo-IR-07.ino:https://dl.dropboxusercontent.com/u/559 ... -IR-07.ino**Programa**====================================
/*
Control de un servo mediante un mando a distancia por infrarrojos
Modificado por Anilandro, 2016
*/
#include <Servo.h> //Importamos la librería para controlar servos
#include <IRremote.h> //Importamos la librería para recibir la señal de infrarrojos
Servo servomotor; //Nombre del servo
int RECV_PIN = 11; //Pin del receptor IR
IRrecv irrecv(RECV_PIN);//Establecer el pin del IR
decode_results results; //Variable del código NEC
int posicion; //Variable global para establecer la posición angular del servo
void setup()
{
irrecv.enableIRIn(); //Inicializamos el receptor IR
servomotor.attach(3); //Asociamos el servo al pin 3 del Arduino
posicion=90; //Ponemos el servo a 90º al iniciar el programa
}
void loop() // Inicio del bucle del programa
{
if (irrecv.decode(&results)) //Si el receptor IR recibe una señal, entra dentro de la función
{
switch(results.value) //Después de obtener el código NEC almacenado en "results.value" compara casos
{
case 0b111111110110001010011101: //Código NEC boton CH y posición del servo a 90º
posicion=90;
break;
case 0b111111111110001000011101: //Código NEC boton CH- y posición del servo a 20º
posicion=20;//Posición del servo a 0º
break;
case 0b111111111010001001011101: //Código NEC boton CH+ y posición del servo a 160º
posicion=160;
break;
case 0b111111110010001011011101: //Código NEC boton >> y posición del servo +5º
posicion=posicion+5;
if(posicion>160){posicion=160;} //límite por si seguimos subiendo sobre 160º
break;
case 0b111111110000001011111101: //Código NEC boton << y posición del servo -5º
posicion=posicion-5;
if(posicion<20){posicion=20;} //límite por si seguimos bajando de 20º
break;
}
irrecv.resume(); //borra buffer IR
}
servomotor.write(posicion); // mueve el servo a la posición angular especificada
} ===================================
Continuará...
Un saludo a todos