Arduino DC Motor Control Tutorial
Arduino DC Motor Control Tutorial
Overview
We can control the speed of the DC motor by simply controlling the input voltage to the motor
and the most common method of doing that is by using PWM signal.
PWM DC Motor Control
PWM, or pulse width modulation is a technique which allows us to adjust the average value of the
voltage that’s going to the electronic device by turning on and off the power at a fast rate. The
average voltage depends on the duty cycle, or the amount of time the signal is ON versus the
amount of time the signal is OFF in a single period of time.
So depending on the size of the motor, we can simply connect an Arduino PWM output to the
base of transistor or the gate of a MOSFET and control the speed of the motor by controlling the
PWM output. The low power Arduino PWM signal switches on and off the gate at the MOSFET
through which the high power motor is driven.
Note: Arduino GND and the motor power supply GND should be connected
together.
H-Bridge DC Motor Control
On the other hand, for controlling the rotation direction, we just need to inverse the direction of
the current flow through the motor, and the most common method of doing that is by using an H-
Bridge. An H-Bridge circuit contains four switching elements, transistors or MOSFETs, with the
motor at the center forming an H-like configuration. By activating two particular switches at the
same time we can change the direction of the current flow, thus change the rotation direction of
the motor.
So if we combine these two methods, the PWM and the H-Bridge, we can have a complete control
over the DC motor. There are many DC motor drivers that have these features and the L298N is
one of them.
L298N Driver
The L298N is a dual H-Bridge motor driver which allows speed and direction control of two DC
motors at the same time. The module can drive DC motors that have voltages between 5 and
35V, with a peak current up to 2A.
Let’s take a closer look at the pinout of L298N module and explain how it works. The module has
two screw terminal blocks for the motor A and B, and another screw terminal block for the Ground
pin, the VCC for motor and a 5V pin which can either be an input or output.
This depends on the voltage used at the motors VCC. The module have an onboard 5V regulator
which is either enabled or disabled using a jumper. If the motor supply voltage is up to 12V we
can enable the 5V regulator and the 5V pin can be used as output, for example for powering our
Arduino board. But if the motor voltage is greater than 12V we must disconnect the jumper
because those voltages will cause damage to the onboard 5V regulator. In this case the 5V pin will
be used as input as we need connect it to a 5V power supply in order the IC to work properly.
We can note here that this IC makes a voltage drop of about 2V. So for example, if we use a 12V
power supply, the voltage at motors terminals will be about 10V, which means that we won’t be
able to get the maximum speed out of our 12V DC motor.
Next are the logic control inputs. The Enable A and Enable B pins are used for enabling and
controlling the speed of the motor. If a jumper is present on this pin, the motor will be enabled
and work at maximum speed, and if we remove the jumper we can connect a PWM input to this
pin and in that way control the speed of the motor. If we connect this pin to a Ground the motor
will be disabled.
Next, the Input 1 and Input 2 pins are used for controlling the rotation direction of the motor A,
and the inputs 3 and 4 for the motor B. Using these pins we actually control the switches of the
H-Bridge inside the L298N IC. If input 1 is LOW and input 2 is HIGH the motor will move forward,
and vice versa, if input 1 is HIGH and input 2 is LOW the motor will move backward. In case both
inputs are same, either LOW or HIGH the motor will stop. The same applies for the inputs 3 and 4
and the motor B.
So we need an L298N driver, a DC motor, a potentiometer, a push button and an Arduino board.
Arduino Code
Here’s the Arduino code:
Next, we check whether we have pressed the button, and if that’s true, we will change the
rotation direction of the motor by setting the Input 1 and Input 2 states inversely. The push
button will work as toggle button and each time we press it, it will change the rotation direction of
the motor.
All we need is 2 DC Motors, the L298N driver, an Arduino board and a joystick for the control. As
for the power supply, I chose to use three 3.7V Li-ion batteries, providing total of 11V. I made the
chassis out of 3 mm tick plywood, attached the motors to it using metal brackets, attached wheels
to the motors and in front attached a swivel wheel.
Now let’s take a look at the Arduino code and see how it works. (Down below you can find the
complete code)
Next, let’s see how we use the X axis for the left and right control of the car.
So again, first we need to convert the X axis readings into speed values from 0 to 255. For moving
left, we use this value to decrease the left motor speed and increase the right motor speed. Here,
because of the arithmetic functions we use two additional “if” statements to confine the range of
the motor speed from 0 to 255.
The same method is used for moving the car to the right.
Depending on the applied voltage and the motor itself, at lower speeds the motor is not able to
start moving and it produces a buzzing sound. In my case, the motors were not able to move if
the value of the PWM signal was below 70. Therefore using this two if statements I actually
confined to speed range from 70 to 255. At the end we just send the final motor speeds or PWM
signal to the enable pins of the L298N driver.
1. // Prevent buzzing at low speeds (Adjust according to your motors. My motors couldn't
start moving if PWM value was below value of 70)
2. if (motorSpeedA < 70) {
3. motorSpeedA = 0;
4. }
5. if (motorSpeedB < 70) {
6. motorSpeedB = 0;
7. }
8. analogWrite(enA, motorSpeedA); // Send PWM signal to motor A
9. analogWrite(enB, motorSpeedB); // Send PWM signal to motor B
Here’s the complete code of the Arduino robot car example: