Baby MIT Cheetah Robot

About: Want to do some thing best with my less resource.

I like very much to see robots walk like animals. Lot of Robots MIT Cheetah, Boston Spot wow amazing robots. Like wise very small robot i want to build. This is the version 1 i plan to upgrade more and more for this robot. In the first version i cover major portion. This robot Run, Walk, Crawl, Walk and run in different heights, take push ups(actually i plan for jump but this servo just push up), self check and say Hai. For the first time i use the 3D printed parts. Use android app to control the robot. On inspired of MIT Cheetah i did it so i name it as "BABY MIT CHEETAH". The Baby cheetah size is only 23 cm X 9 cm X 9 cm.

The cheetah run in different heights and different height in front and back side. Turn in the same place.

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: Materials Required

Materials Required

1) Arduino nano.

2) HC-05 Arduino bluetooth module.

3) MG90S Servo - 8 Nos.

4) Servo motor mount - 3D printed 8Nos, body made with wooden sheet .

5) Old Computer SMPS (5V for servo taken from red and black wire and 12V taken from yellow and black wire).

6) Double Side plain PCB board.

7) Male and Female Header pins.

Step 2: 3D Print Leg and Servo Holder

Use Tinkercad to design the leg links and servo holder. At first i use servo holder and a poly wood to design the robot body then after find it successful i change the body to 3d print.

The 3D model downloaded from tinkercad is given in the link. The leg joint links is 3 cm and 6 cm in length. 4 sets of legs printed. And 8 servo holder printed. I use online printing service. When go through the websites i found A3DXYZ is best in prize and product is also fine.

Step 3: Circuit Plan

As per plan we want to drive 8 servos. So i user Digital pins 2 to 9. Connect the pin to the servo pins using male connector. Arduino TX RX is connected to bluetooth RX and TX and power supply for bluetooth is given from arduino 5V. For Arduino Vin is given from 12V supply from SMPS. For servos voltage is given from 5V supply from SMPS.

Step 4: Design the Circuit

For the first time i use double side PCB its cost more when compare to one side PCB but we able to solder in both sides. While use double side PCB be careful while creating track in the PCB. Molten lead pass through the holes and fill in the next side. Use Female header pins in the double side PCB to connect the arduino nano and in the opposite side of the board use male header pins to connect the servos, I soldered 12 male connectors from 2 to 13(4 for my future use). Solder female header pins to connect the HC-05 bluetooth module on the board. if you feel bluetooth module pop out from the nano use a connector to make it parallel with the arduino nano. Now the circuit is ready and its very compact.

Step 5: Assemble Leg

There are 7 pieces in the a single set leg. Like wise 4 sets available. Join the leg links where two pieces connected with servo has a servo horn slot on the back side and its is 30mm length hole to hole. and the link pieces are 6 cm from hole to hole.In the 3D model i set only 0.1mm difference gap for links, so it hold very tight. I use fine emery sheet to increase the hole size and fix the links.First join the left side and then the right side and then the bottom.Now use the top screw like cap to hold the links. Join all the four sets.

Step 6: Complete Leg

The screw like plastic piece extend up to the back side of the links. Use feviquick (quick fixing liquid) to paste the holder permanently with the legs. Be careful while pasting, Don't allow the feviquick to flow inside the moving joins. Then fully paste the servo horn on both side of the leg. Now check and found the movement is correct. The links are 5mm thick so its hard.

Step 7: Make Body and Fix Servo

1) The total length of body size is 230 mm where the first 10 mm and last 10 mm are empty. So the servos occupied space is 110mm. Breadth is only 70mm. First place the Servo holder on the four edges of the wooden frame.

2) Make slot on the front side to let the wire from the servos come to the arduino controller.

3) Put some 2mm holes on the wooden body to tie wire.

4) Now hot glue the stand with the base.

Step 8: Servo Fix Plan

8 Servo motors are fixed as per the top plan. Arduino pin and the arduino name also meintion in the image. Connect the servo pin as per the drawing.

