1
$\begingroup$

Introduction:

I have modeled my 5-DOF robot arm in a simulation environment to test trajectories for my physical model. I have export the joint variables from the simulation as a .csv file. Then imported this file into the code and the values are written to the servo motors in an infinite while loop. There are 400 values for a 10 second motion. The trajectory that is followed by the robot can be found here: https://www.youtube.com/watch?v=vDA3vEIyznc

The Problem:

When I compile the code the arm follows the desired trajectory but it vibrates while doing so. My guess is that 400 values for 10 seconds is less than the resolution of the motor that it can handle. But it can also be the backlash of the motors.

Additional Information:

I have designed the power circuitry of the servomotors using TI's PTN78020W adjustable switching regulator. The input to the regulators are supplied by a computer power supply. The regulator circuitry is shown below.

enter image description here

The entire system is shown by the visual below.

enter image description here

The Request:

I need suggestions on what causes the mentioned vibration and how to solve it. I can provide more information for troubleshooting on request.

APPENDIX

MATLAB Code:

clear all
clc

myArray = linspace(0,180,404)/180;

servoarray = csvread('C:\Users\Canberk  Gurel\Desktop\Robo1.csv',2,9);
servoarray = transpose(servoarray/180);

%Create an arduino object
a = arduino('com4', 'Mega2560');

% s = servo(a, 'D3');
s1 = servo(a, 'D9', 'MinPulseDuration', 700*10^-6, 'MaxPulseDuration', 2300*10^-6);
s2 = servo(a, 'D10', 'MinPulseDuration', 700*10^-6, 'MaxPulseDuration', 2300*10^-6);
s3 = servo(a, 'D11', 'MinPulseDuration', 700*10^-6, 'MaxPulseDuration', 2300*10^-6);
s4 = servo(a, 'D6', 'MinPulseDuration', 700*10^-6, 'MaxPulseDuration', 2300*10^-6);
s5 = servo(a, 'D3', 'MinPulseDuration', 700*10^-6, 'MaxPulseDuration', 2300*10^-6);
s6 = servo(a, 'D5', 'MinPulseDuration', 1*10^-3, 'MaxPulseDuration', 2*10^-3);

while true
   for i = 1:1:403
      writePosition(s1, servoarray(1,i));
      writePosition(s2, servoarray(2,i));
      writePosition(s3, servoarray(3,i));
      writePosition(s4, servoarray(4,i));
      writePosition(s5, servoarray(5,i));
      writePosition(s6, myArray(i));

      current_pos = readPosition(s1);
      current_pos = current_pos*180;
      fprintf('Current motor position is %d degrees\n', current_pos);
      %pause(0.1);
   end

   for i = 403:-1:1
      writePosition(s1, servoarray(1,i));
      writePosition(s2, servoarray(2,i));
      writePosition(s3, servoarray(3,i));
      writePosition(s4, servoarray(4,i));
      writePosition(s5, servoarray(5,i));
      writePosition(s6, myArray(i));

      current_pos = readPosition(s1);
      current_pos = current_pos*180;
      fprintf('Current motor position is %d degrees\n', current_pos);
      %pause(0.1);
    end
end

Datasheet of the Servo Motors:

enter image description here

Additional Visuals

enter image description here

$\endgroup$
3
  • $\begingroup$ What is the code you're using to send commands to the arm? How are you reading the CSV? How are you powering the arm? You have 400 samples for 10 seconds, which is equivalent to 40 Hz. This is really close to the PWM frame width of 50 Hz. Maybe you're interrupting the frames, maybe your browning out your power supply, maybe the signal itself has noise, maybe you're not converting to PWM or angle correctly - there's a lot that could be going wrong, but you haven't really provided any data we could use to troubleshoot. $\endgroup$
    – Chuck
    Dec 18 '17 at 14:21
  • $\begingroup$ @Chuck Tomorrow, I will revise my post and provide a comprehensive information about the robot arm. Please stay tuned. $\endgroup$
    – csg
    Dec 18 '17 at 14:59
  • $\begingroup$ @Chuck Please check my update. $\endgroup$
    – csg
    Dec 20 '17 at 19:10

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Browse other questions tagged or ask your own question.