Skip to main content

Motor Speed Control With Arduino Nano

Motor speed control is very important in robots and where the motor used. In this project, we will control the speed of DC motors with Arduino Nano. In this way, you will learn how to drive the motor and adjust the speed in projects where you use DC motors.

Motor speed control with Arduino Nano circuit.
Motor Speed Control With Arduino Nano Circuit

First of all, we can say that DC motors are elements that draw a lot of power. Therefore, we cannot drive a DC motor with the input and output pins of the microcontroller. We can suggest 3 ways to drive a DC motor;

  • Making our own motor driver with MOSFETs,
  • Make your own driver module with a motor driver like L298D,
  • Use motor driver modules

We are going to make the 3rd of these three ways for now. There are various modules for this, we will use the L298N module. Let’s examine this module and talk about the working principle.

L298N Motor Drive Module

L293D motor driver module.

The module is usually shown on the right side. With this module, we can drive two DC motors. We think you will use two DC motor circuit designs and the software will do accordingly. The circuit connection should be as follows;

  • We will connect our DC motors to the terminals specified with “MotorA” and “MotorB”.
  • If we do not want to change the speed (we will), we will connect the “ENA” and “ENB” pins to the “+ 5V” pin above with a jumper.
  • For speed control, we will connect the “ENA” and “ENB” pins to the controller’s PWM pins.
  • We will connect the power supply (LiPo battery in this project) to the “+ 12V” and “GND” inputs to power the motors.
  • The “+ 5V” part is the output of the regulator located in the module and provides 5V voltage to the motor driver. We can use this output to power our control circuit (Arduino Nano).
  • The pins “IN1”, “IN2”, “IN3” and “IN4” will control the direction of the motors with the signals from the controller (Arduino Nano).


The “ENA” and “ENB” pins on the module enable us to turn the output power on and off. Thus, we can adjust the speed of the motors by sending a PWM signal to these pins. “ENA” controls “MotorA” while “ENB” controls “MotorB”. These situations are shown in the table below.

There are two ways to stop the motors as shown in the table. The first one is to cut off the power to the motors and make them stop freely. The second is to give the engine power to stop fast. We will use the first stop function in this project.

Schematic Design

As shown below, we used one 11.1V LiPo battery in our circuit. We connected this battery to the motor driver module and did not use an extra power supply by connecting the 5V output to the Arduino Nano. We’ve connected the motors to the output. Lastly, we connected the control pins.

Speed control with Arduino Nano schematic diagram.
Speed Control with Arduino Nano Schematic

Motor Speed Control Function

The function we use in the software performs the operations in the table shown below at the specified speeds. The SC variable used in the table specifies the variable Speed Constant.


Function Code

After installing the following code on Arduino Nano, if the motors are connected to a vehicle then we power the circuit, and they will do the following operations respectively;

  • 1000ms forward at 150 speed,
  • 500ms right at 200 speed,
  • 1000ms forward at 150 speed,
  • 1000ms backward at 150 speed,
  • 500ms left at 200 speed,
  • 1000ms backward at 150 speed,
  • and it will go back to the beginning and repeat the same movements…

Speed is between 0 and 255.

/********* Connections **********/
// Motor connections
#define   IN1   9
#define   IN2   8
#define   IN3   7
#define   IN4   6
#define   ENA   10
#define   ENB   5

/******** Variables ********/
// Direction variables
#define   F     1
#define   FR    2
#define   R     3
#define   BR    4
#define   B     5
#define   BL    6
#define   L     7
#define   FL    8
#define   STOP  0
#define   SPEED_CONSTANT  0.2

void setup() {
  for (int i = 5; i <= 10; i++) {
    pinMode(i, OUTPUT);
  }
}

void motor(int dir, int speed);

void loop() {
  // 1000ms forward @150 speed
  motor(F, 150);
  delay(1000);
  // 500ms right @200 speed
  motor(R, 200);
  delay(500);
  // 1000ms forward @150 speed
  motor(F, 150);
  delay(1000);
  // 1000ms backward @150 speed
  motor(B, 150);
  delay(1000);
  // 500ms left @200 speed
  motor(L, 200);
  delay(500);
  // 1000ms backward @150 speed
  motor(B, 150);
  delay(1000);
}

