Objetivos
Material requerido.
Kit inicio UNO | |
Kit Inicio Mega |
A vueltas con los motores de corriente continua, o motor CC
Hemos visto por encima las características básicas de los motores de corriente continua con escobillas (Porque hay varios tipos además de este), pero vamos a entrar un poco más en detalle de que cosas debes considerar cuando vayas a elegir uno de estos motores.
Cuando compres un motor de corriente continua debes fijarte en tres cosas básicamente:
Típicamente en motores de Hobby andaremos entre 200 y 2.000 rpm
En la sesión anterior vimos como como conectar uno de estos motores a nuestro Arduino y como variar la velocidad de giro modificando la tensión que le entregamos en bornes. La velocidad de giro del motor depende directamente de esta tensión
Pero una cosa que no hicimos en la sesión previa fue invertir el sentido de rotación del motor, porque este es un tema espinoso, ya que para ello necesitamos invertir la polaridad de la tensión en bornes, y esto, queridos amigos, no podemos hacerlo usando solamente nuestros Arduinos (Porque Arduino puede proporcionar +5V pero no -5V).
Para resolver este problema tenemos que usar un poco más de ingenio y diseñar un circuito que se llama puente en H ( H-bridge). Para comprenderlo, imaginaros el siguiente montaje a base de interruptores:
Cuando usamos los interruptores en la posición de la imagen izquierda el motor gira en un sentido que llamaremos directo. Pero si los colocamos en la posición de la derecha girará en sentido contrario, porque hemos invertido la polaridad de la tensión en las entradas del motor, y por tanto el sentido de giro, sin necesidad de invertir la polaridad de la tensión, cosa complicada.
A estos circuitos se les llama H-bridge, porque recuerdan vagamente a una H alrededor del motor.
Claro que invertir el giro mediante interruptores es poco práctico, y como aquí somos expertos electrónicos (Sin carcajadas, por favor), vamos a ver cómo podemos hacer la misma función usando electrónica y que no tengamos que conmutar manualmente, sino mediante señales eléctricas. Un típico H-Bridge seria parecido a este circuito:
Olvídate por ahora de los diodos, que son para protección de la descarga inductiva del motor y proteger los transistores. Jugando con la tensión en los pines A; B; C; D podemos conseguir que los transistores entren en corte o saturación y disponemos de un medio electrónico para abrir o cerrar el equivalente a los interruptores mediante transistores.
Que no se asuste nadie. No voy a pediros que montéis ese circuito (aunque no sería demasiado complicado). Recordad que cuando hay una necesidad en el mercado, siempre hay alguien dispuesto a fabricar un integrado que hace eso y más.
Y como esta no iba a ser la excepción, nos encontramos que disponemos de varias versiones de circuitos H-bridge dependiendo de la tensión y la intensidad que se debe conmutar.
Nosotros hoy vamos a utiliza un integrado barato, probado y fácil de encontrar que incluye dos H-bridge y que nos sirve para pequeños motores de corriente continua. Se llama L293D.
El H Bridge L293D
El L293D, es un pequeño integrado que incluye dos puentes H-Bridge que podemos usar para gobernar simultáneamente dos motores CC.
Si buscáis el manual del L293D, veréis que aunque el funciona a 5V internamente, puede conmutar tensiones de hasta 36V para tus motores.
El patillaje del chip es así:
Veamos que son los diferentes pines del L293D:
Podemos hacer una tabla para mostrar la lógica que sigue el giro del motor en función de los tres pines:
ENABLE | CONTROL PIN 2 | CONTROL PIN 7 | MOTOR STATUS |
---|---|---|---|
LOW | – | – | Motor parado |
HIGH | HIGH | LOW | Gira adelante |
HIGH | LOW | HIGH | Gira al revés |
HIGH | HIGH | HIGH | Motor parado |
HIGH | LOW | LOW | Motor parado |
Por tanto tenemos que activar el pin enable para que el motor gire y después usamos los pines Input1 e Input2 con valore opuestos para hacer girar el motor en una dirección o en la contraria. ¿Fácil no? Veamos cómo hacer el montaje con nuestros Arduinos.
Hagamos un resumen de conexiones
Pin L293D | Pin Arduino | Descripción |
---|---|---|
1 | 10 | Enable |
2 | 9 | Input 1 |
3 | – | Motor1 + |
4,5, 12,13 | GND | GND |
6 | – | Motor1 – |
7 | 8 | Input 2 |
8 | Vin | Alimentación del motor |
16 | 5V | Alimentación del L293D |
Vamos con el esquema de protoboard.
Esquema de protoboard
Una vez que tenemos claras las conexiones, el diagrama de protoboard del chip L293D a nuestro Duino será algo así:
Veamos el programa que vamos a usar para controlar este motor. Vamos a usar los 3 pines de la tabla anterior. Arduino Pin 10 es el enable del Motor 1 y usamos los pines 8 y 9 para controlar el sentido de giro. Por tanto
#define E1 10 // Enable Pin for motor 1 #define I1 8 // Control pin 1 for motor 1 #define I2 9 // Control pin 2 for motor 1 void setup() { for (int i = 8 ; i<11 ; i++) // Inicializamos los pines pinMode( i, OUTPUT); } void loop() { digitalWrite(E1, HIGH); // Activamos Motor1 digitalWrite(I1, HIGH); // Arrancamos digitalWrite(I2, LOW); delay(3000); digitalWrite(E1, LOW); // Paramos Motor 1 delay(1000); digitalWrite(E1, HIGH); // Activamos Motor1 digitalWrite(I1, LOW); // Arrancamos con cambio de direccion digitalWrite(I2, HIGH); delay(3000); digitalWrite(E1, LOW); // Paramos Motor 1 delay(1000); }
El programa no puede ser más sencillo. Activamos el Enable1 para arrancar Motor1, y luego usamos I1 e I2 con valores invertidos. El motor arranca y lo paramos a los 3 segundos. A la de 1 segundo levantamos de nuevo el Enable1y al intercambiar los valores de I1 e I2 el giro del motor se inicia y en la dirección contraria.
Aquí va un mini video con el resultado:
Los lectores más astutos, se habrán dado cuenta de que no hemos variado la velocidad de giro y dado que en el programa anterior todos los valores son digitales lo vamos a tener mal para variar la velocidad de forma analógica.
Pero el truco está en que hemos conectado el pin Enable1 al pin Arduino 10 que es PWM (Así, como sin querer) y los L293D vienen diseñados para variar la velocidad de giro de los motores correspondientes con la tensión aplicada a este pin, por lo que resulta trivial variar la velocidad del motor, sin más darle valores analógicos.
Si por ejemplo añadimos un potenciómetro de nuevo conectado al A1, podemos escribir este valor directamente (dividido por 4, claro) al pin 10 como analógico, sustituyendo la línea
digitalWrite(E1, HIGH); // Activamos Motor1
Por esta otra que escribe un valor analógico:
analogWrite(E1, analogRead(A1) /4 ) ;
Fijaremos la velocidad de giro del motor en función del valor del potenciómetro. El programa corregido, quedaría poco más o menos así:
#define E1 10 // Enable Pin for motor 1 #define I1 8 // Control pin 1 for motor 1 #define I2 9 // Control pin 2 for motor 1 void setup() { for (int i = 8 ; i<11 ; i++) // Inicializamos los pines pinMode( i, OUTPUT); } void loop() { analogWrite(E1, analogRead(A1) / 4); // Activamos Motor1 digitalWrite(I1, HIGH); // Arrancamos digitalWrite(I2, LOW); delay(3000); digitalWrite(E1, LOW); // Paramos Motor 1 delay(1000); analogWrite(E1, analogRead(A1) / 4); // Activamos Motor1 digitalWrite(I1, LOW); // Arrancamos con cambio de direccion digitalWrite(I2, HIGH); delay(3000); digitalWrite(E1, LOW); // Paramos Motor 1 delay(1000); }
Y eso es todo.
Aquí tenemos un vídeo de muestra del resultado.
Resumen de la sesión