Hi.
I bought some time ago an AL5b robot arm kit with mechanics and servos, without electronics. I’m doing the control of the arm with an Arduino Uno.
I’ve noticed that the shoulder servo (HS-755hb) goes to biased positions depending on the weight the arm holds and extension of the arm (more torque on it).
I understand those are hobby servos and not industrial hi-def servos.
But my questions would be: is that behavior expected? or should I look to see if there’s something wrong with the servo?
Also, are position biases normal on hobby servos?
Sure.
By biases positions I mean when I indicate the servo: “go to 45 degrees” but it reaches a position of 40 degrees for example. Its real position is biased from the position I indicate it.
This happens to the shoulder servo when the arm is fully extended or near full extension.
There is one way to test this - can you disconnect the upper part of the arm after the shoulder and repeat the same experiment? If it moves to 45 degrees rather than 40 degrees, then it’s the weight of the arm.
What are you using to power the arm? Can you include a few images here of your setup, especially the servo controller.
It looks like quite a custom setup - you’re sending the signals from the Arduino via a breadboard; can’t quite tell how power is split.
Are you using standard AL5 arm mechanics, or are some of the brackets custom?
The first thought is that the servos are not getting enough power to keep them in place.
Hi,
Sorry for the delay, I was collecting data and doing some experimentation. Here are the results.
First, I’m using the lynxmotion brackets, i just putted some tape on it to measure angles.
I’m powering the arm with a wall power adaptor on 6V (h[size=1]ttps://www.dropbox.com/s/kakr5wjg7vxdrui/DSC07328.JPG?dl=0[/size]). Control signals come from an Arduino Uno. Arduino ground and Adapter ground are connected togheter.
Then, I removed the upper part of the arm leaving the shoulder servo without any load. I placed a piece of carton board and drawed a line in order to be able to measure angles with a protractor. I found that without any load the servo behaved also similarly! So i was not a matter of overloading or similar.
The behavior of the servo is observable also on this video, where the servo is programmed to sweep from 0 degrees to 180 degrees.
It goes way lower than 0 degress and upper than 180 degrees. [size=1]https://www.dropbox.com/s/9y303vbla28fcqd/MOV07335.MPG?dl=0[/size]
I tested the servo on several PWM outputs of the Arduino with same results (to discard it was caused by the arduino). This also happens only on the shoulder servo.
My interest here is to learn if this issue is something you see regularly or if this is a non-expected behavior from a servo.
Try powering the servo at 6V. It’s also important to note that although the max current consumed and displayed by your power supply may be ~350mA, there are “peak currents” which are several amps which last a few milliseconds.
RC servos were never intended for use in robotics, and as such the angular resolution was never too important; it was the absolute positioning which was far more important.
The behavior you are experiencing is a bit odd, but not unheard of. If a servo is not able to reach the desired position, it’s normally because of a power issue.
The issue with the angles however (in the video) is quite weird - how are you sending the signals, and which signals are you sending? Note that 1500 is centered, 500 is 0 degrees, and 2500 is 180 degrees.
Hi, I’m back…
I now think I have some light into this discussion. I’ve been investigating and as you mentioned the origin of these type of servos is very important, they came from the RC world, where you need some precision for the center position (90 degrees) and then you just need it to go right or left but with no precise amount.
So, what I found on the literature is that there’s an agreement about having center position with a signal of 1500us, but there’s no consensus on what is signal length for 0 degrees and 180 degrees.
You mentioned that “500 is 0 degrees, and 2500 is 180 degrees”. Arduino Servo Library has "0-degree angle on the servo defaults to 544… 180-degree angle on the servo defaults to 2400. Other Arduino reference even says: “1000 is fully counter-clockwise, 2000 is fully clockwise”.
But the most important statement that I found was: “Note that some manufactures do not follow this standard very closely so that servos often respond to values between 700 and 2300”.
Since I was using Arduino Servo library, it uses its default values and my experimental data was consistent with them: 547us for 0 degrees and 2392 for 180 degrees (It was slightly different from theoretic values, probably since I didn’t have a scope so I used a DVM and measured Mean Voltage and then calculated time).
This article provided me some insights about how to modify time values for 0 and 180 degrees on the Arduino Servo function ( makezine.com/2014/04/23/arduinos … arameters/ ). So I found that my HS-755 servo has 670us for 0 degrees and 2300us for 180 degrees. I tried also with HS-422 servo and found a different set of values.
In conclusion, each servo might have difference time values for 0 and 180 degrees. For future settings, if I need some precision on angle settings, I need to manually measure those time values first and adjust Arduino Servo function accordingly.