Control de motores DC con el L298N: velocidad y sentido de giro con Arduino
¿Cómo funciona el controlador de motores L298N? Puente H, pines ENA, IN1 e IN2, puente de 5V y alimentación, velocidad con PWM, cambio de sentido, código de coche robot con dos motores y uso con ESP32 y Pico.
Los motores DC son los más comunes: mueven ventiladores, ruedas de robots, bombas de agua y coches de juguete. Pero no puedes conectar un motor directamente a un pin de Arduino: consume mucha más corriente de la que el pin puede dar y, para cambiar el sentido de giro, hay que invertir su polaridad. El controlador de motores L298N resuelve los dos problemas a la vez: hace girar dos motores DC adelante y atrás de forma independiente y ajusta su velocidad con PWM. Aparece en casi todos los proyectos de coches robot.

¿Cómo funciona un motor DC y por qué necesita un controlador?
Si aplicas tensión a los dos terminales de un motor DC, gira; si inviertes la polaridad, gira al revés; si bajas la tensión, va más despacio. Hasta un motor de juguete pequeño consume cientos de miliamperios en marcha y más de 1 amperio al arrancar o si se bloquea. Además, como el motor es una bobina, al apagarse genera picos de tensión inversa. Un pin de Arduino da como mucho 20–40 mA y no está protegido contra esos picos; conectar el motor directamente destroza el pin e incluso puede dañar la placa.
¿Qué es un puente H?
La forma de hacer girar un motor en los dos sentidos es un puente H: cuatro interruptores electrónicos colocados alrededor del motor con forma de letra «H». Cuando se cierran dos interruptores en diagonal, la corriente atraviesa el motor en un sentido; cuando se cierra la otra pareja diagonal, en el sentido contrario. El chip L298N contiene dos puentes H, así que controla dos motores por separado. Cada motor usa dos pines de sentido (IN1 e IN2) y un pin de velocidad (ENA):
| IN1 | IN2 | ENA | Qué hace el motor |
|---|---|---|---|
| HIGH | LOW | HIGH o PWM | Gira hacia delante |
| LOW | HIGH | HIGH o PWM | Gira hacia atrás |
| HIGH | HIGH | HIGH | Frena y se para rápido |
| Cualquiera | Cualquiera | LOW | Queda libre y se frena solo |
Características técnicas del L298N
| Característica | Valor |
|---|---|
| Tensión de los motores | 5–35 V (máx. 12 V con el puente de 5V puesto) |
| Corriente por canal | 2 A continuos, 3 A de pico |
| Tensión lógica | 5 V (las entradas también reconocen 3,3 V) |
| Caída de tensión | Unos 1,5–3 V (el motor recibe eso de menos) |
| Motores que puede mover | 2 motores DC o 1 motor paso a paso bipolar |
| Protección | Diodos de protección en la placa |

