0% found this document useful (0 votes)
17 views

Interface L298N DC Motor Driver Module With Arduino

Uploaded by

King Howler
Copyright
© © All Rights Reserved
Available Formats
Download as PDF, TXT or read online on Scribd
0% found this document useful (0 votes)
17 views

Interface L298N DC Motor Driver Module With Arduino

Uploaded by

King Howler
Copyright
© © All Rights Reserved
Available Formats
Download as PDF, TXT or read online on Scribd
You are on page 1/ 16

Interface L298N DC Motor Driver

Module with Arduino

While you’ll eventually need to learn to control DC motors in order to build


your own robot, you’ll probably need something a little easier to get
started – which is where the L298N motor driver comes in. It can control the
speed and spinning direction of two DC motors.

Controlling a DC Motor
We can only have full control over a DC motor if we can control its speed
and spinning direction. This is possible by combining these two techniques.

• PWM – to control speed

• H-Bridge – to control the spinning direction

Let’s learn more about these techniques.

PWM – to control speed

The speed of a DC motor can be controlled by changing its input voltage. A


widely used technique to accomplish this is Pulse Width Modulation
(PWM).

PWM is a technique in which the average value of the input voltage is


adjusted by sending a series of ON-OFF pulses. This average voltage is
proportional to the width of the pulses, which is referred to as the Duty
Cycle.

The higher the duty cycle, the higher the average voltage applied to the DC
motor, resulting in an increase in motor speed. The shorter the duty cycle,
the lower the average voltage applied to the DC motor, resulting in a
decrease in motor speed.

The image below shows PWM technique with various duty cycles and
average voltages.
Pulse Width Modulation (PWM) Technique

H-Bridge – to control the spinning direction

The spinning direction of a DC motor can be controlled by changing the


polarity of its input voltage. A widely used technique to accomplish this is
to use an H-bridge.

An H-bridge circuit is made up of four switches arranged in a H shape, with


the motor in the center.

Closing two specific switches at the same time reverses the polarity of the
voltage applied to the motor. This causes a change in the spinning direction
of the motor.

The following animation shows the working of the H-bridge circuit.


Working of H-Bridge

L298N Motor Driver Chip


At the center of the module is a big, black chip with a chunky heat sink –
the L298N.
The L298N chip contains two standard H-bridges capable of driving a pair
of DC motors, making it ideal for building a two-wheeled robotic platform.

The L298N motor driver has a supply range of 5V to 35V and is capable of
2A continuous current per channel, so it works very well with most of our
DC motors.

Technical Specifications

Here are the specifications:

Motor output voltage 5V – 35V

Motor output voltage (Recommended) 7V – 12V

Logic input voltage 5V – 7V

Continuous current per channel 2A

Max Power Dissipation 25W

L298N Motor Driver Module Pinout


The L298N module has 11 pins that allow it to communicate with the
outside world. The pinout is as follows:
Let’s get acquainted with each pin one by one.

Power Pins

The L298N motor driver module receives power from a 3-pin, 3.5mm-pitch
screw terminal.
The L298N motor driver has two input power pins: VS and VSS.

VS pin powers the IC’s internal H-Bridge, which drives the motors. This pin
accepts input voltages ranging from 5 to 12V.

VSS is used to power the logic circuitry within the L298N IC, and can range
between 5V and 7V.

GND is the common ground pin.

Output Pins

The output channels of the L298N motor driver, OUT1 and OUT2 for motor A
and OUT3 and OUT4 for motor B, are broken out to the edge of the module
with two 3.5mm-pitch screw terminals. You can connect two 5-12V DC
motors to these terminals.

Each channel on the module can supply up to 2A to the DC motor. The


amount of current supplied to the motor, however, depends on the
capacity of the motor power supply.

Direction Control Pins

The direction control pins allow you to control whether the motor rotates
forward or backward. These pins actually control the switches of the H-
Bridge circuit within the L298N chip.
The module has two direction control pins. The IN1 and IN2 pins control the
spinning direction of motor A; While IN3 and IN4 control the spinning
direction of motor B.

The spinning direction of the motor can be controlled by applying logic


HIGH (5V) or logic LOW (Ground) to these inputs. The chart below shows
various combinations and their outcomes.

Input1 Input2 Spinning Direction

Low(0) Low(0) Motor OFF

High(1) Low(0) Forward

Low(0) High(1) Backward

High(1) High(1) Motor OFF

Speed Control Pins

