
DC Motor Speed Control using Arduino UNO
In this tutorial we will learn that how to make an algorithm for DC Motor Speed Control using Arduino UNO. Speed control of any motor is always done y Pulse Width Modulation, abbreviated as PWM. PWM pulse can be generated using Arduino and L298 Enable Pin is used to get that PWM pulse and then it controls the motor speed accordingly. Before going into the further details I would like to tell you about the concept of PWM for controlling DC motor. Moreover, you can download the complete Arduino code for DC Motor Speed Control using Arduino by clicking the below button: Download Arduino Source Code
Pulse Width Modulation (PWM)
PWM stands for Pulse Width Modulation. It basically describes the type of the digital signal. PWM technique is an excellent technique to control the analog circuits with microcontroller's digital PWM output. In this technique we can get analog results with the digital means. Digital control is used to create square wave. This pattern can vary voltages between full on i.e. 5V and full off i.e. 0V. The duration of on time i.e. when the the signal is present is known as pulse width. PWM waves for the different duty cycles are shown in the figure below.
Motor Controller L298
The pins EnA and EnB of the motor controller L298 are used as the PWM pins. We can rotate the DC motor at different speed providing different high and low voltage levels to these pins of the motor control driver. If we start to reduce the maximum voltage at which the motor rotates at maximum speed, the speed of the motor also starts to reduce. In this way these enable pins are helpful to control the speed of the DC motor.
Algorithm design and descrition
In this section of the tutorial DC Motor Speed Control using Arduino UNO, I am going to explain you about designing as well as a detailed description of the designed algorithm. I will tell you about the entire algorithm in step by step procedure.Note:Since you are working on the DC motor so you must also have a look at my previous tutorials, they will be helpful for you to simulate this project as well.
Open your Arduino software, copy and paste the source code given below in your software.#include <LiquidCrystal.h> //Keyboard Controls: // // C - Clockwise // S - Stop // A - Anti-clockwise // Declare L298N Controller pins // Motor 1 int count=255; int dir1PinA = 2; int dir2PinA = 5; int speedPinA = 6; // PWM control LiquidCrystal lcd(8, 9, 10, 11, 12, 13); void setup() { Serial.begin(9600); // baud rate lcd.begin(20, 4); lcd.setCursor(5,0); lcd.print("DC Motor"); lcd.setCursor(5,1); lcd.print("Direction"); lcd.setCursor(5,2); lcd.print("Control"); lcd.setCursor(2,3); lcd.print("via Arduino UNO"); delay(3000); lcd.clear (); lcd.setCursor(0,2); lcd.print("www.TheEngineering"); lcd.setCursor(4,3); lcd.print("Projects.com"); //Define L298N Dual H-Bridge Motor Controller Pins pinMode(dir1PinA,OUTPUT); pinMode(dir2PinA,OUTPUT); pinMode(speedPinA,OUTPUT); analogWrite(speedPinA, 255);//Sets speed variable via PWM } void loop() { // Initialize the Serial interface: if (Serial.available() > 0) { int inByte = Serial.read(); int speed; // Local variable switch (inByte) { case 'C': // Clockwise rotation //analogWrite(speedPinA, 255);//Sets speed variable via PWM digitalWrite(dir1PinA, LOW); digitalWrite(dir2PinA, HIGH); Serial.println("Clockwise rotation"); // Prints out “Motor 1 Forward” on the serial monitor Serial.println(" "); // Creates a blank line printed on the serial monitor //lcd.clear(); lcd.setCursor(0,0); lcd.print("Clockwise rotation"); break; case 'S': // No rotation //analogWrite(speedPinA, 0); // 0 PWM (Speed) digitalWrite(dir1PinA, LOW); digitalWrite(dir2PinA, LOW); Serial.println("No rotation"); Serial.println(" "); //lcd.clear(); lcd.setCursor(0,0); lcd.print("No rotation"); break; case 'H': //Accelrating motor count=count+20; if (count>255) { count =255; } analogWrite(speedPinA,count); delay(50); //digitalWrite(dir1PinA, LOW); //digitalWrite(dir2PinA, HIGH); Serial.println("Motor is accelrating slowly"); Serial.println(" "); Serial.println(count); lcd.setCursor(0,0); lcd.print("Motor is accelrating"); break; case 'L': //Deaccelrating motor count=count-20; if (count<20) { count=20; } analogWrite(speedPinA,count); delay(50); //digitalWrite(dir1PinA, LOW); //digitalWrite(dir2PinA, HIGH); Serial.println("Motor is deaccelrating slowly"); Serial.println(" "); Serial.println(count); lcd.setCursor(0,0); lcd.print("Motor Deaccelrates"); break; case 'A': // Anti-clockwise rotation //analogWrite(speedPinA, 255); // Maximum PWM (speed) digitalWrite(dir1PinA, HIGH); digitalWrite(dir2PinA, LOW); Serial.println("Anti-clockwise rotation"); Serial.println(" "); //lcd.clear(); lcd.setCursor(0,0); lcd.print("Anti-clockwise"); break; default: // Turn off the motor if any other key is being pressed for (int thisPin = 2; thisPin < 11; thisPin++) { digitalWrite(thisPin, LOW); } Serial.println("Wrong key is pressed"); //lcd.clear(); lcd.setCursor(0,0); lcd.print("Wrong key is pressed"); } } }
- In the previous tutorials, DC Motor Direction Control using Arduino and DC Motor Direction Control using Matlab we have learnt that how to control the direction of the DC motor.
- We used the commands C, A and S for the clockwise rotation, anti clockwise rotation and stopping the motor respectively.
- In this tutorial, we have added two further commands H and L for accelerating and de-accelerating the DC motor.
- If we send the command H different times consecutively the speed of the motor will increase continuously.
- If we send the command L different times consecutively, the speed of the motor will start to decrease.
- Now, upload the source code to your Arduino UNO's board.
- Open the serial monitor at the top right of the Arduino Software.
- And enter the commands in serial monitor periodically as explained above.
Actual Hardware Setup
- When we enter the command C in the serial monitor of the Arduino software. Motor will start rotating in the clockwise direction and a statement Clockwise rotation will be printed on serial port.
- The same statement will be printed on the LCD as well as shown in the figure below.

