You are on page 1of 7

30/11/13

Arduino + Matlab/Simulink: controlador PID

We choose the Moon


Ingeniera aplicada incluso a cosas a las que probablemente no debera aplicarse.
Acerca de Bio El equipo

Engineers like to solve problems. If there are no problems handily available, they will create their own problems.
~ Scott Adams

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.

wechoosethemoon.es/2011/07/21/arduino-matlab-simulink-controlador-pid/

1/18

30/11/13

Arduino + Matlab/Simulink: controlador PID

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

wechoosethemoon.es/2011/07/21/arduino-matlab-simulink-controlador-pid/

2/18

30/11/13

Arduino + Matlab/Simulink: controlador PID

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. 1 2 3 4 5 6 i n to u t=0 ; b y t ei n=0 ; b y t ep i n O u t=1 0 ; v o i ds e t u p ( ){ / /i n i c i a l i z a rp u e r t os e r i e
3/18

wechoosethemoon.es/2011/07/21/arduino-matlab-simulink-controlador-pid/

30/11/13

Arduino + Matlab/Simulink: controlador PID

7 8 9 1 0 1 1 1 2 1 3 1 4 1 5 1 6 1 7 1 8 1 9 2 0 2 1 2 2 2 3 2 4 2 5 2 6 2 7

S e r i a l . b e g i n ( 9 6 0 0 ) ; / /p r e p a r a ro u t p u t p i n M o d e ( p i n O u t ,O U T P U T ) ;

v o i dl o o p ( ){ / /l e e rd e lp i nA 0c o m o o u t=a n a l o g R e a d ( A 0 ) ; / /e s c a l a rp a r ao b t e n e rf o r m a t ou i n t 8 o u t=m a p ( o u t ,0 ,1 0 2 3 ,0 ,2 5 5 ) ; / /e n v i a re nb a s e1 0e nA S C I I S e r i a l . w r i t e ( o u t ) ; / /l e e rd e ls e r i es ih a yd a t o s i f ( S e r i a l . a v a i l a b l e ( ) ) { i n=S e r i a l . r e a d ( ) ; / /e s c r i b i re ne lp i n1 0 a n a l o g W r i t e ( p i n O u t ,i n ) ; } / /e s p e r a rp a r ae s t a b i l i z a re lc o n v e r s o r d e l a y ( 2 0 ) ; }

Simulink: referencia y bucle de control


Por otra parte, nuestro programa de Simulink debe recibir este dato de a travs del puerto serie, compararlo con una referencia 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):

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 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):

wechoosethemoon.es/2011/07/21/arduino-matlab-simulink-controlador-pid/

4/18

30/11/13

Arduino + Matlab/Simulink: controlador PID

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 del eje hasta conseguir que el voltaje del potencimetro (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 1 0 1 1 1 2 1 3 1 4 1 5 1 6 % %P r e p a r a rl af i g u r a f=f i g u r e ( ' N a m e ' , ' C a p t u r a ' ) ; a x i s ( [ 0l e n g t h ( r e f _ o u t )05 . 1 ] ) g r i do n x l a b e l ( ' M e d i d a( ) ' ) y l a b e l ( ' V o l t a j e( V ) ' ) t i t l e ( ' C a p t u r ad ev o l t a j ee nt i e m p or e a lc o nA r d u i n o ' ) h o l da l l % %T r a t a m i e n t o p o s _ o u t=p o s _ o u t ( : ) ; p i d _ o u t=p i d _ o u t ( : ) ; x=l i n s p a c e ( 0 , l e n g t h ( r e f _ o u t ) , l e n g t h ( r e f _ o u t ) ) ; % %L i m p i a rf i g u r ayd i b u j a r c l a
5/18

wechoosethemoon.es/2011/07/21/arduino-matlab-simulink-controlador-pid/

30/11/13

Arduino + Matlab/Simulink: controlador PID

1 7 1 8 1 9 2 0 2 1 2 2

p l o t ( x , p i d _ o u t , ' C o l o r ' , [ 0 . 6 , 0 . 6 , 0 . 6 ] , ' L i n e W i d t h ' , 2 ) p l o t ( x , r e f _ o u t , x , p o s _ o u t , ' L i n e W i d t h ' , 2 ) l e g e n d ( ' C o n t r o l ' , ' R e f e r e n c i a ' , ' P o s i c i n ' , ' L o c a t i o n ' , ' B e s t ' ) ; % %S a l v a re lg r f i c o s a v e f i g u r e ( ' r e s u l t a d o ' , ' s ' , [ 4 . 53 ] , ' p o ' , ' d p d f ' )

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!
Compartes? Facebook Twitter 1 Google Tumblr Pinterest

Categora: Cosas "tiles", Engineer-It-Yourself | Etiquetas: Arduino, Grficos, MATLAB, MOSFET, PID, PWM, Serie, Simulink | Comentarios: 70 Comentarios

70 Comentarios on Arduino + Matlab/Simulink: controlador PID


1. 1Ingeniero dijo a las 4:45 del 17/08/2011: Interesante, me podria enviar el codigo de simulink que utilizaron. Gracias.
wechoosethemoon.es/2011/07/21/arduino-matlab-simulink-controlador-pid/ 6/18

30/11/13

Arduino + Matlab/Simulink: controlador PID

2. 2Jorge dijo a las 4:51 del 17/08/2011: Claro, est aqu; probablemente tengas que ajustar los parmetros del PID a tu planta en concreto! 3. 3wilker dijo a las 6:06 del 25/08/2011: Gracias . Yo estaba tratando de hacer la interfaz entre Matlab/Simulink y Arduino Mega 2560 de destino y no tuvo xito. Creo que voy a obtener de esta manera la solucin gracias; Wilker MG-Brasil 4. 4Esteban Pioquinto dijo a las 0:34 del 19/09/2011: Magnifico trabajo, Jorge te felicito. voy a intentar reproducirlo y espero hacerte varias preguntas saludos 5. 5Jose dijo a las 22:42 del 19/09/2011: Me parece una idea bastante buena para reproducir en laboratorios de bajo coste o para la uned, voy a probarlo, te recomiendo tambien la libreria de arduino que hay en matlab. Un saludo. 6. 6Cristian dijo a las 22:42 del 22/09/2011: Hola! Excelente idea, yo tengo un proyecto similar pero necesito procesar 3 seales provenientes desde el arduino en el simulink y luego a traves de mi bucle de control, generar 2 seales que se envian al arduino. No tengo idea como hacerlo ya que slo veo que funciona con una salida y una entrada. A ver si me ayudan por favor! 7. 7Jorge Garca Tscar dijo a las 19:29 del 23/09/2011: Hola Cristian! Pues nosotros ahora mismo tenemos el proyecto un poco abandonado, porque hemos empezado el curso acadmico y tenemos poco tiempo libre pero la idea que tenemos es usar algn tipo de protocolo que Arduino y Simulink puedan discriminar, del estilo S1 300 S2 400, y que al recibirlo, un switch-case o similar las entiendan como seal 1, seal 2, etc. Colgaremos cualquier avance! Y si lo consigues, avsanos! =) 8. 8Diego dijo a las 0:05 del 12/10/2011: Gracias por tu aporte jorge, un abrazo desde colombia!!! 9. 9adelrio dijo a las 23:26 del 01/11/2011:
wechoosethemoon.es/2011/07/21/arduino-matlab-simulink-controlador-pid/ 7/18

You might also like