Go Down

Topic: Servo stops suddenly? (Read 1 time) previous topic - next topic


Jan 01, 2013, 09:15 pm Last Edit: Jan 01, 2013, 09:36 pm by HackWar Reason: 1
I'm trying to convert my parallax Boe Bot into a Arduino Due version. Unfortunately I'm running into something I cannot explain. The servos start to rotate as expected, but after a few seconds the right servo just stops while the other one keeps running. I cannot find a reason for this, even the 'rightServo.read()' tells me it's running at full speed. What could be the cause of this? I've unplugged the USB connection and connected it to a wall outlet but the results are the same.


Code: [Select]

#include <Servo.h>

Servo pingServo;
Servo leftServo;
Servo rightServo;

int pos = 90;    // variable to store the servo position
boolean countUpwards = true;

unsigned long currentTime;
unsigned long loopTime;

const int PIN_PING_SERVO = 8;
const int PIN_LEFT_SERVO = 10;
const int PIN_RIGHT_SERVO = 9;
const int PIN_PING = 31;
const int PIN_PUSH_BUTTON = 53;

int distancesByAngle[] = {};
int distance = 999;
int oldButtonState = 0;

boolean buttonPressed = false;
boolean programActive = false;

void setup()




void loop()
 int buttonState = digitalRead(PIN_PUSH_BUTTON);
 currentTime = millis();
 if(currentTime >= (loopTime + 500)){  
     pos = pos + 20;

       countUpwards = false;
     pos = pos - 20;

       countUpwards = true;

   distance = checkDistance();
   distancesByAngle[pos] = distance;

   loopTime = currentTime;  // Updates loopTime

 oldButtonState = buttonState;

long checkDistance(){
 // establish variables for duration of the ping,
 // and the distance result in inches and centimeters:
 long duration, cm;

 // The PING))) is triggered by a HIGH pulse of 2 or more microseconds.
 // Give a short LOW pulse beforehand to ensure a clean HIGH pulse:
 digitalWrite(PIN_PING, LOW);
 digitalWrite(PIN_PING, HIGH);
 digitalWrite(PIN_PING, LOW);

 pinMode(PIN_PING, INPUT);
 duration = pulseIn(PIN_PING, HIGH);

 cm = microsecondsToCentimeters(duration);

 //Serial.print("cm on pos: ");
 return cm;

void fullStop(){
 //Serial.println("FULL STOP");

void moveForward(){
 Serial.print("rightServo: ");
 Serial.print(", leftServo: ");

void moveRight(){

long microsecondsToCentimeters(long microseconds)
 return microseconds / 29 / 2;


from your description and picture I cannot see thatnyou have a separate power source for the servos, if not try this as a solution - check th btwo links in my signature for more details.

Duane B
Read this
then watch this



You probably need decoupling on the supply. It sounds like the interference from the motor is screwing with the code.


Ah now it's starting to make sense, I thought the the external power connector on the board would be the decoupled power source, but obviously it's not. So if I set my wall wart to 5V and connect it to my breadboard and power the servo's from there it should work right?


check th btwo links in my signature for more details.

Since I followed your servo tutorial link Duane, in the last two days I've pointed 2-3 members there. It explains stuff really clearly, thanks.
Gone for good


Motors tend to need more decoupling than most other components:-

Go Up

Please enter a valid email to subscribe

Confirm your email address

We need to confirm your email address.
To complete the subscription, please click the link in the email we just sent you.

Thank you for subscribing!

via Egeo 16
Torino, 10131