MonkeyBot - 3 Servo Climbing Robot




About: I am an American teaching English at Shangluo University, Shaanxi. I like making machines that do interesting but fairly useless things - I call them Quixotic Machines.

Have added new video of Version 2 of MonkeyBot that uses standard size robot servos and aluminum brackets.

Version 1 uses microservos and wooden arms but does not have enough power to lift it's own power packs so it is tethered.

I wanted to build a proof of concept robot using only 3 servo that would climb a series of pegs using two "arms". It is constructed of the following items:

3 micro servos

fishing pole sections for the arms

big paper clips (not standard size) for the "hands" or grippers

Arduino Nano

zip ties, epoxy, and hot glue

6 volt AA battery pack for the servos

5 long screws for the climbing pegs and a board (in my case a bamboo cutting board)

The robot works well but is tethered to the power supplies as the micro servos are not powerful enough to lift the battery packs that would be required for untethered use. Possibly I will try to make a version 2 using standard sized servos that would also carry the Nano and battery packs.

Note the hands or grippers are opposed to each other. I tried then facing each other but it would not work as sometimes you need the arms to force against each other to move correctly and they would slip off the pegs. Also you need to keep the voltage as high as possible (6v) for the servos or you will end up programming in movements that wont work at different voltages as the voltage drops over time. I used AAA batteries at first but they drained too quickly because the servos have to do a lot of work lifting the robot and also at times pushing against each other and the pegs. AA batteries worked pretty well.

Kind of an interesting project that has no obvious use except to find out if it can be done.

Programming was rather tedious. The video shows two programming efforts: the first I programmed each servo to move separately and this resulted in a rather jerky moving robot. The second effort I used an interpolated routine to basically move all the servos at the same time and this was decidedly less jerky though could be done much smoother.

If the pegs are at different positions like in my project, you have to program for each movement to each peg. If the pegs were equi-distance and regular then the programming would be much simpler.

Teacher Notes

Teachers! Did you use this instructable in your classroom?
Add a Teacher Note to share how you incorporated it into your lesson.

Step 1: Building the Robot Body

The grippers are just bent large paper clips, zipped tied to the arm and then hotglued to keep them from moving. Same with the servo arms. Also zipped tied and hotglued servos to larger arm sections.

Step 2: Wiring Nano and Programming

The schematic shows how I wired the servos, 6v power supply and Nano. Just be sure to ground 6v to the Nano.

Here is the program for the interpolated servos. Interpolated means that I move all the servos at close to the same time and same relative distance. This results in a smoother moving arm rather than moving each servo separately. Also the coding is easier and faster.


Servo myservoLeft,myservoRight, myservoCenter,myservoWeight; // create servo object to control a servo

