Objetivos
Material requerido
Controlando varios motores de CC
En las sesiones previas hemos visto cómo manejar los motores de corriente continua típicos. Hemos visto cómo hacerlos girar y como modificar esta velocidad de giro, así como la forma de invertir el sentido de rotación mediante un H bridge integrado como el L293D.
¿Y qué hace un hombre normal, cuando consigue controlar un motor (y más uno que esté leyendo esto)? Pues naturalmente, probar a manejar varios motores a la vez, digamos 4, y empezar a pensar en hacer un pequeño cochecito con tracción a las 4 ruedas y control remoto inalámbrico y…. ¡Quieto parado!
Vayamos por partes. De momento solo hemos gobernado un motor, aunque sabemos que el L293D dispone de capacidad para manejar un segundo motor. Podríamos diseñar un circuito con dos L293D para mover 4 motores y quizás hacer un Shield para montar todo en la chepa de nuestro Arduino.
Pero como siempre os digo, si existe una necesidad en este mundo electrónico, siempre hay alguien presto a vendernos la solución de forma conveniente. Y como podréis imaginar, ni somos los primeros que hemos tenido esta idea (Ni seremos los últimos) ni es precisamente una novedad la solución, el mercado nos ofrece toda una variedad de Shields para controlar motores muy interesantes, dependiendo del tamaño de los motores, su consumo, la tensión y cualquier otra cosa que podáis imaginaros.
Como en esta humilde casa pensamos que para aprender hay que trastear y preferiblemente por poca pasta, vamos a presentar un sencillo Motor Shield que fue diseñado por nuestros amigos de Adafruit y luego abandonado en favor de un controlador de motores más avanzado (y caro) y cuyo relevo ha sido tomado por la nube de fabricantes chinos, proporcionándonos un Arduino motor shield V1.0, por muy poco dinero, que nos permite iniciarnos gastando lo justo.
Veamos sus características.
Adafruit Motor Shield V1.0
Aquí tenéis una foto del Motor Shield V1.0, que podéis encontrar fácilmente en cualquier proveedor:
Las características principales son:
En resumen, es un Shield barato y práctico para manejar pequeños motores de 5V, pero que se quedará corto si necesitas una cierta potencia en los motores, ya que la intensidad que estos demandaran superará con facilidad los 0,6A que tiene como límite este Shield.
Es ideal para construir robots autónomos con pequeños motores y sin peso y sobre todo como elemento de aprendizaje antes de invertir una pasta gansa en otras opciones mas sofisticadas.
Conectando el Motor Shield
El shield conecta directamente los H Bridges L293D a los pines PWM de Arduino y además incorpora un viejo conocido nuestro el 74HC595, un Shift Register, para ahorrar pines en la conexión.
El Shield se reserva los pines 3,4,5,6,7,8,9,10,11,12, los pines 9 y 10 se usan para los servos en caso de que los incluyamos y quedan libres los pines 2 y 13, así como el 0 y 1 que se usan para la comunicación USB con nuestro PC.
Los pines A0 a A5 están disponibles para nuestro uso y recordar que a una mala, podemos usarlos como pines digitales también.
Hay conexiones para los bornes de 4 motores, marcados como M1, M2, M3 y M4 y conviene que al conectar sigas el mismo criterio en los bornes y en el Shield porque de lo contrario conseguirás que alguno de los motores gire al revés de lo que pretendes. Lo que no es muy grave porque se arregla con facilidad.
Una cosa interesante de este shield es que nos permite separar la alimentación de los motores de la alimentación de Arduino y es de agradecer porque los motores generan mucha interferencia electromagnética que puede hacer que nuestro Arduino Mega se comporte de forma errática.
Por eso siempre que sea posible conviene que separéis la alimentación de uno y otro (Aunque en un robot autónomo va a ser difícil). Para ello basta con que quites el “power jumper” y la alimentación estará separada. Esto será imprescindible si tus motores son de digamos 9 0 12V porque tu Arduino solo funciona con 5V (So pena de hacer barbacoa de Arduino).
Vamos a conectar un primer motor al Shield para probar. Lo primero montad el Shield a vuestro Arduino. Yo os recomiendo un MEGA para que podamos seguir haciendo cosas en el futuro, pero también vale cualquier otro.
Conectad los bornes del motor a los tornillos A y B del Motor Shield, dejando libre el pin central marcado como GND.
Seria sencillo manejar el motor a través del Shield directamente, recurriendo a los pines de control, y os lo propongo como ejercicio si os parece, pero aquí vamos a descargar ahora una librería de Adafruit para manejar el Shield directamente, que nos permitirá abstraernos del detalle de pines.
La librería que necesitamos es esta adafruit-Adafruit-Motor-Shield-library-8119eec, y para instalarla seguimos el procedimiento habitual.
Para usarla, lo primero que tenemos que hacer es este par de instrucciones:
#include <AFMotor.h> AF_DCMotor Motor1(1);
La primera línea, incluye la librería de AdaFruit en nuestro programa, y la segunda crea una instancia de un motor conectado a la puerta M1, y le iniciamos con el parámetro que le pasamos que puede ir del 1, M1 al 4, M4.
Para establecer la velocidad del motor hacemos:
Motor1.setSpeed(200); // Definimos la velocidad de Motor1 Motor1.run(RELEASE);
La primera línea pone el motor a 200 / 255 del tope de revoluciones, y la segunda línea indica que queremos dejar el motor en punto muerto.
Si queremos que el motor avance usamos:
Motor1.run(FORDWARD);
Y para que retroceda hacemos
Motor1.run(BACKWARD);
Y eso es todo lo necesario para controlar un motor. Si queremos hacer un primer programa sencillo que haga avanzar el motor unos segundos y después retroceda, podemos escribir un programa similar a este
#include <AFMotor.h> AF_DCMotor Motor1(1); void setup() { Motor1.run(RELEASE); } void loop() { Motor1.run(FORWARD); delay (2000); Motor1.setSpeed(180); Motor1.run(BACKWARD); delay (2000); }
Aquí os pongo un mini video con el resultado:
Moviendo varios motores simultáneamente
Vamos a conectar ahora, 4 motores a nuestro Motor Shield. Yo tengo por aquí rodando un bastidor con 4 ruedas y motores que voy a usar como base para hace un robot con tracción a las 4 ruedas.
Pero lo mismo da cualquier otro robot que tengáis, o hasta un bastidor con las ruedas, a condición de que podamos subirle nuestro Arduino mas el motor Shield. Una caja de cartón duro a la que sujetéis los motores y ruedas, sirve de maravilla.
En mi caso lo he puesto en un pedestal, para poder probar los diferentes motores sin que se me escape corriendo. Vamos con el programa de prueba. Lo primero es incluir la librería y definir las instancias de los motores que esta ocasión son 4 en vez de 1:
AF_DCMotor Motor1(1);
AF_DCMotor Motor2(2);
AF_DCMotor Motor3(3);
AF_DCMotor Motor4(4);
Definimos la velociodad de los 4 motores en el setup:
void setup() { Serial.begin(9600); // set up Serial library at 9600 bps Motor1.setSpeed(255); Motor2.setSpeed(255); Motor3.setSpeed(255); Motor4.setSpeed(255); }
Y por ultimo vamos a mandar moverse adelante y atrás y para los 4 motores simultáneamente:
Motor1.run(RELEASE); Motor2.run(RELEASE); Motor3.run(RELEASE); Motor4.run(RELEASE); delay (1000) ; Motor1.run(FORWARD) ; Motor2.run(FORWARD); Motor3.run(FORWARD); Motor4.run(FORWARD); delay (2000); Motor1.run(BACKWARD); Motor2.run(BACKWARD); Motor3.run(BACKWARD); Motor4.run(BACKWARD); delay (2000);
Como veis no es diferente de mover un solo motor, solo mas pesado. Aquí tenéis el programa Prog_92_2.
Es conveniente que comprobéis en vuestro montaje que todas las ruedas giran en la misma dirección y que no hay ninguna rotando al revés, porque cuando queramos avanzar seria un problema.
Aquí os dejo un pequeño video con el trest de giro
Con esto, confío en que con esto hayamos dejado listo el hardware de nuestro robot para empezar a programarlo en serio. Pero parece mas conveniente cortar aqui esta sesión y dejar algo para la próxima sesión, en la que veremos como mover el robot y hacerlo girar además de variar la velocidad de crucero.
Detalle del uso de pines
Una consulta de un lector suscitó la cuestión de que pines se usaban para que en este Motor Shield V1 y como era una cuestión de lo mas razonable que no estaba cubierta previamente,hemos optado por añadir este pequeño anexo especificando los pines que usa cada motor y cuales están disponibles en caso contrario.
Arduino | Función |
---|---|
Pin 1 | Disponible |
Pin 2 | Disponible |
Pin D3 | DC Motor #2 / Stepper #1 |
Pin D4 | Reservado para gobernar el Shift Register 74HC595 |
Pin D5 | DC Motor #3 / Stepper #2 |
Pin D6 | DC Motor #4 / Stepper #2 |
Pin D7 | Reservado para gobernar el Shift Register 74HC595 |
Pin D8 | Reservado para gobernar el Shift Register 74HC595 |
Pin D9 | Servo #1, Disponible si no se usa el servo |
Pin D10 | Servo #2, Disponible si no se usa el servo |
Pin D11 | DC Motor #1 / Stepper #1 |
Pin D12 | Reservado para gobernar el Shift Register 74HC595 |
Pin D13 | Disponible |
A0,A1,A2,A3,A4,A5 | Disponibles. Recuerda que pueden usarse como digitales |
Tened presente que no hay ningun pin de Arduino conectado a los motores directamente. La gestión de los motores se realiza a traves del shift register para ahorra pines y por eso tenéis necesariamente que usar la libreria para manejarlos.
Resumen de la sesión