2

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: ");
    Serial.println(n);
    myServo.writeMicroseconds(n);
    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? – Mikael Patel Feb 20 '16 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°. – Bennett Yeo Feb 22 '16 at 16:08
  • do you have a logic analyzer? you might want to check the actual length of the pulse. – Mikael Patel Feb 22 '16 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); } – Bennett Yeo Feb 22 '16 at 18:45
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() {
  myServo.writeMicroseconds(600);
  delay(2000);
  myServo.writeMicroseconds(2400);
  delay(2000);
}
| improve this answer | |
  • With super simple code, it doesn't travel full angular length. Using uSecs higher/lower than 600-2400 range doesn't do anything different. – Bennett Yeo Mar 25 '16 at 22:05

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.