Clase: Motores y Puente H con Arduino
Clase: Control Avanzado con L298N y tu Primer Robot Autónomo
En clases anteriores aprendimos a darle "ojos" a nuestro Arduino usando el Sensor Ultrasónico y el Sensor Infrarrojo (IR). Hoy aprenderemos a darle "músculos" reales usando el Driver L298N para controlar motores, variando tanto su dirección como su velocidad, y uniremos todo para crear un robot autónomo.
¿Qué es un L298N y por qué lo necesitamos?
Como comentamos frecuentemente, el Arduino es el "cerebro" y no tiene la potencia eléctrica suficiente para mover actuadores pesados como los motores de corriente continua (DC). Si conectas un motor directo al Arduino, podrías quemar la placa.
El L298N es un controlador (driver) de motores ampliamente usado en robótica por su bajo costo y gran utilidad. Actúa como un intermediario: recibe energía fuerte de una batería y recibe órdenes lógicas (suaves) del Arduino.
- Potencia: Soporta hasta 2 Amperios por salida (3A de pico) y voltajes de 3V a 35V.
- Eficiencia Térmica: La electrónica interna consume unos 3V. Es decir, el motor recibe 3V menos que la batería, disipando el resto como calor (por eso tiene un disipador de aluminio). En la práctica, es ideal para corrientes de 0.8A a 1A.
- Protección: Incluye diodos para evitar que las corrientes inducidas (flyback) del motor dañen el circuito.
¿Cómo funciona por dentro? El famoso "Puente H"
Básicamente, un L298N contiene dos Puentes H (uno para cada motor). Un puente H es una formación de 4 transistores (interruptores electrónicos) conectados entre el voltaje positivo (Vcc) y la tierra (GND), con el motor en el medio, formando la letra "H".
- Activando los transistores en diagonal, la corriente fluye en un sentido (Avance).
- Activando la otra diagonal, la corriente se invierte (Reversa).
- Conectando simultáneamente los de abajo, el motor entra en cortocircuito controlado (Freno).
- Nota: La placa evita automáticamente que enciendas los de un mismo lado para prevenir cortocircuitos reales.
Velocidad y Control (Pines IN y EN)
El L298N agrupa las conexiones de los Puentes H en pines muy fáciles de usar:
- IN1 e IN2: Controlan la dirección del Motor A (Izquierdo).
- IN3 e IN4: Controlan la dirección del Motor B (Derecho).
- ENA y ENB (Enable): Controlan la velocidad. Si les enviamos una señal PWM (
analogWritede 0 a 255), podemos hacer que el robot vaya más rápido o más lento.
Esquema de Conexiones y el Jumper de 5V
¡Regla de Oro! Une siempre las tierras (GND) del Arduino, la batería y el L298N. Además, presta atención al jumper del regulador de voltaje:
- Si tu batería es de menos de 12V: Deja el jumper puesto. El L298N creará 5V y puedes usarlos para encender tu Arduino.
- Si tu batería es mayor a 15V: ¡Quita el jumper! O quemarás el regulador. En este caso, tú debes inyectar 5V al L298N desde el Arduino para que su lógica funcione.
| Pin en L298N | Función | Conecta en Arduino |
|---|---|---|
| 12V / GND | Energía principal | Positivo / Negativo Batería (Unir GNDs) |
| ENA (Motor A) | Velocidad (PWM) | Pin Digital 6 (con símbolo ~) |
| IN1 / IN2 | Dirección Motor Izq | Pin Digital 7 y 8 |
| IN3 / IN4 | Dirección Motor Der | Pin Digital 9 y 10 |
| ENB (Motor B) | Velocidad (PWM) | Pin Digital 11 (con símbolo ~) |
Código Nivel Experto: Funciones y Arrays
Cuando hacemos proyectos más grandes (como robots), escribir digitalWrite todo el tiempo ensucia el código. Es mejor agrupar los pines en arreglos (arrays) y crear funciones reutilizables. Aquí tienes la estructura base ideal:
const int pinENA = 6;
const int pinIN1 = 7;
const int pinIN2 = 8;
const int pinIN3 = 9;
const int pinIN4 = 10;
const int pinENB = 11;
// Arrays: Agrupamos {Pin_Velocidad, Pin_Dir_1, Pin_Dir_2}
const int motorA[3] = { pinENA, pinIN1, pinIN2 };
const int motorB[3] = { pinENB, pinIN3, pinIN4 };
void setup() {
// Configurar todos como OUTPUT (omitido por brevedad)
}
void loop() {
moverAdelante(motorA, 180); // Velocidad al 70% (180/255)
moverAdelante(motorB, 180);
delay(2000);
frenarTotal(motorA);
frenarTotal(motorB);
delay(2000);
}
// --- FUNCIONES REUTILIZABLES ---
void moverAdelante(const int motor[3], int velocidad) {
digitalWrite(motor[1], HIGH);
digitalWrite(motor[2], LOW);
analogWrite(motor[0], velocidad); // Señal PWM de 0 a 255
}
void frenarTotal(const int motor[3]) {
digitalWrite(motor[1], LOW);
digitalWrite(motor[2], LOW);
analogWrite(motor[0], 0);
}
Simulador Final: El Robot Evasor
Sabiendo esto, si le añadimos la lógica if / else de un sensor ultrasónico, obtenemos un robot que toma decisiones. Toca el botón para simular un obstáculo en el camino de nuestro robot.
EMS
ESTADO: Avanzando (Camino Libre)