Pines y alimentación del L298N
| Pin o borna | Función |
|---|---|
| OUT1, OUT2 | Los dos terminales del motor A |
| OUT3, OUT4 | Los dos terminales del motor B |
| 12V (VS) | Alimentación de los motores: positivo de la batería o del adaptador |
| GND | Tierra común: aquí van el negativo de la batería y el GND del Arduino |
| 5V | Salida de 5 V con el puente de 5V puesto; entrada de alimentación lógica si se quita |
| ENA, ENB | Entradas de velocidad (PWM); con sus puentes puestos el motor va siempre a tope |
| IN1, IN2, IN3, IN4 | Entradas de sentido |
Hacer girar un motor adelante, atrás y a distintas velocidades
Primero quita el puente de ENA y conecta ENA al pin D9 del Arduino, IN1 al D8 e IN2 al D7. Conecta el motor a OUT1 y OUT2, y un pack de 2 baterías 18650 (7,4 V) o de 4–6 pilas AA a las bornas 12V y GND; lleva también GND al GND del Arduino. La función motor() de abajo recibe un valor de -255 a 255: positivo es adelante, negativo atrás y cero freno. La idea del control de velocidad está en ¿Qué es PWM?
1const int ENA = 9; // hız (PWM) / speed (PWM)
2const int IN1 = 8;
3const int IN2 = 7;
4
5void motor(int speed) { // -255 … 255
6 if (speed == 0) { // fren / brake
7 digitalWrite(IN1, HIGH);
8 digitalWrite(IN2, HIGH);
9 analogWrite(ENA, 255);
10 return;
11 }
12 digitalWrite(IN1, speed > 0); // ileri ya da geri / forward or backward
13 digitalWrite(IN2, speed < 0);
14 analogWrite(ENA, abs(speed));
15}
16
17void setup() {
18 pinMode(ENA, OUTPUT);
19 pinMode(IN1, OUTPUT);
20 pinMode(IN2, OUTPUT);
21}
22
23void loop() {
24 motor(200); delay(2000); // ileri / forward
25 motor(0); delay(500); // dur / stop
26 motor(-120); delay(2000); // yavaşça geri / slowly backward
27 motor(0); delay(500);
28}Coche robot con dos motores: adelante, atrás, izquierda y derecha
Los coches robot no tienen dirección; giran haciendo que las dos ruedas vayan a distinta velocidad o en distinto sentido. Si los dos motores van hacia delante, el coche va recto; si el izquierdo va hacia atrás y el derecho hacia delante, el coche gira a la izquierda sobre sí mismo. La función drive() de abajo recibe por separado la velocidad de cada motor, de -255 a 255:
1// Sol motor / left motor: ENA=9, IN1=8, IN2=7 — Sağ motor / right motor: ENB=10, IN3=5, IN4=4
2const int ENA = 9, IN1 = 8, IN2 = 7;
3const int ENB = 10, IN3 = 5, IN4 = 4;
4
5void drive(int left, int right) { // her biri -255 … 255 / each -255 … 255
6 digitalWrite(IN1, left >= 0); digitalWrite(IN2, left < 0);
7 digitalWrite(IN3, right >= 0); digitalWrite(IN4, right < 0);
8 analogWrite(ENA, abs(left));
9 analogWrite(ENB, abs(right));
10}
11
12void setup() {
13 int pins[] = {ENA, IN1, IN2, ENB, IN3, IN4};
14 for (int p : pins) pinMode(p, OUTPUT);
15}
16
17void loop() {
18 drive(200, 200); delay(1500); // ileri / forward
19 drive(-200, 200); delay(600); // sola dön / turn left
20 drive(200, -200); delay(600); // sağa dön / turn right
21 drive(-180, -180); delay(1000); // geri / backward
22 drive(0, 0); delay(1000); // dur / stop
23}Si pones un sensor de distancia delante del coche, tendrás un robot que se para y gira al ver un obstáculo; para el sensor, mira Sensor de distancia HC-SR04. Si vas a usar la librería Servo en un Uno, cuidado: desactiva el PWM de los pines 9 y 10, así que pasa ENA y ENB a los pines 5 y 6.
L298N con el ESP32 y la Raspberry Pi Pico
Las entradas del L298N consideran HIGH todo lo que supere unos 2,3 V, así que funcionan directamente con las señales de 3,3 V del ESP32 y de la Pico; eso sí, la alimentación lógica del módulo debe seguir siendo de 5 V. En el ESP32 puedes usar el mismo código de Arduino con pines que admitan PWM para ENA y ENB (por ejemplo, GPIO 25 y 26); los pines 34–39 no pueden dar salida. En la Pico con MicroPython, controlar un motor queda así:
1from machine import Pin, PWM
2import time
3
4ena = PWM(Pin(15), freq=1000)
5in1 = Pin(14, Pin.OUT)
6in2 = Pin(13, Pin.OUT)
7
8def motor(speed): # -100 … 100
9 in1.value(speed > 0)
10 in2.value(speed < 0)
11 ena.duty_u16(int(abs(speed) * 655.35))
12
13while True:
14 motor(80); time.sleep(2) # ileri / forward
15 motor(0); time.sleep(0.5) # dur / stop
16 motor(-50); time.sleep(2) # geri / backward¿L298N, TB6612FNG o MOSFET?
| Controlador | Ventajas | Inconvenientes | Ideal para |
|---|---|---|---|
| L298N | Barato, robusto, 2 A por canal | Pierde unos 2 V, se calienta, grande | Robots de afición, motores de 6–12 V |
| TB6612FNG | Pequeño, eficiente (MOSFET), compatible con 3,3 V | 1,2 A continuos, máx. 13,5 V | Robots pequeños con batería |
| L9110S | Muy pequeño y barato | Unos 800 mA por canal | Minimotores |
| MOSFET suelto (como el IRLZ44N) | Muy eficiente, mucha corriente | Solo un sentido | Ventiladores, bombas, tiras LED |
Si solo necesitas encender y apagar un motor, un relé sirve, pero no regula la velocidad; los comparamos en ¿Qué es un módulo relé? Para elegir un transistor o MOSFET adecuado, echa un vistazo a la herramienta Transistores.
Ideas de proyectos con el L298N
- Robot que esquiva obstáculos: un coche que detecta obstáculos con un HC-SR04 y cambia de dirección.
- Coche controlado por Bluetooth: un robot que manejas con una app del móvil a través de un HC-05.
- Coche con joystick: convierte los dos ejes de un joystick en las velocidades de dos motores; detalles en Cómo usar un módulo joystick.
- Robot sigue líneas: un coche que sigue una línea negra en el suelo con sensores infrarrojos.
- Cortina automática: un sistema motorizado que abre la cortina cuando entra la luz por la mañana y la cierra por la noche.
- Cinta transportadora: una pequeña cinta cuya velocidad ajustas con un potenciómetro.
Errores comunes y cómo solucionarlos
- El LED del módulo se enciende pero el motor no gira: las tierras no están unidas, se quitó el puente de ENA sin conectar el pin, o el valor PWM es demasiado bajo.
- El Arduino se reinicia cuando arranca el motor: motor y Arduino comparten una fuente débil; aliméntalos por separado y suelda un condensador de 100 nF entre los terminales del motor.
- El motor va muy lento y sin fuerza: el L298N se come unos 2 V; sube la tensión de la batería (por ejemplo, 2 × 18650) o usa un controlador más eficiente.
- El motor solo gira en un sentido: uno de los pines IN no está conectado, o el código escribe los mismos valores para los dos sentidos.
- El L298N se calienta mucho: el motor consume demasiada corriente; asegúrate de que el disipador esté al aire y, si hace falta, elige un controlador más potente.
- Usar una pila de 9 V: no puede dar mucha corriente y se agota enseguida; usa un pack recargable de 18650 o de pilas AA.
Cuando dominas el control de motores con el L298N, se te abre el mundo de los robots. En la app BlueGrays encontrarás proyectos con el L298N, como un coche controlado por Bluetooth y un robot que esquiva obstáculos, paso a paso con esquemas y código.
Preguntas frecuentes
¿Cuántos motores puede mover el L298N?
Como el L298N tiene dos puentes H, puede mover dos motores DC de forma independiente, hacia delante y hacia atrás y a distintas velocidades. Usando los dos canales juntos, también puede mover un motor paso a paso bipolar.
¿Para qué sirve el puente de 5V del L298N?
Con el puente puesto, el regulador de la placa saca 5 V de la alimentación de los motores para alimentar el chip; esos 5 V también puedes usarlos para alimentar el Arduino. Si la alimentación de los motores supera los 12 V, el regulador puede sobrecalentarse, así que quita el puente y lleva 5 V aparte al pin 5V.
¿Qué batería conecto al L298N?
Para motores pequeños de 6–9 V, 2 baterías de litio 18650 (7,4 V) o 6 pilas AA (9 V) son buena opción. Como el L298N pierde unos 2 V, elige una fuente algo por encima de la tensión nominal del motor. Las pilas de 9 V no dan corriente suficiente para mover motores.
¿Por qué se quita el puente de ENA?
Con el puente de ENA puesto, el motor gira siempre a la máxima velocidad. Para regularla, quita el puente y conecta ENA a un pin PWM del Arduino; así podrás ajustar la velocidad de 0 a 255 con analogWrite.
¿Por qué mi motor no gira a baja velocidad?
Un motor necesita una tensión mínima para vencer el rozamiento y arrancar, y la caída de tensión del L298N lo complica aún más. Normalmente, cuando el valor PWM baja de 80–120, el motor solo zumba. Fija una velocidad mínima en el código o usa una fuente de más tensión.
¿El L298N funciona con el ESP32 y la Raspberry Pi Pico?
Sí. Las entradas del L298N reconocen una señal de 3,3 V como HIGH, así que se puede conectar directamente al ESP32 y a la Pico. La parte lógica del módulo debe seguir alimentándose a 5 V y todas las tierras deben estar unidas.
Proyectos para hacer después de leer esto
Ver todos los proyectos
Coche controlado por Bluetooth con L298N
Proyecto de coche robot 2WD (dos motores, cuatro ruedas) que se puede controlar desde el teléfono con Arduino y el módulo Bluetooth HC-05. Un total de cuatro ruedas se accionan simultáneamente mediant

