Está en la página 1de 5

Arduino + Matlab/Simulink: controlador PID

Jorge Garca Tscar


Jueves, 21 de julio de 2011
Nuestro principal proyecto 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.

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.

Interfaz fsica: Arduino + circuito de potencia PWM

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:

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.

Arduino: lectura y escritura de variables fsicas


En primer lugar, el cdigo del Arduino debe ser capaz de (1) leer

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.
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

// 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);
}

Simulink: referencia y bucle de control


Por otra parte, nuestro programa de Simulink debe recibir este dato de
serie, compararlo con una referencia

a travs del puerto

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 (click para ampliar):

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

son de valor 5/1024 para pasar la

seal a voltios reales.


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
hasta conseguir que el voltaje del potencimetro

del eje

(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 Salva perturbaciones.

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
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!