Make Your Own Low-cost Servo





Introduction: Make Your Own Low-cost Servo

About: Greetings ! I'm Tanay, a hobbyist interested in making robots and sharing stuff. I hope that my instructables help you in solving your problems Happy Tinkering ! Note : Sorry for the inconvenience but I won...

I had a problem with some servos which i bought for my arduino but i don't know why , they were making some strange noises and were drawing too much current. So i decided to make my own servos ! . First of all its important to know exactly how a servo works.
The servo is mainly a DC motor with a motor driver , a comparator and a "feedback potentiometer". The potentiometer (as its name suggests ) gives a feedback to the controller about the current position of the servo shaft. These servos are usually expensive and are fragile. To make our own servo we'll need :
1. A microcontroller  ( preferably Arduino coz i have made a library specially for these DIY Servos -- I've attached the library below
2. a 10k ohm free moving potentiometer as shown
3. a piece of strong flexible wire ( for mount )
4. some super glue
5. a motor driver :  build your own 30 AMP MOTOR DRIVER :

Step 1: Start Building It !

1. First bend the pins of the potentiometer outward as shown and Solder three wires to it .
2. now apply some superglue on the tip of the motor-shaft and place the potentiometer's knob carefully on the motor shaft
NOTE : Do not apply too much superglue as the viscosity of superglue is very less and it can easily lock your shaft / gears or ruin the potentiometer

3. now bend a piece of strong and flexible wire in such a way that it will hold the pot firmly in it's place

4. glue the ends of the wire mount to the potentiometer's body ( not the knob ) and fix it on the motor

Now your servo is ready !  

Step 2: Library and Basic Working

Extract the folder from the zip to   Program files (x86) /  Arduino  / libraries / CustomServo

Now restart the Arduino IDE and paste the code in it and upload it.

The custom servo can be used in robots , etc but not for RC planes or copters.  
The servo shaft's position is encoded by the feedback pot from 0 to 1023 ( zero to extreme )  to  avoid excess turning due to momentum of the shaft , the actual turn area has been limited to 160 degree cutting off 10 degree offset from each side. 
When we send a value to the microcontroller , it compares the value and the position of the servo shaft . If there is a difference between these values  ,the arduino commands the motor driver to drive the servo CW or CCW and equalize the values. To have smooth motion and less momentum build-up , PWM values are required to calculate the phase difference and set the motor speed accordingly. It has been tested with minimum 2 degrees of noticeable displacement .

It requires many PWM outputs , these can be multiplexed using a 8-bit multiplexer ( 4051 )  to reduce the pin count

Step 3: Hook It Up to Arduino

The pin connection has been shown in the picture. The wiper goes to analog 0 , one of the wires from the potentiometer to GND on arduino and the other to +Vcc on arduino.  The motor is to be connected to a motor driver and the inputs of the motor driver are connected to arduino PWM pins only ***

Step 4: Upload the Code

Download the provided CustomServo libray 

here is the code by which you can tell the servo to set it's position as commanded by the used using serial monitor
it can take values from 0 to 160 (in degree)

/* Program and library made by electro18 (Tanay P.)
This code is an example of the CustomServo library
The user can input any value from (0 to 160) in the serial monitor
and drive the custom servo
pin connection :
motor driver input 1 : pin 9
motor driver input 2 : pin 11
Servo feedback pin   : analog 0
pot pins to +5 and gnd on arduino

#include<CustomServo.h> //include the custom servo library
int angle;                // angle by which the servo will rotate
CServo servo1(9,11,0);    // initialize the servo with CServo myservo( pin 1 , pin 2 , analog feedback pin )
void setup()

  Serial.begin(9600);    // setup serial connection

void loop()
while(Serial.available())     // check for availability of serial port
   angle=Serial.parseInt();    // input an integer from 0 to 160 as the angle value and hit enter

};         // drive the servo using angle ) where   0 <= angle <= 160
  Serial.println(angle);      // print the current angle
The CustomServo library description :

1. setting up a custom servo    --- >   CServo myservo( pwm pin 1 , pwm pin 2, analog pin )

eg :    CServo myservo(9,11,0);

2. Commanding it  ----->               angle )
                                                                where angle lies b/w  0 and 160

eg :;         // the servo will rotate 120 degrees



    • Creative Misuse Contest

      Creative Misuse Contest
    • Water Contest

      Water Contest
    • Oil Contest

      Oil Contest

    48 Discussions


    Question 7 weeks ago

    I cant upload the library to the arduino ide. how do i do that.

    It rotate on Anti-clock wise how can i rotate clock wise

    How is this low-cost? You don't really need a arduino to make a servo...
    It's a nice project, but far from low-cost.

    2 replies

    I beg to differ. I am gonna use this to turn a gear motor from a drill into a servo, using a $0.50 potentiometer, a $10 Adafruit Pro Trinket (stripped down Uno), and a $23 18V drill from Harbor Freight. It will have more than 100 in-lb or over 1600 in-lb of torque, i.e. equivalent to this:

    I think low cost applies :)

    Well in that case you might want to consider using a window comparator or a rather cheap microcontroller. Generally high torque servos are really expensive and if you use cheaper components then it may save you a couple of bucks or so.
    Applications involving a combination of microcontrollers and multiple servos together would prove to be "low-cost" because you won't need an in-built controller circuit for that ( excluding RC applications ). In any case you'll have to feed PWM variable signals to the servo to make it work. ( Here the purpose is solved by an arduino else you'll need an RC Tx - Rx pair or a simple PWM generator ).


    2 years ago

    electro ill be emailing your instructables account look for me in your box, im trying to use your lib for this model i created

    k (v7~recovered).png

    is this gonna work with 24 volt dc motor? thanks

    1 reply

    should do, 24v goes to motor power side and logic side (feedback resistor) to arduino power. For the H-Bridge most fets need 12v or so to switch correctly so you will need to take care to get logic level fets that can operate on 5v and handle the 24v motors current (I learned the hard way, non logic level fets explode if you try to switch 24v with only 5v driving them, wear sun glasses..).

    good work!!' can I use arduino motor sheild as the motor driver? would there be any changes to the code if I use the sheild?,If so, can you point out which lines of code do I need to change?

    5 replies

    Yeah the Arduino Motor shield would serve the purpose as well. The only thing that you have to change is the enable pins and the brake pins.
    The motor driver that I'm using depends on the values given to the PWM inputs, i.e. it changes the direction of the spin according to the PWM inputs.
    Whereas in the arduino motor shield, you have to consider the enable and the brake enable pins. Some changes are required in the code to make it work with the shield, the changes have to be done in the library itself ( the .cpp and header file ). If you want, I can rebuild the library for you.

    hello , plz can you send me the library cuz i'm working with the motor shield and does'nt work just the noises :(

    Okay sure, but I won't be able to build and test it for now because I have my school exams right now. As they end, I'll test it and then mail it to you. I need you email ID for that.

    hi there I have a sabertooth dual motor speed control the + gives 5 volts to power a rc receiver im wanting to try this im a newbie strictly rc but just to be sure the 5 v out do I not need to hook that wire up doesn't it just use ground and the signal wire ? like if I didn't want to power my rc reciver with the BEC in the ESC the controller has an rc mode that just uses pwm inputs wasn't sure if this was for a different kind of motor controller

    Awesome idea...

    Darn cool!!! Much Thanks! I do wish the "pins" you name were a bit more clear.

    I want to try this this but, as I can't figure out from your instructable' what are pins 1 and 2 that you use /'s in the code as well but, I'm not using any pins 1 and 2 anywhere..? also could you show how to do 2 of these on 1 arduino/MC? as in for the use of "robot legs" etc....I think if you could do that, the "pins" in question would become more clear. Much Thanks!! Great, very useful method!

    3 replies

    The pin 1 and pin 2 are the two inputs of the motor driver. The Arduino PWM pins 9 and 11 are directly connected to the pin 1 and pin 2 on the motor driver which controls the motor. Depending on the configuration of the motor pins, you may have to swap the connections.

    OH! IN1 IN2 gotcha' Much Thanks!! Im still not gettin' how to move the motor tho'...I can read the pot' when I turn the motor shaft by hand...but no movement from the code itself to make the motor turn? I think my issue is more in the code than "hookin' up" stuff. I want a "sweep" like the servo sweep with this rig. x2 Awesome job and thanks for taking the time to answer my lame questions!!

    Okay, so did you check your motor driver ? does it work as expected ? Did you try swapping the IN1 and IN2 pins ? If this still doesn't seem to work then paste your entire code in the comment box, I'll try to run it myself and get back to you soon ! :)