Inquire: Call 0086-755-23203480, or reach out via the form below/your sales contact to discuss our design, manufacturing, and assembly capabilities.
Quote: Email your PCB files to Sales@pcbsync.com (Preferred for large files) or submit online. We will contact you promptly. Please ensure your email is correct.
Notes: For PCB fabrication, we require PCB design file in Gerber RS-274X format (most preferred), *.PCB/DDB (Protel, inform your program version) format or *.BRD (Eagle) format. For PCB assembly, we require PCB design file in above mentioned format, drilling file and BOM. Click to download BOM template To avoid file missing, please include all files into one folder and compress it into .zip or .rar format.
L298N Motor Driver Arduino: DC Motor Control Tutorial
When you’re working on robotics projects or automated systems, controlling DC motors with an Arduino is one of those fundamental skills you’ll need. The L298N motor driver makes this task straightforward, but there are some critical details you need to understand to avoid the common pitfalls I’ve seen countless engineers struggle with during prototyping.
After spending years designing embedded systems and motor control circuits, I’ve learned that the L298N isn’t just about connecting wires and uploading code. Understanding the voltage drop characteristics, proper grounding techniques, and PWM implementation can mean the difference between a motor that barely turns and one that performs reliably under load.
Understanding the L298N Motor Driver Arduino Interface
The L298N motor driver serves as the critical bridge between your low-power Arduino microcontroller and high-current DC motors. Think of it as a power amplifier for your control signals. Your Arduino generates 5V logic signals at milliamp levels, but DC motors often require 12V or higher at several amps. The L298N handles this translation safely.
At its core, the L298N uses dual H-bridge circuits manufactured by STMicroelectronics. This architecture allows independent control of two DC motors simultaneously, or you can configure it to drive a single bipolar stepper motor. The chip operates across a wide voltage range from 5V to 46V with a maximum continuous current of 2A per channel.
Why You Need a Motor Driver
Direct connection of motors to Arduino pins will damage your board almost instantly. Arduino pins provide approximately 20mA maximum current, while even small hobby motors draw 100mA or more. The L298N solves this by using separate power supplies for logic and motor operation.
The driver also provides electrical isolation. When motors start, stop, or reverse direction, they generate voltage spikes called back EMF (electromotive force). Without proper protection, these spikes can propagate back through your circuit and corrupt microcontroller operation or cause permanent damage.
L298N Motor Driver Pinout and Specifications
Understanding the pinout is essential before making any connections. Here’s a complete breakdown of the L298N module pins:
Pin Name
Type
Function
Voltage Range
VCC (or VS)
Power Input
Motor power supply
5V – 46V
5V
Power
Logic supply (input/output depending on jumper)
5V regulated
GND
Ground
Common ground reference
0V
ENA
PWM Input
Speed control for Motor A
0V – 5V
IN1
Digital Input
Direction control Motor A
0V – 5V
IN2
Digital Input
Direction control Motor A
0V – 5V
OUT1
Power Output
Motor A terminal 1
Variable
OUT2
Power Output
Motor A terminal 2
Variable
ENB
PWM Input
Speed control for Motor B
0V – 5V
IN3
Digital Input
Direction control Motor B
0V – 5V
IN4
Digital Input
Direction control Motor B
0V – 5V
OUT3
Power Output
Motor B terminal 1
Variable
OUT4
Power Output
Motor B terminal 2
Variable
Technical Specifications
Parameter
Value
Notes
Operating Voltage (VCC)
5V – 46V
Absolute maximum 50V
Logic Supply (5V pin)
4.5V – 7V
Regulated for internal circuits
Continuous Current per Channel
2A
Per H-bridge
Peak Current
3A
Short duration only
Total Driver Current
4A
Both channels combined
Voltage Drop
1.8V – 4V
Depends on current load
PWM Frequency
1kHz – 20kHz
Optimal range for smooth operation
Thermal Protection
150°C
Auto-shutdown when exceeded
Operating Temperature
-25°C to 130°C
Junction temperature
The 5V Jumper Configuration
This small jumper causes confusion for many beginners. The L298N module includes an onboard 78M05 voltage regulator that can convert your motor supply voltage to 5V for the logic circuits. Here’s how it works:
When motor voltage ≤ 12V: Keep the jumper in place. The regulator steps down your motor supply voltage to 5V, and the 5V pin becomes an output that can source up to 500mA. You can use this to power your Arduino.
When motor voltage > 12V: Remove the jumper. The onboard regulator cannot safely handle higher input voltages. You must supply 5V externally to the 5V pin to power the L298N logic circuits.
Ignoring this guideline will cause overheating and potential regulator failure.
Critical Voltage Drop Consideration
Here’s something that trips up engineers constantly: the L298N has a significant voltage drop across its internal transistors. This isn’t a design flaw, but a characteristic of the bipolar junction transistors (BJTs) used in the H-bridge configuration.
According to the datasheet, you’ll lose approximately 2V at 1A load, increasing to nearly 4V at 2A. This means:
12V supply = approximately 10V at motor terminals
9V supply = approximately 7V at motor terminals
6V supply = approximately 4V at motor terminals
For a 12V rated motor, you actually need to supply 14V to the L298N to achieve full motor performance. This is why motors sometimes run slower than expected when powered through the L298N with exactly their rated voltage.
Wiring the L298N Motor Driver Arduino Connection
Proper wiring prevents the majority of issues. Follow this systematic approach:
Basic Single Motor Connection
Arduino Connections:
– Pin 9 → ENA (PWM-capable pin for speed control)
– Pin 8 → IN1 (Direction control)
– Pin 7 → IN2 (Direction control)
– GND → L298N GND
Power Connections:
– Battery/Supply Positive → VCC (7-12V recommended for 6V motors)
– Battery/Supply Negative → GND
– If using jumper: Can power Arduino from L298N 5V pin
– If no jumper: Arduino 5V → L298N 5V pin
Motor Connections:
– Motor Wire 1 → OUT1
– Motor Wire 2 → OUT2
Dual Motor Connection
Arduino Connections:
– Pin 11 → ENA (Motor A speed control)
– Pin 10 → ENB (Motor B speed control)
– Pin 9 → IN1 (Motor A direction)
– Pin 8 → IN2 (Motor A direction)
– Pin 7 → IN3 (Motor B direction)
– Pin 6 → IN4 (Motor B direction)
– GND → L298N GND
Power:
– Supply Positive → VCC
– Supply Negative → GND (also connect to Arduino GND)
Motors:
– Motor A → OUT1, OUT2
– Motor B → OUT3, OUT4
Critical Grounding Rule
The most important connection: All grounds must be common. Your Arduino ground, L298N ground, and motor power supply ground must connect together. Floating grounds cause erratic behavior, random resets, and unpredictable motor operation.
H-Bridge Operation Explained
The H-bridge is the heart of motor direction control. Picture four switches arranged in an H shape with the motor in the middle. By closing different pairs of switches, current flows through the motor in different directions.
IN1
IN2
Motor Action
LOW
LOW
Motor Stop (Coast)
HIGH
LOW
Forward Rotation
LOW
HIGH
Reverse Rotation
HIGH
HIGH
Motor Brake (Short brake)
When IN1 is HIGH and IN2 is LOW, current flows from OUT1 to OUT2, spinning the motor in one direction. Reverse these inputs, and current flows from OUT2 to OUT1, reversing motor rotation.
The brake condition (both inputs HIGH) creates a short circuit across the motor terminals, causing rapid deceleration through dynamic braking.
PWM Speed Control Implementation
PWM (Pulse Width Modulation) controls motor speed by rapidly switching the power on and off. The duty cycle determines average voltage delivered to the motor.
Arduino PWM Code Example
// L298N Motor Driver Arduino Code
// Single motor speed and direction control
// Pin definitions
const int ENA = 9; // PWM pin for speed control
const int IN1 = 8; // Direction control 1
const int IN2 = 7; // Direction control 2
void setup() {
pinMode(ENA, OUTPUT);
pinMode(IN1, OUTPUT);
pinMode(IN2, OUTPUT);
// Initialize motor stopped
digitalWrite(IN1, LOW);
digitalWrite(IN2, LOW);
}
void loop() {
// Forward at 50% speed
digitalWrite(IN1, HIGH);
digitalWrite(IN2, LOW);
analogWrite(ENA, 128); // 0-255 scale, 128 = 50%
delay(3000);
// Stop
digitalWrite(IN1, LOW);
digitalWrite(IN2, LOW);
delay(1000);
// Reverse at 75% speed
digitalWrite(IN1, LOW);
digitalWrite(IN2, HIGH);
analogWrite(ENA, 191); // 191 = 75% of 255
delay(3000);
// Brake
digitalWrite(IN1, HIGH);
digitalWrite(IN2, HIGH);
analogWrite(ENA, 255);
delay(500);
}
PWM Frequency Considerations
Arduino’s default PWM frequency on most pins is approximately 490Hz. For pins 5 and 6, it’s 980Hz. These frequencies work acceptably for most DC motors, but you may notice audible whining.
For smoother, quieter operation, increase PWM frequency to 4kHz-20kHz range. This requires modifying Arduino timer registers:
void setup() {
// Increase PWM frequency on pins 9 and 10 to ~31kHz
TCCR1B = TCCR1B & 0b11111000 | 0x01;
// Pin setup continues…
}
Higher frequencies reduce acoustic noise but may increase switching losses and heat generation in the L298N.
Complete Dual Motor Control Example
This example demonstrates controlling two motors with independent speed and direction, useful for differential drive robots:
// Dual motor control with L298N
// For robot car or differential drive platform
// Motor A pins
const int ENA = 11;
const int IN1 = 9;
const int IN2 = 8;
// Motor B pins
const int ENB = 10;
const int IN3 = 7;
const int IN4 = 6;
void setup() {
// Set all motor control pins as outputs
pinMode(ENA, OUTPUT);
pinMode(IN1, OUTPUT);
pinMode(IN2, OUTPUT);
pinMode(ENB, OUTPUT);
pinMode(IN3, OUTPUT);
pinMode(IN4, OUTPUT);
// Start with motors stopped
stopMotors();
}
void loop() {
moveForward(200); // Both motors forward, speed 200
delay(2000);
turnRight(150); // Right turn
delay(1000);
moveBackward(180); // Both motors reverse
delay(2000);
turnLeft(150); // Left turn
delay(1000);
stopMotors();
delay(2000);
}
void moveForward(int speed) {
digitalWrite(IN1, HIGH);
digitalWrite(IN2, LOW);
digitalWrite(IN3, HIGH);
digitalWrite(IN4, LOW);
analogWrite(ENA, speed);
analogWrite(ENB, speed);
}
void moveBackward(int speed) {
digitalWrite(IN1, LOW);
digitalWrite(IN2, HIGH);
digitalWrite(IN3, LOW);
digitalWrite(IN4, HIGH);
analogWrite(ENA, speed);
analogWrite(ENB, speed);
}
void turnRight(int speed) {
// Left motor forward, right motor reverse
digitalWrite(IN1, HIGH);
digitalWrite(IN2, LOW);
digitalWrite(IN3, LOW);
digitalWrite(IN4, HIGH);
analogWrite(ENA, speed);
analogWrite(ENB, speed);
}
void turnLeft(int speed) {
// Right motor forward, left motor reverse
digitalWrite(IN1, LOW);
digitalWrite(IN2, HIGH);
digitalWrite(IN3, HIGH);
digitalWrite(IN4, LOW);
analogWrite(ENA, speed);
analogWrite(ENB, speed);
}
void stopMotors() {
digitalWrite(IN1, LOW);
digitalWrite(IN2, LOW);
digitalWrite(IN3, LOW);
digitalWrite(IN4, LOW);
analogWrite(ENA, 0);
analogWrite(ENB, 0);
}
Common Problems and Troubleshooting
After debugging hundreds of motor control circuits, these are the issues I see repeatedly:
Motor Won’t Spin
Insufficient voltage: Remember the 2V drop. If you’re supplying 9V but the motor needs 9V rated, it only receives 7V through the L298N.
Solution: Increase supply voltage by 2-4V above motor rating.
Enable pin not configured: If the jumper on ENA/ENB is removed, you must send PWM signal to these pins.
Solution: Either replace the jumper for full-speed operation, or connect ENA/ENB to Arduino PWM pins and send analogWrite() commands.
Motors Spin Weakly or Intermittently
Inadequate power supply current: 9V batteries provide poor current capacity and sag under load.
Solution: Use lithium-ion battery packs, NiMH cells, or bench power supplies rated for 2A+ per motor.
Solution: Verify continuity between all ground points. Use thick gauge wire (18-22 AWG) for power connections.
Motors Run in Wrong Direction
Wiring polarity: Motor direction depends on how you connect the motor leads.
Solution: Simply swap the two motor wires on the OUT terminals, or invert the logic in your code.
Arduino Resets Randomly
Ground loop or missing common ground: Logic signals need stable reference.
Solution: Ensure Arduino GND, L298N GND, and power supply GND are star-grounded at a single point.
Voltage spikes: Motor switching generates electrical noise.
Solution: Add 100μF electrolytic capacitor across motor supply (VCC to GND), and 0.1μF ceramic capacitors across each motor terminal.
L298N Overheating
Excessive current draw: Motors stalling or under heavy load exceed 2A continuous rating.
Solution: Reduce load, add heatsink to L298N, or upgrade to higher-current driver (like TB6612FNG or motor controller with MOSFETs).
Poor ventilation: Heat cannot dissipate.
Solution: Mount driver in open air, add heatsink, or use fan for active cooling.
Comparison: L298N vs Alternative Motor Drivers
Feature
L298N
TB6612FNG
L293D
Technology
BJT H-Bridge
MOSFET H-Bridge
BJT H-Bridge
Voltage Drop
2-4V
0.2-0.5V
2-3V
Max Voltage
46V
15V
36V
Continuous Current
2A per channel
1.2A per channel
600mA per channel
Peak Current
3A
3.2A
1.2A
Efficiency
~70%
~95%
~60%
Heat Generation
High
Low
Moderate
Price
Low
Moderate
Low
The TB6612FNG offers better efficiency and less voltage drop but lower voltage range. For low-voltage motors (5-12V) where efficiency matters, consider TB6612FNG. For higher voltage motors or budget projects, L298N remains solid choice.
Practical Applications and Project Ideas
Robot Car Platform
Build a differential drive robot using two motors. The L298N controls both drive motors independently, allowing forward/backward movement and turning by varying individual motor speeds.
Automated Curtain Opener
Use a single motor with limit switches to open and close curtains automatically based on time or light sensor input.
Camera Pan-Tilt System
Control two small DC motors with gear reduction for smooth camera positioning. PWM allows precise speed control for smooth movements.
Conveyor Belt Controller
Industrial automation projects benefit from the L298N’s ability to handle higher voltages and currents common in conveyor motors.
Advanced Techniques
Current Sensing
The L298N provides sense pins (SenseA, SenseB) for current monitoring. Connect a low-value resistor (0.5Ω, 5W) between sense pin and ground. Measure voltage across resistor, apply Ohm’s law to calculate current.
PID Speed Control
For applications requiring constant speed under varying load, implement PID control:
Digi-Key L298N IC – Genuine STMicroelectronics chips for custom PCB designs
Frequently Asked Questions
Q: Can I control motor speed without PWM by removing the jumper on ENA/ENB?
No, removing the jumper disables the motor completely unless you provide a PWM signal to the enable pin. The jumper when in place ties the enable pin to 5V (full speed). For speed control, connect ENA/ENB to Arduino PWM pins regardless of jumper position.
Q: Why do my motors run at different speeds even with the same PWM value?
Motor manufacturing variations mean identical PWM values can produce different speeds. Even motors from the same batch have slight differences in winding resistance, bearing friction, and magnetic field strength. For precise speed matching, implement closed-loop control with encoders or adjust PWM values individually through calibration.
Q: Can I parallel both H-bridges for 4A total current to drive one motor?
Technically yes, but not recommended without careful consideration. You must parallel channel 1 with channel 4 (not 1 with 2) as shown in the datasheet. Both channels must receive identical control signals simultaneously. Small timing differences can cause one bridge to fight the other. For currents above 2A, better to use a dedicated high-current driver.
Q: What happens if I exceed the 2A continuous current rating?
The L298N includes thermal shutdown protection that automatically disables output when junction temperature exceeds 150°C. The driver will cool down and resume operation, but repeated overheating degrades the component and eventually causes permanent failure. Add heatsinking or upgrade to higher current driver if your motors consistently draw above 2A.
Q: Why does my Arduino reset when motors start or stop?
This indicates power supply problems or inadequate filtering. Motor starting current creates voltage dips that propagate to the Arduino. Solutions: Use separate power supplies for motors and Arduino, add bulk capacitance (1000μF+) near the L298N, ensure proper grounding, and consider adding 0.1μF ceramic capacitors on Arduino power pins for high-frequency noise filtering.
Conclusion
The L298N motor driver Arduino combination provides a reliable, affordable solution for controlling DC motors in robotics and automation projects. Understanding the voltage drop characteristics, proper grounding practices, and PWM implementation ensures successful motor control without the frustration of troubleshooting cryptic failures.
From a PCB engineering perspective, the L298N represents mature technology with well-understood limitations. While newer MOSFET-based drivers offer better efficiency, the L298N’s robustness, wide voltage range, and extensive community support make it an excellent choice for learning motor control fundamentals and prototyping systems that don’t demand maximum efficiency.
Take time to implement proper power supply design, add appropriate filtering capacitors, and account for the voltage drop in your system design. These engineering practices separate projects that work occasionally from those that perform reliably under real-world conditions.
Inquire: Call 0086-755-23203480, or reach out via the form below/your sales contact to discuss our design, manufacturing, and assembly capabilities.
Quote: Email your PCB files to Sales@pcbsync.com (Preferred for large files) or submit online. We will contact you promptly. Please ensure your email is correct.
Notes: For PCB fabrication, we require PCB design file in Gerber RS-274X format (most preferred), *.PCB/DDB (Protel, inform your program version) format or *.BRD (Eagle) format. For PCB assembly, we require PCB design file in above mentioned format, drilling file and BOM. Click to download BOM template To avoid file missing, please include all files into one folder and compress it into .zip or .rar format.