Documentation

L298N Motor Driver Controller Board Module for Stepper Motor & DC Dual H-Bridge
Documentation / L298N Motor Driver Controller Board Module for Stepper Motor & DC Dual H-Bridge

L298N Motor Driver Controller Board Module for Stepper Motor & DC Dual H-Bridge

Overview

The L298N is a dual H-bridge motor driver module that lets a microcontroller control up to two DC motors or one bipolar stepper motor — independently controlling direction and speed using PWM. It's the classic driver for robot cars, conveyor belts, small CNC projects, and anywhere you need to drive motors that would otherwise blow out a microcontroller's GPIO pins. The module handles up to 46V and ~2A per channel (3A peak), with a big heatsink on the STMicro L298N chip to soak up thermal loads.

The board has two terminal blocks for motor outputs (OUT1/OUT2 and OUT3/OUT4), a power input block for motor supply (5V to 35V recommended) plus a 5V logic output from the onboard 78M05 regulator, and six input pins (ENA, IN1, IN2, IN3, IN4, ENB) for control. ENA and ENB accept PWM for speed control; IN1–IN4 set direction per motor.

This manual covers specifications, the pinout, wiring for Arduino, ESP32, Raspberry Pi, and the Pico, a working DC-motor "hello world" example per platform, and FAQs on voltage drop, jumper behavior, and overheating.

At a Glance

Motors
2x DC or 1x Stepper
Motor Voltage
5V - 35V
Peak Current
2A / channel (3A peak)
Logic Voltage
3.3V - 5V
Control
PWM + Direction
Onboard 5V Reg
Up to ~500 mA

Specifications

Parameter Value
Driver IC STMicroelectronics L298N (dual H-bridge)
Motor Supply Voltage 5V - 35V (12V typical)
Logic Supply Voltage 5V (generated on-board or external)
Output Current (Continuous) 2A per channel
Output Current (Peak) 3A per channel
Voltage Drop (across H-bridge) ~1.8 - 2V (typical)
Control Inputs ENA, IN1, IN2, IN3, IN4, ENB
PWM Frequency Range Up to ~25 kHz
Protection Flyback diodes, thermal shutdown
Onboard 5V Regulator Enabled via jumper (disable when motor supply > 12V)
Board Format Screw terminals + 0.1" headers

Pinout Diagram

L298N Motor Driver Pinout Diagram

Wiring Guide

Arduino Wiring

Use a separate motor supply (7–12V battery) for the 12V input, and keep the 5V-regulator jumper ON so the board powers its own logic. Connect all GNDs together.

L298N Pin Arduino / Source Details
12V Battery + (7–12V) Motor supply
GND Battery − AND Arduino GND Common ground
5V (out) to Arduino 5V Only if jumper enabled and supply ≤ 12V
ENA D9 (PWM) Motor A speed
IN1 D8 Motor A direction
IN2 D7 Motor A direction
IN3 D5 Motor B direction
IN4 D4 Motor B direction
ENB D3 (PWM) Motor B speed
OUT1/OUT2 Motor A leads DC motor A
OUT3/OUT4 Motor B leads DC motor B
Warning: Remove the onboard 5V-regulator jumper when your motor supply is above 12V — otherwise the 78M05 regulator can overheat.
Tip: For full-speed (no PWM) operation, leave the ENA and ENB jumpers ON; for speed control, remove the jumpers and feed PWM into the header pins.

ESP32 Wiring

The ESP32's 3.3V logic is enough to drive the L298N inputs. Use any GPIO for direction and any LEDC-capable pin for PWM.

L298N Pin ESP32 Pin Details
12V Battery + Motor supply
GND Common ground Battery − and ESP32 GND
ENA GPIO 13 (LEDC/PWM) Motor A speed
IN1 GPIO 14 Motor A direction
IN2 GPIO 27 Motor A direction
IN3 GPIO 26 Motor B direction
IN4 GPIO 25 Motor B direction
ENB GPIO 33 (LEDC/PWM) Motor B speed
Info: Do NOT power the ESP32 from the L298N's 5V output if your motor supply exceeds 12V. Use a dedicated 5V source or USB.

