Servo motor not turning full 180

So as the title says, I have four servo motors (Hi-tec HS 5645MG) and am trying to get one of the to move 180 degrees, however, the most I can get these servo's to move is about 120. I understand that a large number of servo motors cant actually turn 180 degree's, so I don't have a huge amount of faith that mine can, however, is there anyway I can definitively check?

Cheers,

C

Yes, many servos are mechanically limited in the rotation.
But there is something you can try.

Are you using servo.write or servo.writeMicroseconds?
Servo.write accepts a range from 0-180 and then maps that into a number of microseconds, typically in the range from 1000 to 2000.
You can use writeMicroseconds and give it values outside the 1000-2000 range to see if the servo accepts the extended range and if it responds to it.
Try values below 1000, maybe even down to 500.
Try values above 2000, maybe even 2500.

There IS some risk. Running a servo hard up against the mechanical limit can overheat the motor or electronics and cause failure. Or it can strip a gear and cause failure.
You can usually hear when an unloaded servo runs up against the mechanical limit.
Try not to let the servo buzz hard trying to move beyond the limit.

Do you have a potentiometer? That is a handy way to input servo range values. If you print the mocrosecond value to the screen, you can play with the range limits. Maybe your servo will work from 840-2175. Or maybe from 980-2007. You won't really know until you try it.

Hey Vince, thanks for coming to my aid again.

Was using the servo.write command but change to the servo.writeMicroseconds one. Changed it from 180 to 300 just to be on the safe side but same issue. However, the servo would get to its normal position, about 130/140 degrees from its start, then would just stop dead, waiting until the program had finished, then return to its normal position.

Don't have a potentiometer on me at work but do at home, will grab one tonight and give that a try tomorrow.

It's not looking good for these servo's, anything else I could try?

When using servo.writeMicroseconds, the parameter is different.
It is no longer degrees, ranging from 0-180. It is microseconds, ranging from 1000-2000.
If you have a servo sweep and it uses servo.write, the loop will likely from from 0-180.
If you change that servo sweep sketch to use servo.writeMicroseconds, change the loop to cover 1000-2000.
This should produce the identical range of movement.

Then you can start to expand the range. Try 950-2000. Does it bind? If so, change it to 975. If not change it to 900.
After you find the actual limit of the bottom, experiment on the top. Try 2050. 2100. And so on, until you find the values it binds at, them back off a few microseconds so that it does not bind.

Obviously, this means uploading a new sketch each time. This is where the pot would be handy.

Oh, you might find that individual servos have a different absolute maximum range.
Once you have those values, you can use them when you attach the servo.
If you do not specify, the servo uses a range of 1000-2000 when you attach. But if you do specify, your values are used.
So you might do something like servo.attach(pin,950,2100)
Then that servo will use 950 and 2100 as the limits on the range. You could even then use servo.write with 0-180 being mapped into you range. (I think)

Note that you should not leave a servo at its endstop for any length of time as the current/power
shoots up in a futile attempt to try and push past the barrier. Result is the servo cooks
(unless you are lucky and you have a smart one that has a thermal cutout - the cheap ones just
cook themselves however).

Don't expect a servo to provide its rated torque continuously for the same reason.

Ok, great advice, gave this a try, started it off at 1000-2000 and adjusted from there. Was able to get a bit more movement clockwise by changing from 2000 to 2300, but trying to adjust the other value gives the same issue as before. It would keep allowing more movement up until the value it around 700, after that the servo would just stall and wait for the program to finish.

Will grab a potentiometer for tomorrow but not having much hope.

MarkT:
Note that you should not leave a servo at its endstop for any length of time as the current/power
shoots up in a futile attempt to try and push past the barrier. Result is the servo cooks
(unless you are lucky and you have a smart one that has a thermal cutout - the cheap ones just
cook themselves however).

Don't expect a servo to provide its rated torque continuously for the same reason.

Was worried about this happening so have been trying to have the servo do it as little as possible.

So, this servo looks like it has a range of about 750-2300. I'll leave it up to you to get exact values, now that you know how.

What range in degrees would you say that provides?

Does about 140ish degrees of movement, grabbed a pot today to test the motors and same issue. Motor stops turning at the 140 mark even when theres pot left to turn. Looks like the motors just cant turn 180. Shame.

Cheers for the help guys, but it looks like some new servos may be necessary. Anyone happen to know of any servos that do have 180 degrees of movement?

The more expensive ones I’m afraid. >:( See if this test sketch helps any.

/*
 Try this test sketch with the Servo library to see how your
 servo responds to different settings, type a position from
 544 to 2400 in the top of serial monitor and hit [ENTER],
 start at 1472 and work your way toward zero (544) 50 micros at
 a time, then toward 2400. 
*/
#include <Servo.h>
Servo servo;

void setup() {
  // initialize serial:
  Serial.begin(9600); //set serial monitor baud rate to match
  servo.writeMicroseconds(1472);
  servo.attach(9);
  prntIt();
}

void loop() {
  // if there's any serial available, read it:
  while (Serial.available() > 0) {

    // look for the next valid integer in the incoming serial stream:
    int pos = Serial.parseInt();
    pos = constrain(pos, 400, 2400);
    servo.writeMicroseconds(pos);
    prntIt();
  }
}
void prntIt()
{
  Serial.print("  degrees = "); 
  Serial.print(servo.read());
  Serial.print("\t");
  Serial.print("microseconds =  ");
  Serial.println(servo.readMicroseconds());
}

What is it that you were trying to do? Why do you need 180°?
There are geared solutions so that the server turns less but you get larger output.
Describe your project for us and let us see if we can come up with other solutions.

If you are curious, go shopping at servo city.
Here is one 180 degree solution.
https://www.servocity.com/sg-5485hb-tm-180
Killer power. Killer price. :slight_smile:

Thanks to the link to the servo website, you are right, that is quite the killer servo!!

I looked up the servo I had on there as they seemed to have a more detailed spec on the motors. I saw that it had a max travel out of the box of 119 degrees, which seems pretty much bang on from what I have seen. However, underneath this they had a Max Travel (reprogrammed normal res) which was 199 degrees. What is this reprogrammed normal res and how is this different to the out of the box travel?

How about this one? HJ S3315D