Humanoid Robot Voiced Controlled With Arduino Mega, Raspberry Pi and 1Sheeld

26K5411

Intro: Humanoid Robot Voiced Controlled With Arduino Mega, Raspberry Pi and 1Sheeld

Humanoid Robot is a robot shaped in the form of a human. A humanoid robot is used in many different fields such as education for young children, on field marketing for companies, research and development tool , entertainment and for tasks that are unsafe to be done with real people so humanoid robots are a tool for human luxury and safety.

STEP 1: Get the Components

Motors:

19 smart servo Herkulex motor.

For interacting:

  1. webcam.
  2. 2 speakers.
  3. microphone.

1Sheeld is used for a remote control through the mobile phone.

Micro-controllers:

  1. Arduino Mega: it's used to control the servo motors for the movements of the robot.
  2. Raspberry Pi : it's used for the image processing and voice interaction.

You can find all the component you need in Robot shop.

STEP 2: Design on Paper


To start you need to make your design on paper, calculate your dimensions and make torque analysis for each joint (motor) and how much load it'll be carrying.

STEP 3: Software Design

Now you take your design to a 3D software designer (solid-works / inventor...) and turn it to a 3D model ready top be printed.

STEP 4: 3D Printing

Choosing the printing material that is strong, cheap and light in the same time like plastic ABS.

STEP 5: Coding

This is the Arduino code for controlling the robot using 1Sheeld

The Forward and Inverse Kinematics of our Robot is not discussed here but As an Alternative Solution we controlled each Servo with his own angle to get him to the Required Position.

you'll need the following libraries installed in your computer: Herkulex & 1Sheeld

#include <Wire.h><br>#include <Herkulex.h>
#include <OneSheeld.h>
#include <SoftwareSerial.h>  //Software Serial Port
#define RxD 52 //8 lenardo 52 mega
#define TxD 7
#define SLAVE_ADDRESS 0x04
#define DEBUG_ENABLED 1
int ReceivedData , Data;
int number = 0;
float y;
const int Pin1 = 22; 
const int Pin2 = 23;
void setup()
{
    pinMode(Pin1, OUTPUT);
    pinMode(Pin2, OUTPUT);
    delay(1000);
    pinMode(RxD, INPUT);
    pinMode(TxD, OUTPUT);
    Serial.begin(115200);    // Open serial communications
    Serial.println("Begin");
    Herkulex.beginSerial3(115200); //open serial port 1 
    Reboot();
    Herkulex.initialize(); //initialize motors
    // initialize i2c as slave
    Wire.begin(SLAVE_ADDRESS);
    // define callbacks for i2c communication
    Wire.onReceive(receiveData);
    Wire.onRequest(sendData);
    OneSheeld.begin();
    Herkulex.writeRegistryEEP(254,0x13,0x8E);
    delay(200);
    Herkulex.setLed(254,LED_PINK); 
}
void loop() 
{  
  //Switch the Humanoid On/OFF
  /if(PushButton.isPressed())
  {
    Reboot();
    Intial();
    Herkulex.setLed(254,LED_PINK);
  }
  else if(!PushButton.isPressed())
  {
    Herkulex.torqueOFF(254);
    Herkulex.setLed(254,LED_GREEN2);
    Herkulex.end();
  }
  
  if(ReceivedData == 2) //Giving a feedback about the detected Juics 
     { 
       delay(10000);
       TextToSpeech.say("your Juics is ready");
       delay(100);
       ReceivedData = 255;
     }
  if(ReceivedData == 3) //taking a Selfi 
    { 
       Camera.setFlash(ON);
       Camera.rearCapture();
       delay(10000);
       Facebook.postLastPicture("Posted by @Neo Maelo");
       delay(100);
       ReceivedData = 255;
    }
  //sensing the alarm ringtone of the mobile  
  if(Mic.getValue() > 80)
  {
    delay(10000);
    WakeUp();
    delay(1000);
    digitalWrite(Pin1, HIGH);
    digitalWrite(Pin2, LOW);
    delay(300);
    digitalWrite(Pin1, LOW);
    digitalWrite(Pin2, LOW);
  }
  
  if(LightSensor.getValue() < 20 && LightSensor.getValue() > 0)
  {
    sleep();
    delay(1000);
    digitalWrite(Pin1, LOW);
    digitalWrite(Pin2, HIGH);
    delay(300);
    digitalWrite(Pin1, LOW);
    digitalWrite(Pin2, LOW);
  }
  
  //Accelometer Control
  if (GamePad.isRedPressed())
  {
      y=AccelerometerSensor.getY();
      if ( y < 0) //Right Arm 
      {
        rightArm();
      }
      else if (y > 0)
      {
        leftArm();
      }
  }
  //Dance and music
   else if (GamePad.isGreenPressed())
  {
    MusicPlayer.play();
    SimpleDance();
    MusicPlayer.pause();
  }
  else if (GamePad.isBluePressed())
  {
    Intial();
  }
  
}
void rightArm()
{
  Herkulex.moveOneAngle(1, 130, 1000, LED_BLUE);
  Herkulex.moveOneAngle(4, -10, 1000, LED_BLUE);
  delay(1000);
}
  
