Autor: Agustin Gonzalez Redondo. M Rocío García de la Fuente.
En esta entrega, nos centraremos nuevamente en el trabajo con motores, sin embargo y a diferencia de artículos anteriores en los que los motores se empleaban como un dispositivo de salida donde únicamente importaba la tensión de alimentación para conseguir la rotación en el eje, el presente documento tratará aquellos motores que permiten controlar tanto la posición como la velocidad de giro de una forma precisa, los primeros son:
Servomotores: dispositivos que pueden situarse en una posición específica. Normalmente, comprendida entre 0 y 180 grados.
Los servomotores (Figura 1. Distintos modelos de servomotores de radiocontrol) se utilizaron por primera vez en el mundo del radiocontrol (RC), para controlar la dirección de coches RC o los flaps de un avión RC. Con el tiempo, encontraron su uso en la robótica, la automatización y, por supuesto, en el mundo de Arduino.
Su control se realiza mediante una señal de pulsos PWM (Modulada por Ancho de Pulso) cuyo ancho varía entre 1 milisegundo y 2 milisegundos, relacionándose cada señal comprendida entre dichos valores con una posición angular entre 0 y 180 grados, tal y como se muestra en la siguiente figura (figura 2. Relación entre el ancho de pulso y la posición angular del eje del servomotor).
A la hora de trabajar con estos equipos, el esquema de conexión es muy sencillo, tal y como aparece reflejado en la figura 3 simulado con TinkerCad, para dos posiciones distintas del potenciómetro, se muestra en la figura 3 (Figura 3. Conexiones de un servo controlado por un potenciómetro).
Y su programación, también es muy fácil como se muestra a continuación, únicamente hay que tener en cuenta que es necesario trabajar con la librería <Servo.h> incluida en la IDE de Arduino, puesto que facilita enormemente la programación de este tipo de dispositivos.
El código que se muestra a continuación es un ejemplo incluido en la librería, (Figura 4. Acceso a los ejemplos de código para Servos en Arduino, Knob.ino), y que permite situar de forma sencilla nuestro servo en la posición que se desee modificando para ello la posición de un potenciómetro.
#include <Servo.h>
Servo myservo; // Crea un objeto Servo
int potpin = 0; // Pin analogico para lectura del potenciometro
int val; // variable donde se recoge la lectura del pin analogico
void setup()
{
myservo.attach(9); // pin donde se conecta la señal de control del servo
}
void loop()
{
val = analogRead(potpin); // lectura de la entrada del potenciometro (entre 0 and 1023)
val = map(val, 0, 1023, 0, 179); // se escala el valor del potenciometro para adecuarlo a la señal del servo(entre 0 and 180)
myservo.write(val); // situa la posicion del servomotor
delay(15); // espera 15 milisegundos
}
Existen también servomotores de rotación continua, que son una variante de los servos normales, sin embargo, a diferencia de los anteriores, la señal enviada controla la velocidad de giro en lugar de la posición como es el caso de los servos convencionales. Por tanto, estos servos permiten realizar giros de 360 grados de forma continua, y no tienen un rango de movimiento limitado a 180 grados. (figura 6. Despiece de un servomotor de rotación continua).
Sus características físicas son similares a las de los servos convencionales, siendo posible modificar uno de estos servos para convertirlo en rotación continua, con unas sencillas modificaciones física y electrónicas internas (quitando topes internos y sustituyendo resistencias).
Este tipo de servos, permiten, por tanto, controlar de una forma más o menos precisa la velocidad de rotación, sacrificando el control de posición, sin la necesidad de incluir ningún tipo de sistema electrónico de control intermedio (encoders). Y se controlan fácilmente a través de pulsos PWM, como en el caso anterior, teniendo en cuenta que en este caso lo que varía con el ancho de pulso es la velocidad de giro y no la posición (figura 7. Relación entre el ancho de pulso y la velocidad de giro).
El esquema de conexión, dada la similitud existente entre los dos tipos de servomotores es el mismo, con la salvedad de que ahora se trabaja con un servomotor de rotación continua (figura 8. Conexión de un servomotor de rotación continua controlado por un potenciómetro).
Y en cuanto a la programación, vamos a utilizar nuevamente el código Knob.ino anterior, pero con distintas pretensiones, en este caso la velocidad de giro del servomotor aumentará o disminuirá con la posición del potenciómetro.
#include <Servo.h>
Servo myservo; // Crea un objeto Servo
int potpin = 0; // Pin analogico para lectura del potenciometro
int val; // variable donde se recoge la lectura del pin analogico
void setup()
{
myservo.attach(9); // pin donde se conecta la señal de control del servo
}
void loop()
{
val = analogRead(potpin); // lectura de la entrada del potenciometro (entre 0 and 1023)
val = map(val, 0, 1023, 0, 179); // se escala el valor del potenciometro para adecuarlo a la señal del servo(entre 0 and 180)
myservo.write(val); // DIFERENCIA: modifica la velocidad de giro del motor
delay(15); // espera 15 milisegundos
}
Llegado a este punto, ya conocemos los distintos tipos de servomotores y sus características, y os animamos a emplearlos en aquellos proyectos donde tengamos necesidad de controlar con exactitud bien sea la velocidad de giro del eje o su posición.
AUTORES: M. ROCÍO GARCÍA DE LA FUENTE Y AGUSTÍN GONZÁLEZ REDONDO.