Raspberry Pi Wiring

The Pi's 3.3V GPIO output can drive the L298N inputs. Use hardware PWM pins for smoothest speed control.

L298N Pin Raspberry Pi Pin Details
12V Battery + Motor supply
GND Battery − AND Pi GND (Pin 6) Common ground
ENA GPIO 12 (Pin 32, PWM) Motor A speed
IN1 GPIO 23 (Pin 16) Motor A direction
IN2 GPIO 24 (Pin 18) Motor A direction
IN3 GPIO 27 (Pin 13) Motor B direction
IN4 GPIO 22 (Pin 15) Motor B direction
ENB GPIO 13 (Pin 33, PWM) Motor B speed
Warning: Never power the Raspberry Pi from the L298N's 5V output. The regulator is not clean or robust enough for a Pi — use a dedicated USB supply.

Raspberry Pi Pico Wiring

The Pico has plenty of PWM-capable pins (any GP pin). Wire the L298N inputs to any free GP pins.

L298N Pin Pico Pin Details
12V Battery + Motor supply
GND Battery − AND Pico GND Common ground
ENA GP2 (PWM) Motor A speed
IN1 GP3 Motor A direction
IN2 GP4 Motor A direction
IN3 GP5 Motor B direction
IN4 GP6 Motor B direction
ENB GP7 (PWM) Motor B speed

Code Examples

Arduino

l298n_dc_motor.ino
// L298N - Drive 2 DC motors forward, backward, and stop
// Motor A: ENA=D9, IN1=D8, IN2=D7
// Motor B: ENB=D3, IN3=D5, IN4=D4

const int ENA = 9;
const int IN1 = 8;
const int IN2 = 7;
const int ENB = 3;
const int IN3 = 5;
const int IN4 = 4;

void setup() {
  pinMode(ENA, OUTPUT); pinMode(IN1, OUTPUT); pinMode(IN2, OUTPUT);
  pinMode(ENB, OUTPUT); pinMode(IN3, OUTPUT); pinMode(IN4, OUTPUT);
}

void setMotor(int enPin, int in1, int in2, int speed) {
  // speed: -255 (full back) .. 255 (full fwd). 0 = stop.
  digitalWrite(in1, speed > 0 ? HIGH : LOW);
  digitalWrite(in2, speed < 0 ? HIGH : LOW);
  analogWrite(enPin, abs(speed));
}

void loop() {
  setMotor(ENA, IN1, IN2, 200);   // Motor A forward ~80%
  setMotor(ENB, IN3, IN4, 200);   // Motor B forward ~80%
  delay(2000);

  setMotor(ENA, IN1, IN2, -150);  // Motor A reverse ~60%
  setMotor(ENB, IN3, IN4, -150);
  delay(2000);

  setMotor(ENA, IN1, IN2, 0);     // stop
  setMotor(ENB, IN3, IN4, 0);
  delay(1000);
}

ESP32

l298n_esp32.ino
// L298N on ESP32 - dual DC motors using LEDC PWM

const int ENA = 13, IN1 = 14, IN2 = 27;
const int ENB = 33, IN3 = 26, IN4 = 25;
const int PWM_FREQ = 20000, PWM_RES = 8;

void setup() {
  pinMode(IN1, OUTPUT); pinMode(IN2, OUTPUT);
  pinMode(IN3, OUTPUT); pinMode(IN4, OUTPUT);

  ledcAttach(ENA, PWM_FREQ, PWM_RES);
  ledcAttach(ENB, PWM_FREQ, PWM_RES);
}

void motor(int enPin, int in1, int in2, int speed) {
  digitalWrite(in1, speed > 0);
  digitalWrite(in2, speed < 0);
  ledcWrite(enPin, abs(speed));
}

