tutoriales.com

Potencia tu Arduino: Control de Motores DC con el Driver L298N

Este tutorial te enseñará a integrar y controlar motores de corriente continua (DC) en tus proyectos de electrónica utilizando el popular módulo driver L298N y una placa Arduino. Descubre cómo manejar la dirección y velocidad de los motores con explicaciones claras y ejemplos prácticos. Ideal para quienes buscan añadir movimiento a sus creaciones.

Principiante20 min de lectura10 views
Reportar error

🚀 Introducción al Control de Motores DC con L298N y Arduino

¿Alguna vez has soñado con construir tu propio robot móvil, un coche teledirigido o cualquier proyecto que requiera movimiento? Los motores de corriente continua (DC) son el corazón de estas creaciones, proporcionando la fuerza para hacer que las cosas giren. Sin embargo, no puedes simplemente conectar un motor DC directamente a tu Arduino; necesitan más corriente de la que la placa puede suministrar y, a menudo, requieren inversión de polaridad para cambiar de dirección.

Aquí es donde entra en juego el driver L298N: un puente H dual diseñado específicamente para controlar motores DC y motores paso a paso. Este módulo actúa como un intermediario robusto, permitiendo que tu Arduino envíe señales de bajo voltaje para controlar la potencia de motores de mayor voltaje y corriente.

En este tutorial, te guiaremos paso a paso a través de la conexión, configuración y programación del módulo L298N con Arduino para controlar dos motores DC de forma independiente, ¡dando vida a tus proyectos!

💡 Consejo: Un buen punto de partida para cualquier proyecto de robótica o automatización es entender cómo controlar el movimiento. El L298N es una herramienta fundamental para esto.

🔍 ¿Qué es un Motor DC y por qué necesitamos un Driver?

Un motor DC es un dispositivo electromecánico que convierte energía eléctrica en energía mecánica, produciendo un movimiento rotatorio. Son omnipresentes en nuestra vida diaria, desde juguetes y impresoras hasta discos duros y vehículos eléctricos. Su principal característica es que la dirección de giro depende de la polaridad del voltaje aplicado, y su velocidad depende de la magnitud de este voltaje.

⚡ Limitaciones de Arduino para Motores

La placa Arduino, aunque versátil, tiene limitaciones en cuanto a la corriente que puede suministrar por sus pines digitales (generalmente unos 20-40 mA por pin) y su voltaje de operación (5V). Los motores DC, incluso los pequeños, suelen requerir corrientes mucho mayores (cientos de mA o incluso varios Amperes) y a menudo voltajes superiores a 5V para funcionar eficientemente. Si intentaras conectar un motor directamente a un pin de Arduino, podrías dañar la placa.

Además, para cambiar la dirección de un motor DC, necesitas invertir la polaridad de la alimentación. Hacer esto manualmente o con solo transistores es posible, pero complejo para múltiples motores. Aquí es donde el puente H se convierte en la solución ideal.

🏗️ El Puente H: El Corazón del Control de Motores

Un puente H es un circuito electrónico que permite aplicar voltaje a través de una carga en cualquier dirección. Consiste en cuatro interruptores (transistores) dispuestos de tal manera que puedes cambiar el sentido de la corriente que fluye a través del motor. El módulo L298N contiene dos de estos puentes H, lo que le permite controlar dos motores DC de forma independiente o un motor paso a paso bipolar.

Diagrama de Puente H Fuente Vcc (+) GND (-) S1 S3 S2 S4 MOTOR GIRO A: S1 + S4 CERRADOS GIRO B: S2 + S3 CERRADOS

Al activar un par de interruptores en diagonal, la corriente fluye en una dirección a través del motor. Al activar el otro par en diagonal, la corriente fluye en la dirección opuesta, haciendo que el motor gire en sentido contrario.


⚙️ Conociendo el Módulo Driver L298N

El L298N es un circuito integrado que a menudo viene montado en un módulo con bornes de conexión, reguladores de voltaje y LEDs indicadores, lo que facilita su uso. Es capaz de controlar dos motores DC o un motor paso a paso con corrientes de hasta 2A por canal y voltajes de hasta 35V.

