Servo Motor Control using Arduino

Published  August 15, 2015   2
Dilip Raja
Author
Servo Motor Interfacing with Arduino Uno

In this tutorial we are going to control a servo motor by ARDUINO UNO. Servo Motors are used where there is a need for accurate shaft movement or position. These are not proposed for high speed applications. These are proposed for low speed, medium torque and accurate position application. These motors are used in robotic arm machines, flight controls and control systems. This tutorial covers how to control Arduino servo motor using push button, if you want to know more you can check this detailed Arduino servo motor Guide

Servo motors are available at different shapes and sizes. A servo motor will have mainly there wires, one is for positive voltage another is for ground and last one is for position setting. The RED wire is connected to power, Black wire is connected to ground and YELLOW wire is connected to signal.

Servo Motor

A servo motor is a combination of DC motor, position control system, gears. The position of the shaft of the DC motor is adjusted by the control electronics in the servo, based on the duty ratio of the PWM signal the SIGNAL pin.

 

Simply speaking the control electronics adjust shaft position by controlling DC motor. This data regarding position of shaft is sent through the SIGNAL pin. The position data to the control should be sent in the form of PWM signal through the Signal pin of servo motor.

 

The frequency of PWM (Pulse Width Modulated) signal can vary based on type of servo motor. The important thing here is the DUTY RATIO of the PWM signal. Based on this DUTY RATION the control electronics adjust the shaft.

 

As shown in figure below, for the shaft to be moved to 9o clock the TURN ON RATION must be 1/18.ie. 1ms of ON time and 17ms of OFF time in a 18ms signal.

PWM Pulses

For the shaft to be moved to 12o clock the ON time of signal must be 1.5ms and OFF time should be 16.5ms. This ratio is decoded by control system in servo and it adjusts the position based on it. This PWM in here is generated by using ARDUINO UNO.

 

Circuit Components

Hardware: ARDUINO UNO, power supply (5v), 100uF capacitor , buttons (two pieces), 1KΩ resistor (two pieces), Servo motor (which needed to be tested).   

Software: arduino IDE (Arduino nightly).

 

Arduino Servo Motor Circuit Diagram and Explanation

servo motor control using arduino circuit diagram

In normal cases we need to go to the registers of controller for adjusting the frequency and for getting required duty ratio for accurate position control of servo, in ARDUINO we don’t have to do those things.

 

In ARDUINO we have predefined libraries, which will set the frequencies and duty ratios accordingly once the header file is called or included. In ARDUINO we simply have to state the position of servo that needed and the PWM is automatically be adjusted by UNO.

The things which we need to do for getting accurate position of servo are:

  1. #include <Servo.h>
  2. Servo sg90servo;
  3. Sg90.attach(servo_signal_pin_attached_to);
  4. Sg90.write(needed_position_ angle);

 

First we need to set frequency of PWM signal and for that we should call “#include <Servo.h>” header file, on including this header file in the program, the frequency gets set automatically and we get to use some special conditions, which enables the user to enter needed position of servo directly without any fuzz.

 

Now we need to define a name for the servo “Servo sg90sevo”, here ‘sg90servo’ is the name chosen, so while writing for potion we are going to use this name, this feature comes in handy when we have many servos to control, we can control as many as eight servo by this.

 

Now we tell the UNO where the signal pin of servo is connected or where it needs to generate the PWM signal. To do this we have “Sg90.attach(3);”, here we are telling the UNO we connected the signal pin of servo at PIN3.

 

All left is to set the position, we are going set the position of servo by using “Sg90.write(30);”, by this command the servo hand moves 30 degrees, so that’s it. After that whenever we need to change the position of servo we need to call the command ”Sg90.write(needed_position_ angle);”. In this circuit we will have two buttons one button increases the position of servo and the other is for decreasing the position of servo.

 

The Arduino Servo Motor control tutorial is explained in step by step of C code given below.

Code

volatile int i=0;//initializing a integer for incrementing and decrementing duty ratio.

#include <Servo.h>// header file for controlling servo

Servo servo;//defining the name usage as servo itself

void setup()

{

                pinMode(3, OUTPUT);   // sets the pin3 as output

                pinMode(0, INPUT);// sets the pin0 as output

                pinMode(1, INPUT);// sets the pin1 as output

}

 

void loop()

{

                servo.write(i);//set servo potion ‘i’ degrees

               

                if (digitalRead(0)==LOW)

                {

                                if (i<180)

                                {

                                                i++;//if pin0 is pressed and degrees is less than 180

                                                delay(30);

                                }

                }

                if (digitalRead(1)==LOW)

                {

                                if (i>0)

                                {

                                                i--;// if pin1 is pressed and degrees is greater than 0

                                                delay(30);

                                }

                }

}

 

Video

Have any question realated to this Article?

Ask Our Community Members

Comments

Submitted by zeki on Sat, 01/21/2017 - 13:43

Permalink

İt gives error, wil not work because you dont enter a
servo.attach(servo data pin number); command... and also
pinMode(3, OUTPUT); // sets the pin3 as output

pinMode(0, INPUT);// sets the pin0 as output

pinMode(1, INPUT);// sets the pin1 as output

is false.. ınput command do not make output...
try better....

Submitted by Naveed Aijaz on Sat, 05/27/2017 - 02:18

Permalink

This is 100% working code,.
When push button1 is pressed, it goes from 0 to 90 degrees.
When push button2 is pressed, it goes from 0 to 180 degrees
Regards,
Code:
#include <Servo.h>

const int buttonPin = 2;

const int buttonPin2 = 4;

int buttonState = 0;

int buttonState2 = 0;

Servo servoA;

int position = 0;
int position1= 0;

void setup() {

servoA.attach(9);

pinMode(buttonPin, INPUT);

pinMode(buttonPin2,INPUT);

}

void loop() {

buttonState = digitalRead(buttonPin);

buttonState2 = digitalRead(buttonPin2);

if(buttonState ==HIGH && position < 180){

servoA.write(position++);

delay(1);

}

if(buttonState == LOW && position > 90){

servoA.write(position--);

delay(1);

}

if(buttonState2 ==HIGH && position1 < 180){

servoA.write(position1++);

delay(1);

}

if(buttonState2 == LOW && position1 > 3){

servoA.write(position1--);

delay(1);

}

}