Vibration issue in robot arm

Hi all,

I'm building a 4-DoF Robot Arm and I'm having a problem related to vibration.

Basically the 4th servo motor, a MG90S, vibrates a little when rotating at slower speeds. This vibration seems pretty normal to me since it's not a high quality servo. When it's not connected to the arm or rotating something that long, you can't even notice it.

Here's a video showing the problem (the banging noise is due to the vibration as well):

https://www.youtube.com/shorts/VU1G88hsumM

I know for a fact that it's the vibration that is causing it. When I detach that part from the rest of the arm, the problem is gone. Just saying this in case you think it's related to power supply or code. It's NOT. Also, the vibration is related to the servo, and not the other parts. Every joint is using bearings and they rotate very smoothly.

Here's a video with the problem gone. Basically in this case my hand is "absorbing" or "damping" the vibration.

https://www.youtube.com/shorts/57iHkXL-jDU

I've also held the detached part to other fixed surfaces, such as my desk, for example, and in that case the problem happens again. As soon as the arm and the surface are not in contact anymore, it doesn't vibrate.

Do you guys have any idea on how to overcome this without having to buy a servo with better mechanics? I guess I would need something to absorb these vibrations?

The other joints use MG996R servos and it doesn't happen there.

Thanks in advance!

Here's my robot so far:

Well you can't control the speed of a servo other that break up the movement into a whole series of small movements.

As a servo has no accessible feedback as to it's actual current position you have to delay slightly once you give it the next little move in order for it to catch up. If this delay is too long then you get jerky movement, if it is too short you get erratic movement.

So in your case I would play about that delay in your code to see if you can improve things. Or change the size of these small movements to make them even smaller.

Hey Mike, thanks for the tip, I'm in fact controlling the speed that way.

I plan however on letting the user choose if he wants to rotate the joints faster or slower, so it has to work within all speed ranges, which it does when that part of the arm is not connected to a rigid structure, as shown in the video.

So you just include the delay and the amount moved per micro movement hidden behind the speed choice. Choose one speed and have the code set the other parameters from a lookup table or some calculation.

I've tried many different combinations of angle increments and delay between them, both with milli and microseconds and nothing really works when the rotating speed goes down.

I'm now trying to add some soft material between the two links of the arm that move to add some friction. It kinda works but it's not acceptable as a final solution.

Guess I'll just buy a better servo and test it or just use another MG996R

I would suggest that you haven't hit on the right combination, especially angle increment.

Do you know you can get finer control using the servo's write microseconds option.
writeMicroseconds

Hey Mike, thanks, yes I have tried all types of combinations using servo write/writeMicroseconds, delay/delayMicroseconds and angle increments without success. The issue really seems to be related to the poor motor quality in general which results in lots of backlash and causes the vibration.

Besides adding friction, if I add a heavy load to the gripper the problem kinda goes away too. However there's no way I can make a gripper that heavy even with 100% infill 3D printed plastic parts.

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.