📌 Características Clave del L298N

  • Voltaje de Operación Lógico: 5V (suministrado por Arduino o regulador interno).
  • Voltaje de Operación del Motor: 5V a 35V (dependiendo de la versión del módulo, algunos hasta 46V).
  • Corriente Máxima por Canal: 2A (pico, generalmente 1.5A continuo).
  • Número de Canales: 2 (puentes H independientes).
  • Disipación de Calor: Incluye un disipador grande, ya que el chip tiende a calentarse bajo carga.

🗺️ Pines del Módulo L298N

El módulo L298N tiene varios pines importantes. A continuación, se detallan los más comunes:

PinFunciónNotas
---------
OUT1, OUT2Salidas para el Motor AConectar los terminales del primer motor DC aquí.
OUT3, OUT4Salidas para el Motor BConectar los terminales del segundo motor DC aquí.
---------
ENAHabilitación del Motor A (Velocidad)Se utiliza para controlar la velocidad del Motor A mediante PWM. Si se retira el jumper, se conecta a un pin PWM de Arduino. Con el jumper puesto, el motor A está siempre habilitado a máxima velocidad.
ENBHabilitación del Motor B (Velocidad)Similar a ENA, para el Motor B.
---------
IN1, IN2Entradas de Control para el Motor AEstas dos entradas determinan la dirección del Motor A.
IN3, IN4Entradas de Control para el Motor BEstas dos entradas determinan la dirección del Motor B.
---------
+5VSalida/Entrada de 5VPuede ser una salida de 5V regulada (si el jumper de 5V está puesto y se alimenta con VCC > 7V) o una entrada si estás alimentando el chip lógico directamente con 5V (cuando VCC es 5-7V, o si quieres usar una fuente de 5V externa para la lógica).
GNDTierra ComúnConectar a la tierra de Arduino y de la fuente de alimentación externa.
---------
+VCCEntrada de Voltaje para MotoresFuente de alimentación externa para los motores (normalmente de 7V a 35V). Si usas 5-7V, el jumper de 5V debe ser quitado y alimentas la lógica por el pin +5V.
⚠️ Advertencia: NUNCA conectes el pin +VCC a la salida de 5V o 3.3V de tu Arduino. Necesitas una fuente de alimentación externa para los motores.

🛠️ Conexión del L298N con Arduino y Motores DC

Ahora vamos a ver cómo conectar todos los componentes. Es crucial seguir este esquema cuidadosamente para evitar daños a tus dispositivos.

📝 Materiales Necesarios

  • 1x Placa Arduino (Uno, Nano, Mega, etc.)
  • 1x Módulo Driver L298N
  • 2x Motores DC (pequeños, por ejemplo, de 3V-9V, con cables)
  • 1x Fuente de Alimentación Externa (ej. batería de 9V, fuente de 12V con adaptador, fuente de laboratorio). Asegúrate de que el voltaje sea adecuado para tus motores.
  • Cables Jumper (macho-macho y macho-hembra)
  • Protoboard (opcional, para conexiones auxiliares)

🔌 Esquema de Conexión Paso a Paso

  1. Conectar la Tierra (GND) Común:

    • Conecta el pin GND del módulo L298N al pin GND de tu Arduino.
    • Conecta el GND de la fuente de alimentación externa también al GND del L298N y al GND de Arduino. Es fundamental que todas las tierras estén unidas.
  2. Alimentación del Motor (VCC_Motor):

    • Conecta el terminal positivo (+) de tu fuente de alimentación externa al pin +VCC del módulo L298N.
    • 📌 Nota: Si tu fuente de alimentación externa es de 7-12V, el regulador de 5V interno del L298N se activará y proporcionará 5V en el pin +5V del módulo. Puedes usar este 5V para alimentar la lógica de otros componentes o incluso el propio Arduino (aunque no es lo ideal si ya alimentas Arduino por USB). Si tu fuente externa es de 5V o menos, **debes quitar el jumper de 5V del L298N** y alimentar su pin `+5V` desde el `5V` de Arduino.
  3. Conexión de los Motores DC:

    • Conecta los dos cables del primer motor DC a los pines OUT1 y OUT2 del L298N.
    • Conecta los dos cables del segundo motor DC a los pines OUT3 y OUT4 del L298N.
    • La polaridad inicial no importa; si el motor gira al revés, puedes invertir los cables o la lógica de programación.
  4. Pines de Control del Motor A (Dirección y Velocidad):

    • Conecta IN1 del L298N a un pin digital de Arduino (ej. 2).
    • Conecta IN2 del L298N a un pin digital de Arduino (ej. 3).
    • Conecta ENA del L298N a un pin PWM de Arduino (ej. 9). Quita el jumper de ENA para poder controlar la velocidad por PWM. Si dejas el jumper, el motor siempre funcionará a máxima velocidad.
  5. Pines de Control del Motor B (Dirección y Velocidad):

    • Conecta IN3 del L298N a un pin digital de Arduino (ej. 4).
    • Conecta IN4 del L298N a un pin digital de Arduino (ej. 5).
    • Conecta ENB del L298N a un pin PWM de Arduino (ej. 10). Quita el jumper de ENB para poder controlar la velocidad por PWM.
