Hello
As a part of a design class at uni, we (a group of other folk and I) are making a six legged walker. We're using twelve servos to move the legs, two servos per leg, all of them controlled by an Arduino Uno. As usually happens with these things, we've run into some problems. Whenever the power is disconnected from the servos and reconnected, the legs start going mad (random angles, freezing, basically nothing like the gait programmed). Resetting the board doesn't always help. In fact, sometimes as many as 10 resets and/or reprogramming is necessary to sort it out. Anyone have any ideas as to why this might happen?
Knee servos are New Power XL-9HMB
Hip servos are Tower Pro SG-90
The board is Arduino Uno.
Programmed using Arduino 1.0 on Ubuntu 10.04.
Servos are currently powered from a K and H Products PP272 Powered Project Board (it's got 5V with a 1A fuse).
Legs are made of acrylic, are fairly light and the joints are definitely loose enough.
Any help/ideas appreciated.
EDIT: Probably worth adding the code as well.
#include <Servo.h>
//create servo objects, comments are aliases for short-hand notation
Servo hipFrontRight; //FR
Servo hipMiddleRight; //MR
Servo hipRearRight; //RR
Servo hipFrontLeft; //FL
Servo hipMiddleLeft; //ML
Servo hipRearLeft; //RL
Servo kneeFrontRight; //FR
Servo kneeMiddleRight; //MR
Servo kneeRearRight; //RR
Servo kneeFrontLeft; //FL
Servo kneeMiddleLeft; //ML
Servo kneeRearLeft; //RL
//software switch for convenience - if !1, then the loop routine is empty
int sw = 0;
//define the initial range and position of knees and hips
//polarity or ranges different for sides because of the way the servos
//are placed on the body
int hipRange = 10;
int kneeRange = 20;
int FRHipRange = 10;
int MRHipRange = 10;
int RRHipRange = 10;
int FLhipRange = 10;
int MLHipRange = 10;
int RLHipRange = 10;
int FRKneeRange = 20;
int MRKneeRange = 20;
int RRKneeRange = 20;
int FLKneeRange = 20;
int MLKneeRange = 20;
int RLKneeRange = 20;
int FRInitHip = 90;
int MRInitHip = 90;
int RRInitHip = 90;
int FLInitHip = 90;
int MLInitHip = 90;
int RLInitHip = 90;
int FRInitKnee = 90;
int MRInitKnee = 90;
int RRInitKnee = 90;
int FLInitKnee = 90;
int MLInitKnee = 90;
int RLInitKnee = 90;
//define speed of movement - smaller value gives higher speed
int movSpeed = 15;
//generic counter variable
int i = 0;
void setup()
{
//attach servos to pins on the board
hipFrontRight.attach(1);
hipMiddleRight.attach(2);
hipRearRight.attach(3);
hipFrontLeft.attach(4);
hipMiddleLeft.attach(5);
hipRearLeft.attach(6);
kneeFrontRight.attach(7);
kneeMiddleRight.attach(8);
kneeRearRight.attach(9);
kneeFrontLeft.attach(10);
kneeMiddleLeft.attach(11);
kneeRearLeft.attach(12);
//initialise servos to their initial positions
hipFrontRight.write(FRInitHip);
hipMiddleRight.write(MRInitHip);
hipRearRight.write(RRInitHip);
hipFrontLeft.write(FLInitHip);
hipMiddleLeft.write(MLInitHip);
hipRearLeft.write(RLInitHip);
kneeFrontRight.write(FRInitKnee);
kneeMiddleRight.write(MRInitKnee);
kneeRearRight.write(RRInitKnee);
kneeFrontLeft.write(FLInitKnee);
kneeMiddleLeft.write(MLInitKnee);
kneeRearLeft.write(RLInitKnee);
if (sw == 0)
{
for (i = 0; i <= kneeRange; i++) //lift knees FR, RR, ML to initialise motion
{
kneeFrontRight.write(FRInitKnee - i);
kneeRearRight.write(RRInitKnee - i);
kneeMiddleLeft.write(MLInitKnee + i);
delay(movSpeed);
}
}
}
void loop()
{
if (sw == 1)
{
for (i = 0; i <= hipRange; i++) //hips FR, RR, ML go forwards, hips FL, RL, MR go backwards
{
hipFrontRight.write(FRInitHip + i);
hipRearRight.write(RRInitHip + i);
hipMiddleLeft.write(MLInitHip - i);
hipMiddleRight.write(MRInitHip - i);
hipRearLeft.write(RLInitHip + i);
hipFrontLeft.write(FLInitHip + i);
delay(movSpeed);
}
for (i = 0; i <= kneeRange; i++) //lower knees FR, RR, ML
{
kneeFrontRight.write(FRInitKnee - kneeRange + i);
kneeRearRight.write(RRInitKnee - kneeRange + i);
kneeMiddleLeft.write(MLInitKnee + kneeRange - i);
delay(movSpeed);
}
for (i = 0; i <= kneeRange; i++) //lift knees MR, FL, RL
{
kneeMiddleRight.write(MRInitKnee - i);
kneeFrontLeft.write(FLInitKnee + i);
kneeRearLeft.write(RLInitKnee + i);
delay(movSpeed);
}
for (i = 0; i <= hipRange; i++) //all hips return to initial position
{
hipFrontRight.write(FRInitHip + hipRange - i);
hipRearRight.write(RRInitHip + hipRange - i);
hipMiddleLeft.write(MLInitHip - hipRange + i);
hipMiddleRight.write(MRInitHip - hipRange + i);
hipRearLeft.write(RLInitHip + hipRange - i);
hipFrontLeft.write(FLInitHip + hipRange - i);
delay(movSpeed);
}
for (i = 0; i <= hipRange; i++) //hips FR, RR, ML go backwards, hips MR, FL, RL go forwards
{
hipMiddleRight.write(MRInitHip + i);
hipRearLeft.write(RLInitHip - i);
hipFrontLeft.write(FLInitHip - i);
hipFrontRight.write(FRInitHip - i);
hipRearRight.write(RRInitHip - i);
hipMiddleLeft.write(MLInitHip + i);
delay(movSpeed);
}
for (i = 0; i <= kneeRange; i++) //lower knees FL, RL, MR
{
kneeMiddleRight.write(MRInitKnee - kneeRange + i);
kneeRearLeft.write(RLInitKnee + kneeRange - i);
kneeFrontLeft.write(FLInitKnee + kneeRange - i);
delay(movSpeed);
}
for (i = 0; i <= kneeRange; i++) //lift knees ML, FR, RR
{
kneeMiddleLeft.write(MLInitKnee + i);
kneeFrontRight.write(FRInitKnee - i);
kneeRearRight.write(RRInitKnee - i);
delay(movSpeed);
}
for (i = 0; i <= hipRange; i++) //all hips return to initial position
{
hipMiddleRight.write(MRInitHip + hipRange - i);
hipRearLeft.write(RLInitHip - hipRange + i);
hipFrontLeft.write(FLInitHip - hipRange + i);
hipFrontRight.write(FRInitHip - hipRange + i);
hipRearRight.write(RRInitHip - hipRange + i);
hipMiddleLeft.write(MLInitHip + hipRange - i);
delay(movSpeed);
}
}
}