void leftArm()
{
  Herkulex.moveOneAngle(1, 10, 1000, LED_BLUE);
  Herkulex.moveOneAngle(4, -130, 1000, LED_BLUE);
  delay(1000);
}
// callback for received data
void receiveData(int byteCount){
    while(Wire.available()) {
        Data = Wire.read();
        Serial.print("data received: ");
        Serial.println(Data);
        ReceivedData = Data;
     }
}
// callback for sending data
void sendData(){
    number = ReceivedData;
    Wire.write(number);
}
void Reboot()
{
  Herkulex.reboot(0); //reboot first motor
  Herkulex.reboot(1); //reboot first motor
  Herkulex.reboot(2); //reboot first motor
  Herkulex.reboot(3); //reboot first motor
  Herkulex.reboot(4); //reboot first motor
  Herkulex.reboot(5); //reboot first motor
  Herkulex.reboot(6); //reboot first motor
  Herkulex.reboot(7); //reboot first motor
  Herkulex.reboot(8); //reboot first motor
  Herkulex.reboot(9); //reboot first motor
  Herkulex.reboot(10); //reboot first motor
  Herkulex.reboot(11); //reboot first motor
  Herkulex.reboot(12); //reboot first motor
  Herkulex.reboot(13); //reboot first motor
  Herkulex.reboot(14); //reboot first motor
  Herkulex.reboot(15); //reboot first motor
  Herkulex.reboot(16); //reboot first motor
  Herkulex.reboot(17); //reboot first motor
  Herkulex.reboot(18); //reboot first motor
  Herkulex.reboot(19); //reboot first motor
  delay(500); 
  Herkulex.initialize(); //initialize motors 
}
void Intial()
{
Herkulex.moveOneAngle(0, 98.00, 1000, LED_BLUE);
Herkulex.moveOneAngle(1, 10.00, 1000, LED_BLUE);
Herkulex.moveOneAngle(2, 0.00, 1000, LED_BLUE);
Herkulex.moveOneAngle(3, -98.00, 1000, LED_BLUE);
Herkulex.moveOneAngle(4, -10.00, 1000, LED_BLUE);
Herkulex.moveOneAngle(5, 0.00, 1000, LED_BLUE);
Herkulex.moveOneAngle(6, 0.00, 1000, LED_BLUE);
Herkulex.moveOneAngle(7, -5.00, 1000, LED_BLUE);
Herkulex.moveOneAngle(8, 2.00, 1000, LED_BLUE);
Herkulex.moveOneAngle(9, 4.00, 1000, LED_BLUE);
Herkulex.moveOneAngle(10, -2.00, 1000, LED_BLUE);
Herkulex.moveOneAngle(11, 0.00, 1000, LED_BLUE);
Herkulex.moveOneAngle(12, 8.00, 1000, LED_BLUE);
Herkulex.moveOneAngle(13, 0.00, 1000, LED_BLUE);
Herkulex.moveOneAngle(14, 0.00, 1000, LED_BLUE);
Herkulex.moveOneAngle(15, 0.00, 1000, LED_BLUE);
Herkulex.moveOneAngle(16, 0.00, 1000, LED_BLUE);
Herkulex.moveOneAngle(17, 0.00, 1000, LED_BLUE);
Herkulex.moveOneAngle(18, 0.00, 1000, LED_BLUE);
Herkulex.moveOneAngle(19, 0.00, 1000, LED_BLUE);
delay(1200);
}
void Bye()
{
  for(int i=0; i <3; i++)
  {
   Herkulex.moveOneAngle(0, 88, 700, LED_BLUE);
   Herkulex.moveOneAngle(1, 159, 700, LED_BLUE);
   Herkulex.moveOneAngle(2, 77, 700, LED_BLUE);
   Herkulex.moveOneAngle(3, -93, 700, LED_BLUE);
   Herkulex.moveOneAngle(4, -120, 700, LED_BLUE);
   Herkulex.moveOneAngle(5, -2, 700, LED_BLUE);
   delay(900);
   Herkulex.moveOneAngle(0, 76, 700, LED_GREEN);
   Herkulex.moveOneAngle(1, 92, 700, LED_GREEN);
   Herkulex.moveOneAngle(2, 3, 700, LED_GREEN);
   Herkulex.moveOneAngle(3, -76, 700, LED_GREEN);
   Herkulex.moveOneAngle(4, -140, 700, LED_GREEN);
   Herkulex.moveOneAngle(5, -83, 700, LED_GREEN); 
   delay(900);
  }
}
 void SimpleDance()
{
 Herkulex.moveOneAngle(3, -150, 1000, LED_BLUE);
 delay(950);
 Herkulex.moveOneAngle(3, -100, 1000, LED_BLUE);
 Herkulex.moveOneAngle(4, -60, 1000, LED_BLUE);
 Herkulex.moveOneAngle(1, 60, 1000, LED_BLUE);
 delay(950);
 Herkulex.moveOneAngle(0, 110, 1000, LED_PINK);
 Herkulex.moveOneAngle(1, 25, 1000, LED_PINK);
 Herkulex.moveOneAngle(3, -150, 1000, LED_PINK);
 Herkulex.moveOneAngle(4, -25, 1000, LED_PINK);
 delay(1000);
 Herkulex.moveOneAngle(7, -0.97, 1000, LED_BLUE);
 Herkulex.moveOneAngle(8, 2.60, 1000, LED_BLUE);
 Herkulex.moveOneAngle(9, 4.88, 1000, LED_BLUE);
 Herkulex.moveOneAngle(12, 1.63, 1000, LED_BLUE);
 Herkulex.moveOneAngle(13, 0.00, 1000, LED_BLUE);
 Herkulex.moveOneAngle(14, -1.63, 1000, LED_BLUE);
 Herkulex.moveOneAngle(0, 150, 1000, LED_GREEN);
 Herkulex.moveOneAngle(3, -110, 1000, LED_BLUE);
 delay(1000);
 Herkulex.moveOneAngle(0, 110, 1000, LED_BLUE);
 Herkulex.moveOneAngle(3, -150, 1000, LED_GREEN);
 delay(1000);
 Herkulex.moveOneAngle(0, 150, 1000, LED_GREEN);
 Herkulex.moveOneAngle(3, -110, 1000, LED_BLUE);
 delay(1000);
 Herkulex.moveOneAngle(0, 110, 1000, LED_BLUE);
 Herkulex.moveOneAngle(3, -150, 1000, LED_GREEN);
 delay(1000);
 Herkulex.moveOneAngle(0, 160, 1000, LED_GREEN);
 Herkulex.moveOneAngle(3, -160, 1000, LED_GREEN);
 Herkulex.moveOneAngle(4, -70, 1000, LED_BLUE);
 Herkulex.moveOneAngle(1, 0, 1000, LED_BLUE);
 delay(1000);
 Herkulex.moveOneAngle(4, 0, 1000, LED_BLUE);
 Herkulex.moveOneAngle(1, 60, 1000, LED_BLUE);
 delay(1000);
 Herkulex.moveOneAngle(0, 98.70, 900, LED_BLUE);
 Herkulex.moveOneAngle(1, 10.00, 900, LED_BLUE);
 Herkulex.moveOneAngle(3, -98.70, 900, LED_BLUE);
 Herkulex.moveOneAngle(4, -10.00, 900, LED_BLUE);
 delay(800);
 Herkulex.moveOneAngle(0, 160, 900, LED_GREEN);
 Herkulex.moveOneAngle(3, -160, 900, LED_GREEN);
 Herkulex.moveOneAngle(4, -70, 900, LED_BLUE);
 Herkulex.moveOneAngle(1, 0, 900, LED_BLUE);
 delay(900);
  Herkulex.moveOneAngle(0, 89.05, 1500, LED_BLUE);
  Herkulex.moveOneAngle(1, 116.67, 1500, LED_BLUE);
  Herkulex.moveOneAngle(3, -92.30, 1500, LED_BLUE);
  Herkulex.moveOneAngle(4, -149.83, 1500, LED_BLUE);
  Herkulex.moveOneAngle(6, 12.02, 1500, LED_BLUE);
  Herkulex.moveOneAngle(10, 1.63, 1500, LED_BLUE);
  Herkulex.moveOneAngle(11, 30.55, 1500, LED_BLUE);
  Herkulex.moveOneAngle(15, 20.47, 1500, LED_BLUE);
  delay(1500);
  Herkulex.moveOneAngle(6, -7.00, 1000, LED_BLUE);
  Herkulex.moveOneAngle(10, -8.60, 1000, LED_BLUE);
  Herkulex.moveOneAngle(11, 8.00, 1000, LED_BLUE);
  Herkulex.moveOneAngle(15, 8, 1000, LED_BLUE);
  delay(900);
  Herkulex.moveOneAngle(1, 144.95, 1500, LED_BLUE);
  Herkulex.moveOneAngle(4, -123.17, 1500, LED_BLUE);
  Herkulex.moveOneAngle(6, -22.42, 1500, LED_BLUE);
  Herkulex.moveOneAngle(10, -19.17, 1500, LED_BLUE);
  Herkulex.moveOneAngle(11, -5.85, 1500, LED_BLUE);
  Herkulex.moveOneAngle(15, -1.63, 1500, LED_BLUE);
  delay(1500);
  Herkulex.moveOneAngle(6, -7.00, 1000, LED_BLUE);
  Herkulex.moveOneAngle(10, -8.60, 1000, LED_BLUE);
  Herkulex.moveOneAngle(11, 8.00, 1000, LED_BLUE);
  Herkulex.moveOneAngle(15, 8, 1000, LED_BLUE);
  delay(1500);
  Herkulex.moveOneAngle(0, 89.05, 1500, LED_BLUE);
  Herkulex.moveOneAngle(1, 116.67, 1500, LED_BLUE);
  Herkulex.moveOneAngle(3, -92.30, 1500, LED_BLUE);
  Herkulex.moveOneAngle(4, -149.83, 1500, LED_BLUE);
  Herkulex.moveOneAngle(6, 12.02, 1500, LED_BLUE);
  Herkulex.moveOneAngle(10, 1.63, 1500, LED_BLUE);
  Herkulex.moveOneAngle(11, 30.55, 1500, LED_BLUE);
  Herkulex.moveOneAngle(15, 20.47, 1500, LED_BLUE);
  delay(1500);
  Herkulex.moveOneAngle(6, -7.00, 1000, LED_BLUE);
  Herkulex.moveOneAngle(10, -8.60, 1000, LED_BLUE);
  Herkulex.moveOneAngle(11, 8.00, 1000, LED_BLUE);
  Herkulex.moveOneAngle(15, 8, 1000, LED_BLUE);
  delay(900);
  Herkulex.moveOneAngle(1, 144.95, 1500, LED_BLUE);
  Herkulex.moveOneAngle(4, -123.17, 1500, LED_BLUE);
  Herkulex.moveOneAngle(6, -22.42, 1500, LED_BLUE);
  Herkulex.moveOneAngle(10, -19.17, 1500, LED_BLUE);
  Herkulex.moveOneAngle(11, -5.85, 1500, LED_BLUE);
  Herkulex.moveOneAngle(15, -1.63, 1500, LED_BLUE);
  delay(1500);
  Herkulex.moveOneAngle(6, -7.00, 1000, LED_BLUE);
  Herkulex.moveOneAngle(10, -8.60, 1000, LED_BLUE);
  Herkulex.moveOneAngle(11, 8.00, 1000, LED_BLUE);
  Herkulex.moveOneAngle(15, 8, 1000, LED_BLUE);
  delay(1500);
  Intial();
}
void sleep()
{
  Herkulex.moveOneAngle(0, 97.00, 2000, LED_BLUE);
Herkulex.moveOneAngle(1, 9.00, 2000, LED_BLUE);
Herkulex.moveOneAngle(2, -1.00, 2000, LED_BLUE);
Herkulex.moveOneAngle(3, -97.00, 2000, LED_BLUE);
Herkulex.moveOneAngle(4, -9.00, 2000, LED_BLUE);
Herkulex.moveOneAngle(5, -1.00, 2000, LED_BLUE);
Herkulex.moveOneAngle(6, 1.00, 2000, LED_BLUE);
Herkulex.moveOneAngle(7, -37.00, 2000, LED_BLUE);
Herkulex.moveOneAngle(8, -69.00, 2000, LED_BLUE);
Herkulex.moveOneAngle(9, 43.00, 2000, LED_BLUE);
Herkulex.moveOneAngle(10, 1.00, 2000, LED_BLUE);
Herkulex.moveOneAngle(11, 1.00, 2000, LED_BLUE);
Herkulex.moveOneAngle(12, 43.00, 2000, LED_BLUE);
Herkulex.moveOneAngle(13, 69.00, 2000, LED_BLUE);
Herkulex.moveOneAngle(14, -37.00, 2000, LED_BLUE);
Herkulex.moveOneAngle(15, 1.00, 2000, LED_BLUE);
}
void WakeUp()
{
Herkulex.moveOneAngle(6, 0.00, 1200, LED_BLUE);
Herkulex.moveOneAngle(7, 0.00, 1200, LED_BLUE);
Herkulex.moveOneAngle(8, 2.00, 1200, LED_BLUE);
Herkulex.moveOneAngle(9, 4.00, 1200, LED_BLUE);
Herkulex.moveOneAngle(10, -2.00, 1200, LED_BLUE);
Herkulex.moveOneAngle(11, 0.00, 1200, LED_BLUE);
Herkulex.moveOneAngle(12, 0.00, 1200, LED_BLUE);
Herkulex.moveOneAngle(13, 0.00, 1200, LED_BLUE);
Herkulex.moveOneAngle(14, 0.00, 1200, LED_BLUE);
Herkulex.moveOneAngle(15, 0.00, 1200, LED_BLUE);
delay(1000);
Herkulex.moveOneAngle(0, 160.00, 1000, LED_BLUE);
Herkulex.moveOneAngle(1, 30.00, 1200, LED_BLUE);
Herkulex.moveOneAngle(2, -1.00, 1200, LED_BLUE);
Herkulex.moveOneAngle(3, -143.00, 1200, LED_BLUE);
Herkulex.moveOneAngle(4, -26.00, 1200, LED_BLUE);
delay(1200);
Herkulex.moveOneAngle(0, 160.00, 1000, LED_BLUE);
Herkulex.moveOneAngle(1, 90.00, 1000, LED_BLUE);
Herkulex.moveOneAngle(2, -1.00, 1000, LED_BLUE);
Herkulex.moveOneAngle(3, -159.00, 1000, LED_BLUE);
Herkulex.moveOneAngle(4, -64.00, 1000, LED_BLUE);
delay(1200);
Intial();
}

9 Comments

Great job, I love how detailed this instructable is. You really did a good job explaining all the steps from beginning to the end. After I get some projects crossed off my list, I'll give this a try too. If I am successful, I'll post a "I Make It!" comment to let you know. Thanks again for being so detailed.

Sir can you help me i want to build a robot can you give me the design and the full conection part

thanks instructables for giving a fantastic robot with all its coding. i made it.it's mine 55th robo that i have made

Can you give me more details about your robot and its dimension
sir please can you give me full details like wiring and program for voice control and all the coding.please send the precious details to this e-mail ID : charlescomputer369@gmail.com
Sir can u give me the wire connection diagram I mean how to wiring.

Is it possible to program it with python?

dear sir amazing i am from india i am pursing my graduation bachelor degree in electronic engineering how can i contact you

can we have a talk on skype ? whats is your email id

shahsoumil519@gmail.com

Man That's Really Awesome

with some improvements I could be a really Nice robot

I really Liked the dancing part :D