Este es un módulo que permite controlar motores de corriente continua o un motor paso a paso bipolar de hasta 2 amperios.
Conectar un motor de corriente continua a nuestro Arduino es sencillo y también variar su velocidad (basta con modificar la tensión que proporcionamos al motor). El problema viene cuando queremos invertir el sentido de rotación del motor. Para ello es necesario invertir la polaridad de la tensión que conectamos en bornes del motor. Arduino nos proporciona una tensión de +5 V, pero no una de -5 V, por lo que para resolver este inconveniente tendremos que diseñar un circuito que se llama puente en H (H-bridge).
En un proyecto sencillo realizado con componentes discretos podríamos realizar un montaje como el siguiente:
Si queremos hacer girar el motor en un sentido cerraríamos dos interruptores:
Y si quisiéramos que girase en sentido contrario serían los otros dos interruptores los que deberían estar cerrados:
Estos circuitos es a lo que se les llama puente H, porque recuerdan a la forma de la letra hache. Sustituyendo los interruptores, que se nos hacen poco prácticos, por componentes electrónicos para poder realizar la inversión del sentido de giro con señales eléctricas y no manualmente tendríamos un circuito similar a este:
Jugando con la tensión en los transistores, trabajando las corrientes de base, podemos conseguir que los transistores pasen del estado de corte a saturación y así poder controlar de forma electrónica lo que antes hacíamos con los interruptores. Observamos que hay transistores PNP y NPN precisamente para poder cambiar la polaridad de la tensión. Los diodos sirven para proteger a los transistores de las corrientes inductivas que provienen del motor cuando se invierte el sentido de giro.
Este montaje, aunque no es complicado, sería tedioso realizarlo, sobre todo si tenemos en cuenta que existen módulos comerciales que realizan la misma función y por un precio razonable. Uno de ellos es el L298N, que nos permite controlar la velocidad y el sentido de giro de dos motores de corriente continua o un motor paso a paso bipolar de manera sencilla gracias a los dos puentes H que lleva integrados. También permite controlar un motor paso a paso unipolar configurado como bipolar.
Sus características son las siguientes:
- La entrada de tensión Vin admite tensiones entre 3V y 35 V
- El módulo lleva integrado un regulador de tensión. Si la tensión en Vin es mayor de 12 V el jumper del regulador debe estar desactivado, ya que si no podríamos dañar el módulo.
- La salida +5V funciona solamente cuando el regulador de tensión está activado.
- Si el regulador está desactivado debemos alimentar la parte lógica del módulo con 5V a través de la entrada +5V. ¡¡¡Cuidado no introducir corriente por +5V cuando el regulador está activado!!!, el módulo quedará inservible.
- Las salidas para los motores A y B proporcionan la energía que necesitan los motores para moverse. Si algún motor no gira en el sentido deseado bastará con intercambiar las conexiones de ese motor.
- Los pines 1 y 2 controlan el sentido de giro del motor A, de manera que si IN1está en HIGH e IN2 está en LOW, el motor A gira en un sentido y si IN1 está en LOW e IN2 está en HIGH, girará en sentido contrario. La misma función realizan los pines IN3 e IN4 en el motor B.
- Si queremos controlar la velocidad de los motores tendremos que quitar los jumpers de los pines ENA y ENB. Se conectan a salidas PWM de Arduino de manera que podamos enviarle valores de 0 a 255 que controlarán la velocidad de giro de los motores. En caso de que los jumpers estén colocados los motores girarán siempre a la misma velocidad.
Un ejemplo de uso de este módulo podemos desarrollarlo controlando un motor de corriente continua como haremos a continuación.
Alimentamos el módulo L298N desde una pila de 9V a través de Vin y GND a Arduino. Como no vamos a controlar la velocidad del motor dejamos el jumper puesto en el pin ENA. Alimentamos el motor a través de los bornes correspondientes y conectamos los pines IN1 e IN2 a los pines 9 y 7 de Arduino. Vamos a hacer girar el motor en un sentido durante un tiempo, lo detenemos y luego lo hacemos girar en sentido contrario.
Un ejemplo de código para el sketch sería el siguiente:
/*
* Ejemplo de sketch de control de motor de
* corriente continua usando módulo L298N
*
* Se activa el motor en un sentido durante
* un tiempo, se detiene y se activa en sentido
* contrario durante un tiempo.
*
*Esta dirección de correo electrónico está siendo protegida contra los robots de spam. Necesita tener JavaScript habilitado para poder verlo.
*/
// Definimos las variables para los pines IN1 e IN2
int IN1=9;
int IN2=7;
void setup() {
pinMode(IN1,OUTPUT); //IN1 conectado al pin 9
pinMode(IN2, OUTPUT); //IN2 conectado al pin 7
}
void loop() {
//Hacemos que el motor gire en un sentido
digitalWrite(IN1,HIGH);
digitalWrite(IN2,LOW);
delay(5000); //Gira en un sentido durante 5 segundos
//Detenemos el motor
digitalWrite(IN1, LOW);
delay(1000); //Detenemos el motor durante 1 segundo
//Hacemos que el motor gire en sentido contrario
digitalWrite(IN2,HIGH);
delay(5000); //Gira en el otro sentido durante 5 segundos
//Detenemos el motor
digitalWrite(IN2,LOW);
delay(1000);
}
Si queremos controlar la velocidad del motor debemos utilizar los pines ENA o ENB y conectarlos a un pin PWM de Arduino. En nuestro caso vamos a controlar el motor A, por lo cual vamos a retirar el jumper que cierra a ENA para poder regular su velocidad.
Vamos a diseñar un código sencillo en el que la velocidad se vaya incrementando poco a poco a escalones hasta detenerlo finalmente.
/*
* Ejemplo de sketch de control de motor de
* corriente continua usando módulo L298N
* con regulación de la velocidad
*
* Se irá incrementando la velocidad
* de manera progresiva
*
*Esta dirección de correo electrónico está siendo protegida contra los robots de spam. Necesita tener JavaScript habilitado para poder verlo.
*/
// Definimos las variables para los pines ENA, IN1 e IN2
int IN1=9;
int IN2=7;
int ENA=11;
// Definimos una variable para la velocidad
int velocidad=20;
void setup() {
pinMode(IN1,OUTPUT); //IN1 conectado al pin 9
pinMode(IN2, OUTPUT); //IN2 conectado al pin 7
pinMode(ENA, OUTPUT); //ENA conectado al pin 11
}
void loop() {
//Hacemos que el motor gire en un sentido
digitalWrite(IN1,HIGH);
digitalWrite(IN2,LOW);
//Vamos incrementando la velocidad del motor
//Cada iteración se multiplica la velocidad por 10
for(int i=1;i<=10;i++){
analogWrite(ENA,velocidad);
delay(3000);
velocidad=velocidad*i;
}
//Detenemos el motor durante 6 segundos
analogWrite(ENA,0);
delay(6000);
}