Robot para evitar obstáculos
¿Qué le parece construir un vehículo inteligente que encuentre su propio camino? El Robot Evitador de Obstáculos explora constantemente su entorno gracias al sensor ultrasónico que lleva delante. Cuan

Servocontrol con joystick
Proyecto Pan-tilt que controla independientemente dos servomotores en los ejes X e Y con módulo joystick. Enseña la lógica de integración joystick-servo y seguimiento de posición.

Servomotor ESP32 (control mediante potenciómetro)
En este proyecto controlamos un servomotor SG90 mediante un potenciómetro. Ajustamos el ángulo del servo asignando el valor analógico leído en el potenciómetro al rango de 0 a 180 grados. Gracias a la biblioteca ESP32Servo, cualquier GPIO del ESP32 puede generar una señal PWM. Este es un método de control básico para brazos robóticos, cardanes de cámara y mecanismos de puertas automáticas.

Control Led con Joystick
Proyecto de control que enciende LEDs en 4 direcciones diferentes según los valores de los ejes X e Y del módulo joystick. Enseña la lectura analógica del joystick y la lógica de detección de direcció

ESP32 HC-SR04 Medidor de distancia por ultrasonidos
El sensor ultrasónico HC-SR04 calcula la distancia midiendo el tiempo de vuelo (Time of Flight) de la onda sonora que emite al chocar contra un objeto y rebotar. En este proyecto, enviaremos un pulso de 10 microsegundos al pin TRIG del ESP32 y leeremos el tiempo de eco procedente del pin ECHO mediante `pulseIn()`. Imprimiremos la distancia calculada en centímetros en el monitor serie. Dado que el HC-SR04 funciona a 5 V, es obligatorio utilizar un **divisor de tensión** en el pin ECHO; de lo cont

Sensor de aparcamiento ESP32 (HC-SR04 + barra de 5 LED + zumbador + OLED)
¡La versión ESP32 del sensor de aparcamiento para coches! Medimos la distancia al objeto que hay delante mediante el sensor ultrasónico HC-SR04. A medida que la distancia disminuye, la barra de 5 LED se va llenando (verde → amarillo → rojo) y la frecuencia de los pitidos del zumbador se acorta. Cuando se acerca demasiado (menos de 10 cm), suena una alarma continua y se encienden todos los LED. En la pantalla OLED SSD1306 se muestra, en letra grande, el valor actual en centímetros, un mensaje de

HC-SR04 Medición de distancia (pantalla en serie)
Sensor ultrasónico HC-SR04 para medir distancias y mostrar el resultado en cm en el monitor serie. Enseña el principio del cálculo de distancias con ondas sonoras.
Más artículos
Aprende por qué un motor DC no se conecta directamente a Arduino, cómo funciona un puente H, los pines y la alimentación del L298N, el control de velocidad y sentido con PWM y un coche robot de dos motores paso a paso.