- When we enter the command A in the serial monitor of the Arduino software. Motor will start rotating in the anti clockwise direction and a statement Anti clockwise rotation will be printed on serial port.
- The same statement will be printed on the LCD as well as shown in the figure below.

- When we enter the command H in the serial monitor of the Arduino software. Motor will start accelerating and a statement Motor is accelerating will be printed on serial port.
- The same statement will be printed on the LCD as well as shown in the figure below.

- When we enter the command L in the serial monitor of the Arduino software. Motor will start to deaccelerate and a statement Motor Deaccelerates will be printed on serial port.
- The same statement will be printed on the LCD as well as shown in the figure below.

Leave a Reply
Leave a Reply
You must be logged in to post a comment.
Comments on ‘’DC Motor Speed Control using Arduino‘’
( 3 )
I want to find/write a program allowing me to use my dual H bridge to run a set up like what makebot mSpider (one of the set-ups for the mdraw bot kit) can do.Much like an X/Y plotter but hanging in mid air. Any suggestions for accomplishing this? I have tried to download many controller that would allow me to “draw” what I want to come out on the other end (at the “spider”) but I am having difficulties with zip files and such. I am currently experimenting with inkscape (recommended) but its not as easy to learn as they would like you to believe. I am trying to refamilurize myself with master cam but the “code” its generating is not being recgonized (has too many characters or such) by the controller. GRBL looks great but due to my inability to open zip files, its a bit of a loss. Any advice or insights you could lend would be greatly appreciated.
please share circuit diagram
Please give the circuit diagram of this project