Difference between 0 and 90 degrees is not 90 degrees

I got a big problem the difference between 0 and 90 degrees is not 90 degrees for my servos. To get the servo horn parallel to a surface servo needs to rotated at 22 "servo" degrees and to get it is perpendicular it needs to rotate at 101 degrees(servo)

I got several hitec servos and they behave in a similar way, I tried several programs and the behavior is exactly the same. I am using the servo library, and the problem persists with an external power supply.

Can you post your code and schematics?

What you are seeing is not a bug but rather the difference between your specific model servos and the 'generic' servo 'model' that the servo library assumes in it's default parameters. From the arduino reference:

Parameters servo: a variable of type Servo

pin: the number of the pin that the servo is attached to

min (optional): the pulse width, in microseconds, corresponding to the minimum (0-degree) angle on the servo (defaults to 544)

max (optional): the pulse width, in microseconds, corresponding to the maximum (180-degree) angle on the servo (defaults to 2400)

Therefore a specific servo will only move accurately 90 degrees if it's end of travel points are at 544 usec and 2400 usec. You would be find out what your servo end points are exactly and use the optional parameters when you call the attach method using servo.attach(pin, min, max) where min and max are the actual end point times required for your specific servos. Many servos will not have 180 degrees of travel, 120 degrees is common and some even less. Only through testing will you be able to determine these values as it's not normally a published specification for most servos. Servo manufactures only fully comply that a pulse of between 1 and 2 msec will not hit an end point in either direction. How much 'over travel' a specific servo has for either direction is specific to each manufacture model of servo.

One really is better off using the servo libraries WriteMicroseconds() command as it has better control and resolution over a specific servo rather then the 'abstracted' degrees movement of the arduino servo write(degrees) statement.

Lefty