You are on page 1of 7

30/11/13

Arduino + Matlab/Simulink: controlador PID

We choose the Moon
Ingeniería aplicada incluso a cosas a las que probablemente no debería 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 García Tíscar Jueves, 21 de julio de 2011 Nuestro principal proyecto con Arduino! En este caso, empleando el sistema de comunicación serie, vamos a programar un controlador PID (un controlador que actúa proporcionalmente al valor del error, al de su derivada, y al de su integral) en Simulink, el programa de dibujar esquemas más caro de la historia. El objetivo es controlar la posición de un sistema muy simple (podría ser llamado “helicóptero de un grado de libertad” por alguien extremadamente idealista y “balancín a hélice” por alguien que lo fuera menos) y gradualmente ir complicado el sistema.

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

1/18

que devuelve un voltaje entre 0V y 5V. Nos falta pues un bucle de control (que programaremos en Simulink).30/11/13 Arduino + Matlab/Simulink: controlador PID Como se observa. unido a una hélice que proporciona más o menos sustentación en función del voltaje suministrado al motor. En la articulación del eje hay un potenciómetro solidario a él. una variable de entrada y una interfaz física. Interfaz física: Arduino + circuito de potencia PWM wechoosethemoon. en función del ángulo . se trata de un brazo articulado con un motor en un extremo.es/2011/07/21/arduino-matlab-simulink-controlador-pid/ 2/18 . El esquema del sistema de control es el siguiente: De esta manera tenemos definida la variable de salida (posición del eje: voltaje transmitido por el potenciómetro) y la variable de control (sustentación de la hélice: voltaje proporcionado al motor).

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. b y t ep i n O u t=1 0 . el código del Arduino debe ser capaz de (1) leer del potenciómetro.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. Arduino: lectura y escritura de variables físicas En primer lugar. El microcontrolador enviará a la puerta del transistor una señal PWM. b y t ei n=0 . La representación de este montaje será la siguente: Esta es toda la parte física del problema: la planta que vamos a controlar.es/2011/07/21/arduino-matlab-simulink-controlador-pid/ . que mapeamos a 0 y 255 para poder enviarlo como un solo bit unsigned. A continuación la parte de código. (3) recibir el dato de potencia necesaria al motor y (4) escribir dicho dato en la salida analógica como señal PWM. la variable de control (potencia al motor) y el montaje que hemos realizado con el Arduino. la variable de salida (ángulo del eje). por lo que emplearemos un circuito de potencia consistente en un transistor MOSFET. y por tanto esta misma señal PWM pero de potencia será la que reciba el motor. 1 2 3 4 5 6 i n to u t=0 . Hay que tener en cuenta que el conversor devuelve un valor entre 0 y 1024. tanto de Arduino como de Simulink/Matlab. (2) enviarlo como dato a través del puerto serie.

/ /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 .9. y. con otros parámetros del PID sin optimizar todavía): wechoosethemoon. Después debe enviarla a través del puerto serie en formato uint8.2 5 5 ) . } / /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 ) . determinar la señal de control (potencia al motor) necesaria. / /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 .1 0 2 3 . a v a i l a b l e ( ) ) { i n=S e r i a l . D = 0. mediante un controlador PID. / /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 .es/2011/07/21/arduino-matlab-simulink-controlador-pid/ 4/18 .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 .26 . nuestro programa de Simulink debe recibir este dato de a través del puerto serie.0 . pero las operaciones se hacen en formato double. de ahí los conversores. r e a d ( ) . 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 ) . A continuación. Las ganancias son de valor 5/1024 para pasar la señal a voltios reales. siendo los últimos que hemos empleado P = 0. que toma valores entre 0 y 255. I y D. compararlo con una referencia que controlaremos nosotros con un slider en la propia interfaz gráfica de Simulink.04 y una discretización de 10 ms.O U T P U T ) . I = 0. un vídeo de todo el sistema en funcionamiento (esta es una de las primeras pruebas. b e g i n ( 9 6 0 0 ) . / /e n v i a re nb a s e1 0e nA S C I I S e r i a l .i n ) . ideales para la función analogWrite() de Arduino (click para ampliar): Dentro del bloque PID. / /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 . Otro dato a tener en cuenta es que la transmisión serie se hace en formato uint8. se pueden editar los parámetros P.0 . unsigned integer de 8 bits. w r i t e ( o u t ) . } Simulink: referencia y bucle de control Por otra parte.

