
Controlador L298N DC Motor para Arduino
- AGR
- Web , Programación
- 07 Feb, 2025
Introduccion
Si bien eventualmente necesitarás aprender a controlar motores de CC para construir tu propio robot, probablemente necesitarás algo un poco más fácil para comenzar, y ahí es donde entra en juego el controlador de motor L298N. Puede controlar la velocidad y la dirección de giro de dos motores de CC.
Control de un motor de corriente continua
Solo podemos tener un control total sobre un motor de corriente continua si podemos controlar su velocidad y dirección de giro. Esto es posible combinando estas dos técnicas.
- PWM – para controlar la velocidad
- Puente H : para controlar la dirección de hilado
PWM – para controlar la velocidad
La velocidad de un motor de corriente continua se puede controlar modificando su voltaje de entrada. Una técnica muy utilizada para lograrlo es la modulación por ancho de pulso (PWM).
PWM es una técnica en la que el valor medio del voltaje de entrada se ajusta mediante el envío de una serie de pulsos ON-OFF. Este voltaje medio es proporcional al ancho de los pulsos, lo que se denomina ciclo de trabajo .
Cuanto mayor sea el ciclo de trabajo, mayor será el voltaje promedio aplicado al motor de CC, lo que dará como resultado un aumento en la velocidad del motor. Cuanto más corto sea el ciclo de trabajo, menor será el voltaje promedio aplicado al motor de CC, lo que dará como resultado una disminución en la velocidad del motor.
La siguiente imagen muestra la técnica PWM con varios ciclos de trabajo y voltajes promedio.
Puente H: para controlar la dirección
La dirección de giro de un motor de corriente continua se puede controlar modificando la polaridad de su voltaje de entrada. Una técnica muy utilizada para lograrlo es utilizar un puente en H.
Un circuito de puente H está formado por cuatro interruptores dispuestos en forma de H, con el motor en el centro.
Al cerrar dos interruptores específicos al mismo tiempo se invierte la polaridad del voltaje aplicado al motor, lo que provoca un cambio en la dirección de giro del motor.
La siguiente animación muestra el funcionamiento del circuito del puente H.
Chip controlador de motor L298N
En el centro del módulo hay un gran chip negro con un disipador de calor grueso: el L298N.
El chip L298N contiene dos puentes H estándar capaces de impulsar un par de motores de CC, lo que lo hace ideal para construir una plataforma robótica de dos ruedas.
El controlador de motor L298N tiene un rango de suministro de 5 V a 35 V y es capaz de suministrar una corriente continua de 2 A por canal, por lo que funciona muy bien con la mayoría de nuestros motores de CC.
Especificaciones técnicas
DESCRIPCION | VOLTAJE |
---|---|
Voltaje de salida del motor | 5 V – 35 V |
Voltaje de salida del motor (recomendado) | 7 V – 12 V |
Voltaje de entrada lógica | 5 V – 7 V |
Corriente continua por canal | 2A |
Disipación de potencia máxima | 25 W |
Para mas detalles consulta la hoja de datos
Distribución de pines del módulo del controlador del motor L298N
El módulo L298N tiene 11 pines que le permiten comunicarse con el mundo exterior. La distribución de pines es la siguiente:
Conozcamos cada pin uno por uno.
Pines de alimentación
El módulo del controlador del motor L298N recibe energía de un terminal de tornillo de 3 pines con paso de 3,5 mm.
El controlador de motor L298N tiene dos pines de alimentación de entrada: VS y VSS.
VS: El pin alimenta el puente H interno del CI, que impulsa los motores. Este pin acepta voltajes de entrada que van desde 5 a 12 V.
VSSSe utiliza para alimentar los circuitos lógicos dentro del IC L298N y puede variar entre 5 V y 7 V. Tierraes el pin de tierra común.
Pines de salida Los canales de salida del controlador de motor L298N,SALIDA1 y SALIDA2para el motor A yOUT3 y OUT4Para el motor B, se separan hasta el borde del módulo con dos terminales de tornillo con un paso de 3,5 mm. Puede conectar dos motores de CC de 5 a 12 V a estos terminales.
Cada canal del módulo puede suministrar hasta 2 A al motor de CC. Sin embargo, la cantidad de corriente suministrada al motor depende de la capacidad de la fuente de alimentación del motor.
Pines de control de dirección
Los pines de control de dirección permiten controlar si el motor gira hacia adelante o hacia atrás. Estos pines controlan los interruptores del circuito del puente H dentro del chip L298N.
El módulo tiene dos pines de control de dirección.IN1 y IN2Los pines controlan la dirección de giro del motor A; mientrasIN3 y IN4controlar la dirección de giro del motor B.
La dirección de giro del motor se puede controlar aplicando lógica ALTA (5 V) o lógica BAJA (Tierra) a estas entradas. El siguiente gráfico muestra varias combinaciones y sus resultados.
ENTRADA 1 | ENTRADA 2 | DIRECCION DE GIRO |
---|---|---|
Bajo(0) | Bajo(0) | Motor apagado |
Alto(1) | Bajo(0) | Adelante |
Bajo(0) | Alto(1) | Hacia atrás |
Alto(1) | Alto(1) | Motor apagado |
Pasadores de control de velocidad
Los pines de control de velocidad EN
y ENB
Se utilizan para encender/apagar los motores y controlar su velocidad.
Si se colocan estos pines en posición ALTA, los motores girarán, mientras que si se colocan en posición BAJA, se detendrán. Sin embargo, con la modulación por ancho de pulso (PWM), se puede controlar la velocidad de los motores.
El módulo suele venir con un puente en estos pines. Cuando este puente está colocado, el motor gira a toda velocidad. Si desea controlar la velocidad de los motores mediante programación, retire los puentes y conéctelos a los pines habilitados para PWM del Arduino.
Regulador y puente de 5 V integrado
El módulo incluye un regulador 78M05 de 5 V que se puede habilitar o deshabilitar mediante un puente.
Cuando este puente está en su lugar, el regulador de 5 V está habilitado y la fuente de alimentación lógica (VSS) se deriva de la fuente de alimentación del motor (VS). En este caso, el terminal de entrada de 5 V actúa como pin de salida y proporciona 5 V 0,5 A. Puede usarlo para alimentar un Arduino u otro circuito que necesite alimentación de 5 V.
Cuando se quita el puente, el regulador de 5 V se desactiva y tenemos que suministrar 5 V por separado a través del pin VSS.
Advertencia
Si la alimentación del motor es inferior a 12 V, puede dejar el puente en su lugar. Si es superior a 12 V, debe quitar el puente para evitar dañar el regulador de 5 V integrado.
Además, no suministre energía a los pines VSS y VS mientras el puente esté en su lugar.
Caída de tensión de L298N
El L298N tiene una caída de voltaje de aproximadamente 2 V. Esto se debe a que los transistores de conmutación internos tienen una caída de voltaje de aproximadamente 1 V cuando están polarizados en directa y, debido a que un puente H requiere que la corriente pase a través de dos transistores, la caída de voltaje total es de 2 V.
Por lo tanto, si conectas 12 V al terminal de alimentación del motor, los motores recibirán aproximadamente 10 V. Esto significa que un motor de 12 V CC nunca girará a máxima velocidad.
Para que el motor funcione a su velocidad máxima, la fuente de alimentación del motor debe tener un voltaje ligeramente superior (+2 V) al requisito de voltaje real del motor.
Teniendo en cuenta una caída de tensión de 2 V, si utiliza motores de 5 V, deberá suministrar 7 V al terminal de alimentación del motor. Si tiene motores de 12 V, la tensión de alimentación del motor debe ser de 14 V.
Conexión de un módulo controlador de motor L298N a un Arduino
Ahora que sabemos todo sobre el módulo, ¡podemos empezar a conectarlo a nuestro Arduino!
Comencemos conectando la fuente de alimentación del motor. En nuestro experimento, estamos usando motores de caja de cambios de CC, también llamados motores “TT”, que suelen encontrarse en robots con tracción en dos ruedas. Tienen una capacidad nominal de 3 a 12 V. Por lo tanto, conectaremos una fuente de alimentación externa de 12 V al terminal VS. Debido a que L298N tiene una caída de voltaje de aproximadamente 2 V, los motores recibirán 10 V y girarán a unas RPM ligeramente inferiores. Pero eso está bien.
A continuación, debemos suministrar 5 V al circuito lógico del L298N. Usaremos el regulador de 5 V integrado para extraer 5 V de la fuente de alimentación del motor, así que mantenga el puente 5V-EN en su lugar.
Ahora, conecta los pines de entrada y habilitación del módulo L298N (ENA, IN1, IN2, IN3, IN4 y ENB) a los seis pines de salida digital de Arduino (9, 8, 7, 5, 4 y 3). Ten en cuenta que ambos pines de salida de Arduino, 9 y 3, están habilitados para PWM.
Por último, conecta un motor al terminal A (OUT1 y OUT2) y el otro al terminal B (OUT3 y OUT4). Puedes intercambiar las conexiones del motor. Técnicamente, no hay una forma correcta o incorrecta.
Código de ejemplo de Arduino
El siguiente boceto le mostrará cómo controlar la velocidad y la dirección de giro de un motor de CC utilizando el controlador de motor L298N y puede servir como base para experimentos y proyectos más prácticos.
El esquema muestra el movimiento del motor en una dirección durante una revolución y luego en la dirección opuesta. También hay cierta aceleración y desaceleración involucradas.
Info
Al acelerar o desacelerar el motor, es posible que escuche un zumbido, especialmente con valores PWM bajos. Esto es normal; no hay nada de qué preocuparse. Esto sucede porque el motor de CC requiere una cantidad mínima de voltaje para funcionar.
// Motor A connections
int enA = 9;
int in1 = 8;
int in2 = 7;
// Motor B connections
int enB = 3;
int in3 = 5;
int in4 = 4;
void setup() {
// Set all the motor control pins to outputs
pinMode(enA, OUTPUT);
pinMode(enB, OUTPUT);
pinMode(in1, OUTPUT);
pinMode(in2, OUTPUT);
pinMode(in3, OUTPUT);
pinMode(in4, OUTPUT);
// Turn off motors - Initial state
digitalWrite(in1, LOW);
digitalWrite(in2, LOW);
digitalWrite(in3, LOW);
digitalWrite(in4, LOW);
}
void loop() {
directionControl();
delay(1000);
speedControl();
delay(1000);
}
// This function lets you control spinning direction of motors
void directionControl() {
// Set motors to maximum speed
// For PWM maximum possible values are 0 to 255
analogWrite(enA, 255);
analogWrite(enB, 255);
// Turn on motor A & B
digitalWrite(in1, HIGH);
digitalWrite(in2, LOW);
digitalWrite(in3, HIGH);
digitalWrite(in4, LOW);
delay(2000);
// Now change motor directions
digitalWrite(in1, LOW);
digitalWrite(in2, HIGH);
digitalWrite(in3, LOW);
digitalWrite(in4, HIGH);
delay(2000);
// Turn off motors
digitalWrite(in1, LOW);
digitalWrite(in2, LOW);
digitalWrite(in3, LOW);
digitalWrite(in4, LOW);
}
// This function lets you control speed of the motors
void speedControl() {
// Turn on motors
digitalWrite(in1, LOW);
digitalWrite(in2, HIGH);
digitalWrite(in3, LOW);
digitalWrite(in4, HIGH);
// Accelerate from zero to maximum speed
for (int i = 0; i < 256; i++) {
analogWrite(enA, i);
analogWrite(enB, i);
delay(20);
}
// Decelerate from maximum speed to zero
for (int i = 255; i >= 0; --i) {
analogWrite(enA, i);
analogWrite(enB, i);
delay(20);
}
// Now turn off motors
digitalWrite(in1, LOW);
digitalWrite(in2, LOW);
digitalWrite(in3, LOW);
digitalWrite(in4, LOW);
}
Explicación del código:
El código de Arduino es bastante simple. No requiere ninguna biblioteca para funcionar. El boceto comienza declarando los pines de Arduino que están conectados a los pines de control del L298N.
// Motor A connections
int enA = 9;
int in1 = 8;
int in2 = 7;
// Motor B connections
int enB = 3;
int in3 = 5;
int in4 = 4;
En la sección de configuración del código, todos los pines de control del motor, incluidos los pines de control de dirección y velocidad, se configuran como SALIDA digital. Y los pines de control de dirección se ponen en BAJO para deshabilitar inicialmente ambos motores.
void setup() {
// Set all the motor control pins to outputs
pinMode(enA, OUTPUT);
pinMode(enB, OUTPUT);
pinMode(in1, OUTPUT);
pinMode(in2, OUTPUT);
pinMode(in3, OUTPUT);
pinMode(in4, OUTPUT);
// Turn off motors - Initial state
digitalWrite(in1, LOW);
digitalWrite(in2, LOW);
digitalWrite(in3, LOW);
digitalWrite(in4, LOW);
}
En la sección de bucle del código, llamamos a dos funciones definidas por el usuario con un retraso de un segundo.
void loop() {
directionControl();
delay(1000);
speedControl();
delay(1000);
}
Estas funciones son:
- directionControl() – Esta función hace que ambos motores giren a máxima velocidad durante dos segundos. A continuación, invierte la dirección de giro de los motores y gira durante dos segundos. Por último, detiene los motores.
void directionControl() {
// Set motors to maximum speed
// For PWM maximum possible values are 0 to 255
analogWrite(enA, 255);
analogWrite(enB, 255);
// Turn on motor A & B
digitalWrite(in1, HIGH);
digitalWrite(in2, LOW);
digitalWrite(in3, HIGH);
digitalWrite(in4, LOW);
delay(2000);
// Now change motor directions
digitalWrite(in1, LOW);
digitalWrite(in2, HIGH);
digitalWrite(in3, LOW);
digitalWrite(in4, HIGH);
delay(2000);
// Turn off motors
digitalWrite(in1, LOW);
digitalWrite(in2, LOW);
digitalWrite(in3, LOW);
digitalWrite(in4, LOW);
}
speedControl()– Esta función utiliza la función analogWrite() para generar una señal PWM que acelera ambos motores desde cero hasta la velocidad máxima antes de desacelerarlos nuevamente hasta cero. Finalmente, detiene los motores.
void speedControl() {
// Turn on motors
digitalWrite(in1, LOW);
digitalWrite(in2, HIGH);
digitalWrite(in3, LOW);
digitalWrite(in4, HIGH);
// Accelerate from zero to maximum speed
for (int i = 0; i < 256; i++) {
analogWrite(enA, i);
analogWrite(enB, i);
delay(20);
}
// Decelerate from maximum speed to zero
for (int i = 255; i >= 0; --i) {
analogWrite(enA, i);
analogWrite(enB, i);
delay(20);
}
// Now turn off motors
digitalWrite(in1, LOW);
digitalWrite(in2, LOW);
digitalWrite(in3, LOW);
digitalWrite(in4, LOW);
}
En el siguiente enlace puedes consultar el blog original: link referencia.