ARDUINO UNO L298N DRIVER MOTOR 1 MOTOR 2 BATERÍA (VCC) VCC GND GND 5V D9(PWM) -> ENA D10(PWM) -> ENB D2 -> IN1 D3 -> IN2 D4 -> IN3 D5 -> IN4 OUT1/2 OUT3/4 ENA IN1 IN2 IN3 IN4 ENB

👨‍💻 Programando Arduino para el Control de Motores

Una vez que las conexiones físicas están hechas, el siguiente paso es escribir el código de Arduino para controlar los motores. Utilizaremos las funciones digitalWrite() para la dirección y analogWrite() (PWM) para la velocidad.

💡 Lógica de Control de Dirección

Para un motor DC, hay cuatro estados posibles para los pines INx y INy:

INxINyEstado del Motor
---------
LOWLOWFrenado Rápido (Cortocircuito los terminales del motor)
LOWHIGHGira en una Dirección
---------
HIGHLOWGira en la Dirección Opuesta
HIGHHIGHFrenado Rápido (Cortocircuito los terminales del motor)
📌 Nota: Los estados `LOW`/`LOW` y `HIGH`/`HIGH` cortocircuitan los terminales del motor a través de los transistores del puente H, lo que lo frena rápidamente. Es una forma efectiva de detener el motor.

Primer Código: Control Básico de un Motor

Vamos a empezar con un ejemplo simple para controlar la dirección y velocidad de un solo motor.

// Definición de pines para el Motor A
const int in1 = 2;   // Pin IN1 del L298N
const int in2 = 3;   // Pin IN2 del L298N
const int enA = 9;   // Pin ENA del L298N (PWM para velocidad)

void setup() {
  // Configurar los pines como OUTPUT
  pinMode(in1, OUTPUT);
  pinMode(in2, OUTPUT);
  pinMode(enA, OUTPUT);

  // Inicializar el motor detenido
  digitalWrite(in1, LOW);
  digitalWrite(in2, LOW);
  analogWrite(enA, 0); // Velocidad 0
}

void loop() {
  // Girar el motor en una dirección a media velocidad
  digitalWrite(in1, HIGH);
  digitalWrite(in2, LOW);
  analogWrite(enA, 150); // Velocidad media (0-255)
  delay(2000); // Mantener por 2 segundos

  // Detener el motor
  digitalWrite(in1, LOW);
  digitalWrite(in2, LOW);
  analogWrite(enA, 0);
  delay(1000);

  // Girar el motor en la dirección opuesta a máxima velocidad
  digitalWrite(in1, LOW);
  digitalWrite(in2, HIGH);
  analogWrite(enA, 255); // Velocidad máxima
  delay(2000);

  // Detener el motor
  digitalWrite(in1, LOW);
  digitalWrite(in2, LOW);
  analogWrite(enA, 0);
  delay(1000);
}

Explicación del Código:

  • const int in1 = 2;, const int in2 = 3;, const int enA = 9;: Declaran las variables para los pines de control del motor A. Asegúrate de que enA esté conectado a un pin PWM (con el símbolo ~ en tu Arduino Uno, como 3, 5, 6, 9, 10, 11).
  • pinMode(pin, OUTPUT);: Configura estos pines como salidas.
  • digitalWrite(in1, HIGH); digitalWrite(in2, LOW);: Define la dirección de giro. Invierte HIGH y LOW para cambiar la dirección.
  • analogWrite(enA, 150);: Establece la velocidad del motor. analogWrite() usa PWM (Pulse Width Modulation) para simular diferentes voltajes. El valor puede ir de 0 (motor parado) a 255 (máxima velocidad).
  • delay(ms);: Introduce pausas para observar el comportamiento del motor.

