IV. Matlab: Torque Calculation

To calculate the torques required at the motor, we use the method of calculating instant centers of links 2 and 3. Below is our matlab code to implement this calculation and visualization. The results can be found at the bottom of the page or by using the table of contents to navigate there faster. 

Methodology

Dino Bank Code
clc
clear all
close all
 
% Motor Max Operatable Torque
polulu_T_stall = 5; %oz-in
polulu_rpm = 11000; %RPM
polulu_T_op = polulu_T_stall/2;
polulu_gearbox = 131;
 
polulu_T_op_geared = polulu_T_op * polulu_gearbox
 
% Our Gearbox
teamGbox = 40/16;
T_op = polulu_T_op_geared * teamGbox;
 
% Convert to N-m
Nm_over_Ozin = 141.6119;
T_op_Nm = T_op/Nm_over_Ozin;
 
% Lenghts in inches
a = 3.15;
b= 6.89;
c = 6.89;
d = 8.94;
f = c + 6.89;
 
% inches to meters
i_to_m = 0.0254;
 
% L is in meters
L1 = a * i_to_m;
L2 = c * i_to_m;
L3 = b * i_to_m;
L4 = d * i_to_m;
LP = f * i_to_m;
qP = degtorad(0);%*pi/180;
 
xaxis_max = 0.46%0.2;
xaxis_min = -0.46;
yaxis_max = 0.48;
yaxis_min = -0.2;
 
m = 1; %1kg
g = 9.81; %Force Exerted by load N-m
 
alpha = degtorad(45)%1* pi/180;
% Rotation Matrix
R = [cos(alpha) -sin(alpha); sin(alpha) cos(alpha)]
 
dir = -1 % +1 or -1
% in degrees
qstart = -80;
qend = qstart+360; 
 
w2 = dir*100*2*pi/60; %RPM to rad/s
 
%video
writerObj = VideoWriter('4barAnim.avi');
 
