características de un servo Amax standard de 11Kg enlace
Los servos no permiten mover cosas con mucha precisión y rapidez, tradicionalmente se usaban para el manejo de aviones y coches de radio control, pero por su bajo precio, prestaciones y reducido tamaño se han hecho imprescindibles en muchos proyectos de robótica.
El Servo viene con un conector de tres cables;
- Masa (GND) de color negro o marrón, salida de corriente eléctrica agotada, sin voltaje.
- Alimentación (de color rojo) Entrada de corriente eléctrica fresca para alimentar el motor que hay dentro del servo y la electrónica de control de la posición, que también va dentro. Depende del tipo de servo y varia entre 5 y 7V
- Señal (de color blanco, naranja o amarillo). A través de este cable se envía al servo un pulso periódico de 5V cada cada 20ms que sirve para controlar la posición del servo. En función de la duración del pulso el servo se coloca en un rango de posiciones que varía de forma continua entre 0º y 180º.
En los servos de rotación continua la duración del pulso no controla la posición, sino la velocidad de giro. La velocidad máxima de giro suele ser de una vuelta por segundo (60 rev/min). En la tabla de abajo se muestra el efecto de las instrucciones write(0), write(90) y write(180) en un servo posicional y en otro de rotación continua.
Los servos normales consumen mucha corriente (del orden de 1A) y necesitan un voltaje de unos 7V, por lo que no se pueden alimentar desde el pin de 5V de una placa Arduino. Sin embargo los microservos tipo SG90 necesitan mucha menos corriente y funcionan con 5V, por lo que se pueden alimentar desde la patilla de 5V de Arduino, siempre que no tengan que mover mucho peso. En caso de que tengan que mover mucho peso simplemente hay que añadir otra batería separada de la de Arduino para alimentar el servo.
Para controlar el Servo no tenemos que preocuparnos de saber la anchura de los pulsos, la librería Servo de Arduino lo hace por nosotros. A continuación se muestra un programa de ejemplo para controlar un microservo conectado al pin 12 de Arduino, como se muestra en el diagrama de la derecha. El programa hace que el servo repita la secuencia 0º-90º-180º .
// Usamos la librería Servo para el control de servos
#include <Servo.h>
// Creamos un objeto de la clase servo
Servo myServo;
void setup() {
// Asociamos el objeto myServo con el pin 12 para
// que arduino le envie los pulsos de control
myServo.attach(12);
}
void loop() {
// mover el servo a la posición 0º y esperar 3s
myServo.write(0);
delay(3000);
// mover el servo a la posición 90º y esperar 3s
myServo.write(90);
delay(3000);
// mover el servo a la posición 180º y esperar 3s
myServo.write(180);
delay(3000);
}
Los servos de rotación continua se usan mucho en robótica como motores. Regulando su velocidad y dirección de giro podemos conseguir que el robot se mueva en línea recta hacia adelante o hacia atrás, que trace curvas a derecha o izquierda o que gire sobre sí mismo sin moverse. Para que los microservos funcionen bien y giren con fuerza es mejor alimentarlos independientemente de Arduino a un voltaje de 6V. A continuación se muestra el diagrama de conexión. A continuación se muestra u programa de ejemplo.
// Usamos la librería Servo para el control de servos
#include <Servo.h>
// Creamos dos objetos de la clase servo
Servo myServoDcha, myServoIzda;
void setup() {
// Asociamos los servos con sus pines de control.
myServoDcha.attach(12);
myServoIzda.attach(11);
//Avanza recto 1s
myServoDcha.write(0);
myServoIzda.write(180);
delay(1000);
//para
myServoDcha.write(90);
myServoIzda.write(90);
}
void loop() {
// No hacer nada
}
Si queremos programar un robot o un brazo robótico, es muy interesante poder mandar a Arduino desde otro dispositivo (ordenador , teléfono, mando a distancia etc) la posición en la que
queremos que se coloque el servo, o su velocidad.
En el ejemplo de abajo Arduino recibe a través del puerto serie (pines D0 y D1) una cadena de caracteres con el ángulo al que hay que llevar al servo.
// Usamos la librería Servo para el control de servos
#include <Servo.h>
// Creamos un objeto de la clase servo
Servo myServo;
// Variable para almacenar la cadena con el ángulo
String sAngulo = "0";
// Variable para almacenar el ángulo como un número entero
int iAngulo = 0;
void setup() {
// Inicializamos la comunicación con el ordenador a 9600 bits/s
Serial.begin(9600);
// Vinculamos el objeto myServo con el servo conectado al pin 12
myServo.attach(12);
// Llevamos el servo a la posición 0 Grados
myServo.write(0);
}
void loop() {
// Si llegan datos por el puerto serie....
if(Serial.available() > 0) {
// Espera un poco por si acaso
// no ha terminado de llegar todos los caracteres de la cadena
delay(50);
// Leemos la cadena con el valor del ángulo
sAngulo = Serial.readString();
// Convertimos la cadena en su valor numérico
iAngulo = sAngulo.toInt();
// llevamos el servo al ángulo recibido por el puerto serie
myServo.write(iAngulo);
// Escribimos un mensaje de confirmación de vuelta
Serial.println("Servo en posición: " + iAngulo);
}
}