Step 9: Join Servo to PCB

As per the servo fix plan. Connect the servo wires to the pcb male connector, through the slot taken in the base of the plat form.Fix the servos as like the picture so that the distance between each leg center is 45cm.Now hot glue the servos with the base. For testing i use hot glue. After testing when fix with the 3d pinted body i use screws and nuts. Tie the wire neatly with the holes in the body.

Step 10: Join the Legs and Body

Create a simple arduino program and set the servos in following position

Leg1F = 80 degree

Leg1B = 100 degree

Leg2F = 100 degree

Leg2B = 80 degree

Leg3F = 80 degree

Leg3B = 100 degree

Leg4F = 100 degree

Leg4B = 80 degree

fix the leg horn to the servos as shown in the figure ( set the 30mm link parallel to he body) an screw it tightly.

Step 11: First Finish Look

Now the "Baby Cheetah is born". Though lot of future changes id done for stability. This first look looks good.

Step 12: Android Program Using MIT

By using the online MIT APP INVENTOR. I created a app to control the cheetah. The Actions done by the cheetah with the keys send from android are as follows.

G-Front left-Move Front with left turn

F-Front - Move Front

I-Front Right - Move front with right turn

L-Left - Turn left in the same place

S-Stop - Stop

R-Right - Turn right in the same place

H-Back left - Move back in with left turn.

B-Back - Move back

J-Back right - Move back with right turn

U-Up - One step up on all legs

D-Down - One step down on all legs

W-Front only down - Only front two legs one step down

X Back only down- Only Back two legs one step down

Y Front only UP - Only front two legs one step up

Z Back only UP - Only Back two legs one step up

O Fullstand - Full stand from any position

P Fullshit - Full Sit from any position

C Check - Self check all the legs one by one

V Hai - Sit and say hai to all.

Winrar apk file is attached here download and install in your android mobile and start using.

Step 13: Arduino Program

The main aim of the arduino program is to keep the body in the same position even walk and turn. For that angle of the leg movement is calculated in each height and put it in a multidimensional array. As per the commands received from the android the program check the array and move the leg in that direction. So the body is in the same height while walk and turn.

Cheetah walk funny like front leg in full height and back leg full down. Like wise wise verse. Like wise it also run in all heights.

Step 14: Running Android

After install the app in the android mobile. You found a Baby Cheetah app in the screen. Before open the app turn on the blue-tooth in the mobile. Click and open the app. In the display you found Pick blue-tooth, click it and found list of linked blue-tooth and available blue-tooth. Select the blue-tooth connected with arduino. Now the control screen open. Use the control to move the Baby Cheetah.

Step 15: First Checking

This is the first video with basic coding. The cheetah full sit and stand.

Step 16: First Walking Video

This is the first walking video of Baby Cheetah.

Step 17: Change Controller Location

For stability, Controller want to move to the center of the base. Only after check this i create a 3d print base for the cheetah.

Step 18: Make a Body Cover

Using A4 Plastic sheet, make a box to cover the body. The cover sit over the servo motor and with the body tight, So no need for any screw. If want add screws on the sides.

Step 19: Photo Shot for Baby Cheetah

See some Inhouse photo shoot for Baby Cheetah.

Step 20: Baby Cheetah Videos

Two Videos one with long shot and another one with close up shot. Lot type of walk and modes.

Step 21: Future Development

At first want to change the body fully to 3D print. Add battery for the servos and arduino (already purchase booked for 18650 batteries).

Then as like original cheetah i want to move side wise with out turn. so when solder i already provide provision for 12 servos. I want to change the base design, Separate each legs and one servo for each legs to side rotation. If it complete then add gyoscope sensor and ultrasonic sensor to the arduino and try to do it autonomous robot.

Step 22: Have Fun

This is my first instructables with walking style robot. After complete this i have different plans for walking robots in different angle. May i develop more projects in walking robots.

