For some reason my servos keep burning out.

My code is simple, if condition, rotate to 0 degrees, else rotate to 180.

However, what that does to the motor is keep it in a constant struggle to stay in rotation 0 or 180, when there is no movement in between. Sure enough, leave it running for 1 hour, the motor burns out.

if (!strcmp("1",output)){
else {

Is there something like myservo.release or something? I presuming i need to get the servo in to position, then release it so it doesnt try to stay in position.

Please help, i've burned through 4-5 of them so far, it's not fun :(

  • Servo's are meant to keep their position; if you could "release" the torque you won't have a "fixed" position, since when shut down the motor does not generate the torque to keep it still. You can try to reduce the speed of the servo, but if the problem arises when you leave it still then probably you just have to consider changing servo brand.. – frarugi87 Apr 19 '16 at 12:28
  • Are you sure these servos can run all the way to 0 and 180 degrees? (If they are running against their end stops it might cause problems.) Also what voltage are they rated for, and what power are you using? – Andy Apr 19 '16 at 12:28
  • What are your servos doing, or trying to do? If they are not driving anything they should hold position with very little current. If they are holding against a load, they take current to maintain position; more load = more current. Seeking an unachievable position (beyond their, or the mechanical system's stops) is a worst-case. – JRobert Apr 19 '16 at 12:31
  • First steps: Burned motors are most often the result of two things, incorrect wiring or using the wrong voltage input to the motor for power. Make sure your voltage source matches the specs on the servos and that your wiring is correct. – dinotom Apr 19 '16 at 13:25

Some servos are actually not able to do full 0..180 rotation - or to rephrase it better, the standard 0.5ms and 1.5ms pulse will force them to a position which can not be reached. Therefore the motor keeps on rotating in a constant struggle.

  • change 0 to something like 20, and 180 to something like 150
  • check that the motor has stopped once reaching 20 or 150. I.e. it does not produce any sound, and if you touch the motor body it is not producing any vibration (so no constant stuggle)
  • Most servo has a range of 90deg, so the safe range is from 45 to 135 (which correspond to a pulse from 1000 to 2000ms) – Lesto Apr 19 '16 at 22:04
  • 1
    Actually, I found it is not etched into stone. I have a couple of micro servos, which accept pulses of 0..180 degrees (0.5/1,5ms), still make a rotation of only 90 degrees because of difference in gears. I would say that we control the pulse width - and the servo react in some way :) I agree that it is a little oversimplification expecting that myservo.write(35) will move to 35.000 degrees. – Gee Bee Apr 19 '16 at 22:45
  • Yes there are exception, but most use the "standard" pulse, because that is what come out from most radiocontroller – Lesto Apr 20 '16 at 5:04
  • I can fully agree, @lesto! However standards are obeyed pretty liberally by many Chinese manufacturers as I have found, especially with TowerPro servos. (They are great price to value ratio, but do have the same problems what the OP mentioned.) – Gee Bee Apr 20 '16 at 12:25

Ensure your voltage source matches the motors specs and that your wiring to the arduino or driver shield is correct and try the code I've posted which has worked for me to test servos.

#include <Servo.h>  // servo library
// You can control a maximum of twelve servos on the Uno 
// using this library. (Other servo libraries may let you
// control more). Note that this library disables PWM on
// pins 9 and 10!

Servo servo1;  // servo control object

void setup()
  //  Attach the servo1 object to digital pin 4.

void loop()
  int position;
  // Change position at full speed:

  servo1.write(90);    // Tell servo to go to 90 degrees
  delay(1000);         // Pause to get it time to move
  servo1.write(180);   // Tell servo to go to 180 degrees
  delay(1000);         // Pause to get it time to move
  servo1.write(0);     // Tell servo to go to 0 degrees
  delay(1000);         // Pause to get it time to move

  // Change position at a slower speed:
  // Tell servo to go to 180 degrees, stepping by two degrees

  for(position = 0; position < 180; position += 2)
    servo1.write(position);  // Move to next position
    delay(20);               // Short pause to allow it to move

  // Tell servo to go to 0 degrees, stepping by one degree

  for(position = 180; position >= 0; position -= 1)
    servo1.write(position);  // Move to next position
    delay(20);               // Short pause to allow it to move

I wanted to answer my own question: I had purchased some really cheap servos from AliExpress. These are not good. They burn out really fast, which has been confirmed by some friends of mine that had purchased the same servos. The voltage was correct, it was 5V. When using more quality servos that cost $15 I did not see any of these issues. Do your self a favor. Do not get servos from AliExpress. Get them from DFRobot or some other more reputable website.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

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