open(writerObj);
for index = qstart:1:qend    
    i = (index-qstart)+1;
    q2 = dir*index;  % Degree
    q2 = dir*index*pi/180;  % Radian
    
    q2_i(i) = q2;
 
    K1 = L4 / L1;
    K2 = L4 / L3;
    K3 = (L1^2 - L2^2 + L3^2 +L4^2) / (2*L1*L3);
    K4 = L4 / L2;
    K5 = (L3^2 - L4^2 - L1^2 - L2^2) / (2*L1*L2);
 
    A = cos(q2) - K1 - K2*cos(q2) + K3;
    B = -2*sin(q2);
    C = K1 - (K2 + 1)*cos(q2) + K3;
    D = cos(q2) - K1 + K4*cos(q2) + K5;
    E = -2*sin(q2);
    F = K1 + (K4 - 1)*cos(q2) + K5;
 
    q4 = 2*atan((-B - sqrt(B^2 - 4*A*C)) / (2*A));
    q3 = 2*atan((-E - sqrt(E^2 - 4*D*F)) / (2*D));
 
    w3 = a/b*w2*sin(q4-q2)/sin(q3-q4);
    
    w3_i(i) = w3;
 
    % Calculate Instant Center w3_w1;
    I = [cos(q2), -cos(q4); sin(q2), -sin(q4)];
    LI = inv(I)*[L4;0];   
    
    origin = [0; 0];
    L_A = [L1*cos(q2); L1*sin(q2)];
    L_B = L_A + [L2*cos(q3); L2*sin(q3)];
    L_D = [L4*cos(0); L4*sin(0)];
    L_C = L_D + [L3*cos(q4); L3*sin(q4)];
    P = L_A + [LP*cos(q3 - qP); LP*sin(q3 - qP)];
    
    L_AI = [LI(1)*cos(q2); LI(1)*sin(q2)];
    L_DI = L_D + [LI(2)*cos(q4); LI(2)*sin(q4)];
    
    % Plot Point P
    vA = L1*w2*[-sin(q2); cos(q2)];
    vPA = LP*w3*[-sin(q3-qP); cos(q3-qP)];    
    vP = vA+vPA;
    
    % Force Direction
    F_load = [0;-m*g;0];
    % Arm Vector From Point I to Point P
    R_load = P-L_AI;      
    
 
    L_A = R*L_A;
    L_B = R*L_B;
    L_C = R*L_C;
    L_D = R*L_D;
    P = R*P;
    vP = R*vP;
    L_AI = R*L_AI;
    L_DI = R*L_DI;    
    R_load = R*R_load;
    % Torque of Load on Point B
    T_Load = cross([R_load(1), R_load(2),0], F_load);
    
    T_Load_i(i) = T_Load(3);
    
    vP_i(i) = -vP(1);%norm(vP,2);       
    vP_unit = vP/norm(vP,2);    
 
    Px(i) = P(1);
    Py(i) = P(2);
    
    figure(1)
    plot(origin(1),origin(2),'ro','linewidth',3)
    hold on
    plot(-L_A(1),L_A(2),'ro','linewidth',2)
    plot(-L_B(1),L_B(2),'ro','linewidth',2)
    plot(-L_D(1),L_D(2),'ro','linewidth',3)
    %plot(L_C(1),L_C(2),'bx','linewidth',2)
    plot(-P(1),P(2),'ro','linewidth',4)
    
    % Plot Instant Center I1,3
    plot(-L_AI(1),L_AI(2),'kx','linewidth',3)    
    plot(-L_DI(1),L_DI(2),'co','linewidth',2)    
    
    plot(-Px, Py,'rx')
 
    % Visualize Line of Instant Center
    line([-L_D(1) -L_DI(1)], [L_D(2) L_DI(2)],'color','y','linewidth',1)
    line([-L_A(1) -L_AI(1)], [L_A(2) L_AI(2)],'color','y','linewidth',1)
    
    line([origin(1) -L_A(1)], [origin(2) L_A(2)],'linewidth',2.5)
    line([-L_A(1) -L_B(1)], [L_A(2) L_B(2)],'linewidth',2.5)
    line([-L_D(1) -L_C(1)], [L_D(2) L_C(2)], 'linewidth',2.5)
    line([-L_A(1) -P(1)], [L_A(2) P(2)],'linewidth',2.5)
    line([-L_B(1) -P(1)], [L_B(2) P(2)],'linewidth',2.5)
    
    %Visualize R-vector
    %line( [-L_AI(1), -L_AI(1)-R_load(1)], [L_AI(2),L_AI(2)+R_load(2)], 'color','k');
   
    
    %Scaled Velocity
    vPs = vP/10;
    quiver( -P(1), P(2), -vPs(1), vPs(2),'g');    
 
    % R vector 
    quiver( -L_AI(1), L_AI(2), -R_load(1), R_load(2),'k');
    % Torque Visualization
    quiver( -P(1), P(2), 0, (T_Load(3)/10),'m');
 
    % Force Visualization
    quiver( -P(1), P(2), 0, F_load(2)/75,'k');
    
    title('DinoBank','fontsize',15)
    xlabel('x','fontsize',15)
    ylabel('y','fontsize',15)
    %axis equal
    axis([xaxis_min, xaxis_max, yaxis_min, yaxis_max])
    %pause(0.01)
    hold off
    frame = getframe;
    writeVideo(writerObj,frame);
 
end
close(writerObj); %Save video
 
hold on
h1 = figure(1)
saveas(h1, '4Bar_path_plot.pdf');
plot(-Px,Py,'rx')
hold off
h2 = figure(2)
plot(radtodeg(q2_i), fliplr(vP_i))
title('velP in x direction')
xlabel('theta 2 deg')
ylabel('vel P m/s')
saveas(h2, 'xVelofP');
h3 = figure(3)
plot(radtodeg(q2_i), T_Load_i);
xlabel('theta 2 deg');
ylabel('Torque on theta 3');
saveas(h3, 'torqueOn3.pdf');
h4 = figure(4)
 
MA = w2*(1./w3_i);
plot(radtodeg(q2_i), MA);
xlabel('theta 2 deg');
ylabel('Mechanical Advantage w2/w3');
saveas(h4, 'Ma.pdf');
 
h5 = figure(5)
hold on
plot(radtodeg(q2_i), T_Load_i./MA);
plot(radtodeg(q2_i), T_op_Nm*ones(1,size(q2_i,2)),'r');
plot(radtodeg(q2_i), -T_op_Nm*ones(1,size(q2_i,2)),'r');
title('Torque Seen by Motor (Nm)')
xlabel('theta 2 deg');
ylabel('Torque Nm');
legend ('Torque Required', 'Operating Torque Available');
saveas(h5, 'TorqueAtMotor.pdf');



Visualization and Torque and Force Simulation

 

Results

Mechanical Advantage


Motor Torque Required