Thank you for going through my project. In this project whats i learn new is start using 3D printed parts, Double side PCB, Leg movement calculation (trigonometry), Calculate the power taken by servos and order a battery.

Lot more to enjoy...............Don't forgot to comment and encourage me friends.

Make it Move

First Prize in the
Make it Move

Be the First to Share

    Recommendations

    • Instrument Contest

      Instrument Contest
    • Make it Glow Contest

      Make it Glow Contest
    • STEM Contest

      STEM Contest

    95 Discussions

    0
    None
    apravata

    Question 21 days ago

    This is what I got. It’s 2 3.7V 2200mah batteries connected to the arduino which is connected to the PCA9685 connected to 8 servos... but it still doesn’t work

    89B49652-37CC-4484-ABE0-C1984A4794C5.jpeg
    8 answers

    No problem.....Aft first upload my code...create a new code for PCA9685. from the given above link download the library and test with example code.

    ive tried changing a few things and adding the library from the website, still wont work. It could be my burrent but i cant test for that without having the code working first so the servos can call for the current.

    #include <Adafruit_PWMServoDriver.h>
    #include <Servo.h>
    Servo Leg1F;
    Servo Leg1B;
    Servo Leg2F;
    Servo Leg2B;
    Servo Leg3F;
    Servo Leg3B;
    Servo Leg4F;
    Servo Leg4B;
    boolean stringComplete = false;
    boolean stopcmd = false;
    String inputString;
    int selservo;
    int rotate1;
    int rotate2;
    int rotate3;
    int rotate4;
    #include <Wire.h>
    #include <Adafruit_PWMServoDriver.h>
    // called this way, it uses the default address 0x40
    Adafruit_PWMServoDriver pwm = Adafruit_PWMServoDriver();
    //int walkF[][7]={{124,146,177,150,132,115,115},{94,132,178,139,112,84,84},{37,112,179,139,95,42,42},{22,95,150,115,78,30,30},{11,78,124,92,59,13,13},{13,59,92,58,36,2,2}};
    //int walkB[][7]={{3,34,56,65,48,30,30},{2,48,86,96,68,41,41},{1,68,143,138,85,41,41},{30,85,158,150,102,65,65},{56,102,169,167,121,88,88},{88,121,167,178,144,122,122}};
    int walkF[][7]={{124,146,177,150,132,115,115},{124,146,177,139,112,84,84},{94,132,178,139,95,42,42},{37,112,179,115,78,30,30},{22,95,150,92,59,13,13},{11,78,124,58,36,2,2}};
    int walkB[][7]={{3,34,56,65,48,30,30},{3,34,56,96,68,41,41},{2,48,86,138,85,41,41},{1,68,143,150,102,65,65},{30,85,158,167,121,88,88},{56,102,169,178,144,122,122}};
    int walkH[]={3,4,5,6,7,8};
    int Fheight;
    int Bheight;
    int heightchange;
    int walkstep;
    int walkstep2;
    int Twalkstep;
    int Twalkstep2;
    String S1;
    String S2;
    String Splitstr;
    int Sstr1;
    int Sstr2;
    int findcomma;
    int previouscomma;
    String reccmd;
    String othercmd;
    void setup() {
    // put your setup code here, to run once:
    Leg1F.attach(2);
    Leg1B.attach(3);
    Leg2F.attach(4);
    Leg2B.attach(5);
    Leg3F.attach(6);
    Leg3B.attach(7);
    Leg4F.attach(8);
    Leg4B.attach(9);
    delay(1000);
    Leg1F.write(80);
    Leg1B.write(100);
    Leg2F.write(100);
    Leg2B.write(80);
    Leg3F.write(80);
    Leg3B.write(100);
    Leg4F.write(100);
    Leg4B.write(80);
    Serial.begin(9600);
    walkstep=1;
    Fheight=5;
    Bheight=5;
    reccmd="S";
    Serial.begin(9600);
    Serial.println("16 channel PWM test!");
    pwm.begin();
    pwm.setPWMFreq(1600); // This is the maximum PWM frequency
    // save I2C bitrate
    uint8_t twbrbackup = TWBR;
    // must be changed after calling Wire.begin() (inside pwm.begin())
    TWBR = 12; // upgrade to 400KHz!
    }
    void loop() {
    // if(stringComplete == true)
    // {
    // findcomma=0;
    // previouscomma=0;
    // findcomma=inputString.indexOf(",",findcomma);
    // if (findcomma>0)
    // {
    // Splitstr=inputString.substring(0,findcomma);
    // rotate1=Splitstr.toInt();
    // }
    // previouscomma=findcomma+1;
    // inputString = inputString.substring(previouscomma);
    //
    // findcomma=0;
    // findcomma=inputString.indexOf(",",findcomma);
    // if (findcomma>0)
    // {
    // Splitstr=inputString.substring(0,findcomma);
    // rotate2=Splitstr.toInt();
    // }
    // Leg1F.write(rotate1);
    // Leg1B.write(rotate2);
    // Leg2F.write(rotate2);
    // Leg2B.write(rotate1);
    // Leg3F.write(rotate1);
    // Leg3B.write(rotate2);
    // Leg4F.write(rotate2);
    // Leg4B.write(rotate1);
    //
    //// Serial.print(rotate1);
    //// Serial.print("-");
    //// Serial.print(rotate2);
    //
    // inputString="";
    // stringComplete = false;
    // }
    if (reccmd=="F" || reccmd=="B" || reccmd=="L" || reccmd=="R" || reccmd=="G" || reccmd=="I" || reccmd=="H" || reccmd=="J" )
    {
    if(reccmd=="F" || reccmd=="L" || reccmd=="G" || reccmd=="I" )
    {
    walkstep=walkstep+1;
    if (walkstep>7)
    {
    walkstep=1;
    }
    walkstep2 = walkstep+3;
    if(walkstep2>7)
    {
    walkstep2=walkstep2-7;
    }
    }
    else if(reccmd=="B" || reccmd=="R" || reccmd=="H" || reccmd=="J" )
    {
    walkstep=walkstep-1;
    if (walkstep<1)
    {
    walkstep=7;
    }
    walkstep2 = walkstep-4;
    if(walkstep2<1)
    {
    walkstep2=walkstep2+7;
    }
    }
    if(reccmd=="F" || reccmd=="B" )
    {
    //Walking Full correct***********************************************************
    rotate1=walkF[Fheight][walkstep-1];
    rotate2=walkB[Fheight][walkstep-1];
    rotate3=walkF[Bheight][walkstep-1];
    rotate4=walkB[Bheight][walkstep-1];
    Leg1F.write(rotate1);
    Leg1B.write(rotate2);
    Leg4F.write(180-rotate3);
    Leg4B.write(180-rotate4);
    rotate1=walkF[Fheight][walkstep2-1];
    rotate2=walkB[Fheight][walkstep2-1];
    rotate3=walkF[Bheight][walkstep2-1];
    rotate4=walkB[Bheight][walkstep2-1];
    Leg2F.write(180-rotate1);
    Leg2B.write(180-rotate2);
    Leg3F.write(rotate3);
    Leg3B.write(rotate4);
    // Serial.print(walkstep-1);
    // Serial.print("-");
    // Serial.println(walkstep2-1);
    //********************************************************************************
    }else if(reccmd=="G" || reccmd=="I" || reccmd=="H" || reccmd=="J")
    {
    if (reccmd=="I" and walkstep>=4)
    {
    rotate1=walkF[Fheight][4];
    rotate2=walkB[Fheight][4];
    }else
    {
    rotate1=walkF[Fheight][walkstep-1];
    rotate2=walkB[Fheight][walkstep-1];
    }
    if (reccmd=="H" and walkstep>=4)
    {
    rotate3=walkF[Bheight][4];
    rotate4=walkB[Bheight][4];
    }
    else
    {
    rotate3=walkF[Bheight][walkstep-1];
    rotate4=walkB[Bheight][walkstep-1];
    }
    Leg1F.write(rotate1);
    Leg1B.write(rotate2);
    Leg4F.write(180-rotate3);
    Leg4B.write(180-rotate4);
    if (reccmd=="G" and walkstep2>=4)
    {
    rotate1=walkF[Fheight][4];
    rotate2=walkB[Fheight][4];
    }
    else
    {
    rotate1=walkF[Fheight][walkstep2-1];
    rotate2=walkB[Fheight][walkstep2-1];
    }
    if (reccmd=="J" and walkstep2>=4)
    {
    rotate3=walkF[Bheight][4];
    rotate4=walkB[Bheight][4];
    }
    else
    {
    rotate3=walkF[Bheight][walkstep2-1];
    rotate4=walkB[Bheight][walkstep2-1];
    }
    Leg2F.write(180-rotate1);
    Leg2B.write(180-rotate2);
    Leg3F.write(rotate3);
    Leg3B.write(rotate4);
    }
    else if(reccmd=="L" || reccmd=="R" )
    {
    rotate1=walkF[Fheight][walkstep-1];
    rotate2=walkB[Fheight][walkstep-1];
    rotate3=walkF[Bheight][walkstep-1];
    rotate4=walkB[Bheight][walkstep-1];
    Leg1F.write(rotate1);
    Leg1B.write(rotate2);
    Leg4F.write(rotate4);
    Leg4B.write(rotate3);
    rotate1=walkF[Fheight][(8-walkstep)-1];
    rotate2=walkB[Fheight][(8-walkstep)-1];
    rotate3=walkF[Bheight][(8-walkstep)-1];
    rotate4=walkB[Bheight][(8-walkstep)-1];
    Leg2F.write(180-rotate1);
    Leg2B.write(180-rotate2);
    Leg3F.write(180-rotate4);
    Leg3B.write(180-rotate3);
    }
    delay(100);
    if (stopcmd==true)
    {
    if(walkstep==4)
    {
    reccmd="S";
    stopcmd=false;
    }
    }
    if(heightchange!=0 && walkstep==4)
    {
    changeheight();
    }
    }else if(heightchange!=0)
    {
    changeheight();
    }else if(reccmd=="C")
    {
    selfcheck();
    reccmd="S";
    }else if(reccmd=="V")
    {
    sayhai();
    reccmd="S";
    }
    // Drive each PWM in a 'wave'
    for (uint16_t i=0; i<4096; i += 8)
    {
    for (uint8_t pwmnum=0; pwmnum < 16; pwmnum++)
    {
    pwm.setPWM(pwmnum, 0, (i + (4096/16)*pwmnum) % 4096 );
    }
    }
    }
    void sayhai(){
    Leg1F.write(0);
    Leg1B.write(180);
    Leg2F.write(180);
    Leg2B.write(0);
    Leg3F.write(180);
    Leg3B.write(0);
    Leg4F.write(0);
    Leg4B.write(180);
    for(int i=1;i<=5;i++)
    {
    delay(500);
    Leg1F.write(60);
    delay(500);
    Leg1F.write(100);
    }
    Leg1F.write(0);
    }
    void selfcheck()
    {
    Leg1F.write(0);
    Leg1B.write(180);
    Leg2F.write(180);
    Leg2B.write(0);
    Leg3F.write(0);
    Leg3B.write(180);
    Leg4F.write(180);
    Leg4B.write(0);
    delay(500);
    Leg1F.write(180);
    Leg1B.write(0);
    delay(500);
    Leg1F.write(0);
    Leg1B.write(180);
    delay(500);
    Leg2F.write(0);
    Leg2B.write(180);
    delay(500);
    Leg2F.write(180);
    Leg2B.write(0);
    delay(500);
    Leg3F.write(180);
    Leg3B.write(0);
    delay(500);
    Leg3F.write(0);
    Leg3B.write(180);
    delay(500);
    Leg4F.write(0);
    Leg4B.write(180);
    delay(500);
    Leg4F.write(180);
    Leg4B.write(0);
    }
    void changeheight(){
    if(othercmd=="O")
    {
    Fheight=5;
    Bheight=5;
    }
    else if(othercmd=="P")
    {
    Fheight=0;
    Bheight=0;
    }
    if(othercmd=="D" || othercmd=="U" ||othercmd=="W" || othercmd=="Y")
    {
    Fheight=Fheight+heightchange;
    if(Fheight>5)
    {
    Fheight=5;
    }
    if(Fheight<0)
    {
    Fheight=0;
    }
    }
    if(othercmd=="D" || othercmd=="U" || othercmd=="X" || othercmd=="Z")
    {
    Bheight=Bheight+heightchange;
    if(Bheight>5)
    {
    Bheight=5;
    }
    if(Bheight<0)
    {
    Bheight=0;
    }
    }
    heightchange=0;
    rotate1=walkF[Fheight][4];
    rotate2=walkB[Fheight][4];
    Leg1F.write(rotate1);
    Leg1B.write(rotate2);
    Leg2F.write(180-rotate1);
    Leg2B.write(180-rotate2);
    rotate1=walkF[Bheight][4];
    rotate2=walkB[Bheight][4];
    Leg3F.write(rotate1);
    Leg3B.write(rotate2);
    Leg4F.write(180-rotate1);
    Leg4B.write(180-rotate2);
    }
    void serialEvent() {
    while (Serial.available()) {
    char inChar = (char)Serial.read();
    // if (inChar == 'Q') {
    // stringComplete = true;
    // reccmd="S";
    // }
    if (inChar == 'F' || inChar == 'B' || inChar == 'L' || inChar == 'R' || inChar == 'G' )
    {
    inputString ="";
    reccmd=inChar;
    }
    else if (inChar == 'S') {
    inputString = "";
    stopcmd=true;
    }
    else if (inChar == 'C' || inChar == 'V') {
    inputString = "";
    reccmd=inChar;
    }
    else if (inChar == 'U' || inChar == 'O' ) {
    inputString = "";
    othercmd=inChar;
    heightchange=1;
    }
    else if (inChar == 'D' || inChar == 'P' ) {
    inputString = "";
    othercmd=inChar;
    heightchange=-1;
    }
    else if (inChar == 'W' || inChar == 'X' ) {
    inputString = "";
    othercmd=inChar;
    heightchange=-1;
    }
    else if (inChar == 'Y' || inChar == 'Z' ) {
    inputString = "";
    othercmd=inChar;
    heightchange=1;
    }
    // else
    // {
    // //inputString += inChar;
    // }
    }
    }

    cvheetag_bb.jpg
    0
    None
    apravata

    Question 23 days ago

    I built mine with an arduino uno and a PCA9685 using 2 9 volt batteries, one connected to the arduino and the other to the PCA board. Any idea on why it womt work?

    6 answers

    Yeah it works. I currently using 18650 3.7v 2500 ma battery 2nos and its supply is directly given to arduino. And use a LM25496 to reduce the voltage and given to servo.

    0
    None
    AndrésG62

    Tip 5 weeks ago

    Hi Again Do you know you can control up to 16 servos with the two I2C Arduino pins ? Search for this PCA9685 module. You can also Daisy chain a lot of them for more servos.

    3 replies
    0
    None
    apravataAndrésG62

    Reply 4 weeks ago

    So can i use that instead of the power supply?

    0
    None
    AndrésG62apravata

    Reply 4 weeks ago

    This the way you connect PCA9685 to an Arduino. 5 volts power supply goes to the module. You can also use an Arduino nano to the same I2c pins A4, A5.

    arduino PCA9685.jpg