Академический Документы
Профессиональный Документы
Культура Документы
INFORME FINAL
SECCION: “A"
2018 - I
PROYECTO DEL CURSO ANÁLISIS Y CONTROL DE ROBOTS
1. OBJETIVO
1
Figura 1. Diseño realizado en Solidworks del brazo robótico de 2GDL
Para realizar este cálculo, primero se aísla toda parte del robot que moverá el primer
motor, como se muestra en la figura 2. Luego, con las densidad de todos los materiales
establecidos y sabiendo que el segundo motor tiene un peso de 105 gramos, se procede
a ver las características brindadas en Solidworks como es mostrado en la figura 3.
0
𝐼𝑧𝑧 = 4992793.87 𝑔 − 𝑚𝑚2 ⋯ (1)
Sabemos que:
0
∑ 𝑀 = 𝑇𝑚𝑜𝑡𝑜𝑟 = 𝐼𝑧𝑧 ∙𝛼 ⋯ (2)
2 ∙ Δ𝜃
𝛼= ⋯ (3)
𝑡2
2
Teniendo en cuenta los parámetros que suelen tener los motores DC, podemos suponer
uno que trabajará a 180 RPM, es decir dará una vuelta en 1/3 de segundo:
1
𝑡= 𝑠 Δ𝜃 = 2𝜋 ⋯ (4)
3
Reemplazando (1), (3) y (4) en (2) y trabajando en las unidades del SI tendremos:
𝑇𝑚𝑜𝑡𝑜𝑟 = 0.56 𝑁 − 𝑚 = 5.6 𝑘𝑔 − 𝑐𝑚
Por tanto se necesitará un motor de al menos 6 𝑘𝑔 − 𝑐𝑚 para poder trabajar, sin
embargo esta aproximación está relativamente alejada de lo normal, por lo que con un
motor que ofrezca 10 𝑘𝑔 − 𝑐𝑚 será más que suficiente para poder mover sin problema
todo el robot.
3
Figura 4. Motor para el primer link adquirido
Tabla 1. Especificaciones del prime motor, brindadas por el fabricante
4
Figura 6. Motor para el segundo link adquirido
Tabla 2. Especificaciones del segundo motor, brindadas por el fabricante
5
Figura 7. Planos del segundo motor brindados por el fabricante
6
Figura 9. Diseño en Solidworks del segundo motor
2.3.3. VISTAS DEL ROBOT
7
Figura 11. Vista lateral del robot de 2GDL
a. LINK 1
8
Figura 13. Diseño del link 2 en Solidworks
c. Soporte del segundo motor
9
Figura 15. Planos de los link 1 y 2
3. CINEMÁTICA DIRECTA
3.1. DETERMINACIÓN DE LOS SISTEMAS COORDENADOS
10
Figura 16. Sistemas coordenados del robot
3.2. DETERMINACIÓN DE LOS PARÁMETROS DE DENAVIT HARTENBERG
Tabla 3. Parámetros DH
JUNTA 𝜽𝒊 𝒅𝒊 𝒂𝒊 𝜶𝒊
𝜋
1 𝜃1 𝐿1 0
2
2 𝜃2 𝐿2 0 0
11
3.3. DETERMINACIÓN DE LAS MATRICES DE TRANSFORMACIÓN
⋯ (5)
⋯ (6)
cos 𝜃1 0 𝑠𝑖𝑛𝜃1 0
𝑠𝑖𝑛𝜃1 0 −𝑐𝑜𝑠𝜃1 0
𝑇10 = [ ]
0 0 1 𝐿1
0 0 0 1
𝑐𝑜𝑠𝜃1 ∙ 𝑐𝑜𝑠𝜃2 − 𝑐𝑜𝑠 𝜃1 ∙ 𝑠𝑖𝑛𝜃2 𝑠𝑖𝑛𝜃1 𝐿2 ∙ 𝑠𝑖𝑛 𝜃1
𝑐𝑜𝑠𝜃2 ∙ 𝑠𝑖𝑛𝜃1 −𝑠𝑖𝑛𝜃1 ∙ 𝑠𝑖𝑛𝜃2 −𝑐𝑜𝑠𝜃1 − 𝐿2 ∙ 𝑐𝑜𝑠𝜃1
𝑇20 = [ ]
𝑠𝑖𝑛𝜃2 𝑐𝑜𝑠𝜃2 0 𝐿1
0 0 0 1
4. CINEMÁTICA INVERSA
De la figura 17
vemos
fácilmente que:
𝑧𝑐 = 𝐿1
Esto es una
primera
restricción.
12
De la figura 18 tenemos que:
𝑥𝑐 = 𝐿2 ∙ 𝑠𝑖𝑛𝜃1 ⋯ (7)
𝑦𝑐 = −𝐿2 ∙ 𝑐𝑜𝑠𝜃1 ⋯ (8)
El ángulo 𝜃2 solo determinará el giro de la pinza por lo que no hay una relación para ella
en la cinemática inversa.
5. CÓDIGOS EN MATLAB
5.1. CINEMÁTICA DIRECTA
%**** CINEMATICA DEL ROBOT DE 2 GDL ****%
clc, clear all, close all;
% ------------------------------------- %
% 1. DEFINICION DE VARIABLES SIMBOLICAS %
% ------------------------------------- %
syms theta1 d1 a1 alpha1;
syms theta2 d2 a2 alpha2;
syms q1 q2;
syms L1 L2;
% ------------------------------------- %
% 2. DEFINICION DE SISTEMAS COORDENADOS %
% ------------------------------------- %
% 2.1. Sistema Coordenado 1
theta1 = q1;
d1 = L1;
a1 = 0;
alpha1 = pi/2;
A1 = matriz_homogenea_DH(theta1,d1,a1,alpha1);
% 2.2 Sistema coordenado 2
theta2 = q2;
d2 = L2;
a2 = 0;
alpha2 = 0;
A2 = matriz_homogenea_DH(theta2,d2,a2,alpha2);
% ------------------------------------- %
% 3. CINEMATICA %
% ------------------------------------- %
T01 = A1;
T02 = simplify(A1*A2);
13
% 3.1. Matriz de transformacion T01
disp('Matriz T01');
pretty(T01);
% 3.2. Matriz de transformacion T02
disp('Matriz T02');
pretty(T02);
% ------------------------------------- %
% 1. DEFINICION DE PARÁMETROS DEL ROBOT %
% ------------------------------------- %
L1 = 1;
L2 = 1;
% ------------------------------------- %
% 2. DEFINICION DE SISTEMAS COORDENADOS %
% ------------------------------------- %
% 2.1. Sistema coordenado inercial
T0 = eye(4);
figure('name', 'Cinematica Directa', 'NumberTitle', 'off');
title('SIMULACIÓN CINEMÁTICA DIRECTA');
h0 = plot_frame(T0, 'color', 'k', 'view', 'auto');
axis([-4 4 -4 4 -4 4]);
hold on, grid on;
xlabel('x(m)');
ylabel('y(m)');
% 2.2. Sistema coordenado 1
theta1 = 0;
d1 = L1;
a1 = 0;
alpha1 = pi/2;
A1 = matriz_homogenea_DH(theta1,d1,a1,alpha1);
14
T01 = A1;
h1 = plot_frame(T01, 'frame', '1', 'color', 'b');
% 2.3. Sistema coordenado 2
theta2 = 0;
d2 = L2;
a2 = 0;
alpha2 = 0;
A2 = matriz_homogenea_DH(theta2,d2,a2,alpha2);
T02 = T01*A2;
h2 = plot_frame(T02, 'frame', '2', 'color', 'g');
% ------------------------------------- %
% 3. LAZO DE SIMULACIÓN %
% ------------------------------------- %
MOVE_JUNTA1 = 1;
MOVE_JUNTA2 = 1;
STEPS = 100;
for i = 1:STEPS
if MOVE_JUNTA1 == 1
theta1 = theta1 + pi/200;
end
if MOVE_JUNTA2 == 1
theta2 = theta2 + pi/200;
end
A1 = matriz_homogenea_DH(theta1,d1,a1,alpha1);
A2 = matriz_homogenea_DH(theta2,d2,a2,alpha2);
T01 = A1;
T02 = T01*A2;
plot_frame(h1, T01);
plot_frame(h2, T02);
pause(0.1);
end
clc, disp('Presione una tecla para terminar.');
pause();
clc, close all;
15
5.3. CINEMÁTICA INVERSA
%**** SIMULACION CINEMATICA INVERSA ****%
clc, clear all, close all;
% ------------------------------------- %
% 1. DEFINICION DE PARÁMETROS DEL ROBOT %
% ------------------------------------- %
L1 = 1;
L2 = 1;
% ------------------------------------- %
% 2. POSICIÓN FINAL DESEADA %
% ------------------------------------- %
xc = 0.4; % xc^2 + yc^2 = 1
yc = sqrt(1-0.4^2);
zc = 1; % Fijo
% ------------------------------------- %
% 3. SISTEMAS COORDENADOS INICIALES %
% ------------------------------------- %
% 3.1. Sistema coordenado inercial
T0 = eye(4);
figure('name', 'Cinematica Directa', 'NumberTitle', 'off');
title('SIMULACIÓN CINEMÁTICA INVERSA');
h0 = plot_frame(T0, 'color', 'k', 'view', 'auto');
axis([-4 4 -4 4 -4 4]);
hold on, grid on;
xlabel('x(m)');
ylabel('y(m)');
% 3.2. Sistema coordenado 1
theta1 = 0;
d1 = L1;
a1 = 0;
alpha1 = pi/2;
A1 = matriz_homogenea_DH(theta1,d1,a1,alpha1);
T01 = A1;
h1 = plot_frame(T01, 'frame', '1', 'color', 'b');
% 3.3. Sistema coordenado 2
theta2 = 0;
d2 = L2;
a2 = 0;
alpha2 = 0;
A2 = matriz_homogenea_DH(theta2,d2,a2,alpha2);
T02 = T01*A2;
h2 = plot_frame(T02, 'frame', '2', 'color', 'g');
% ------------------------------------- %
% 4. PLOTEO DEL PUNTO FINAL %
% ------------------------------------- %
plot3(xc, yc, zc, 'ro', 'MarkerFaceColor', 'k', 'MarkerSize', 10);
% ------------------------------------- %
% 5. CÁLCULO DE ÁNGULOS %
% ------------------------------------- %
D = (xc^2 + yc^2)/L2^2;
if (D < 1 - 1E-15 || D > 1+1E-15 || zc ~= L1)
close all, error('Posición imposible de alcanzar');
else
theta1_final = atan2(xc, -yc);
16
theta2_final = pi/3;
end
% ------------------------------------- %
% 6. LAZO DE SIMULACIÓN %
% ------------------------------------- %
% 6.1. Mensaje
disp('Presione una tecla para empezar la simulación.');
pause();
% 6.3. Lazo
for i = 1:STEPS
% 6.3.1. Ángulo instantáneo
theta1 = THETA1(i);
theta2 = THETA2(i);
% 6.3.2. Matrices T
A1 = matriz_homogenea_DH(theta1,d1,a1,alpha1);
A2 = matriz_homogenea_DH(theta2,d2,a2,alpha2);
T01 = A1;
T02 = T01*A2;
% 6.3.3. Ploteo del movimiento
plot_frame(h1, T01);
plot_frame(h2, T02);
% 6.3.4. Pausa por movimiento
pause(0.001);
end
17
La cual representa la transformación del sistema del efector final al sistema inercial. Con
el movimiento del robot las variables de las juntas 𝑞𝑖 , el efector final 𝑜𝑛0 y la orientación
𝑅𝑛0 en función de los ángulos.
Se define:
𝑣𝑛0 = 𝐽𝑣 𝑞̇
𝑤𝑛0 = 𝐽𝑤 𝑞̇
𝑣𝑛0
𝜀 = 𝐽𝑞̇ = [ ]
𝑤𝑛0
𝑚
𝑝̇𝑚𝑖 = 𝐽𝑣 𝑖 𝑞̇
𝑚 𝑚 𝑚 𝑖𝑚
𝐽𝑣 𝑖 = [𝐽𝑣1𝑖 𝐽𝑣2𝑖 … . 𝐽𝑣,𝑖−1 0 … 0] ⋯ (3)
Donde:
𝑚
𝑤𝑚𝑖 = 𝐽𝑤 𝑖 𝑞̇
18
El jacobiano:
𝑚 𝑚 𝑚 𝑚
𝐽𝑤 𝑖 = [𝐽𝑤1𝑖 𝐽𝑤2𝑖 …. 𝐽𝑤,𝑖𝑖 0 … 0]
Donde:
(𝑙 )
(𝑚 ) 𝐽𝑤𝑗𝑖 𝑗 = 1,2, … … . 𝑖 − 1
𝐽𝑤𝑗 𝑖 = { ⋯ (4)
𝑘𝑟𝑖 𝑧𝑚𝑖 𝑗=𝑖
19
Tabla 1. Parámetros DH
JUNTA 𝜽𝒊 𝒅𝒊 𝒂𝒊 𝜶𝒊
𝜋
1 𝜃1 𝐿1 0
2
2 𝜃2 𝐿2 0 0
A partir de la cinemática, calculamos las coordenadas del centro de masa de los links.
20
Figura 3. Ubicación del centro de masa del link 1
21
Figura 4. Ubicación del centro de masa del link 2
1 1]𝑇
𝑟𝑐𝑚 1
= [0 −𝐿𝐶𝑀1𝑦 𝐿𝐶𝑀1𝑧
0
𝑟𝑐𝑚 1
= 𝑇10 . 𝑟𝑐𝑚
1
1
= [𝐿𝐶𝑀1𝑧 ∙ sin 𝜃1 −𝐿𝐶𝑀1𝑧 ∙ cos 𝜃1 𝐿1 − 𝐿𝐶𝑀1𝑦 1]𝑇
22
2 0 −𝐿𝐶𝑀2𝑧 1]𝑇
𝑟𝑐𝑚 2
= [𝐿𝐶𝑀2𝑥
(𝐿2 − 𝐿𝐶𝑀2𝑧 ) ∙ sin 𝜃1 + 𝐿𝐶𝑀2𝑥 ∙ cos 𝜃1 ∙ cos 𝜃2
−(𝐿2 − 𝐿𝐶𝑀2𝑧 ) ∙ cos 𝜃1 + 𝐿𝐶𝑀2𝑥 ∙ sin 𝜃1 ∙ cos 𝜃2
0
𝑟𝑐𝑚 2
= 𝑇20 . 𝑟𝑐𝑚
2
2
=[ ]
𝐿1 + 𝐿𝐶𝑀2𝑥 ∙ sin 𝜃2
1
0 0 𝐿𝐶𝑀1𝑧 ∙ cos 𝜃1 0
𝐽𝑤1 = [0 0] 𝐽𝑣𝐶𝑀1 = [ 𝐿𝐶𝑀1𝑧 ∙ sin 𝜃1 0]
1 0 0 0
𝐴 𝐶
𝐽𝑣𝐶𝑀2 = [𝐵 𝐷 ]
0 𝐵 ∙ cos 𝜃1 − 𝐴 ∙ sin 𝜃1
0 sin 𝜃1
𝐽𝑤2 = [0 − cos 𝜃1 ] 𝐴 = (𝐿2 − 𝐿𝐶𝑀2𝑧 ) ∙ cos 𝜃1 − 𝐿𝐶𝑀2𝑥 ∙ cos 𝜃2 ∙ sin 𝜃1
1 0 𝐵 = (𝐿2 − 𝐿𝐶𝑀2𝑧 ) ∙ sin 𝜃1 + 𝐿𝐶𝑀2𝑥 ∙ cos 𝜃2 ∙ cos 𝜃1
𝐶 = −𝐿𝐶𝑀2𝑥 ∙ cos 𝜃1 ∙ sin 𝜃2
𝐷 = −𝐿𝐶𝑀2𝑥 ∙ sin 𝜃1 ∙ sin 𝜃2
1 −𝐿𝑀2 1]𝑇
𝑟𝑐𝑚 2
= [0 0
0 0 0 0
𝐽𝑤𝑀1 = [ 0 0] 𝐽𝑣𝑀1 = [0 0]
𝐾𝑟1 0 0 0
23
7. DINÁMICA
7.1. CÁLCULO DE LOS CENTROS DE MASA
Link 1
𝑳𝑪𝑴𝟏𝒚
𝑳𝑪𝑴𝟏𝒛
𝑴𝒂𝒔𝒂
24
Link 2
𝑳𝑪𝑴𝟐𝒙
𝑳𝑪𝑴𝟐𝒛
𝑴𝒂𝒔𝒂
25
Link 1
Link 2
26
7.3. MÉTODO DE LAGRANGE
El análisis del modelo dinámico puede ser útil para diseño y cálculo de las fuerzas y
pares requerido para la ejecución de movimientos típicos, proporciona información útil
para diseñando juntas, transmisiones y actuadores. Para ello usaremos el método que
se basa en la formulación de Lagrange y es conceptualmente simple y sistemático.
El modelo dinámico de un manipulador proporciona una descripción de la relación entre
los pares de accionamiento del conjunto y el movimiento de la estructura. Con la
formulación de Lagrange. El Lagrangiano del sistema mecánico se puede definir como:
𝐿 =𝑇−𝑈
Donde T y U denotan la energía cinética y potencial del sistema. La ecuación de
Lagrange puede ser expresada por:
𝑑 𝜕𝐿 𝜕𝐿
− = 𝜀𝑖 𝑃𝑎𝑟𝑎 𝑖 = 1, 2, ⋯ , 𝑛
𝑑𝑡 𝜕𝑞𝑖̇ 𝜕𝑞𝑖
Donde 𝜀𝑖 es la fuerza generalizada asociada con el movimiento generalizado 𝑞𝑖 , esta
ecuación puede ser escrita de manera compacta de la forma:
𝑑 𝜕𝐿 𝑇 𝜕𝐿 𝑇
( ) −( ) =𝜀 ⋯ (5)
𝑑𝑡 𝜕𝑞̇ 𝜕𝑞
Las contribuciones a las fuerzas generalizadas están dadas por las fuerzas no
conservativas, es decir, la articulación, pares de torsión del actuador, pares de fricción
de la junta, así como pares de torsión inducidos por fuerzas efectores finales en el
contacto con el medio ambiente. La ecuación anterior establece la relación existente
entre el vector de fuerzas aplicadas al manipulador y las posiciones de las
articulaciones, las velocidades y aceleraciones. Por lo tanto, permiten la derivación del
modelo dinámico del manipulador a partir de la determinación de la energía cinética y
potencial del sistema mecánico.
7.3.1. Cálculo de la energía cinética
Considerando un manipulador con 𝑛 juntas, la energía cinética total está dada por:
𝑛
Donde 𝑇𝑙𝑖 es la energía cinética de cada link 𝑖 y 𝑇𝑚𝑖 es la energía cinética de los motores
de las juntas 𝑖. Luego la contribución de la energía cinética de los links es:
1 1
𝑇𝑙𝑖 = 𝑚𝑙𝑖 . 𝑝𝑙̇ 𝑖 𝑇 . 𝑝̇ 𝑙𝑖 + 𝑤𝑖 𝑇 . 𝑅𝑖 . 𝐼 𝑖 𝑙𝑖 . 𝑅𝑖 𝑇 . 𝑤𝑖
2 2
Además:
𝑝𝑙̇ 𝑖 = 𝐽(𝑙𝑖) 𝑣 . 𝑞̇
𝑤̇ 𝑖 = 𝐽(𝑙𝑖) 𝑤 . 𝑞̇
27
Luego la energía cinética del rotor 𝑖 es:
1 1
𝑇𝑚𝑖 = 𝑚𝑚𝑖 . 𝑝𝑚̇ 𝑖 𝑇 . 𝑝𝑚̇ 𝑖 + 𝑤𝑚𝑖 𝑇 . 𝐼𝑚𝑖 . 𝑤𝑚𝑖 ⋯ (7)
2 2
Donde 𝑚𝑚𝑖 es la masa del rotor y 𝑝𝑚̇ 𝑖 la velocidad lineal del centro de masa del rotor,
𝐼𝑚𝑖 es el tensor de inercia del rotor relativo al centro de masa y 𝑤𝑚𝑖 la velocidad angular
del rotor. Además:
𝑝̇𝑚𝑖 = 𝐽(𝑚𝑖) 𝑣 . 𝑞̇
𝑤̇𝑚𝑖 = 𝐽(𝑚𝑖) 𝑤 . 𝑞̇
28
Se debe tener en cuenta de que la matriz de rotación del motor con respecto a tierra es
diferente a la matriz de rotación del link 𝑖 con respecto a tierra, es decir:
0
𝑅𝑚𝑖 ≠ 𝑅𝑙𝑖0
Donde:
𝑛
𝑇 𝑇 𝑇
𝐷(𝑞) = ∑(𝑚𝑙𝑖 𝐽𝑣 (𝑙𝑖) 𝐽𝑣 (𝑙𝑖) + 𝐽𝑤 (𝑙𝑖) 𝑅𝑖 𝐼𝑙𝑖 𝑖 𝑅𝑖 𝑇 𝐽𝑤 (𝑙𝑖) + 𝑚𝑚𝑖 𝐽𝑣 (𝑚𝑖) 𝐽𝑣 (𝑚𝑖)
𝑖=1
⋯ (11)
(𝑚𝑖 ) 𝑇 𝑚𝑖 𝑇 (𝑚𝑖 )
+ 𝐽𝑤 𝑅𝑚𝑖 𝐼𝑚𝑖 𝑅𝑚𝑖 𝐽𝑤 )
29
Podemos notar que esta es solo una función de las posiciones y no de las velocidades.
7.4. ECUACIONES DEL MOVIMIENTO
Entonces reemplazando nuestros valores en el Lagrangiano:
𝐿(𝑞, 𝑞̇ ) = 𝑇(𝑞, 𝑞̇ ) − 𝑈(𝑞)
Aplicamos el método de Euler – Lagrange y tendremos:
𝑑 𝜕𝐿 𝜕𝐿
( )− = 𝜀𝑘
𝑑𝑡 𝜕𝑞𝑘̇ 𝜕𝑞𝑘
Primer término:
𝑛 𝑛 𝑛 𝑛 𝑛
𝑑 𝑑𝐿 𝑑 𝑑𝑇 𝑑𝐷𝑘𝑗 (𝑞) 𝑑𝐷𝑘𝑗 (𝑞)
( )= ( ) = ∑ 𝐷𝑘𝑗 (𝑞). 𝑞𝑗̈ + ∑ . 𝑞̇ 𝑗 = ∑ 𝐷𝑘𝑗 (𝑞). 𝑞𝑗̈ + ∑ ∑ . 𝑞̇ 𝑖 𝑞̇ 𝑗
𝑑𝑡 𝑑𝑞𝑘̇ 𝑑𝑡 𝑑𝑞𝑘̇ 𝑑𝑡 𝑑𝑞𝑖
𝑗=1 𝑗=1 𝑗=1 𝑖=1 𝑗=1
Segundo término:
𝑛 𝑛
𝑑𝑇 1 𝑑𝐷𝑖𝑗 (𝑞)
( ) = ∑∑ . 𝑞̇ 𝑖 𝑞̇ 𝑗
𝑑𝑞𝑖̇ 2 𝑑𝑞𝑘
𝑗=1 𝑘=1
𝑛 𝑛
𝑑𝑈 𝑑𝑝𝑙𝑗 𝑑𝑝𝑚𝑗 (𝑙 ) (𝑚 )
( ) = − ∑ (𝑚𝑙𝑗 . 𝑔0 𝑇 + 𝑚𝑚𝑗 . 𝑔0 𝑇 ) = − ∑ (𝑚𝑙𝑗 . 𝑔0 𝑇 𝐽𝑣𝑖𝑗 + 𝑚𝑚𝑗 . 𝑔0 𝑇 𝐽𝑤𝑖 𝑗 ) = 𝑔𝑘 (𝑞)
𝑑𝑞𝑘̇ 𝑑𝑞𝑘 𝑑𝑞𝑘
𝑗=1 𝑗=1
𝑛 𝑛
𝑑𝐿 1 𝑑𝐷𝑖𝑗 (𝑞)
( ) = ∑∑ . 𝑞̇ 𝑖 𝑞̇ 𝑗 + 𝑔𝑘 (𝑞)
𝑑𝑞𝑘̇ 2 𝑑𝑞𝑘
𝑗=1 𝑘=1
Finalmente, reemplazando:
𝑛 𝑛 𝑛
Donde:
𝑑𝐷𝑘𝑗 (𝑞) 1 𝑑𝐷𝑖𝑗 (𝑞)
ℎ𝑘𝑗𝑖 (𝑞) = −
𝑑𝑞𝑖 2 𝑑𝑞𝑘
El lagrangiano puede ser escrito de la siguiente forma despreciando la fricción y fuerza
de contacto externo:
𝐷(𝑞). 𝑞⃛ + 𝐶(𝑞, 𝑞̇ )𝑞̈ + 𝑔𝑘 (𝑞) = 𝜏
Donde 𝐶(𝑞, 𝑞̇ ) se calcula de la siguiente forma:
𝑛
30
7.5. DINÁMICA DE NUESTRO MANIPULADOR
Tenemos los siguientes parámetros del manipulador de 2 GDL.
Tabla 5. Parámetros del robot de 2 GDL
𝑇 𝐼𝑦𝑦1 0
𝐷1𝑤 = 𝐽𝑤1 ∙ 𝐼1 ∙ 𝐽𝑤1 = [ ]
0 0
Matriz de inercia rotacional (link 2)
𝐼𝑥𝑥2 0 𝐼𝑥𝑧2
̃
𝐼2 = [ 0 𝐼𝑦𝑦2 0 ]
𝐼𝑥𝑧2 0 𝐼𝑧𝑧2
31
𝑇 𝐼𝑥𝑥2 ∙ sin2 𝜃2 + 𝐼𝑦𝑦2 ∙ cos 2 𝜃2 𝐼𝑥𝑧2 ∙ sin 𝜃2
𝐷2𝑤 = 𝐽𝑤2 ∙ 𝐼2 ∙ 𝐽𝑤2 = [ ]
𝐼𝑥𝑧2 ∙ sin 𝜃2 𝐼𝑧𝑧2
Donde:
1 𝜕𝐷𝑖𝑗 𝜕𝐷𝑖𝑘 𝜕𝐷𝑗𝑘
𝑐𝑖𝑗𝑘 = ( + − )
2 𝜕𝑞𝑘 𝜕𝑞𝑗 𝜕𝑞𝑖
Entonces:
32
(𝐼𝑥𝑥2 + 𝐼𝑦𝑦2 + 𝐼𝑚𝑦𝑦2 + −𝐼𝑚𝑥𝑥2 + 𝐿𝐶𝑀2𝑥 2 ∗ 𝑚2 ) ∗ 𝑆(2 ∗ θ2 ) ∗ 𝑞2̇ /2 𝐶12
𝐶=[ ]
(−𝐼𝑥𝑥2 + 𝐼𝑦𝑦2 + 𝐼𝑚𝑦𝑦2 + −𝐼𝑚𝑥𝑥2 + 𝐿𝐶𝑀2𝑥 2 ∗ 𝑚2 ) ∗ 𝑆(2 ∗ θ2 ) ∗ 𝑞1̇ /2 0
𝑔1 = 0
𝑔2 = 𝐿𝑐𝑚2𝑥 ∗ 𝑔 ∗ 𝑚2 ∗ 𝐶θ2
Luego:
0
𝑔=[ ]
𝐿𝑐𝑚2𝑥 ∗ 𝑔 ∗ 𝑚2 ∗ 𝐶θ2
Observaciones:
Se observó en el cálculo de la dinámica que esta no depende de IL1X , IL1y
IL2X, IL2y, Im1xx, Im2xx, Im1yy, Im2yy
6.6.1. JACOBIANOS
% Demo_01
% Dinamica de un manipulador planar de 2GDL
clc; clear all; close all
%-------------------------------------------------------------------%
% 1. DEFINICION DE VARIABLES SIMBOLICAS
%---------------------------------------------------------------------
-%
syms theta1 d1 a1 alpha1
syms theta2 d2 a2 alpha2
syms q1 q2
syms dq1 dq2
syms L1 L2
syms m1 m2 mm1 mm2
syms Lcm1y Lcm1z Lcm2x Lcm2z Lm1 Lm2
syms Ixx1 Iyy1 Izz1 Iyz1 Ixx2 Iyy2 Izz2 Ixz2
syms Imxx2 Imyy2 Imzz2 Imxx1 Imyy1 Imzz1
syms g
syms Kr1 Kr2
q = [q1; q2];
33
dq = [dq1; dq2];
n = 2;
%---------------------------------------------------------------------
-%
% 2. SISTEMAS COORDENADOS Y CINEMATICA
%---------------------------------------------------------------------
-%
% 2.1. SISTEMA COORDENADO 1
% -> Parametros D-H
theta1 = q1;
d1 = L1;
a1 = 0;
alpha1 = pi/2;
% -> Matriz A
A1 = matriz_homogenea_DH(theta1, d1,a1,alpha1);
% -> MATRIZ T
T01 = A1
%---------------------------------------------------------------------
-%
% 3. CALCULO DE LOS JACOBIANOS
%---------------------------------------------------------------------
-%
% 3.1. DEFINICION DE ALGUNOS PARAMETROS
% -> Origenes de coordenadas
34
p0 = [0;0;0];
p1 = T01(1:3,4)
% -> Vectores unitarios "z"
z0 = [0;0;1];
z1 = T01(1:3,3);
% 3.2. CALCULO DE LAS COORDENADAS DE LOS C.M
% -> Del eslabon 1
pCM1 = [0; -Lcm1y; Lcm1z; 1];
pCM1 = T01*pCM1;
pCM1 = simplify( pCM1(1:3) );
disp('pCM1')
disp(pCM1)
% -> Del eslabon 2
pCM2 = [Lcm2x; 0; -Lcm2z; 1];
pCM2 = T02*pCM2;
pCM2 = simplify( pCM2(1:3) );
disp('pCM2')
disp(pCM2)
% 3.3. CALCULO DE LOS JACOBIANOS PARA EL ESLABON 1
% -> Calculo de "Jv"
Jvc1 = [ cross(z0, (pCM1-p0)) zeros(3,1) ]
% -> Calculo de "Jw"
Jw1 = [ z0 zeros(3,1) ]
% 3.4. CALCULO DE LOS JACOBIANOS PARA EL ESLABON 2
% -> Calculo de "Jv"
Jvc2 = [ cross(z0, (pCM2-p0)) cross(z1, (pCM2-p1)) ]
% -> Calculo de "Jw"
Jw2 = [ z0 z1 ]
% 3.5. CALCULO DE LOS JACOBIANOS DE LOS MOTORES
pM1 = [0; 0; -Lm1];
pM2 = [0; 0; -Lm2; 1];
pM2 = simplify(T01*pM2);
pM2 = pM2(1:3);
Jvm1 = [ cross(z0, (pM1-p0)) zeros(3,1) ]
Jwm1 = [ z0*Kr1 zeros(3,1) ]
Jvm2 = [ cross(z0, (pM2-p0)) cross(z1, (pM2-p1)) ]
Jwm2 = [ z0 z1*Kr2 ]
%---------------------------------------------------------------------
-%
% 4. CALCULO DE LA MATRIZ DE INERCIA - COMPONENTE TRANSLACIONAL
%---------------------------------------------------------------------
-%
% 4.1. ESLABON "1"
D1v = m1*transpose(Jvc1)*Jvc1;
D1v = simplify(D1v);
% 4.2. ESLABON "2"
D2v = m2*transpose(Jvc2)*Jvc2;
D2v = simplify(D2v);
% 4.3. MOTOR "1"
Dm1v = mm1*transpose(Jvm1)*Jvm1;
Dm1v = simplify(Dm1v);
% 4.4. MOTOR "2"
Dm2v = mm2*transpose(Jvm2)*Jvm2;
Dm2v = simplify(Dm2v);
%---------------------------------------------------------------------
-%
% 5. CALCULO DE LA MATRIZ DE INERCIA (COMPONENTE ROTACIONAL)
%---------------------------------------------------------------------
-%
% 5.1. ESLABON "1"
% -> Tensor de inercia en el centro de masa
35
I1 = [Ixx1 0 0;0 Iyy1 Iyz1; 0 Iyz1 Izz1];
% -> Tensor de inercia en el sistema inercial
R1 = T01(1:3, 1:3);
II1 = R1*I1*transpose(R1);
II1 = simplify(II1);
% -> Componente "D"
D1w = transpose(Jw1)*II1*Jw1;
D1w = simplify(D1w);
% 5.2. ESLABON "2"
% -> Tensor de inercia en el centro de masa
I2 = [Ixx2 0 Ixz2;0 Iyy2 0; Ixz2 0 Izz2];
% -> Tensor de inercia en el sistema inercial
R2 = T02(1:3, 1:3);
II2 = R2*I2*transpose(R2);
% -> Componente "D"
D2w = transpose(Jw2)*II2*Jw2;
D2w = simplify(D2w);
% 5.3. MOTORES
% -> Tensor de inercia en el centro de masa
Im1 = [Imxx1 0 0; 0 Imyy1 0; 0 0 Imzz1];
Im2 = [Imxx2 0 0; 0 Imyy2 0; 0 0 Imzz2];
IIm1 = simplify(R1*Im1*transpose(R1));
IIm2 = simplify(R2*Im2*transpose(R2));
Dwm1 = transpose(Jwm1)*IIm1*Jwm1;
Dwm1 = simplify(Dwm1);
Dwm2 = transpose(Jwm2)*IIm2*Jwm2;
Dwm2 = simplify(Dwm2);
%---------------------------------------------------------------------
-%
% 6. CALCULO DE LA MATRIZ "D"
%---------------------------------------------------------------------
-%
% 6.1. SUMA DE LOS TERMINOS HALLADOS ANTERIORMENTE
D = D1v + D2v + D1w + D2w + Dm1v + Dm2v + Dwm1 + Dwm2;
D = simplify(D);
% 6.2. MENSAJES
disp('**********')
disp(' MATRIZ D ')
disp('**********')
for i=1:n
for j=1:n
fprintf('D%d%d: \n', i, j)
pretty( D(i,j))
end
end
%---------------------------------------------------------------------
-%
% 7. CALCULO DE LA MATRIZ "C"
%---------------------------------------------------------------------
-%
% 7.1. CALCULO DE LOS TERMINOS "Cijk"
cijk = cell(n,n,n);
for i=1:n
for j=1:n
for k=1:n
% Terminos individuales
term_01 = diff(D(k,j), q(i));
term_02 = diff(D(k,i), q(j));
term_03 = diff(D(i,j), q(k));
% Suma total
36
cijk{i,j,k} = 1/2*( term_01 + term_02 - term_03);
end
end
end
% cijk{1,1,2} es igual a c112 ???
% 7.2. MATRIZ "C"
disp('**********')
disp(' MATRIZ C ')
disp('**********')
C = cell(n,n);
for k=1:n
for j=1:n
% Calculo de "ckj"
sum = 0;
for i=1:n
sum = sum + cijk{i,j,k}*dq(i);
end
C{k,j} = simplify(sum);
% Mensajes
fprintf('C%d%d:\n', k, j)
pretty( C{k,j} )
end
end
%---------------------------------------------------------------------
-%
% 8. CALCULO DE LA MATRIZ "g"
%---------------------------------------------------------------------
-%
% 8.1.CALCULO DE LA ENERGIA POTENCIAL
P1 = m1*g*(L1-Lcm1z)
P2 = m2*g*(L1+Lcm2x*sin(q2))
P1M= mm1*[0;0;g].'*pM1
P2M= mm2*[0;0;g].'*pM2
P = P1 + P2 +P1M+P2M
% 8.2. HALLAMOS "gi"
disp('**********')
disp(' MATRIZ g ')
disp('**********')
for i=1:n
a = diff(P, q(i));
a = simplify(a);
% Mensajes
fprintf('g%d: \n', i)
pretty(a)
end
37
6.6.2. RESULTADOS:
MOTOR 1 MOTOR 2
MATRIZ D
38
MATRIZ C
MATRIZ g
Curso: 39
Análisis y Control de Robots (MT - 517)
8. OBTENCIÓN DEL MODELO DINÁMICO DE UN MOTOR DC
8.1. Obtención de parámetros
Con este método obtendremos el modelo dinámico de un motor dc aplicando solamente
leyes físicas.
Tabla 1. Parámetros de un motor DC
𝑅𝑎 Resistencia de armadura Ω
𝐿𝑎 Inductancia de armadura 𝐻
𝑁∙𝑚∙𝑠
𝐵 Coeficiente de fricción viscosa
𝑟𝑎𝑑
𝑁∙𝑚
𝐾𝑡 Constante de torque
𝐴
𝑉∙𝑠
𝐾𝑏 Constante electromotriz
𝑟𝑎𝑑
𝐸𝑔 = 𝑤𝑟𝑜𝑡𝑜𝑟 ∙ 𝐾𝑏 ⋯ (1)
También:
40
𝑉 − 𝑉𝑅 − 𝑉𝐿 − 𝐸𝑔 = 0
𝑑𝑖 ⋯ (2)
𝑉 − 𝑅𝑎 ∙ 𝑖 − 𝐿𝑎 ∙ − 𝑤𝑟𝑜𝑡𝑜𝑟 ∙ 𝐾𝑏 = 0
𝑑𝑡
Si despreciamos 𝐿 (por ser casi siempre pequeño comparado con los demás valores):
𝑉 − 𝑅𝑎 ∙ 𝑖 − 𝑤𝑟𝑜𝑡𝑜𝑟 ∙ 𝐾𝑏 = 0
Si bloqueamos el roto (𝑤𝑟𝑜𝑡𝑜𝑟 = 0):
𝑉 − 𝑅𝑎 ∙ 𝑖 = 0
𝑉 ⋯ (3)
𝑅𝑎 =
𝑖
También:
𝑤𝑟𝑜𝑡𝑜𝑟 ∙ 𝐾𝑏 = 𝑉 − 𝑅𝑎 ∙ 𝑖
𝑉 − 𝑅𝑎 ∙ 𝑖 ⋯ (4)
𝐾𝑏 =
𝑤𝑟𝑜𝑡𝑜𝑟
8.1.2. Análisis mecánico
Analizaremos en un primer momento la potencia del motor DC, que debería ser la misma
en la entrada como en la salida.
𝐸𝑔 = 𝐾𝑏 ∙ 𝑤𝑟𝑜𝑡𝑜𝑟
𝑇𝑚 = 𝐾𝑡 ∙ 𝑖
𝑃𝑜𝑡𝑒𝑛𝑡𝑟𝑎𝑑𝑎,𝑓𝑒𝑚 = 𝐸𝑔 ∙ 𝑖 = 𝑇𝑚 ∙ 𝑤𝑟𝑜𝑡𝑜𝑟 = 𝑃𝑜𝑡𝑠𝑎𝑙𝑖𝑑𝑎
Luego:
𝐾𝑡 = 𝐾𝑏 ⋯ (5)
Cuando se analiza el motor sin carga tendremos:
𝑑𝑤𝑟𝑜𝑡𝑜𝑟
𝑇𝑚 = 𝐽 ∙ + 𝐵 ∙ 𝑤𝑟𝑜𝑡𝑜𝑟
𝑑𝑡
𝑑𝑤𝑟𝑜𝑡𝑜𝑟
𝐾𝑡 ∙ 𝑖 = 𝐽 ∙ + 𝐵 ∙ 𝑤𝑟𝑜𝑡𝑜𝑟
𝑑𝑡
Ahora, si consideramos que el sistema se encuentra en un punto estacionario (𝑤̇ = 0):
𝐾𝑡 ∙ 𝑖 − 𝐵 ∙ 𝑤𝑟𝑜𝑡𝑜𝑟 = 0
𝐾𝑡 ∙ 𝑖 ⋯ (6)
𝐵=
𝑤𝑟𝑜𝑡𝑜𝑟
41
𝐾𝑡 ∙ 𝐾𝑏 ⋯ (7)
𝐽= ∙ 𝑡𝑚
𝑅𝑎
Hay diferentes definiciones del tiempo de subida, pero la que use usará es la siguiente:
“El tiempo de subida es el tiempo que le toma al sistema para llegar del 10% al 90% de
su valor final”.
8.2. Realización del experimento
8.2.1. Cálculo de la resistencia de armadura (𝑹𝒂 )
42
Figura 2. Motor DC de 6V
MOTOR PEQUEÑO
1
0.9
0.8 y = 0.0119x + 0.056
0.7 R² = 0.987
Voltaje (V)
0.6
0.5
0.4
0.3
0.2
0.1
0
0 10 20 30 40 50 60 70 80
Corriente I (mA)
43
Tabla 4. Parámetros medidos y calculados para el cálculo de la constante
Valores medidos Valores calculados
𝑽 (𝑽) 𝑰 (𝒎𝑨) 𝒇 (𝑯𝒛) 𝒘𝒓𝒐𝒕𝒐𝒓 (𝒓𝒂𝒅/𝒔) 𝑬𝒈 (𝑽)
3.82 75.8 694 436.0530603 2.91798
4.037 77.1 741 465.5840313 3.11951
4.355 79.2 798 501.3981875 3.41252
4.664 80 867 544.7521661 3.712
4.996 81.3 946 594.3893301 4.02853
5.2 81.6 1000 628.3185307 4.22896
5.295 82.3 1030 647.1680866 4.31563
5.405 82.3 1055 662.8760499 4.42563
5.568 83.4 1091 685.495517 4.57554
5.755 83.8 1115 700.5751618 4.75778
𝐾𝑏 = 𝐾𝑡 = 0.0073
MOTOR PEQUEÑO
5
4.5 y = 0.0073x + 0.0356
4 R² = 0.997
3.5
3
Eg (V)
2.5
2
1.5
1
0.5
0
0 100 200 300 400 500 600 700
w_rotor (rad/s)
Figura 4. Voltaje electromotriz vs. Velocidad angular del rotor – Prueba Kb, Kt
44
𝑁∙𝑚∙𝑠
𝐵 = 2.03 ∙ 10−7
𝑟𝑎𝑑
MOTOR PEQUEÑO
0.00057
0.00053
0.00052
0.00051
0.0005
0 100 200 300 400 500 600 700 800
w_rotor (rad/s)
45
Figura 6. Motor DC de 12V
MOTOR GRANDE
1
0.9
y = 0.0158x + 0.0025
0.8
R² = 1
0.7
Voltaje (V)
0.6
0.5
0.4
0.3
0.2
0.1
0
0 10 20 30 40 50 60
Corriente I (mA)
46
7.11 79.8 948 541.4963337 5.84916
7.55 82 1027 586.6210282 6.2544
8.54 86.4 1168 667.1600399 7.17488
9.52 90 1314 750.5550449 8.098
10.62 94.6 1480 845.3740231 9.12532
11.21 95.4 1574 899.0666976 9.70268
12 95.2 1694 967.6105373 10.49584
𝐾𝑏 = 𝐾𝑡 = 0.0107
MOTOR GRANDE
12
10
y = 0.0107x + 0.0531
8 R² = 0.9996
Eg (V)
0
0 200 400 600 800 1000 1200
w_rotor (rad/s)
Figura 4. Voltaje electromotriz vs. Velocidad angular del rotor – Prueba Kb, Kt
47
MOTOR GRANDE
0.0012
y = 6E-07x + 0.0005
0.001 R² = 0.9682
0.0008
Kb.I
0.0006
0.0004
0.0002
0
0 200 400 600 800 1000 1200
w_rotor (rad/s)
48
Figura 6. Diagrama de bloques de la estructura ARX
Para la realización de la prueba usamos los siguientes materiales:
DAQ 6002
Arduino UNO
Puente H – L298N
Circuito conversor frecuencia – voltaje (LM331)
Fuente de voltaje
Multímetro
9.1.1. Explicación del funcionamiento
El DAQ se encargará de generar de una señal en forma de pulso de 0 – 5V como la
mostrada en la figura, esta señal activará el puente H para que el motor empieza a girar
a su tensión nominal y la frecuencia generada en el encoder por uno de sus canales es
leída en forma de voltaje (haciendo uso del conversor, calibrado previamente para que
arroje un máximo de 5V) por el DAQ… así mismo la misma señal generada es leída por
el encoder en otro de sus pines.
El esquema resumido para obtener los datos es el mostrado en la figura 7.
49
635 2.41 2.912
528 2.01 2.45
397 1.51 1.872
297 1.131 1.43
135 0.47 0.7
0 0 0.1
MOTOR PEQUEÑO
1600
1400 y = 263.7036226002x + 1.1082227963
1200 R² = 0.9999232886
Frecuencia (Hz)
1000
800
600
400
200
0
0 1 2 3 4 5 6
Voltaje (V)
50
MOTOR GRANDE
2000
1800 y = 361.1253903099x + 1.813621677
Frecuencia (Hz) 1600 R² = 0.9996472431
1400
1200
1000
800
600
400
200
0
0 1 2 3 4 5 6
Voltaje (V)
Programación en LabView
51
Figura 11. Diagrama de bloques del programa
void setup() {
// put your setup code here, to run once:
TCCR1A = 0x00; // Setea timer modo de genera PWM
TCCR1B = 0x12; // Preescaler N = 8
ICR1 = 50; // Valor máximo de analogWrite
TIMSK1 = 0; // Deshabilita cualquier interrupción
pinMode(9, OUTPUT);
Serial.begin(9600);
}
void loop() {
// put your main code here, to run repeatedly:
temp = analogRead(input_pot);
temp1 = map(temp, 0, 1023, 0, 50);
analogWrite(output_pwm, temp1);
Serial.print(temp);
Serial.print(" - ");
Serial.println(temp1);
}
52
% Adquisicion Continous Sample
load DatosMotorPequeno2.lvm; % Ingresar data adquirida xxxx
t=DatosMotorPequeno2(:,1);
u=DatosMotorPequeno2(:,2);
y=DatosMotorPequeno2(:,4)/341.2;
%Ploteo de la data
subplot(2,1,1),plot(t,u,'r'), grid on; title('Señal generada');
xlabel('Tiempo [seg]'), ylabel('Voltaje [V]'), axis([0 14.4 -inf
inf]);
subplot(2,1,2),plot(t,y,'b'), grid on, title('Respuesta del motor
pequeño');
xlabel('Tiempo [seg]'), ylabel('W [rad/s]');
axis([0 max(t) min(y) max(y)+10])
%Identificacion ARX
fs=1000;
T=1/fs;
data=iddata(y,u,T);
th=arx(data,[1 1 1]);
Gpd=tf(th.b,th.a,T); % F.T. en T.D.
Gpc=d2c(Gpd); % F.T. en T.C.
disp('Planta Identificada en continuo')
[nc,dc]=tfdata(Gpc,'v');
Gpc
53
Figura 12. Señal generada y respuesta del motor pequeño adquiridos por el DAQ
Y la planta es:
9.2.2. Motor 2
Los datos obtenidos se muestran a continuación.
54
Figura 13. Señal generada y respuesta del motor grande adquiridos por el DAQ
Y la planta es:
Motor 1 (pequeño)
Usando el método físico (medición de parámetros) obtuvimos:
𝑤(𝑠) 𝟒. 𝟗𝟐
=
𝑉(𝑠) 𝟎. 𝟐𝟏𝟓 ∙ 𝒔 + 𝟏
Y mediante adquisición de datos:
𝑤(𝑠) 𝟐𝟓. 𝟓𝟐
=
𝑉(𝑠) 𝒔 + 𝟓. 𝟎𝟕𝟓
55
Figura 14. Respuesta ante un step para el motor pequeño
Motor 2 (grande)
Usando el método físico (medición de parámetros) obtuvimos:
𝑤(𝑠) 𝟐. 𝟏𝟖
=
𝑉(𝑠) 𝟎. 𝟑𝟎 ∙ 𝒔 + 𝟏
Y mediante adquisición de datos:
𝑤(𝑠) 𝟗. 𝟗𝟓𝟐
=
𝑉(𝑠) 𝒔 + 𝟒. 𝟑𝟏𝟏
56
Figura 15. Respuesta ante un step para el motor grande
Las diferencias se dieron por diversas razones:
Arduino UNO
57
Figura 16. Arduino UNO
Puente H L298N
58
Figura 19. Esquema de conexión para la implementación del circuito
#define EncoderB 3
void setup() {
// put your setup code here, to run once:
attachInterrupt(0, PosicionMotor, RISING);
pinMode(EncoderB, INPUT);
Serial.begin(9600);
//Serial.println(0);
}
void loop() {
// put your main code here, to run repeatedly:
if ((millis() - t) > 500){
Serial.print((float)cont*360.0/375.0);
Serial.print(" ");
Serial.println(rpm, 6);
t = millis();
}
if (rpm < 10 || rpm > 210){
rpm = 0;
}
59
}
void PosicionMotor(){
//cont++;
//t_actual = millis();
rpm = angulo/(micros() - t_pasado)*1000000.0*60.0;
t_pasado = micros();
if (digitalRead(3)){
cont--;
}
else{
cont++;
}
if (cont == PPR || cont == -PPR){
cont = 0;
}
//Serial.println(cont);
//t_pasado = millis();
}
60
float cia = 0.0; // Anterior ci
float e = 0.0; // Error
float u = 0.0; // Señal del controlador
const float dt = 10.0;
float g = 0, l = 3;
pinMode(IN1, OUTPUT);
pinMode(IN2, OUTPUT);
digitalWrite(IN1, LOW);
digitalWrite(IN2, LOW);
pinMode(IN3, OUTPUT);
pinMode(IN4, OUTPUT);
digitalWrite(IN3, LOW);
digitalWrite(IN4, LOW);
}
// ---------------------------------------- //
61
MandarPWM2();
}
// ----------------------------------------- //
62
cp = kp * e;
cd = kd * (e - ea) / dt * 1000.0;
ci = cia + ki * e * dt / 1000.0;
ea = e;
cia = ci;
g = 9.81*cos(cont*360/PPR*PI/180)*l*18.51*0.01275;
u = cp + cd + ci + g;
if (u > PPR/2){
u = PPR/2;
}
if (u < -PPR/2){
u = -PPR/2;
}
u = u*dt/PPR*2;
/*if (cont > (POSICION - 1) && cont < (POSICION + 1)){
u = 0.0, cia = 0;
}
//MandarPWM();*/
}
// --------------------------------------- //
63
}
}
else{
digitalWrite(IN1, LOW);
//digitalWrite(IN2, LOW);
if((millis() - t) < -u){
digitalWrite(IN2, HIGH);
}
else{
digitalWrite(IN2, LOW);
}
}
}
// ------------------------------------- //
13. BIBLIOGRAFÍA
64