🤖 Control de Dos Motores DC (Robot Básico)

Para un control más avanzado, como el de un robot móvil, necesitas controlar ambos motores de forma independiente. Aquí tienes un ejemplo que permite mover el robot hacia adelante, hacia atrás, girar y detenerse.

// Definición de pines para el Motor A (Izquierdo)
const int in1A = 2;   // IN1 del L298N
const int in2A = 3;   // IN2 del L298N
const int enA  = 9;   // ENA del L298N (PWM)

// Definición de pines para el Motor B (Derecho)
const int in1B = 4;   // IN3 del L298N
const int in2B = 5;   // IN4 del L298N
const int enB  = 10;  // ENB del L298N (PWM)

void setup() {
  // Configurar pines del Motor A como OUTPUT
  pinMode(in1A, OUTPUT);
  pinMode(in2A, OUTPUT);
  pinMode(enA,  OUTPUT);

  // Configurar pines del Motor B como OUTPUT
  pinMode(in1B, OUTPUT);
  pinMode(in2B, OUTPUT);
  pinMode(enB,  OUTPUT);

  // Asegurarse de que los motores estén detenidos al inicio
  stopMotors();
}

void loop() {
  // Mover hacia adelante a media velocidad
  moveForward(180);
  delay(2000);
  stopMotors();
  delay(1000);

  // Mover hacia atrás a velocidad reducida
  moveBackward(120);
  delay(2000);
  stopMotors();
  delay(1000);

  // Girar a la izquierda (Motor Izquierdo hacia atrás, Motor Derecho hacia adelante)
  turnLeft(200);
  delay(1500);
  stopMotors();
  delay(1000);

  // Girar a la derecha (Motor Izquierdo hacia adelante, Motor Derecho hacia atrás)
  turnRight(200);
  delay(1500);
  stopMotors();
  delay(1000);
}

// Función para mover ambos motores hacia adelante
void moveForward(int speed) {
  digitalWrite(in1A, HIGH); // Motor A hacia adelante
  digitalWrite(in2A, LOW);
  analogWrite(enA, speed);

  digitalWrite(in1B, HIGH); // Motor B hacia adelante
  digitalWrite(in2B, LOW);
  analogWrite(enB, speed);
}

// Función para mover ambos motores hacia atrás
void moveBackward(int speed) {
  digitalWrite(in1A, LOW);  // Motor A hacia atrás
  digitalWrite(in2A, HIGH);
  analogWrite(enA, speed);

  digitalWrite(in1B, LOW);  // Motor B hacia atrás
  digitalWrite(in2B, HIGH);
  analogWrite(enB, speed);
}

// Función para detener ambos motores (frenado rápido)
void stopMotors() {
  digitalWrite(in1A, LOW);
  digitalWrite(in2A, LOW);
  analogWrite(enA, 0);

  digitalWrite(in1B, LOW);
  digitalWrite(in2B, LOW);
  analogWrite(enB, 0);
}

// Función para girar a la izquierda (Motor A hacia atrás, Motor B hacia adelante)
void turnLeft(int speed) {
  digitalWrite(in1A, LOW);
  digitalWrite(in2A, HIGH);
  analogWrite(enA, speed);

  digitalWrite(in1B, HIGH);
  digitalWrite(in2B, LOW);
  analogWrite(enB, speed);
}

// Función para girar a la derecha (Motor A hacia adelante, Motor B hacia atrás)
void turnRight(int speed) {
  digitalWrite(in1A, HIGH);
  digitalWrite(in2A, LOW);
  analogWrite(enA, speed);

  digitalWrite(in1B, LOW);
  digitalWrite(in2B, HIGH);
  analogWrite(enB, speed);
}

Mejoras en este código:

  • Funciones Reutilizables: Se han creado funciones (moveForward, moveBackward, stopMotors, turnLeft, turnRight) para encapsular la lógica de control, haciendo el código más modular y fácil de leer. Esto es muy útil para proyectos más grandes.
  • Parámetro de Velocidad: Las funciones de movimiento aceptan un parámetro speed (0-255), lo que permite controlar la velocidad de forma dinámica.
  • Claridad: Las variables tienen nombres descriptivos (in1A, enB), lo que mejora la legibilidad.
