Make Your Own Low-cost Servo

56,524

131

47

Posted

Introduction: Make Your Own Low-cost Servo

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 : https://www.instructables.com/id/MOTOR-DRIVER-30Amp/

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.

WORKING :
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 .

FURTHER SCOPE OF IMPROVEMENT : 
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

}
  servo1.drive(angle);         // drive the servo using myservo.drive( 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  ----->                        myservo.drive( angle )
                                                                where angle lies b/w  0 and 160

eg :  myservo.drive(120);         // the servo will rotate 120 degrees

Share

Recommendations

  • Epilog Challenge 9

    Epilog Challenge 9
  • Sew Warm Contest 2018

    Sew Warm Contest 2018
  • Gluten Free Challenge

    Gluten Free Challenge
user

We have a be nice policy.
Please be positive and constructive.

Tips

Questions

47 Comments

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.

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: http://www.robotshop.com/en/torxis-i01856-12v-high...

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 ).

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

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?

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 :(
bouddaliabdesamad@gmail.com
thanks