int servoRead(int servoNumber) {

int servoCurrent;

if (servoNumber== 3) { servoCurrent =; }

if (servoNumber== 4) { servoCurrent =; }

if (servoNumber== 5) { servoCurrent =; }

return servoCurrent;


void servoWrite(int servoNumber, int offset) {

if (servoNumber==3) { myservoLeft.write(offset); }

if (servoNumber==4) { myservoCenter.write(offset); }

if (servoNumber==5) { myservoRight.write(offset); }


void myServo(int newAngle,int angleInc,int incDelay,int servoNum) {

int curAngle;

if (servoNum== 1) { curAngle =; }

if (servoNum== 2) { curAngle =; }

if (servoNum== 3) { curAngle =; }

if (servoNum== 4) { curAngle =; }

if (curAngle < newAngle) {

for(int angle=curAngle;angle < newAngle;angle += angleInc) {

if (servoNum == 1) myservoLeft.write(angle);

if (servoNum == 2) myservoCenter.write(angle);

if (servoNum == 3) myservoRight.write(angle);

if (servoNum == 4) myservoWeight.write(angle);

delay(incDelay); }


else if (curAngle > newAngle) {

for(int angle=curAngle;angle > newAngle;angle -= angleInc) {

if (servoNum == 1) myservoLeft.write(angle);

if (servoNum == 2) myservoCenter.write(angle);

if (servoNum == 3) myservoRight.write(angle);

if (servoNum == 4) myservoWeight.write(angle);

delay(incDelay); }



void interpolate3Servos( int servo3,int servo3Position,

int servo4,int servo4Position,

int servo5,int servo5Position,

int numberSteps,int timeDelay){

int servo3Current,servo4Current,servo5Current;

servo3Current = servoRead(servo3);

servo4Current = servoRead(servo4);

servo5Current = servoRead(servo5);

Serial.print("Servo3Pos and Current "); Serial.print(servo3Position); Serial.print(" "); Serial.println(servo3Current);

Serial.print("Servo4Pos and Current "); Serial.print(servo4Position); Serial.print(" "); Serial.println(servo4Current);

Serial.print("Servo5Pos and Current "); Serial.print(servo5Position); Serial.print(" "); Serial.println(servo5Current);

Serial.println(" ");

int cOffset = (servo3Position - servo3Current); cOffset = abs(cOffset)/numberSteps;

int dOffset = (servo4Position - servo4Current); dOffset = abs(dOffset)/numberSteps;

int eOffset = (servo5Position - servo5Current); eOffset = abs(eOffset)/numberSteps;

int cOffsetTotal=0,dOffsetTotal=0,eOffsetTotal=0;

cOffsetTotal = servo3Current;

dOffsetTotal = servo4Current;

eOffsetTotal = servo5Current;

for (int x=0; x

if (servo3Position > servo3Current) { cOffsetTotal = cOffsetTotal + cOffset; }

else { cOffsetTotal = cOffsetTotal - cOffset; }

if (servo4Position > servo4Current) { dOffsetTotal = dOffsetTotal + dOffset; }

else { dOffsetTotal = dOffsetTotal - dOffset; }

if (servo5Position > servo5Current) { eOffsetTotal = eOffsetTotal + eOffset; }

else { eOffsetTotal = eOffsetTotal - eOffset; }

if (servo3Position != servo3Current) servoWrite(servo3,cOffsetTotal);

if (servo4Position != servo4Current) servoWrite(servo4,dOffsetTotal);

if (servo5Position != servo5Current) servoWrite(servo5,eOffsetTotal);

// Serial.print(" a and b Offset "); Serial.print(aOffsetTotal); Serial.print(" ");Serial.println( bOffsetTotal); delay(10);


}// end for


// take care of modulo remainders //


if (servo3Position != servo3Current) servoWrite(servo3,servo3Position);

if (servo4Position != servo4Current) servoWrite(servo4,servo4Position);

if (servo5Position != servo5Current) servoWrite(servo5,servo5Position);


void leftArm() {

interpolate3Servos( 3,170,4,140,5,150,20,50); //


interpolate3Servos( 3,90,4,120,5,150,20,50); // shift monkey right


myServo(90,1,1,2); // let go of left hook


interpolate3Servos( 3,40,4,100,5,70,20,50); //


interpolate3Servos( 3,20,4,90,5,20,20,50); //


interpolate3Servos( 3,20,4,90,5,10,20,50); // extend left arm up


myServo(120,1,1,2); // grab left hook


interpolate3Servos( 3,20,4,110,5,70,20,50); // shift monkey left


interpolate3Servos( 3,30,4,90,5,50,20,50); // let loose right arm


interpolate3Servos( 3,30,4,80,5,55,20,50); // let loose right arm


interpolate3Servos( 3,130,4,85,5,150,10,50); // pull right arm up to left peg


interpolate3Servos( 3,150,4,160,5,150,20,50); // reach right arm up to right peg


interpolate3Servos( 3,130,4,140,5,140,20,50); // reach right arm up to right peg


interpolate3Servos( 3,120,4,130,5,140,20,50); // reach right arm up to right peg


interpolate3Servos( 3,110,4,110,5,150,20,50); // reach right arm up to right peg


interpolate3Servos( 3,110,4,90,5,150,20,50); // reach right arm up to right peg

// last arm movement

interpolate3Servos( 3,80,4,100,5,70,20,50); // reach right arm up to right peg


interpolate3Servos( 3,70,4,90,5,10,20,50); // reach right arm up to right peg


interpolate3Servos( 3,40,4,140,5,0,20,50); // reach right arm up to right peg


interpolate3Servos( 3,40,4,140,5,100,20,50); // reach right arm up to right peg





void setup()




myservoLeft.attach(3); // attaches the servo on pin 3 to the servo object


myservoCenter.attach(4); // attaches the servo on pin 4 to the servo object


myservoRight.attach(5); // attaches the servo on pin 5 to the servo object


delay(1000); // waits for the servo to get there

interpolate3Servos( 3,90,4,90,5,90,10,50); // neutral



void loop() {



// delay(1000);

exit(0); //pause program - hit reset to continue


Be the First to Share


    • Instrument Contest

      Instrument Contest
    • Make it Glow Contest

      Make it Glow Contest
    • STEM Contest

      STEM Contest

    8 Discussions


    1 year ago

    Very imaginative! I appreciate the effort that went into this.


    2 years ago

    Sir can you send me the code. There is some error in this code

    1 reply

    Reply 2 years ago

    Sorry. That is the only code I have and it was working fine on mine. I have since dismantled by robot to use the servos on other projects.
    Are your servos oriented the same way as mine. And of course the positional numbers will not work for you, you will have to experiment and put in your own numbers as it would be almost impossilbe that your linkage is exactly the same as mine. Good luck.


    2 years ago

    Great project. I love the idea of using ONLY three micro servos for the robot!

    1 reply

    Reply 2 years ago

    Thank you! My last robot project used 7 servos and I swore I would never again work a project with many servos as it chewed up a couple hundred hours of programming time. Used only about 25 hours programming time on this one. Simple is better. I plan on building another one like this using standard servos so it can carry the battery packs and Arduino - untethered.


    2 years ago

    With sensors &/or cameras you could make it able to trace its path "alone". You can easily imagine a lot of applications for such a robot. Working in a hard polluted site, rescuing people (or cats) who climbs too high and cannot return back, etc.


    2 years ago

    Can you please make a youtube video on how to assemble the parts of the robot bcoz I cant get it much......please can you help me out

    1 reply

    Reply 2 years ago

    If you don't have exactly the same size materials as me it wouldn't do you much good. I just wanted to give a general idea of the robot and I think you can see from the pictures that it is just 3 servos connected to each other so that they are all on the same plane. You can do the same using just about any material for the legs: rods, wooden strips, whatever and using whatever dimensions you see fit as long as the legs are not so long that the servos will not have the power to lift the entire robot. Each of my legs are about 8 centimeters long from servo to servo and so are the arms. This instructable is more about fabrication that it is putting a kit together. If you have specific issues or problems, I can address those but mostly you are on your own.