Recently we purchased servos for use in an Arduino and began testing with servos. It turned out that the uSec for the servos differed from the online documentation and we had to find the min and maxes of the uSecs manually:

while (Serial.available()) {
    char c = Serial.read();  //gets one byte from serial buffer
    readString += c; //makes the string readString
    delay(2);  //slow looping to allow buffer to fill with next character

if (readString.length() >0) {
    Serial.println(readString);  //so you can see the captured string 
    int n = readString.toInt();  //convert readString into a number
    Serial.print("writing Microseconds: ");
    readString = ""; //empty for next input

The issue is that the servos don't travel the full 180 degree advertised price (more like 135-160) and that lack of angular distance is affecting performance of one of our products. The servos can even mechanically travel a noticeable distance farther than 180, but not "programmatically" farther even when given a larger PWM uSec value that the observed "max" PWM value

What I've found

I looked around and apparently there are "Servo Programmers" to calibrate endpoints and midpoints, but cost an arm and a leg. I find it strange that I would have to "program" my servos. I was part of an First (FTC) robotics team using tetrix/nxt electronic control systems, and never noticed a problem with uSec values or not getting the full range of motion using the same brand of servos I currently am now.

How can I perform a low cost, easy way to simply get the full range of motion I paid for?

  • 2
    what do they say about this where you bought the servos from? they get paid to give you that service? Feb 20, 2016 at 23:21
  • This servo can operate 180° when given a pulse signal ranging from 600usec to 2400usec I have tried giving it more than 2400usec, but it is noticeably off from 180°. Feb 22, 2016 at 16:08
  • do you have a logic analyzer? you might want to check the actual length of the pulse. Feb 22, 2016 at 17:34
  • No we don't have a logic analyzer/oscilloscope, nor do we have the funding for one. I don't think the PWM would be incorrect becuase the problem is at longer PWM than shorter PWM. For example, manual implementation of Pulse Width Modulation: void loop() { digitalWrite(pin, HIGH); delayMicroseconds(100); // Approximately 10% duty cycle @ 1KHz digitalWrite(pin, LOW); delayMicroseconds(1000 - 100); } Feb 22, 2016 at 18:45

1 Answer 1


This is an analog servo, so there is no endpoint calibration on the servo side. This type of calibration is for digital servos (which can be tuned) and controllers. On the servo description page, they talk about a stretcher. This is a translation tool to help with old controllers: usually servos have a narrower band: 1000us to 2000us for 0° to 180°. Therefore old controllers can only do 1000us to 2000us, and would fail to achieve full range with this servo, which requires 600us to 2400us

Also, note that RC servo input signal isn't really a PWM: duty cycle doesn't matter, only lengh of the pulse does.

Your servo doc says: 600us to 2400us for -90° to +90°, which correspond to what the Servo lib does by default according to its documentation. You should be fine. What are the results of a super simple sweep-like code? eg:

loop() {
  • With super simple code, it doesn't travel full angular length. Using uSecs higher/lower than 600-2400 range doesn't do anything different. Mar 25, 2016 at 22:05

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

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