The speed control pins ENA and ENB are used to turn on/off the motors and
control their speed.
Pulling these pins HIGH will cause the motors to spin, while pulling them
LOW will stop them. However, with Pulse Width Modulation (PWM), the
speed of the motors can be controlled.

The module usually comes with a jumper on these pins. When this jumper
is in place, the motor spins at full speed. If you want to control the speed of
the motors programmatically, remove the jumpers and connect them to the
Arduino’s PWM-enabled pins.

On-board 5V Regulator and Jumper


The module includes a 78M05 5V regulator that can be enabled or disabled
via a jumper.
When this jumper is in place, the 5V regulator is enabled, and the logic
power supply (VSS) is derived from the motor power supply (VS). In this
case, the 5V input terminal acts as the output pin, delivering 5V 0.5A. You
can use it to power an Arduino or other circuitry that needs 5V power.

When the jumper is removed, the 5V regulator is disabled, and we have to


supply 5V separately through the VSS pin.

Warning:

If the motor power supply is less than 12V, you can keep the jumper in
place. If it is greater than 12V, the jumper must be removed to prevent
damage to the onboard 5V regulator.

Also, do not supply power to both the VSS and VS pins while the jumper is
in place.

Voltage Drop of L298N


The L298N has a voltage drop of approximately 2V. This is due to the fact
that internal switching transistors have a voltage drop of approximately 1V
when forward biased, and because an H-Bridge requires the current to pass
through two transistors, the total voltage drop is 2V.

So, if you connect 12V to the motor power supply terminal, the motors will
receive approximately 10V. This means that a 12V DC motor will never spin
at full speed.
In order to get the motor to run at its maximum speed, the motor power
supply should have a voltage that is slightly higher (+2V) than the actual
voltage requirement of the motor.

Taking into account a voltage drop of 2V, if you are using 5V motors, you
will need to provide 7V at the motor power supply terminal. If you have 12V
motors then your motor supply voltage should be 14V.

This excess voltage drop results in significant power dissipation in the form
of heat. This is why the L298N based motor drivers require a big heatsink.

Wiring an L298N Motor Driver Module to an Arduino


Now that we know everything about the module, we can start hooking it up
to our Arduino!

Let’s begin by connecting the motor power supply. In our experiment, we


are using DC gearbox motors, also called “TT” motors, which are often
found in two-wheel-drive robots. They are rated for 3 to 12V. We will
therefore connect an external 12V power source to the VS terminal.
Because L298N has a voltage drop of about 2V, the motors will receive 10V
and spin at a slightly lower RPM. But that’s okay.

Next, we need to supply 5V to the logic circuitry of the L298N. We’ll use the
on-board 5V regulator to draw 5V from the motor power supply, so keep
the 5V-EN jumper in place.

Now connect the L298N module’s Input and Enable pins (ENA, IN1, IN2,
IN3, IN4 and ENB) to the six Arduino digital output pins (9, 8, 7, 5, 4 and 3).
Note that both Arduino output pins 9 and 3 are PWM-enabled.

Finally, wire one motor to terminal A (OUT1 and OUT2) and the other to
terminal B (OUT3 and OUT4). You can swap out your motor’s connections.
There is technically no right or wrong way.
Arduino Example Code
The sketch below will show you how to control the speed and spinning
direction of a DC motor using the L298N Motor Driver and can serve as the
basis for more practical experiments and projects.

The sketch moves the motor in one direction for one revolution, then in the
opposite direction. There is also some acceleration and deceleration
involved.

When accelerating or decelerating the motor, you may hear it humming,


especially at lower PWM values. This is normal; there is nothing to be
concerned about. This happens because the DC motor requires a minimum
amount of voltage to operate.
// Motor A connections
int enA = 9;
int in1 = 8;
int in2 = 7;
// Motor B connections
int enB = 3;
int in3 = 5;
int in4 = 4;

void setup() {
// Set all the motor control pins to outputs
pinMode(enA, OUTPUT);
pinMode(enB, OUTPUT);
pinMode(in1, OUTPUT);
pinMode(in2, OUTPUT);
pinMode(in3, OUTPUT);
pinMode(in4, OUTPUT);

// Turn off motors - Initial state


digitalWrite(in1, LOW);
digitalWrite(in2, LOW);
digitalWrite(in3, LOW);
digitalWrite(in4, LOW);
}

void loop() {
directionControl();
delay(1000);
speedControl();
delay(1000);
}

// This function lets you control spinning direction of motors


