Objetivos
Material requerido.
Arduino Uno o compatible y con el firmware para S4A cargado. | |
Una Protoboard más cables. | |
Servo Futaba MG945 |
Volviendo a los servos
En una sesión previa, ya hicimos una primera aproximación al servo motor. Vimos que son motores de corriente continua diseñados no para girar sin fin, sino que se concebidos de modo que se muevan a una posición específica y se mantengan en ella.
Vimos que podíamos usar señales PWM como medio de controlar con precisión el angulo en que queremos posicionar el servo.
Este tipo de posicionamiento mediante servos, es de lo más interesante en el caso de timones de navegación y vuelo, o posicionamiento de brazos robots, y están muy extendidos tanto en la industria, como en los aficionados al radio control.
Un servo típico se define en función del angulo que puede girar, el par que puede desarrollar y el consumo que tiene. Para esta sesión voy a usar un par de servos típicos que tengo por aquí, pero tanto da cualquier otro.
Veamos sus características:
Leyendo las características, vemos que podemos alimentarlo entre 4,8 y 6V. Sin problemas con nuestro Arduino, y consumirá entre 200 y 250 mA y con esto hay que tener un poco cuidado, porque si estamos alimentando nuestro Arduino con USB, este solo puede proporcionar un máximo de 500mA
Eso quiere decir que podemos manejar un servo sin problemas, pero si metemos el segundo servo pueden empezaran a pasar cosas raras:
2x 250 500 mA y aún falta alimentar el propio Arduino.
Por eso, aunque resulta muy sencillo manejar servos con nuestros Duinos, es importante fijarte en el consumo, porque de lo contrario habrá problemas.
- Por si alguien está pensando que 250mA es mucho más de los 40 mA que cualquier pin de Arduino puede proporcionar, tened en cuenta que la señal PWM no alimenta el servo, sino que proporciona la señal de control.
- Por eso la alimentación se hace a través de Vcc y GND y no podríamos alimentarlo con un pin de Arduino, pero sí de las líneas principales, a condición de no sobrepasar la capacidad de la fuente (0,5 A en el caso de un USB típico)
Nos detalla un par de 2,5 Kg por cm, lo que significa que si usamos un brazo de un cm alrededor de su eje, puede levantar 2,5 Kg, lo que no está nada mal para un motorcito tan pequeño como este.
Así pues no tenemos ningún problema en alimentar nuestro servo con un programa sencillo como este que ya vimos:
#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) { servo1.write(angulo); delay(25); }
Aquí os dejo un pequeño vídeo con el resultado
Usando el Motor Shield V1 con servos
Cuando hablamos en sesiones anteriores que el Adafruit Motor Shield V1, dijimos que podía manejar cuatro motores de continua o dos motores paso a paso y vimos las razones de que esto fuera así, pero hasta ahora no habíamos comentado que el motor shield V1, puede manejar dos servos adicionales también.
Pero ¿Por qué iba a querer usar el motor Shield para majear servos, si puedo manejarlos directamente desde el propio Arduino?
Bueno en primer lugar porque si usas un Arduino UNO ibas a ir mal de conectores para conectar los servos, porque el Shield te los tapa (Aunque esto se puede arreglar)
En segundo lugar porque un servo tiene normalmente un conector de 3 pines y para conectarlo a nuestros Duinos hay que poner cables, mientras que el Shield trae un par de conectores para servo directos y es mas limpio.
En tercer lugar, porque el Motor Shield te permite usar una fuente de alimentación independiente de la que usa tu Arduino y esto puede ser importante, ya que hay servos de 12 y 24V y no podrías alimentarlos directamente. El shield te ofrece un sistema fácil de combinar ambas cosas.
Y en tercer lugar porque hay proyectos que necesitan más de un motor o tipo de motor, y con este shield podrías usar simultáneamente un motor paso a paso con 2 motores de continua y dos servos (Con alimentación externa indudablemente pero resulta factible).
Por eso, porque la vida es complicada, los chicos de Adafruit nos proporcionan la capacidad de manejar los servos directamente desde la librería que acompaña al shield.
Pero tened en cuenta de que la librería hace poco más que definir la forma de usar los pines digitales 9 y 10, para el control de los servos mediante una señal PWM y proporcionarnos una forma coherente de manejar estos motores por software, igual o muy similar a la que usamos para mover los motores de continua o Steppers.
Servos y Motor Shield 1.0
Fijaros en la imagen y veréis en la esquina superior izquierda, las conexiones de los servos 1 y 2, que son independientes del resto de los motores.
Servo1 y Servo2 utilizan los pines digitales 9y 10 de Arduino respectivamente.
Nos queda ahora ver como usamos los servos con este Shield mediante un programa, que en realidad tiene poco mérito, porque usamos la librería estándar de servos además de la del shield motor, y después instanciamos un par de servos directamente, por el procedimiento habitual:
#include <AFMotor.h> #include <Servo.h> Servo servo1, servo2 ;
El resto del programa se parece mucho al que pusimos un poco más arriba:
#include <AFMotor.h> #include <Servo.h> Servo servo1, servo2 ; void setup() { Serial.begin(115200); servo1.attach(9); // El servo 1 se controla con el pin 9 servo2.attach(10); // El servo 2 se controla con el pin 10 } void loop() { for (int ang =0 ; ang <180 ; ang++) { servo1.write( ang) ; servo2.write( ang ); delay(25); } delay(1000); }
Fijate que barremos un ángulo de 0 a 180º porque aparentemente este servo se comporta así, con un ángulo de 90º se coloca en la posición central y luego puede moverse a 0º o hasta 180º, pero esto es algo que tenéis que comprobar con vuestro servo.
- Si le dais un ángulo superior a lo que puede moverse, simplemente zumbara y no podrá haceros caso, porque para eso tiene topes.
- En un servo pequeño como esto no es grave, pero evitaría algo así en servos de una cierta potencia y precio por si acaso.
Aquí os dejo un pequeño video con los dos servos en movimiento:
Otros Shields
Este Motor Shield V1 está pensado como un sistema sencillo y de bajo coste para introducirse en el mundo de los pequeños motores, y no es llevéis a engaño, se pueden hacer muchas cosas con el especialmente para interesar a gente que desea empezar de modo sencillo sin complicaciones ni tener que empeñar un riñón en las compras.
Pero a medida que vuestros proyectos vayan creciendo, el Motor Shield V1 se os quedara corto, primero porque su capacidad de alimentar motores es limitada sin una fuente externa y en segundo lugar porque con solo 2 servos no vas a hacer un robot muy interesante.
Por eso, cuando necesitéis usar más de dos servos por ejemplo, vais a necesitar otro shield o tarjeta de expansión que os permita crecer.
Y estáis de suerte porque naturalmente el mercado nos ofrece todo una plétora de soluciones en forma de shields y tarjetas integradas que nos permiten controlar múltiples servos, pero hay algunas cosas que necesitáis tener en cuenta antes de comprar una.
Lo primero cuantos servos vais a usar y cuál es el consumo máximo en carga, porque tenéis que prever una alimentación suficiente para el peor caso. Por ejemplo si necesitas 12 servos de 250 mA, tienes un consumo de 3A en el peor caso. Quizás nunca se de pero tienes que preverlo, y no todos los shield o tarjetas pueden aguantarlo aunque parezca que sí, asegúrate.
Lo segundo es si quieres comprar un shield para tu Arduino, o una tarjeta que ya incluya un Arduino y más cosas, y hay muchos así.
Por ejemplo es fácil encontrar tarjetas como estas:
USB 32 channel servo controller |
Que incluyen un chip compatible con Arduino UNO la primera y con MEGA la segunda para mayor potencia y por el número de pines necesarios. Suelen encontrarse con capacidad para controlar 16, 24 y 32 servos.
La propia tarjeta incluye USB y Arduino para manejar directamente los servos, pero fíjate que ninguna de estas tarjetas tiene alimentación propia y por tanto necesitas prever el uso de una fuente externa.
Imagínate que quieres hacer algo así como una araña robot. Cada pata necesita tres grados de libertad: Girar el hombro arriba y abajo para levantar la pata y girar el hombro adelante y atrás para avanzar y por ultimo girar el codo arriba y abajo (De momento ignoramos el tobillo) y como una araña usa 8 patas, salimos por la bonita cantidad de 24 servos mínimo para hacer una araña.
Algo así va a llevar a límite a este tipo de controladoras y por eso las hay de hasta 32 servos que yo haya visto. Tengo por aquí una que compre hace un tiempo (Para una araña robótica precisamente) que es de lo más grande que he visto:
Se llama Spider Controller e incluye el corazón de un Arduino Mega y es compatible con él y además 48 conectores para servo y una fuente de alimentación de 3ª, junto con el USB para programarlo, lo que le convierte en el mayor monstruo que he visto nunca para controlar servos.
Quizás mas adelante lo usemos un día para algo (Una Araña no me suena mal)
Resumen de la sesión