Вы находитесь на странице: 1из 8

Arduino +

Matlab/Simulink:
controlador PID
Jorge Garca Tscar| July 21, 2011

uno de nuestros ms divertidos proyectos con Arduino!

En este caso, empleando el sistema de comunicacin serie,


vamos a programar un controlador PID (un controlador que
acta proporcionalmente al valor del error, al de su derivada, y
al de su integral) en Simulink, el programa de dibujar esquemas
ms caro de la historia.
El objetivo es controlar la posicin de un sistema muy simple (podra
ser llamado helicptero de un grado de libertad por alguien
extremadamente idealista y balancn a hlice por alguien que lo fuera
menos) y gradualmente ir complicado el sistema.

Esquema del sistema

1. Introduccin

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 V(\theta)V() entre 0V y 5V, en funcin del
ngulo \theta. 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.

2. Interfaz fsica

Tal y como se explica en una entrada anterior, el Arduino es incapaz


por s mismo de aportar el amperaje que necesita el motor, por lo que
emplearemos un circuito de potencia consistente en un transistor
MOSFET.

El microcontrolador enviar a la puerta del transistor una seal PWM,


y por tanto esta misma seal PWM pero de potencia ser la que reciba
el motor. La representacin de este montaje ser la siguente:

Esquema del montaje fsico

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.

3. Programacin
3.1. Arduino: interfaz I/O
En primer lugar, el cdigo del Arduino debe ser capaz de (1)
leer V(\theta)V() del potencimetro, (2) 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.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27

int out = 0;
byte in = 0;
byte pinOut = 10;
void setup() {
// inicializar puerto serie
Serial.begin(9600);
// preparar output
pinMode(pinOut, OUTPUT);
}
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);
}

3.2. Simulink: bucle de control


Por otra parte, nuestro programa de Simulink debe recibir este dato
de V(\theta)V() a travs del puerto serie, compararlo con una
referencia V_\text{ref}Vref que controlaremos nosotros con
un slider en la propia interfaz grfica de Simulink, y, mediante un
controlador PID, determinar la seal de control (potencia al motor)
necesaria. Despus debe enviarla a travs del puerto serie en formato
uint8, unsigned integer de 8 bits, que toma valores entre 0 y 255,
ideales para la funcin analogWrite() de Arduino:

Diagrama de bloques Simulink

Dentro 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 formato double, de ah los conversores. Las ganancias K son
de valor 5/1024 para pasar la seal a voltios reales.
Nota: este modelo de Simulink se puede descargar aqu.

A continuacin, un vdeo de todo el sistema en funcionamiento (esta es


una de las primeras pruebas, con otros parmetros del PID sin
optimizar todava):
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 \theta del eje hasta
conseguir que el voltaje del potencimetro V(\theta)V() (seal
amarilla) coincida con la referencia que le hemos indicado. Incluso, a
pesar de estar en una primera fase de pruebas, se observa que es capaz
de resistir a Salvaperturbaciones.

3.3. Matlab: postproceso de los datos


recogidos

Si nos fijamos en el programa de Simulink anterior, se puede observar


que no slo se presentan en el visor las tres seales, sino que adems se
guardan en el espacio de trabajo de Matlab. Esto nos permite, a
posteriori, procesar los resultados del proceso de control como
queramos: identificacin de sistemas, exportacin a Excel en este
caso, nos contentamos con emplear la til 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 otro ensayo del sistema,
hemos obtenido el siguiente resultado:

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.

4. Conclusiones
En esta entrada se describe cmo es posible, con un presupuesto muy
reducido, construir montajes que permiten poner en prctica la teora
del control PID. El siguiente desarrollo interesante sera realizar un
control con dos grados de libertad en lugar de uno not because it is
easy, but because it is hard!

Вам также может понравиться