556 Servo Driver

8,658

87

13

Servos (also RC servos) are small, cheap, mass-produced servomotors used for radio control and small-scale robotics. The are designed to be easily controlled: the position of the internal potentiometer is continually compared to the commanded position from the control device (i.e., the radio control). Any difference gives rise to an error signal in the appropriate direction, which drives the electric motor either forwards or backwards, and moving the shaft to the commanded position. When the servo reaches this position, the error signal reduces and then becomes zero, at which point the servo stops moving.

Radio control servos are connected through a standard three-wire connection: two wires for a DC power supply and one for control, carrying a pulse-width modulation (PWM) signal. The standard voltage is 4.8 V DC, however 6 V and 12 V is also used on a few servos. The control signal is a digital PWM signal with a 50 Hz frame rate. Within each 20 ms timeframe, an active-high digital pulse controls the position. The pulse nominally ranges from 1.0 ms to 2.0 ms with 1.5 ms always being center of range.

You don’t need a microcontroller or computer to control a servo. You can use the venerable 555 timer IC to provide the required pulses to a servo.

Many microcontroller based circuits are available on the net. There is also a few circuits available to test servo with based on single 555's, but I wanted precise timing without the frequency varying at all. Yet it had to be cheap and easy to build.

Step 1: PWM What?

As its name suggests, pulse width modulation speed control works by driving the motor with a series of “ON-OFF” pulses and varying the duty cycle, the fraction of time that the output voltage is “ON” compared to when it is “OFF”, of the pulses while keeping the frequency constant.

The concept behind this circuit is that it uses two timers to generate the output PWM (Pulse Width Modulation) signal to drive the servo with.

The first timer operates as an astable multivibrator and it generates the "carrier frequency", or the frequency of the pulses. Sounds confusing? Well, while the pulse width of the output can vary, we want the time from the start of the first pulse to the start of the second pulse to be the same. This is the frequency of the pulse occurrences. And this is where this circuit overcomes the varying frequency of most single 555 circuits.

The second timer acts as a monostable multivibrator. This means that it is required to be triggered to generate a pulse of its own. As said above, the first timer will trigger the second at a fixed, user definable interval. The second timer however, has an external pot that is used to set the output pulse width, or in effect determine the duty cycle and in turn the rotation of the servo. Let's get to the schematic...

Step 2: A Little Bit of Math... Frequency

The circuit uses a LM556 or NE556, which can be substituted with two 555's. I just decided to use the 556 because it is a dual 555 in one package. The left timer circuit, or frequency generator, is set up as an astable multivibrator. The idea is to get it to produce a carrier frequency of about 50Hz, from where a duty cycle will be added by the right hand timer, or pulse width generator.

C1 charges through R1, R4 (used for setting the frequency) and R2. During this time, the output is high. Then C1 discharges through R1, and the output is low.

F = 1.44 / ( (R2+R4 + 2*R1) * C1)

F= 64Hz for R1 = 0

F= 33Hz for R1 = 47k

On the simplified simulated circuit however R1 is omitted, and the frequency is a fixed 64 Hz.

Very important! We want the time that the output is low to be shorter than the minimum pulse width of the pulse width generator.

Step 3: A Little Bit of Math... Pulse

The pulse width generator, or right hand timer, is set up in monostable mode. This means that every time the timer is triggered, it gives an output pulse. The pulse time is determined by R3, R5, R6 and C3 . An external potentiometer (100k LIN POT) is connected to determine the pulse width, which will determine the rotation and extend of rotation on the servo. R5 and R6 are used to finely tune the outermost positions for the servo, avoiding it to chatter. The formula used is as follow:

t = 1.1 * (R3 + R5 + ( R6 * POT)/(R6 + POT)) * C4

So, the minimum pulse time when all the variable resistors are set to zero is:

t = 1.1 * R3 * C4

t = 0.36 ms

Note that this minimum pulse width time is longer than the trigger pulse to ensure that the pulse width generator doesn't constantly generate 0.36ms pulses one after the other, but at a steady +- 64Hz frequency.