void directionControl() {
// Set motors to maximum speed
// For PWM maximum possible values are 0 to 255
analogWrite(enA, 255);
analogWrite(enB, 255);

// Turn on motor A & B


digitalWrite(in1, HIGH);
digitalWrite(in2, LOW);
digitalWrite(in3, HIGH);
digitalWrite(in4, LOW);
delay(2000);

// Now change motor directions


digitalWrite(in1, LOW);
digitalWrite(in2, HIGH);
digitalWrite(in3, LOW);
digitalWrite(in4, HIGH);
delay(2000);

// Turn off motors


digitalWrite(in1, LOW);
digitalWrite(in2, LOW);
digitalWrite(in3, LOW);
digitalWrite(in4, LOW);
}

// This function lets you control speed of the motors


void speedControl() {
// Turn on motors
digitalWrite(in1, LOW);
digitalWrite(in2, HIGH);
digitalWrite(in3, LOW);
digitalWrite(in4, HIGH);

// Accelerate from zero to maximum speed


for (int i = 0; i < 256; i++) {
analogWrite(enA, i);
analogWrite(enB, i);
delay(20);
}

// Decelerate from maximum speed to zero


for (int i = 255; i >= 0; --i) {
analogWrite(enA, i);
analogWrite(enB, i);
delay(20);
}

// Now turn off motors


digitalWrite(in1, LOW);
digitalWrite(in2, LOW);
digitalWrite(in3, LOW);
digitalWrite(in4, LOW);
}

Code Explanation:

The Arduino code is fairly simple. It does not require any libraries to work.
The sketch starts by declaring the Arduino pins that are connected to the
L298N’s control pins.

// Motor A connections
int enA = 9;
int in1 = 8;
int in2 = 7;
// Motor B connections
int enB = 3;
int in3 = 5;
int in4 = 4;

In the setup section of the code, all of the motor control pins, including the
direction and speed control pins, are configured as digital OUTPUT. And the
direction control pins are pulled LOW to initially disable both motors.

void setup() {
// Set all the motor control pins to outputs
pinMode(enA, OUTPUT);
pinMode(enB, OUTPUT);
pinMode(in1, OUTPUT);
pinMode(in2, OUTPUT);
pinMode(in3, OUTPUT);
pinMode(in4, OUTPUT);

// Turn off motors - Initial state


digitalWrite(in1, LOW);
digitalWrite(in2, LOW);
digitalWrite(in3, LOW);
digitalWrite(in4, LOW);
}

In the loop section of the code, we call two user-defined functions with a
one-second delay.

void loop() {
directionControl();
delay(1000);
speedControl();
delay(1000);
}

These functions are:

• directionControl() – This function causes both motors to spin at


full speed for two seconds. It then reverses the spinning direction of
the motors and spins for two seconds. Finally, it stops the motors.
• void directionControl() {
• // Set motors to maximum speed
• // For PWM maximum possible values are 0 to 255
• analogWrite(enA, 255);
• analogWrite(enB, 255);

• // Turn on motor A & B
• digitalWrite(in1, HIGH);
• digitalWrite(in2, LOW);
• digitalWrite(in3, HIGH);
• digitalWrite(in4, LOW);
• delay(2000);

• // Now change motor directions
• digitalWrite(in1, LOW);
• digitalWrite(in2, HIGH);
• digitalWrite(in3, LOW);
• digitalWrite(in4, HIGH);
• delay(2000);

• // Turn off motors
• digitalWrite(in1, LOW);
• digitalWrite(in2, LOW);
• digitalWrite(in3, LOW);
• digitalWrite(in4, LOW);
}

• speedControl() – This function uses the analogWrite() function to


generate a PWM signal that accelerates both motors from zero to
maximum speed before decelerating them back to zero. Finally, it
stops the motors.
• void speedControl() {
• // Turn on motors
• digitalWrite(in1, LOW);
• digitalWrite(in2, HIGH);
• digitalWrite(in3, LOW);
• digitalWrite(in4, HIGH);

• // Accelerate from zero to maximum speed
• for (int i = 0; i < 256; i++) {
• analogWrite(enA, i);
• analogWrite(enB, i);
• delay(20);
• }

• // Decelerate from maximum speed to zero
• for (int i = 255; i >= 0; --i) {
• analogWrite(enA, i);
• analogWrite(enB, i);
• delay(20);
• }

• // Now turn off motors
• digitalWrite(in1, LOW);
• digitalWrite(in2, LOW);
• digitalWrite(in3, LOW);
• digitalWrite(in4, LOW);
}

You might also like