void loop() {
  motor(ENA, IN1, IN2, 200); motor(ENB, IN3, IN4, 200); delay(2000);
  motor(ENA, IN1, IN2, -200); motor(ENB, IN3, IN4, -200); delay(2000);
  motor(ENA, IN1, IN2, 0);  motor(ENB, IN3, IN4, 0);  delay(1000);
}

Raspberry Pi

l298n_motor.py
# L298N on Raspberry Pi - drive 2 DC motors with PWM
# Install: pip install gpiozero

from gpiozero import Motor, PWMOutputDevice
from time import sleep

# gpiozero's Motor handles direction; we add PWM for speed
motor_a = Motor(forward=23, backward=24)
speed_a = PWMOutputDevice(12)

motor_b = Motor(forward=27, backward=22)
speed_b = PWMOutputDevice(13)

def drive(motor, speed_pin, speed):
    if speed > 0:
        motor.forward()
    elif speed < 0:
        motor.backward()
    else:
        motor.stop()
    speed_pin.value = abs(speed)

try:
    while True:
        drive(motor_a, speed_a, 0.8); drive(motor_b, speed_b, 0.8); sleep(2)
        drive(motor_a, speed_a, -0.6); drive(motor_b, speed_b, -0.6); sleep(2)
        drive(motor_a, speed_a, 0);   drive(motor_b, speed_b, 0);   sleep(1)
except KeyboardInterrupt:
    pass

Raspberry Pi Pico (MicroPython)

l298n_pico.py
# L298N on Raspberry Pi Pico - two DC motors

from machine import Pin, PWM
import time

ENA = PWM(Pin(2)); IN1 = Pin(3, Pin.OUT); IN2 = Pin(4, Pin.OUT)
ENB = PWM(Pin(7)); IN3 = Pin(5, Pin.OUT); IN4 = Pin(6, Pin.OUT)

ENA.freq(20000); ENB.freq(20000)

def motor(en, in1, in2, speed):
    # speed in -65535..65535
    in1.value(1 if speed > 0 else 0)
    in2.value(1 if speed < 0 else 0)
    en.duty_u16(min(abs(speed), 65535))

while True:
    motor(ENA, IN1, IN2,  50000); motor(ENB, IN3, IN4,  50000); time.sleep(2)
    motor(ENA, IN1, IN2, -40000); motor(ENB, IN3, IN4, -40000); time.sleep(2)
    motor(ENA, IN1, IN2,  0);     motor(ENB, IN3, IN4,  0);     time.sleep(1)

Frequently Asked Questions

Why is my motor running slower than expected?
The L298N drops about 1.8–2V across its H-bridge. If you supply 12V, your motors actually see about 10V. To compensate, use a supply a few volts higher than your motor's rated voltage, or switch to a MOSFET-based driver (TB6612FNG, DRV8833) for better efficiency.
When should I remove the onboard 5V-regulator jumper?
Remove it whenever your motor supply exceeds 12V. Above that, the 78M05 regulator runs too hot. With the jumper removed, you must supply 5V to the 5V logic pin from an external source.
What do the ENA/ENB jumpers do?
When the ENA/ENB jumpers are on, the enable pins are tied HIGH, so motors run at full speed whenever IN1/IN2 (or IN3/IN4) are set. Remove them to feed PWM into the ENA/ENB header pins for speed control.
How do I drive a stepper motor?
Connect the stepper's two coils to OUT1/OUT2 and OUT3/OUT4, then sequence IN1–IN4 in a stepping pattern (full-step or half-step). Libraries like Arduino's Stepper or Python's AccelStepper-like packages simplify the sequencing.
My L298N is getting very hot — is this normal?
Some warmth is normal due to the voltage drop across the H-bridge, but if it's hot enough to burn you, reduce motor load, add a bigger heatsink with airflow, or switch to a more efficient driver. The chip has built-in thermal shutdown but prolonged heat still shortens its life.
Do I need to connect the microcontroller's ground to the L298N?
Yes — always tie the microcontroller GND to the L298N GND and motor-supply GND. Without a common ground, the input pins can't be correctly interpreted and you'll get erratic behavior.

Related Tutorials