/*
  dir:
  F- Forward
  FR- Forward Right
  R- Right
  BR- Backward Right
  B- Backward
  BL- Backward Left
  L- Left
  FL- Forward Left
  STOP- Stop

  speed:
  min: 0, max: 255
*/
void motor(int dir, int speed) {
  if (dir == F) {
    // Left motor forward with full speed
    digitalWrite(IN1, HIGH);
    digitalWrite(IN2, LOW);
    analogWrite(ENA, speed);
    // Right motor forward with full speed
    digitalWrite(IN3, HIGH);
    digitalWrite(IN4, LOW);
    analogWrite(ENB, speed);
  } else if (dir == FR) {
    // Left motor forward with full speed
    digitalWrite(IN1, HIGH);
    digitalWrite(IN2, LOW);
    analogWrite(ENA, speed);
    // Right motor forward with speed*SPEED_CONSTANT
    digitalWrite(IN3, HIGH);
    digitalWrite(IN4, LOW);
    analogWrite(ENB, speed * SPEED_CONSTANT);
  } else if (dir == R) {
    // Left motor forward with full speed
    digitalWrite(IN1, HIGH);
    digitalWrite(IN2, LOW);
    analogWrite(ENA, speed);
    // Right motor backward with full speed
    digitalWrite(IN3, LOW);
    digitalWrite(IN4, HIGH);
    analogWrite(ENB, speed);
  } else if (dir == BR) {
    // Left motor backward with full speed
    digitalWrite(IN1, LOW);
    digitalWrite(IN2, HIGH);
    analogWrite(ENA, speed);
    // Right motor backward with speed*SPEED_CONSTANT
    digitalWrite(IN3, LOW);
    digitalWrite(IN4, HIGH);
    analogWrite(ENB, speed * SPEED_CONSTANT);
  } else if (dir == B) {
    // Left motor backward with full speed
    digitalWrite(IN1, LOW);
    digitalWrite(IN2, HIGH);
    analogWrite(ENA, speed);
    // Right motor backward with full speed
    digitalWrite(IN3, LOW);
    digitalWrite(IN4, HIGH);
    analogWrite(ENB, speed);
  } else if (dir == BL) {
    // Left motor backward with speed*SPEED_CONSTANT
    digitalWrite(IN1, LOW);
    digitalWrite(IN2, HIGH);
    analogWrite(ENA, speed * SPEED_CONSTANT);
    // Right motor backward with full speed
    digitalWrite(IN3, LOW);
    digitalWrite(IN4, HIGH);
    analogWrite(ENB, speed);
  } else if (dir == L) {
    // Left motor forward with full speed
    digitalWrite(IN1, LOW);
    digitalWrite(IN2, HIGH);
    analogWrite(ENA, speed);
    // Right motor backward with full speed
    digitalWrite(IN3, HIGH);
    digitalWrite(IN4, LOW);
    analogWrite(ENB, speed);
  } else if (dir == FL) {
    // Left motor forward with speed*SPEED_CONSTANT
    digitalWrite(IN1, HIGH);
    digitalWrite(IN2, LOW);
    analogWrite(ENA, speed * SPEED_CONSTANT);
    // Right motor forward with full speed
    digitalWrite(IN3, HIGH);
    digitalWrite(IN4, LOW);
    analogWrite(ENB, speed);
  } else if (dir == STOP) {
    // Left motor stop
    analogWrite(ENA, 0);
    // Right motor stop
    analogWrite(ENB, 0);
  }
}

In this project, we try to teach you how to do motor speed control. I hope it’s useful. Don’t forget to comment, and stay healthy.

Comments

Popular posts from this blog

Ultrasonic Sensor HC-SR04 With PIC Microcontroller

How Ultrasonic Sensor Works An ultrasonic sensor is a very useful sensor that measures distances with sounds. We used the PIC16F628A microcontroller for this project. This microcontroller has TMR1 which we are going to use. We need 2 I/O pins for TRIG and ECHO pins. For showing distance, we used an LCD. For more information about the LCD library and usage click the button below. LCD Interfacing with PIC Using XC8

How to Make Blink LED with PIC16F628A

How to Make Blink LED With PIC16F628A In this project tutorial, we are going to make blink-led projects with a pic microcontroller. After you read this tutorial you can build a PIC microcontroller project with XC8 on MPLAB IDE. We are going to make 3 different blinking projects. These projects are basic. Just learn how to make a basic project with a PIC microcontroller. You can see below which projects we are going to make; Blinking LED with 1s delay, LED with button, Blinking LED with a button.

How To Make Android App To Connect Arduino via Bluetooth

In this project, we are going to make an Android App that will connect with Arduino Nano via the HC-05 Bluetooth module. This app will control the LED, and motor, and read the temperature-humidity of the environment. We will use a free MIT App Inventor website for building apps via blocks. We will give all the project files for this project. If you are ready let’s get started. Schematic Firstly we made an example circuit to make bidirectional communication. You can see in the picture below which components we use. The main component is Arduino Nano which controls the system. We connect the red LED to the D2 pin. We use the L293D motor driver to control the DC motor. We added AHT10 to get temperature and humidity from the environment. Finally, we added HC-05 to communicate with the Android App. Circuit Schematic Android App We made an Android App via MIT App Inventor which is easy to make basic apps. This app will get and send data via Bluetooth. Let’s start to explain what we did. App