# 3 servo's working together

Hi, we’re building a robot, which can pick up a golfball and drop it after a while.
We are having some problems, it’s like the Arduino isn’t working right, sometimes it’s getting pulses, sometimes it’s just changing it’s way, doing nothing at all.
Everything worked well on our test models, but now, when everything is in our final model (which is way smaller), it just won’t work.
I’m not a professional electronic specialist, so could it be that the arduino’s (we tested two atmega168 models and one atmega8) are messed up because of an magnetic field => produced inside one of the servo’s?

This is what we got:

## Hardware

-2 modified servo motors ( futuba s3001) for driving
-1 regular servo motor for gripping the ball.
-an Arduino sending pulses to the 3 servo motors
-a rechargable 9V battery for powering the arduino (with a switch to power off/on)
-4 rechargable 1.5V batteries for powering the servo motors (with a switch to power off/on)

## software

:exclamation
/* Project iRobot
* ---------------
* Last updated: 13/03/2007
*
* Pieter Carette    www.pieterc.be
* Loic De Buck      www.technicum.net
* Ken Ketelslegers  www.hoepertingen.be
*
* 2Ba. IPO
* Product development
* Hogeschool Antwerpen
* www.arduino.cc
*
*/

/*  - - - - - - - - - - - - - - V A R I A B E L E N - - - - - - - - - - - - - - - -  */

//  D R I V E
int servoPinrechts = 9;//De aansluiting van de rechterservo zit op pinnetje 9
int servoPinlinks = 10;//De aansluiting van de linkerservo zit op pinnetje 8
int pulse = 1502;//Integer van de pulse
int count = 0;//Deze variabele wordt gebruikt om een tijdsaanduiding te hebben
int traagvoor = 1520; //pulse moet traag vooruit
int snelvoor = 1990; //pulse snel vooruit
int traagachter = 3000-traagvoor; //pulse moet traag achteruit
int snelachter = 3000-snelvoor; //pulse moet snel achteruit
int pauze = 1502; //pulse moet snel achteruit

// G R I P
int servoPingrip = 5; //Pinnetje van de grip zit op 10
int doelbereikt = 0; //Variabele om aan te geven als doel bereikt is

/*  - - - - - - - - - - - - - - - - F U N C T I O N S - - - - - - - - - - - - - - - - - */

//  D R I V E
void draaien(int pulse) { //Deze functie laat beide motoren vooruit of achteruit gaan met dezelfde snelheid
count += 1; //optellen plus 1
digitalWrite(servoPinrechts, HIGH); //Startpuls Rechts
delayMicroseconds(pulse); //Snelheid van de puls
digitalWrite(servoPinrechts, LOW); //Eind van de puls Rechts
delay(20); //Tussentijd van een puls
}

void rijden(int pulse) { //Deze functie laat beide motoren in tegengestelde richting gaan => Links of rechts draaien dus
count += 1; //optellen plus 1
delayMicroseconds(pulse); //Snelheid van de puls
delay(20); //Tussentijd van een puls
digitalWrite(servoPinrechts, HIGH); //Startpuls Rechts
delayMicroseconds(3000-pulse); //Snelheid van de puls
digitalWrite(servoPinrechts, LOW); //Eind van de puls Rechts
delay(20); //Tussentijd van een puls
}

// G R I P
void grijp(int pulse) { //Deze functie laat het grijpen toe
count += 1; //optellen plus 1
digitalWrite(servoPingrip, HIGH); //Stuur een pulse door
delayMicroseconds(pulse); // pulse zelf
digitalWrite(servoPingrip, LOW); //Breek pulse af
delay(20); //Tussentijd => 20 om een ononderbroken lijn te draaien.
}

void setup() {
pinMode(servoPinrechts, OUTPUT);
pinMode(servoPingrip, OUTPUT);
}

/*  - - - - - - - - - - - - - - - - L O O P - - - - - - - - - - - - - - - - - */

void loop() {
if (count < 200) {
rijden(snelvoor);
}
if (count >= 200  && count < 400) {
rijden(snelachter);
}
if (count >= 400) {
draaien(snelachter);
}
}

I am not sure or this is of any help, but servos can draw a lot of amps under load, 2A seems not to be uncommon. How much different is your testing environment from what you have now? If the servos in the testing environment were not connected to any other hardware, it may have worked well.

Can the rechargeable batteries that you have the servos powered with deliver the amps that the servos are asking?

Good luck and please post here if you find out what is/was wrong.

My robot uses a very similar setup, with no problems at all.

I think the problem with yours is that you have three delay(20)'s that makes the program stop, so if you use the servo a lot, the program will essentially stop doing anything.

See the link at the bottom of my post for a way to get around this problem:

http://www.arduino.cc/cgi-bin/yabb2/YaBB.pl?num=1173623665/0#2

-Z-