QUE ES UN SERVO
.
Normalmente los motores habituales lo que hacen es
transformar la energía eléctrica (O química) en un giro continuo que
podemos usar para desarrollar trabajo mecánico.
En la sesión 13 utilizamos un pequeño motor de corriente
continua y regulamos la velocidad de giro mediante una señal PWM de Arduino.
Los servos son también motores de corriente
continua, pero en lugar de diseñarse para obtener un giro continuo que podamos
aprovechar (para mover una rueda por ejemplo), se diseñan para que se muevan un
angulo fijo en respuesta a una señal de control, y se mantengan fijos en esa
posición.
Imaginad por ejemplo un timón de un avión o barco. No
queremos un giro continuo, sino un motor al que le pueda indicar el ángulo que
deseamos en grados y que mantenga esa orientación hasta que le demos una orden
en contrario.
Estos servos o servomotores son muy frecuentes en
Aero modelismo y en robótica, por la capacidad que presentan para moverse a un
ángulo concreto y mantenerse allí. De hecho se suelen diseñar para que giren un
ángulo proporcional a una señal PWM, de forma que su control es muy
preciso. Un servo suele estar formado por:
·
Un servo suele estar formado por:
·
Una reductora.Un circuito de control..
·
Un motor de CC.
·
Un circuito de control
·
En la práctica se comporta como un bloque
funcional que posiciona su eje en un ángulo preciso en función de la señal de control
Habitualmente los servos tiene un margen de operación, es
decir, pueden moverse entre 0º y ángulo dado, que suele ser de 180º, pero
existen modelos comerciales de todas la características imaginables (incluyendo
servos de 360º).
Normalmente estos pequeños servos funcionan sobre 5V y el
control se realiza mediante una señal de control PWM, en la que el ancho
el pulso indica el ángulo que deseamos adopte el eje.
Un servo tiene un conector de 3 hilos, 5V (rojo), GND (negro
o marrón) y el otro Control (amarillo o blanco).
Podríamos escribir un pequeño programa en Arduino que
controle estos pulsos y los relacione con el ángulo buscado, pero antes de que
nadie se asuste, los servos (y otras cosas) son tan habituales, que ya ha
habido gente que han escrito estos programas y los han puesto a nuestra
disposición.
De este modo podemos manejar un servo sin preocuparnos para
nada de cómo realizar el control de las señales, o de la operación interna,
basta con instalar estos programas en una forma especial llamada librería.
Una librería es un conjunto de definiciones y funciones
escritas en C++ de Arduino, que podemos utilizar en nuestros programas. Podemos
ver el código de estos programas, aunque normalmente se requiere un nivel medio
alto en C++ para comprender su funcionamiento.
La ventaja de trabajar con una plataforma tan bien
establecida como Arduino, es que hay cantidad de gente en el mundo
desarrollando librerías, casi para cualquier cosa que podáis imaginar.
Y aún hay algo mejor: Son gratis.
Veréis que en las próximas sesiones vamos a utilizar
librerías para cantidad de cosas, pero hoy vamos a comenzar con la primera, la
librería servo.
USANDO NUESTRA PRIMERA LIBRERÍA: SERVO
.
Servo es una librería estándar en Arduino. Eso quiere decir
que viene incluida cuando instaláis el IDE, a diferencia de otras librerías que
debemos buscar, descargar de Internet e instalar para poder usarlas.
Para usar una librería estándar, basta con pedirle al IDE
que la incluya en nuestro programa. Id al menú Programa \ Importar Librería y
os saldrá un desplegable con todas las librerías que tenéis instaladas en el
IDE.
Por ahora solo nos interesa la librería Servo. Pinchad en
ella. Arduino incluirá una línea al principio de vuestro programa como esta:
#include <Servo.h>
A partir de ahora ya podemos utilizar las funciones
disponibles en la librería.
·
Normalmente para usar una librería hay que leer
la documentación, en la que se detalla la forma de usarla, que funciones
tenemos disponibles, que parámetros pasarlas…etc.
·
Como es vuestra primera librería, y nosotros ya
nos hemos leído el manual, vamos a llevaros de la mano. Veréis que es de lo más fácil.
Vamos a montar un circuito en el que hagamos moverse al
servo de forma controlada, e iremos
viendo las instrucciones necesarias.
ESQUEMA ELECTRÓNICO DEL CIRCUITO
.
Vamos a conectar el servo primero a GND y 5V y luego el pin
de control, a un pin de Arduino que permita PWM (Recordad esto o de lo
contrario os costara ver el problema). Recordad que es el ancho el pulso lo que
controla el ángulo.
Vamos también a conectar un potenciómetro a la puerta A0
para jugar con el servo.
El diagrama de
conexión para la protoboard es igual de sencillo:
EL PROGRAMA DE CONTROL
Vamos a empezar con
una línea que ya conocíamos el include y otra nueva:
#include <Servo.h>
Servo servo1;
Para poder utilizar la librería debemos crear, lo que
se conoce como un objeto tipo Servo que llamamos servo1.
C++ es un lenguaje orientado a objetos, esto significa que
podemos definir objetos tipo (como servos) sin más que declarar un nuevo objeto
del tipo que deseamos. En la jerga de la programación se llama crear una
instancia, o instanciar un nuevo objeto.
Así, esa segunda línea significa que vamos a crear una nueva
instancia de tipo Servo que llamamos servo1.
Aunque ahora os pueda parecer una forma extraña de hacer las
cosas, la programación orientada a objetos (OOP por sus siglas en inglés), es
una de las metodologías más potentes de las ciencias de computación actuales y
todos los lenguajes de programación que se precien, han incorporado las ideas
de la OOP.
Entrar en la teoría del OOP, desborda con mucho las
pretensiones de este humilde tutorial de Arduino, por ahora nos limitaremos a
mostraros como usar los objetos.
Una vez creada la instancia del objeto (y podemos
crear tantas como necesitemos, para manejar varios servos a la vez) tenemos que
incluir una línea en la función setup() para informar a C++ que vamos a
conectar ese objeto abstracto que todavía es servo1 a un pin físico del Arduino
para controlarlo. En nuestro caso el
pin 9:
servo1.attach(9);
Una vez cumplido el
trámite para gobernar la posición del servo recurrimos a
servo1.write( angulo);
Donde Angulo es el valor en grados de la posición que
deseamos. Fácil ¿No?
Vamos a escribir un programa que vaya barriendo un Angulo en
grados y moviendo el servo a esa posición.
#include
<Servo.h>
// Incluir la librería Servo
Servo servo1;
// Crear un objeto tipo Servo llamado servo1
int angulo =
0 ;
void setup()
{
servo1.attach(9) ;
// Conectar servo1 al pin 9
}
void loop()
{
for(angulo = 0; angulo <= 180; angulo += 1)
//incrementa angulo 1 grado
{
servo1.write(angulo);
delay(25);
}
for(angulo = 180; angulo >=0; angulo -=1
) //decrementa angulo 1 grado
{
servo1.write( angulo );
delay(25);
}
}
Veréis como el servo se va moviendo primero hacia adelante y
luego retrocede para volver a empezar.
Vamos ahora a hacer que el valor del potenciómetro
represente la posición del servo de manera que el servo se mueva siguiendo al
potenciómetro. Para ello hay que entender que el valor que leamos en la puerta
A0 está comprendido entre 0 y 1024, y que estos valores tienen que distribuirse
entre 0 y 180º. Así que para calcular el Angulo correspondiente basta con hacer:
Como la experiencia me ha demostrado, que los errores
haciendo este tipo proporciones tienden a infinito, voy a aprovechar para
presentaros la función map(), que hace exactamente eso de un modo cómodo,
librándonos de los float ( aunque para aprender no os vendría mal hacer así el
programa y luego usar el map()).
angulo = map( analogRead(A0), 0, 1024,
0, 180);
Traducido quiere
decir: Haz la proporción de los valores que leas en A0, entre 0 y 1024, en un valor comprendido entre 0 y 180 y asignale ese valor al
ángulo. //Prog_16_2
#include <Servo.h>
// Incluir la librería Servo
Servo
servo1;
// Crear un objeto tipo Servo llamado servo1
int angulo =
0 ;
void setup()
{
servo1.attach(9) ; // Conectar servo1 al pin 9
}
void loop()
{
angulo = map( analogRead(A0), 0, 1024, 0, 180);
servo1.write(angulo);
delay(250);
}
Aquí teneis un
peqeño video, mostrando el movimiento del servo
Comentarios
Publicar un comentario