Incluso.30/11/13 Arduino + Matlab/Simulink: controlador PID Se puede observar cómo mediante el slider ajustamos la referencia (señal lila).es/2011/07/21/arduino-matlab-simulink-controlador-pid/ . l e n g t h ( r e f _ o u t ) ) . ajustando la señal de potencia entregada al motor (señal azul) va ajustando el ángulo del eje hasta conseguir que el voltaje del potenciómetro (señal amarilla) coincida con la referencia que le hemos indicado. x=l i n s p a c e ( 0 . a pesar de estar en una primera fase de pruebas. exportación a Excel… en este caso. 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 ( : ) . Esto nos permite. a posteriori. nos contentamos con emplear la genial función externa savefigure() para obtener un gráfico 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 ' . El sistema. l e n g t h ( r e f _ o u t ) . a x i s ( [ 0l e n g t h ( r e f _ o u t )05 . sino que además se guardan en el espacio de trabajo de Matlab. Matlab: postproceso de los datos recogidos Si nos fijamos en el programa de Simulink anterior. se observa que es capaz de resistir a Salva perturbaciones. ' C a p t u r a ' ) . se puede observar que no sólo se presentan en el visor las tres señales. p i d _ o u t=p i d _ 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. procesar los resultados del proceso de control como queramos: identificación de sistemas.

PWM. ' R e f e r e n c i a ' . 2 ) p l o t ( x . 6 . r e f _ o u t . ' d p d f ' ) Ejecutando este código tras haber realizado una prueba del sistema. ' p o ' . ' B e s t ' ) . Gracias. p o s _ o u t . 1Ingeniero dijo a las 4:45 del 17/08/2011: Interesante. but because it’s hard! ¿Compartes? Facebook Twitter 1 Google Tumblr Pinterest Categoría: Cosas "útiles". 6 . p i d _ o u t . MOSFET. cosa que esperamos corregir en futuras versiones.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 . wechoosethemoon. 2 ) l e g e n d ( ' C o n t r o l ' . hemos obtenido el siguiente gráfico. El siguiente desarrollo programado es realizar un control con dos grados de libertad en lugar de uno… not because it’s easy. ' L i n e W i d t h ' . ' L o c a t i o n ' . [ 0 . % %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 ' . 53 ] . 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 más potente que el inicial y que el sistema presenta todavía una sobreoscilación (overshoot ) en la señal de salida (en rojo) cuando la señal de referencia (en verde) presenta una subida escalón. Simulink | Comentarios: 70 Comentarios » 70 Comentarios on “Arduino + Matlab/Simulink: controlador PID” 1. ' L i n e W i d t h ' . ' C o l o r ' . ' s ' . 0 .es/2011/07/21/arduino-matlab-simulink-controlador-pid/ 6/18 . [ 4 . 0 . PID. me podria enviar el codigo de simulink que utilizaron. 6 ] . que a pesar de ser originalmente un gráfico vectorial PDF. Gráficos. ' P o s i c i ó n ' . x . Engineer-It-Yourself | Etiquetas: Arduino. Serie. MATLAB.

señal 2. 7Jorge García Tíscar dijo a las 19:29 del 23/09/2011: Hola Cristian! Pues nosotros ahora mismo tenemos el proyecto un poco abandonado. 3wilker dijo a las 6:06 del 25/08/2011: Gracias . Colgaremos cualquier avance! Y si lo consigues. A ver si me ayudan por favor! 7. probablemente tengas que ajustar los parámetros del PID a tu planta en concreto! 3. 8Diego dijo a las 0:05 del 12/10/2011: Gracias por tu aporte jorge. voy a intentar reproducirlo y espero hacerte varias preguntas …… saludos 5. un switch-case o similar las entiendan como señal 1. y que al recibirlo.30/11/13 Arduino + Matlab/Simulink: controlador PID 2.es/2011/07/21/arduino-matlab-simulink-controlador-pid/ 7/18 . te recomiendo tambien la libreria de arduino que hay en matlab. voy a probarlo. 9adelrio dijo a las 23:26 del 01/11/2011: wechoosethemoon. Wilker MG-Brasil 4. 6Cristian dijo a las 22:42 del 22/09/2011: Hola! Excelente idea. porque hemos empezado el curso académico y tenemos poco tiempo libre… pero la idea que tenemos es usar algún tipo de “protocolo” que Arduino y Simulink puedan discriminar. del estilo “S1″ “300″ “S2″ “400″. No tengo idea como hacerlo ya que sólo veo que funciona con una salida y una entrada. yo tengo un proyecto similar pero necesito procesar 3 señales provenientes desde el arduino en el simulink y luego a traves de mi bucle de control. 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. Un saludo. generar 2 señales que se envian al arduino. 6. Jorge te felicito. un abrazo desde colombia!!! 9. etc. avísanos! =) 8. está aquí. 4Esteban Pioquinto dijo a las 0:34 del 19/09/2011: Magnifico trabajo. 2Jorge dijo a las 4:51 del 17/08/2011: Claro. 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 solución gracias.