# Overheating/Jamming MG996R servo

I have recently purchased my first ever servo, a cheap unbranded Chinese MG996R servo, for £3.20 on eBay.

I am using it in conjunction with a Arduino Servo shield (see below):

As soon as it arrived, before even plugging it in, I unscrewed the back and ensured that it had the shorter PCB, rather than the full length PCB found in MG995 servos. So, it seems to be a reasonable facsimile of a bona-fide MG996R.

I read somewhere (shame I lost the link) that they have a limited life, due to the resistive arc in the potentiometer wearing out. So, as a test of its durability, I uploaded the following code to the Arduino, which just constantly sweeps from 0° to 180° and back to 0°, and left it running for about 10 to 15 minutes, in order to perform a very simple soak test.

#include <Servo.h>

const byte servo1Pin = 12;

Servo servo1;                // create servo object to control a servo
// twelve servo objects can be created on most boards

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

void setup()
{
servo1.attach(servo1Pin);  // attaches the servo on pin 9 to the servo object
Serial.begin(9600);
}

void loop()
{
pos = 0;
servo1.write(pos);         // tell servo to go to position in variable 'pos'
Serial.println(pos);
delay(1000);               // waits 15ms for the servo to reach the position

pos = 180;
servo1.write(pos);         // tell servo to go to position in variable 'pos'
Serial.println(pos);
delay(1000);               // waits 15ms for the servo to reach the position
}


When I returned, the servo was just making a grinding noise and no longer sweeping, but rather it seemed to be stuck in the 0° position (or the 180°). I picked the servo up and whilst not hot, it was certainly quite warm. A quick sniff also revealed that hot, burning motor windings smell. After switching of the external power supply and allowing it to cool, the servo began to work again. However, the same issue occurred a little while later. Again, after allowing it to rest, upon re-powering, the servo continues to work. However, I am reluctant to continue with the soak test, as I don’t really want to burn the motor out, just yet.

Is there a common “no-no” of not making servos sweep from extreme to extreme, and one should “play nice” and just perform 60° sweeps, or is the cheapness of the servo the issue here?

I am powering the servo from an external bench supply, capable of 3A, so a lack of current is not the issue.

Please note that I also have a follow up question, Should a MG996R Servo's extreme position change over time?

You might be driving the servo beyond its limits. As noted in the pololu.com article “Servo control interface in detail”:

If you keep making the pulses wider or narrower, servos will keep moving farther and farther from neutral until they hit their mechanical limits and possibly destroy themselves. This usually isn’t an issue with RC applications since only about half of the mechanical range is ever used, but if you want to use the full range, you have to calibrate for it and be careful to avoid crashing the servo into its limit.

Similarly, the arduino.cc article about Servo.WriteMicroseconds says (with emphasis I added):

On standard servos a parameter value of 1000 is fully counter-clockwise, 2000 is fully clockwise, and 1500 is in the middle. [...] some [...] servos respond to values between 700 and 2300. Feel free to increase these endpoints until the servo no longer continues to increase its range. Note however that attempting to drive a servo past its endpoints (often indicated by a growling sound) is a high-current state, and should be avoided.

I suggest running a calibration, where you drive the servo to different angles, to find out what parameter values are large enough to drive the servo to its extreme positions without overdriving it.

• The growling sound sounds just like what I experienced. Good tips, thx... – Greenonline Sep 22 '15 at 17:00