La tarjeta (o módulo) controladora de motores L298N permite controlar la velocidad y la dirección de dos motores de corriente continua o un motor paso a paso de una forma muy sencilla, gracias a los dos puentes en “H” incorporados. El módulo L298N es muy económico, robusto y fácil de emplear.
El nombre del módulo se debe al nombre del circuito integrado y se encuentra posicionado verticalmente sobre el disipador de aluminio pintado de color negro.
El módulo L298N está basado en un puente-H (o H-bridge en inglés). Esto es principalmente una configuración electrónica formada por cuatro transistores permitiendo invertir el sentido de la corriente y por tanto el sentido de giro del motor.
El rango de voltajes en el que trabaja esta tarjeta va desde los 3V hasta 35V, y una intensidad de hasta 2A.
El módulo L298N es de baja eficiencia. La electrónica del módulo consume aproximadamente entre dos y tres voltios por lo que los motores recibirán hasta tres voltios menos. Esto es algo a considerar en el momento de seleccionar unas baterías.
Otra característica que hace interesante este módulo es su regulador de tensión LM7805. Dicho regulador permite obtener una tensión de 5V ideal para alimentar a nuestro Arduino cuando la alimentación es de 12V.
El L298N incorpora ciertas protecciones contra los fenómenos típicos que suelen producirse al en los motores de corriente continua. Dispone de protecciones contra sobre intensidad, sobre temperatura, y diodos de protección contra corrientes inducidas (diodos flyback).
El controlador L298N es ampliamente usado en proyectos de electrónica y robótica, por su sencillez de uso, bajo coste, y excelente relación calidad – precio. Además, permite alimentar una gran variedad de motores eléctricos de hasta 35V lo que lo hace muy versátil.
CONEXIONES Y PINES
Alimentación
Vin: Si miramos el módulo veremos que tiene un Vin. Esta es la entrada de tensión y admite tensiones comprendidas entre los 3V y 35V.
GND: El GND es el cable de conexión a tierra. Es recomendable, interconectar el GND de Arduino con el GND del módulo, sobretodo cuándo se empleen fuentes de alimentación distintas.
Jumper
Si miramos la placa desde arriba el módulo veremos tres pines muy especiales que se llama “jumpers”.
Los jumpers EN
Estos jumpers ponen al ENA y ENB a un nivel lógico alto. Si esos jumpers se quitan, las salidas OUT1, OUT2, OUT3 y OUT4 estarán inhabilitadas. Lo que si se podrá por ejemplo es alimentar a un Arduino cuándo el otro jumper está activado.
Con estos jumpers puestos, se habilitan las salidas de los motores por defecto. Luego, lo único posible será controlar el sentido de giro del motor.
Para controlar la velocidad del motor es necesario quitarlos y guardarlos en algún lugar que no se puedan perder, puesto que los valores lógicos se darán desde Arduino.
El jumper de selección 5V
Este es el llamado pin de selección de 5V. Si el jumper está cerrado, con una tensión de alimentación de hasta 12V máxima, el regulador de tensión se activa obteniendo una salida de 5V que se puede emplear, por ejemplo, para alimentar Arduino. Es decir, permite alimentar a un Arduino de forma muy sencilla, con sólo alimentar el LN298.
Si el jumper está abierto (sin él) entonces el regulador está desactivado. Esto es interesante cuándo trabajamos con voltajes superiores a los 12V. Por lo que será necesaria alimentar con 5V para que funcione el módulo. Sin embargo, hay que tener cuidado en no alimentar el módulo cuando el jumper está puesto.
El regulador sólo funciona con tensiones de hasta 12V en Vin. Si se superan estos valores, entonces es necesario quitar el jumper y alimentar la parte lógica del módulo con una fuente independiente. Finalmente, como resumen:
- Jumper cerrado: El voltaje de salida del motor va de los 6V a los 12V y un voltaje de salida lógico de 5V.
- Jumper abierto: El voltaje de salida del motor va de los 12V a los 35V y necesita ser alimentado con una entrada de 5V.
Conexiones para un motor DC
Las salidas A y B son la alimentación de los motores DC. Hay que tener en cuenta la polaridad de las conexiones para no hacer que un motor gire en un sentido y el otro, en otro sentido. Es decir, hay que respetar la polaridad para que los motores giren de forma deseada. Para ello, es deseable, que los colores de los cables de cada motor sean distintos para poder distinguir la polaridad fácilmente.
Pines IN
Luego veremos que existen los pines IN. Estos pines reciben la información procedente de Arduino para controlar la velocidad y sentido de giro de los motores. Son dos pines IN por motor, es decir, el IN1 e IN2 para el motor A y los otros dos para el motor B. Los primeros tres pines de la derecha sirven para controlar el motor B y los otros tres pines de la izquierda sirven para controlar el motor A.
- IN1 = HIGH – IN2 = LOW — En un sentido
- IN1 = LOW – IN2 = HIGH — En sentido contrario
- IN1 = LOW – IN2 = LOW — Parado
Pines EN
Estos se alimentan con el PWM de Arduino de forma que recibe señales comprendidas entre 0 y 255. Si el jumper no está colocado, los motores siempre se moverán a la misma velocidad.
Configuración de una alimentación de 12V (máxima) con dos fases, sentido sin control de la velocidad de giro
En el caso de querer usar ambas fases (dos motores), y poder cambiar el sentido de giro, y alimentar desde una fuente de alimentación un máximo de 12V, el esquema de conexión a Arduino sería el siguiente:
Observamos que los jumperes (en amarillo) están conectados.
Ejemplo sencillo de código
Una vez realizada la conexión anterior, con este simple sketch podremos controlar la velocidad las ruedas de un solo motor cada dos segundos, en un solo sentido de giro.
const int pinIN1 = 8; // Cualquier pin digital const int pinIN2 = 9; // Cualquier pin digital const int pinENA = 7; // Buscar los pines PWM de Arduino. const int rpm = 255; //velocidad de giro máxima puesto que la velocidad del 100% equivale a 255. void setup() { pinMode(pinIN1, OUTPUT); pinMode(pinIN2, OUTPUT); pinMode(pinENA, OUTPUT); } void loop() { digitalWrite(pinIN1, HIGH); digitalWrite(pinIN2, LOW); analogWrite(pinENA, rpm); delay(2000); }
Librería para el L298N
Hay una librería disponible en el repositorio de Arduino de Andrea Lombardo, compatible con todas las arquitecturas de Arduino que facilita el control de los motores de corriente continua. Se denomina igual que la misma tarjeta, es decir, L298N.
Las librerías oficiales muchas veces tienen en cuenta cosas que nosotros ni nos imaginamos. Aunque un exceso de librerías tampoco es bueno, hay librerías que pueden ayudar a mejorar el código y el funcionamiento del dispositivo.
Primero hay que indicar si disponemos de uno o dos motores.
- Un motor: #include <L298N.h>
- Dos motores: #include <L298NX2.h>
Importación
Podemos importar la libraría directamente del IDE de Arduino. Para ello, vamos a Sketch Include Library L298N .
Instanciar el módulo
Para controlar un motor lo primero es crear una instancia de la librería:
// Permitiendo el control de velocidad
L298N myMotor(EN, IN1, IN2);
// Sin conrol de velocidad, con el jumper en su lugar correcto
L298N myMotor(IN1, IN2);
Como sabemos EN = ENA o ENB y se conectan al PWM de Arduino. Luego, IN1 o IN2 se conectan a los pines digitales permitiendo controlar el sentido del motor.
Para controlar dos motores usamos la variante L298NX2. Con control de la velocidad de rotación:
motor A motor B |------------------| |----------------| L298NX2 myMotors(EN_A, IN1_A, IN2_A, EN_B, IN1_B, IN2_B);
// Sin control de la velocidad de rotación
motor A motor B |------------||------------| L298NX2 myMotors(IN1_A, IN2_A, IN1_B, IN2_B);
Métodos para la librería L298N
Una función o método es un fragmento de código independiente que es parte de la funcionalidad que le conferimos a un objeto. Los métodos pueden o no tener parámetros, es decir, valores que el objeto recoge como argumentos.
Método | Parámetro | Descripción |
setSpeed | unsigned short pwmVal | Establece el valor PWM utilizado para regular la velocidad del motor y comprende entre 0 y 255. |
getSpeed | Sin parámetro | Obtiene la velocidad definida anteriormente. |
forward | Sin parámetro | Hace girar el motor hacia delante (cuidado con las conexiones). |
forwardFor | unsigned long delay | Hace girar el motor hacia atrás durante un tiempo especificado mediante delays. (cuidado con las conexiones). |
forwardFor | unsigned long delay, CallBackFunction callback | Hace girar el motor hacia delante durante un tiempo especificado mediante un delay, después de ejecutar una función callback. |
backward | Sin parámetro | Hace girar el motor hacia atrás (cuidado con las conexiones). |
backwardFor | unsigned long delay | Hace girar el motor hacia atrás durante un tiempo especificado mediante un delay. |
backwardFor | unsigned long delay, CallBackFunction callback | Hace girar el motor hacia atrás durante un tiempo especificado mediante un delay, después de ejecutar una función callback. |
run | uint8_t direction | Mover el motor. Para especificar la dirección usa lo siguiente: L298N::FORWARD, L298N::BACKWARD ó L298N::STOP. |
runFor | unsigned long delay, L298N::Direction direction | Como el caso de forwardFor ó backwardFor pero más flexible. Para especificar la dirección usar lo siguiente: L298N::FORWARD, L298N::BACKWARD ó L298N::STOP. |
runFor | unsigned long delay, L298N::Direction direction, CallBackFunction callback | Como el caso anterior con la habilidad de ejecutar una función “callback”. |
stop | Sin parámetro | Para el motor. |
reset | Sin parámetro | Usado para reconectar los movimientos del motor después de usar las funciones runFor, forwardForó backwardFor methods. |
isMoving | Sin parámetro | Devuelve una indicación booleana indicando si el motor está funcionando o no. |
getDirection | Sin parámetro | Devuelve la dirección actual: L298N::Direction. |
La dirección la conocemos con:
Constante | Constante |
L298N::FORWARD | 0 |
L298N::BACKWARD | 1 |
L298N::STOP | -1 |
El método L298NX2
El método L298NX2 tiene los mismos métodos que el L298N identificados por un sufijo A o B para cada motor. Por ejemplo, setSpeed para el motor A es setSpeedA y setSpeedB para el motor B. Sin embargo, hay métodos sin sufijo, lo que afectará a ambos motores:
Método | Parámetro |
setSpeed | unsigned short pwmVal |
forward | Sin parámetro |
forwardFor | unsigned long delay, CallBackFunction callback |
forwardFor | unsigned long delay |
backward | Sin parámetro |
backwardFor | unsigned long delay, CallBackFunction callback |
backwardFor | unsigned long delay |
run | uint8_t direction |
runFor | unsigned long delay, L298N::Direction direction |
runFor | unsigned long delay, L298N::Direction direction, CallBackFunction callback |
stop | Sin parámetro |
reset | Sin parámetro |
Ejemplos
Se pueden encontrar algunos ejemplos en el mismo IDE de Arduino, Menu -> File -> Example -> L298N. El esquema de cableado se encuentra en la carpeta de “schema”.
Finalmente podéis aprender a calcular las rpm de un motor en el siguiente enlace.