Académique Documents
Professionnel Documents
Culture Documents
Como se observa, se trata de un brazo articulado con un motor en un extremo, unido a una
hlice que proporciona ms o menos sustentacin en funcin del voltaje suministrado al motor.
En la articulacin del eje hay un potencimetro solidario a l, que devuelve un voltaje
entre 0V y 5V, en funcin del ngulo . El esquema del sistema de control es el siguiente:
De esta manera tenemos definida la variable de salida (posicin del eje: voltaje transmitido
por el potencimetro) y la variable de control (sustentacin de la hlice: voltaje
proporcionado al motor). Nos falta pues un bucle de control (que programaremos en
Simulink), una variable de entrada y una interfaz fsica.
Esta es toda la parte fsica del problema: la planta que vamos a controlar, la variable de salida
(ngulo del eje), la variable de control (potencia al motor) y el montaje que hemos realizado con
el Arduino. A continuacin la parte de cdigo, tanto de Arduino como de Simulink/Matlab.
enviarlo como dato a travs del puerto serie, (3) recibir el dato de potencia necesaria al motor y
(4) escribir dicho dato en la salida analgica como seal PWM. Hay que tener en cuenta que el
conversor devuelve un valor entre 0 y 1024, que mapeamos a 0 y 255 para poder enviarlo como
un solo bit unsigned.
int out = 0;
1
byte in = 0;
2
byte pinOut = 10;
3
4
void setup() {
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
void loop() {
// leer del pin A0 como
out = analogRead(A0);
// escalar para obtener formato uint8
out = map(out, 0, 1023, 0, 255);
// enviar en base 10 en ASCII
Serial.write(out);
// leer del serie si hay datos
if(Serial.available()){
in = Serial.read();
// escribir en el pin 10
analogWrite(pinOut, in);
}
// esperar para estabilizar el conversor
delay(20);
}
D
entro del bloque PID, se pueden editar los parmetros P, I y D, siendo los ltimos que hemos
empleado P = 0.26 , I = 0.9, D = 0.04 y una discretizacin de 10 ms. Otro dato a tener en cuenta
es que la transmisin serie se hace en formato uint8, pero las operaciones se hacen en
formatodouble, de ah los conversores. Las ganancias
Se puede observar cmo mediante el slider ajustamos la referencia (seal lila). El sistema,
ajustando la seal de potencia entregada al motor (seal azul) va ajustando el ngulo
hasta conseguir que el voltaje del potencimetro
del eje
referencia que le hemos indicado. Incluso, a pesar de estar en una primera fase de pruebas, se
observa que es capaz de resistir a Salva perturbaciones.
identificacin de sistemas, exportacin a Excel en este caso, nos contentamos con emplear la
genial funcin externa savefigure() para obtener un grfico vectorial PDF:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
%% Preparar la figura
f = figure('Name','Captura');
axis([0 length(ref_out) 0 5.1])
grid on
xlabel('Medida (-)')
ylabel('Voltaje (V)')
title('Captura de voltaje en tiempo real con Arduino')
hold all
%% Tratamiento
pos_out = pos_out(:);
pid_out = pid_out(:);
x = linspace(0,length(ref_out),length(ref_out));
%% Limpiar figura y dibujar
cla
plot(x,pid_out,'Color',[0.6,0.6,0.6],'LineWidth',2)
plot(x,ref_out,x,pos_out,'LineWidth',2)
legend('Control','Referencia','Posicin','Location','Best');
%% Salvar el grfico
savefigure('resultado','s',[4.5 3],'po','-dpdf')
Ejecutando este cdigo tras haber realizado una prueba del sistema, hemos obtenido el siguiente
grfico, que a pesar de ser originalmente un grfico vectorial PDF, hemos rasterizado como
PNG para poder representarlo aqu:
Se
observa
en este caso que el motor requiere mucho menos voltaje (en gris) debido a que se trata de uno
ms potente que el inicial y que el sistema presenta todava una sobreoscilacin ( overshoot)
en la seal de salida (en rojo) cuando la seal de referencia (en verde) presenta una subida
escaln, cosa que esperamos corregir en futuras versiones. El siguiente desarrollo programado
es realizar un control con dos grados de libertad en lugar de uno not because its easy, but
because its hard!