En una entrada pasada, ya habíamos detallado el funcionamiento de un Servomotor utilizando en ese caso un microcontrolador PIC, en esta entrada vamos a ver un rápido resumen del Servo, pero si deseas puedes visitar la entrada de servomotor con PIC.
¿Que es un Servomotor Arduino?
Un servomotor es un motor con control, es decir este dispositivo mecánico posee internamente un controlador que posiciona precisamente el rotor del motor en un ángulo especificado por la señal entrante de control.
Para entender esto, veamos que físicamente el servomotor se compone de tres cables: GND, Power (5v) y Control. Es decir que los dos primeros se usan como alimentación en cuanto el cable de control es usado para enviar la señal de posicionamiento del motor con una secuencia de pulsos PWM.
Un servo con Arduino podrá tener una potencialidad tremenda, dado que la propia placa de Arduino será la encargada de enviar esa señal PWM para posicionar el motor en una posición en grados en específico.
Servo Arduino: Control de Posición
La señal PWM que ingresa al Servo a través de Arduino, es procesada y dependiendo del ancho de dicho pulso, el servomotor se desplazará a un determinado ángulo.
Generalmente los servomotores comerciales procesan un pulso con un periodo de 20ms para conseguir efectuar todo el movimiento del servo adecuadamente.
Tomemos como ejemplo un servomotor 180 grados con Arduino. En este caso, para posicionar el motor en 0 grados, nuestro pulso debe ser de 1ms encendido y los 19ms restantes debe estar apagado. Para 90 grados, nuestro pulso debe ser de 1.5ms encendido y los 18.5ms restantes debe estar apagado. Y por último, para 180 grados, nuestro pulso debe ser de 2ms encendido y los 18ms restantes debe estar apagado.
¿Como detener un servomotor con Arduino? Si el servomotor es de posición, basta con asignarle el ángulo deseado, que el propio motor se detendrá solo cuando llegue a dicha posición. Mas abajo en este post, te explico como detener un servomotor de 360 grados con Arduino.
Servomotor Arduino Características
En el mercado es posible encontrar varios tipos de servos, y es importante entender sus características para adaptarlos adecuadamente a nuestros proyectos, por lo tanto, es de extrema importancia de que leas la hoja de datos del servo que deseas comprar para ver si se adapta en fuerza y grados de movimiento a tu proyecto.
Existen 2 servos básicos que son:
- Servomotor de -90 grados a 90 grados (total de 180 grados)
- Servomotor de 360 grados
Con el servomotor de 180 grados con Arduino podremos controlar la posición donde deseamos ubicar el motor, por otro lado cuando conectamos un servomotor 360 grados en Arduino ya NO tendremos control de posición, porque el servo gira constantemente. Este servomotor de 360 grados es utilizado para realizar control de velocidad, bastante empleado en pequeños o medianos robots para el control de velocidad de las ruedas.
Un factor a tener en cuenta es observar la fuerza del servo, que sea adecuada para mover la carga que necesitamos en nuestro proyecto.
Calibrar Servomotor Arduino
Vimos que el Arduino necesita de un determinado pulso para poder despazarse a los diferentes ángulos, sin embargo, cada servomotor tendrá un comportamiento diferente, y antes de usarlo en nuestro proyecto, conviene calibrarlo.
No siempre 1ms va a colocar el Arduino en 0 grados, muchas veces este valor es mucho menor, debemos entonces ir moviendo este valor con la instrucción servo.attach(pin, min, max) que veremos mas adelante para establecer los valores en milisegundos mínimos y máximos en los que el motor hace el barrido completo.
Programar Servomotor en Arduino
Vamos a emplear la librería del Arduino llamada Servo Library con la cual controlaremos estos dispositivos de una manera adecuada que nos permite controlar hasta 12 servos en Arduino Uno/Nano, y hasta 48 en Arduino Mega. Claro también puedes controlar el servomotor con Arduino sin Librería y para eso te invito a ver la entrada que hicimos con PIC donde hicimos algo parecido, donde básicamente debemos generar la señal PWM.
El servomotor Puede ser conectado en cualquier PIN DIGITAL de la PLACA DE ARDUINO.
Primero incluimos la librería
#include<Servo.h>
Definimos el PIN de control donde conectaremos el SERVO
Sintaxis:
servo.attach(pin)
servo.attach(pin, min, max)
Parámetros:
servo: una variable de tipo Servo
pin: el número del pin que el servo está conectado
min (opcional): el ancho de pulso, en microsegundos, correspondiente al ángulo mínimo (0 grados) del servo (por defecto 544)
max (opcional): el ancho de pulso, en microsegundos, correspondiente al ángulo máximo (180 grados) del servo (por defecto 2400)
Para escribir en el servo una posición especifica usamos el comando:
servo.write(angle)
Parámetros:
servo: una variable de tipo Servo
angle: el valor a escribir en el servo, de 0 a 180
Para leer la posición actual en la que se encuentra nuestro servo con Arduino podemos usar:
servo.read()
Parámetros:
servo: una variable de tipo Servo
Retornos:
El ángulo del servo, de 0 a 180 grados.
Los servo motores de 360 grados son servos RC estándar que se han modificado para ofrecer un control de velocidad en lazo abierto en lugar de su control habitual de posición de lazo cerrado.
La modificación los convierte en motores con un sistema de motoreducción que le permite aumentar su fuerza y disminuir la velocidad, donde adicionalmente se puede controlar el sentido de giro, todo eso integrado en un paquete compacto y económico.
Se puede usar en ruedas de robots y controlarse mediante una señal RC o una simple conexión directa a una sola línea de E / S del microcontrolador (Arduino).
Como controlar un servomotor 360 grados en Arduino
Para eso vamos a valernos de la misma librería del Arduino solo que en este caso usaremos las siguientes configuraciones para manipular un servo continuo o de 360 grados.
Primero veamos que las señales PWM que deben ser enviadas son exactamente las mismas, con la diferencia de que ya no tendremos el control de posición (CCW: sentido antihorario; CW: Centido Horario)
Detener Servomotor 360
Es decir que si deseas saber como detener un servomotor con arduino de 360 usamos la siguiente instrucción:
servo.write(90);
Detener un servomotor de 360 grados es equivalente a programar un servomotor común en 90 grados.
Sentido Anti-Horario
servo.write(180);
Mover un servomotor de 360 grados en sentido anti-horario es equivalente a programar un servomotor común en 180 grados.
Sentido Horario
servo.write(0);
Mover un servomotor de 360 grados en sentido horario es equivalente a programar un servomotor común en 0 grados.
Controlar la Velocidad de un Servomotor de 360 grados
¿Como controlar la velocidad de un Servo con Arduino? Primero que todo cabe aclarar que el control de velocidad de un servomotor de 360 grados no es muy precisa, por lo tanto si tu objetivo es lograr una velocidad precisa deberas optar por agregar un sensor adicional.
Como ya lo notaste, en un servo de giro completo en lugar de enviar un ángulo entre 0 y 180 grados lo que estaremos enviando realmente es su velocidad y no solo el sentido siendo, el control de velocidad del servo 360 se logra entonces como:
- 0: máxima velocidad de giro en sentido horario.
- Entre 0 y 90: se conserva el mismo sentido horario pero la velocidad se reduce conforme nos acercamos a 90
- 90: el servomotor 360 se detiene.
- Entre 90 y 180: la velocidad aumenta conforme nos acercamos al valor de 180, girando en sentido antihorario.
- 180: máxima velocidad de giro en el sentido antihorario.
Servo Arduino Ejemplo
El siguiente ejemplo puede ser reproducido para programar 1 servo, controlar 4 servos con arduino o controlar hasta los 12 servos utilizando en este caso el Arduino UNO.
En este ejemplo, conectaremos un servomotor al Arduino en el PIN 5, y a través del puerto serial le enviaremos los grados a los cuales se debe desplazar el servomotor.
Primeramente, se recomienda calibrar el servomotor para encontrar los extremos máximos y mínimos del mismo, y si se emplea un servomotor grande o que esté arrastrando alguna carga, debemos alimentarlo con una fuente EXTERNA, dado que el arduino no será capaz de moverlo. Esta fuente EXTERNA deberá compartir la misma TIERRA o GND que el Arduino.
Código de implementación al final de este post.
Servomotor 360 – Ejemplo
Para el mismo circuito mostrado anteriormente, cambie el Servomotor por uno de Giro continuo o de 360 grados y a través del monitor serial, enviar la orden al servomotor de girar en cualquiera de los dos sentidos, o incluso detenerse.
Servomotor Arduino Código
Para copiar el código basta con que compartas este post con cualquiera de los siguientes tres botones para de esa forma hacer que este contenido llegue a más personas y puedan aprender y aportar cada día más al conocimiento.
Servo Convencional
#include <Servo.h> //Include the Servo Library
int degree=0;
String words;
Servo servo1; // "Servos" objects are created
void setup() {
// put your setup code here, to run once:
Serial.begin(9600);
Serial.println("Servos - Arduino");
//servo1.attach(5); //Default
servo1.attach(5,600,2400);
servo1.write(0);
}
void loop() {
// put your main code here, to run repeatedly:
while (Serial.available()) { // Read the value sent by the Serial Port
delay(5);
char c = Serial.read(); // Read the characters
words += c; // Convert Characters to character string
}
if (words.length()>0){
degree = words.toInt(); // Convert character string to integers
Serial.print(degree); //Send value in Degrees
Serial.println(" Grados");
delay(5);
servo1.write(degree); // Ajuste de 512 vueltas a los 360 grados
while(servo1.read()<degree-3)
{Serial.println("Desplazando...");}
}
words = ""; // Initialize the string of characters received
}
Servo 360
#include <Servo.h> //Include the Servo Library
int dir=0,menu=1,opc=0;
char c='\0';
String words;
Servo servo1; // "Servos" objects are created
void setup() {
// put your setup code here, to run once:
Serial.begin(9600);
Serial.println("Servo 360 - Arduino");
//servo1.attach(5); //Default
servo1.attach(5);
servo1.write(90);
}
void loop() {
// put your main code here, to run repeatedly:
if(menu==1){
Serial.println(" ");
Serial.println("------------ DIGUITE UNA OPCIÓN ENTRE 1 Y 3 -------------");
Serial.println("1) Detener Motor");
Serial.println("2) Sentido Horario");
Serial.println("3) Sentido Anti-Horario");
menu=0;
}
while (Serial.available()) { // Read the value sent by the Serial Port
delay(5);
c = Serial.read(); // Read the characters
words += c; // Convert Characters to character string
}
opc=words.toInt();
if (opc!=0){
if(opc>=1 && opc<=3){
switch(opc){
case 1:
servo1.write(90);
Serial.println(">>>>> Motor DETENIDO! <<<<<<");
break;
case 2:
servo1.write(0);
Serial.println(">>>>> GIRANDO SENTIDO CW <<<<<<");
break;
case 3:
servo1.write(180);
Serial.println(">>>>> GIRANDO SENTIDO CCW <<<<<<");
break;
}
}else{
Serial.println(" OPCIÓN INVALIDA!!!! INTENTE NUEVAMENTE");
}
menu=1;
opc=0;
}
words = ""; // Initialize the string of characters received
}
No hay comentarios:
Publicar un comentario