Welcome to Synthiam!

Program robots using technologies created from industry experts. ARC is our free-to-use robot programming software that makes features like vision recognition, navigation and artificial intelligence easy.

Get Started
Asked — Edited

Servo Buzzes After Moving To A Value Near Min Or Max

When I rotate one of my servos to a value near the min or max (1, 2, 3, 98, 99, 100) the servo rotates just like it should, but starts buzzing afterwards until I either move it to a value farther away from the min or max, or close the connection. Is there something I should be doing after setting the servo position (maybe some method I should be calling)? This buzzing sound is just a little discomforting, and I don't want too do anything that is damaging the servos, and I also find it strange that it only does this for values near the min and max. Thanks!

#1  
The buzzing is "loading" on the servo motor. It means it has hit it's max movement. Generally, a little strain is OK, but be careful not to over strain the servos, they can burn out (The max. load of a servo is generally indicated by the number of ounces it can sustain.). It is this load that allows the servo to maintain position however, so it's a balance.

You can send a "release" call which will remove the electrical pulse to the servo, therefore, stopping load. However, if the weight on the servo is greater than the unloaded resistance of the servo, the servo gears will rotate. If the servo has no weight on it, it will remain in place.

For example, if on a "head" mount (horizontal movement), the servo will simply stop buzzing and likely nothing will change position. If on a neck (vertical movement), potentially when you remove the load with a release call, the head will sink if the weight of the head is greater than the resistance of the servo gears.

Hope that helps.
#2  
When do I send the release call? In my code, I use the following code to set the servo position:

SetServoPosition(Servo.ServoPortEnum.D0, Servo.SERVO_MIN)

And that works fine (except for the buzzing). I tried adding the following code immediately after it:

ReleaseServo(Servo.ServoPortEnum.D0)

But even though the SetServoPosition statement is called before the ReleaseServo statement, it doesn't work when the ReleaseServo statement is there. How can I tell when the servo is done rotating so that I know when it is safe to send the ReleaseServo statement? Thanks.
PRO
Synthiam
#3  
Every control has a ? button next to the X (close) button. If you press that button, you will be directed to the help page for that control. The help page for the servo will explain how the servo controls works. It will also provide a link which directs you to a page that explains how a servo works. Read that page and it will answer your question:)
#4  
That may explain how a servo works, and what releasing does, but it does not answer my question. My question is about where in the code I should call the ReleaseServo method so that it does not prevent the servo from rotating, or how I can check to see if the servo has finished rotating. Thanks.
#5  
njsokalski,
I'm no script writer. Heck I just started myself and have only written a few that actually work. Without seeing your script I would think the release code would go at the end on a line of it's own. I've found that I need to place a Sleep(x) function, x being how many ms to wait, after an action. This gives the action time to complete before running the next line of code. Try using that.

Also in ARC there are many examples (in the Examples section of all places ;) ) of servo scripts. That's where I go to get ideas when I get stuck. At least you'll see how a script is structured. DJ even has examples of how to write a script.

Good luck and have fun,
Dave Schulpius