Walking Android Man :0

Posted by apoorvas

apoorvas's picture

 

Lab:

For this week's lab, we explored the Servo Motors. A Servo Motor is more powerful than a DC motor and enables the user to have precision on the angular rotation they want to achieve. In the lab we learnt to control the rotation of the Servo motor using a pot.

Components Used:
  • Arduino Micro-controller
  • Wires
  • Potentiometer
  • Servo Motor
  • Elastic Rubber Bands
  • Wooden sticks
  • Chip clips
  • Cardboard Paper
Description:
As a homework assignment, we were supposed to use Servo Motor to make a simple mechanical Crawler which could move forwards. I used a single Servo Motor and connected it one chip clip which allows the servo motor to propel forward and it is connected to another chip clip on another side using a rod. This allows it to support its own weight as well as move more or less in a straight line. 
 
Video :
 
Intial Crawler : Click Here
 
Android Walking : Click here
 
 
I also tried replicating the human walking motion, by using two servos and that worked a little worse than this one but nonetheless here is the video of that endeavor.  ;) Enjoy!
 
 
Click here
 
As you can see I had waay too much with this thing.. :)

Design Considerations:
I realized that the length of the leg and at  the angle they make between them makes quite a lot of different to the way the robot moves and how stable it is. Linking the two legs also worked better and allowed me to maneuver it more easily. Using clips with bent ends helped to provide friction and grip so that the robot could stand. I intially wanted to support the actual softtoy and make it walk, but it was too heavy to be supported on its legs :( . 
 
Servo Code:
int servoPin = 7;      // Control pin for servo motor
int potPin   = 0;      // select the input pin for the potentiometer

int pulseWidth = 0;    // Amount to pulse the servo
long lastPulse = 0;    // the time in millisecs of the last pulse
int refreshTime = 20;  // the time in millisecs needed in between pulses
int val;               // variable used to store data from potentiometer

int minPulse = 500;   // minimum pulse width

void setup() {
  pinMode(servoPin, OUTPUT);  // Set servo pin as an output pin
  pulseWidth = minPulse;      // Set the motor position to the minimum
  Serial.begin(9600);         // connect to the serial port
  Serial.println("servo_serial_better ready");
}

void loop() {
  val = analogRead(potPin);    // read the value from the sensor, between 0 - 1024
  
  if (val > 0 && val <= 999 ) {
    pulseWidth = val*2 + minPulse;  // convert angle to microseconds
    
    Serial.print("moving servo to ");
    Serial.println(pulseWidth,DEC);
  
  }
  updateServo();   // update servo position
}

// called every loop(). 
void updateServo() {
  // pulse the servo again if the refresh time (20 ms) has passed:
  if (millis() - lastPulse >= refreshTime) {
    digitalWrite(servoPin, HIGH);   // Turn the motor on
    delayMicroseconds(pulseWidth);  // Length of the pulse sets the motor position
    digitalWrite(servoPin, LOW);    // Turn the motor off
    lastPulse = millis();           // save the time of the last pulse
  }
} 
.
 
 
walker2.PNG
Androidman
5
Your rating: None Average: 5 (3 votes)