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
Attachments
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
51 Comments
Question 1 year ago on Step 4
Sir can I use L298n motor driver?
3 years ago
Hey nice instructable, I wanted to know if i have an L298n motor driver, how can i modify the code to work with this driver.
Tip 4 years ago on Step 4
First, thank you SO MUCH for posting this. It saved me a huge amount of headache trying to code it myself.
I wanted to mention that this does also work really well for turning a high power linear actuator into a linear servo, as long as the actuator has a feedback potentiometer built in. The only changes that I made to the cpp file were to increase the scaling from 0-160 to 0-100 (0-100% travel) and I increased the gain values from 1 to 10 to speed up the action of the actuator. Even with the increased gain, the position still seems extremely repeatable.
I hope that helps someone else as much as it just did me!
Question 5 years ago
I cant upload the library to the arduino ide. how do i do that.
5 years ago
It rotate on Anti-clock wise how can i rotate clock wise
7 years ago
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.
Reply 7 years ago
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 :)
Reply 7 years ago
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 ).
7 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
7 years ago
is this gonna work with 24 volt dc motor? thanks
Reply 7 years ago
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..).
8 years ago
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?
Reply 8 years ago on Introduction
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.
Reply 8 years ago on Introduction
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
Reply 8 years ago on Introduction
It would be much appreciated if you can make the library for me, thanks in advance :)
Reply 8 years ago on Introduction
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.
Reply 8 years ago on Introduction
It's ok bro, take your time,here's my email address:norhamdillah233@hotmail.com
8 years ago on Introduction
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
8 years ago
Awesome idea...
8 years ago on Step 4
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 /mention...it'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!