6

So I've tried this a few times and I always get the same issue. When I try to run the sweep example the servo goes round 180 degrees but only in steps. Anyone know a way to fix this?

The servo I'm using is a Tower Pro Micro Servo 9G SG90

// Sweep
// by BARRAGAN <http://barraganstudio.com> 
// This example code is in the public domain.


#include <Servo.h> 

Servo myservo;  // create servo object to control a servo 
                // a maximum of eight servo objects can be created 

int pos = 0;    // variable to store the servo position 

void setup() 
{ 
  myservo.attach(9);  // attaches the servo on pin 9 to the servo object 
} 


void loop() 
{ 
  for(pos = 0; pos < 180; pos += 1)  // goes from 0 degrees to 180 degrees 
  {                                  // in steps of 1 degree 
    myservo.write(pos);              // tell servo to go to position in variable 'pos' 
    delay(15);                       // waits 15ms for the servo to reach the position 
  } 
  for(pos = 180; pos>=1; pos-=1)     // goes from 180 degrees to 0 degrees 
  {                                
    myservo.write(pos);              // tell servo to go to position in variable 'pos' 
    delay(15);                       // waits 15ms for the servo to reach the position 
  } 
} 

Video: http://vidd.me/A40

14
  • does it hummmmm in between the "steps"?
    – jippie
    Commented Apr 21, 2014 at 12:15
  • no just the usual ticking on each step Commented Apr 21, 2014 at 12:16
  • You don't tell us anything about the set up (schematic?). My guess would be it doesn't have enough voltage.
    – mikeY
    Commented Apr 21, 2014 at 15:04
  • I've set it up exactly as shown in the sweep example Commented Apr 21, 2014 at 15:15
  • 1
    My only advice is make sure the Arduino is getting enough power and check your connections. Consider external power if you're not on USB. Commented Apr 22, 2014 at 0:56

6 Answers 6

2

In electronics, as usual in situations where a cricuit is misbehaving and we don't understand why, a solution that generally works is to add a decoupling cap between +5V and GND.

In your case, I would put at least 220uF; that would ensure two things:

  • the voltage used to control the servo never drops
  • the voltage brought to Arduino by the USB does not drop either (which would have very bad impact on the Arduino, probably resetting it)

Electrolytic caps are a must-have for every electronics hobbyist (and professional as well, of course).

You can read more about decoupling capacitors on Wikipedia.

Edit:

According to @gwideman comment, it seems that using a decoupling capacitance above 10uF in a USB 2.0 device would violate USB specs and may damage the USB host controller on the computer.

I was not aware of this limitation but I have already used decoupling capacitance up to 100uF in my circuits and never got any issue with my USB computer port.

It might be due to extra electronics on the Arduino board that would "isolate" USB power from Arduino +5V anf d GND pins, I don't know (that should probably be the topic of a specific question); or maybe I have just been lucky all this time...

14
  • Would you happen to have a schematic for this? Commented Apr 23, 2014 at 9:35
  • You don't need a schematic just to add a decoupling cap! You just need the right cap and put it (on breadboard preferrably but you could also solder it directly to the servo) between +5V and the GND pins; just ensure you put the cap right as it is polarized (if you put it reverse it will explode)
    – jfpoilpret
    Commented Apr 23, 2014 at 10:48
  • Like this? imgur.com/thfEQtY Commented Apr 23, 2014 at 11:20
  • 1
    USB requires that connected devices limit inrush current. This limits the size of bulk capacitor between VBUS and Ground to 10uF in USB 2.0. See USB 2.0 standard section 7.2.4.1 – Inrush Current Limiting. Using a larger capacitor, particularly one much larger than the source (computer) is required to supply on its end (120uF) would possibly lead to damage to the computer, or at least disruption of its operation.
    – gwideman
    Commented Apr 25, 2014 at 12:12
  • 1
    It's worth noting that USB is often quite tolerant of devices that are MASSIVELY out of spec. It depends on the host implementation, and lots of computers are willing to provide connected devices considerably more current then the specifications say the need to. Commented Apr 27, 2014 at 19:00
1

I've experienced same behavior with this type of servos. In my case it was easier to spot since Arduino frequently rebooted when servo was approaching the boundaries of the swing - so it was clear it was consuming too much power, and USB port was unable to deliver that.

Cheap dedicated 9V 1A AC/DC converter usually solves the problem. But if you can't wait for one to get delivered, get an iPad USB charger (nowadays everyone has it or has a neighbor/friend who has one). It is rated 10W, and it doesn't suffer from voltage drops even under high loads. Power your setup from it, and if you'd see it moves smoothly, you will have your answer.

0

It looks like your sketch runs in slow motion.

Check if you wrote delay(150) or have an additional delay in your loop. Check twice and - just to make sure - upload the corrected sketch again.

Edit: If possible, test with another servo and even test with another Arduino board.

2
  • I can assure you that's not the case. I've tried everything from 1 to 15 for the delay and even without the delay. I've also tried having just one for loop Commented Apr 22, 2014 at 10:24
  • Ok. Without delay, the servo should move at the actual processor speed. Which board type do you use? And is the code above the original code that is running on the board? did you try to set pin 9 as digital out? Code in setup(){ ... pinMode(9, OUTPUT); // sets the pin as output ... }
    – suit4
    Commented Apr 22, 2014 at 11:26
0

give a 9v supply +ve terminal to Vin and -ve ground. since the arduino board cannot supply enough power to the servo, this will provide this worked for me and workin just fine

0

I tested your code, nothing wrong with it. Maybe it is power supply issue. 1. Don't use USB to power servo, it can make current spike when it move rapidly. 2. Use proper supply for servo. High current and use large capacitor to deal with current spike.

-1

The program is faulty. 1) No servo can react to a command in 15 milliseconds. Delay should be more like 500 milliseconds (.5 seconds). 2) The for loops are not designed to work together. The 1st loop feeds a value of 181to the second loop which is designed to start with a value of 180. The 2nd loop feeds a value of -1 back to the first loop, which is designed to start with a value of 0.

3
  • Please tell me what is incorrect about my for loop analysis. Could use some help. Commented May 30, 2016 at 3:23
  • 2
    There are some pretty serious misunderstandings in this - the given delay is only between the finest increments, the actual time of the sweep is 2.7 seconds, well within the capability of a servo. Using a 20ms delay (possibly with larger increments to compensate) would indeed be more in keeping with typical servo update rates, but that is not what you recommend. Also your analysis of the for loops is incorrect. Commented May 30, 2016 at 3:25
  • The contents of the for loop only execute if the condition is true, so only conditions which satisfy it are written to the servo. Both for loops initialize their variable. Commented May 30, 2016 at 3:26

Not the answer you're looking for? Browse other questions tagged or ask your own question.