🔥 Importante: La dirección de giro de tus motores puede variar. Si un motor gira en sentido contrario al esperado (ej. `moveForward` hace que un motor gire hacia atrás), simplemente invierte los cables de ese motor en el L298N (ej. `OUT1` con `OUT2`). No necesitas cambiar el código.

💡 Consejos y Buenas Prácticas

Para maximizar la vida útil de tus componentes y garantizar el buen funcionamiento de tus proyectos, considera los siguientes puntos:

  • Fuente de Alimentación: Utiliza una fuente de alimentación externa que pueda suministrar suficiente corriente para tus motores, especialmente si van a trabajar bajo carga. Una batería de 9V (las pequeñas cuadradas) es solo para pruebas ligeras; para uso continuo o motores más grandes, necesitarás algo más robusto.
  • Disipación de Calor: El L298N puede calentarse significativamente, especialmente a altas corrientes. Asegúrate de que el disipador de calor esté correctamente instalado y, si trabajas con motores potentes, considera la posibilidad de añadir ventilación o un disipador más grande.
  • Capacitores de Filtrado: Algunos motores DC generan ruido eléctrico al conmutar, lo que puede afectar la estabilidad de tu Arduino. Añadir pequeños capacitores cerámicos (ej. 0.1µF) entre los terminales del motor y entre cada terminal y la carcasa del motor puede ayudar a suprimir este ruido.
  • Diodos Flyback (Opcional pero Recomendado): Aunque el L298N a menudo tiene diodos flyback integrados en el módulo, a veces no son lo suficientemente robustos. Los motores son cargas inductivas y generan picos de voltaje cuando se apagan, lo que puede dañar el driver. Puedes añadir diodos 1N4001 o 1N4007 en paralelo con cada terminal del motor, con el cátodo apuntando hacia el polo positivo del motor (para atrapar el voltaje inducido). Esto es especialmente importante para motores grandes.
  • Pruebas Progresivas: Empieza con el código más simple (un motor, sin control de velocidad), y añade complejidad gradualmente. Esto te ayudará a depurar problemas más fácilmente.
¿Por qué el L298N se calienta tanto?El L298N es un driver lineal, lo que significa que disipa la energía sobrante como calor. Cuando controlas la velocidad de un motor reduciendo el voltaje (o con PWM), la diferencia de voltaje entre la fuente de alimentación y lo que el motor realmente usa se convierte en calor dentro del chip. Por eso, un buen disipador de calor es esencial. Drivers más modernos como el DRV8833 o el A4988 usan tecnología MOSFET y son más eficientes, disipando menos calor, pero son para motores más pequeños o diferentes.

✅ Proyectos donde puedes aplicar el L298N

El control de motores DC es una habilidad fundamental que abre la puerta a una infinidad de proyectos. Aquí tienes algunas ideas para inspirarte:

  • Robots Móviles: Coches, tanques, robots seguidores de línea o esquiva-obstáculos.
  • Ventiladores Controlados: Controlar la velocidad de un ventilador en función de la temperatura o manualmente.
  • Cortinas Automáticas: Un motor DC para abrir y cerrar persianas o cortinas.
  • Sistemas de Elevación: Pequeños ascensores o plataformas controladas.
  • Dispensadores Automáticos: Dispensadores de comida para mascotas o cualquier sistema que requiera un mecanismo de empuje/giro.
  • Gimbal para Cámaras Pequeñas: Controlar la orientación de una cámara con motores DC (con retroalimentación).

Fácil Intermedio Robótica Automatización


🏁 Conclusión

¡Felicidades! Has completado una guía exhaustiva para controlar motores DC con Arduino utilizando el driver L298N. Ahora tienes el conocimiento y las herramientas para añadir movimiento y dinamismo a tus proyectos electrónicos. Recuerda la importancia de las conexiones correctas, la alimentación adecuada y la lógica de programación para asegurar el éxito.

El L298N es un componente robusto y muy utilizado en el mundo de la robótica y la automatización DIY. Experimenta con diferentes velocidades, patrones de movimiento y combina este conocimiento con sensores para crear proyectos aún más inteligentes y autónomos. ¡El límite es tu imaginación!

Tutorial Completo

Tutoriales relacionados

Comentarios (0)

Aún no hay comentarios. ¡Sé el primero!