When the potentiometers are set to maximum, the time is

t = 1.1 * (R3 + R5 + ( R6 * POT)/(R6 + POT)) * C4

t = 13 ms

Duty Cycle = Pulse Width / Interval.

So at a frequency of 64Hz, the pulse interval is 15.6ms. So the Duty Cycle varies from 2% to 20%, with the centre being 10% (remember that 1.5ms pulse is center position).

For the sake of clarity potentiometers R5 and R6 have been removed from the simulation and replaced with a single resistor and a single potentiometer.

Step 4: Enough With the Math! Now Let's Play!

You can play the simulation HERE: just click on the "Simulate" button, wait while the simulation loads and then click on "Start simulation" button: wait for the voltage to stabilize, then click and hold the left mouse button on the potentiometer. Drag the mouse and move the potentiometer to control the servo.

You can note the pulse width changing on the upper oscilloscope, while the frequency of the pulse stays the same on the second oscilloscope.

Step 5: Last But Not Least... the Real Thing!

If you want to go further and build the circuit itself here you can find schematic, PCB layout (it's a single side PCB that you can easily fabricate at home), components layout, copper layout and parts list.

A little note about the trimmers:

  • the blue trimmer sets the frequency of the signal
  • the middle black trimmer sets the lower rotation limit
  • the remaining black trimmer set the upper rotation limit

A quick note useful to calibrate the circuit for a particular servo:

  1. set the main potentiometer to zero
  2. adjust the middle black trimmer until the servo is steadily set at the lower limit without chattering
  3. now set the main potentiometer to maximum
  4. adjust the remaining black trimmer until the servo is steadily set at the higher limit without chattering

If you enjoyed this instructable please vote for me in the contest! :)

Electronics Tips & Tricks Challenge

Judges Prize in the
Electronics Tips & Tricks Challenge

Share

    Recommendations

    • Make it Glow Contest 2018

      Make it Glow Contest 2018
    • Toys Contest

      Toys Contest
    • PCB Contest

      PCB Contest

    13 Discussions

    0
    None
    SteveM245

    Question 4 weeks ago

    Great instructable. How much do you think it will cost to build the board? Many thanks.

    1 more answer
    0
    None
    hombremagneticoSteveM245

    Answer 4 weeks ago

    Hi SteveM245, I would say not more than 10 USD if you make it at home... (servo excluded)

    1
    None
    indoorgeek

    4 weeks ago

    A small application very well explained! Congrats on your big win!

    1 reply
    0
    None
    hombremagneticotechnovative

    Reply 5 weeks ago

    Thanks! I hope so... You don't always need Arduino or Raspberry PI to have fun... :)

    0
    None
    KISELIN

    4 weeks ago

    Hi. 555 (& 556) "Rules".
    Thank's to your Ible I "FINALY" got the concept of PWM, that is:
    I allways got the pricipes of the 1,0ms --- 1,5ms -- 2,0ms (Home. Midle, End)
    What I never ewer before got is that there's the "time window of 20ms" for ewery pulse to be transmitted. Why don't they clearyfy that in them most Instr's? I guess because they "allways" (Arduino) assume to "include.h PWM", thus actually not knowing what it includes.
    Sure, allways including what so ewer is to have a "pre-composed" function (thank God for that, the Wheel is allready invented, no need to that invention again, but it would be fun to do it)
    Again: Hurray for 555. (my first 555 experience was in the late 70's)

    0
    None
    bvd1940

    4 weeks ago

    Nicley done and presented

    1
    None
    gm280

    5 weeks ago

    Interesting post. I remember back in the days I flew R/C planes, I made a servo standard to adjust the servos. It produced a 1.5 ms pulse to verify the servos were set to center. And it was an amazingly easy circuit to build. And it helps when installing servos in the aircraft. Nice project you posted.

    1 reply
    0
    None
    hombremagneticogm280

    Reply 4 weeks ago

    Thanks gm280! It's quite an old-school project indeed :)