You are on page 1of 16

12/10/2017 Arduino + Matlab/Simulink: controlador PID

WE CHOOSE THE MOON Menu

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

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

https://wechoosethemoon.es/2011/07/21/arduino-matlab-simulink-controlador-pid/ 1/16
12/10/2017 Arduino + Matlab/Simulink: controlador PID

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 () entre 0V y 5V, en funcin del ngulo . El esquema del
sistema de control es el siguiente:

De esta manera tenemos de nida 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.

https://wechoosethemoon.es/2011/07/21/arduino-matlab-simulink-controlador-pid/ 2/16
12/10/2017 Arduino + Matlab/Simulink: controlador PID

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.

https://wechoosethemoon.es/2011/07/21/arduino-matlab-simulink-controlador-pid/ 3/16
12/10/2017 Arduino + Matlab/Simulink: controlador PID

3. Programacin
3.1. Arduino: interfaz I/O
En primer lugar, el cdigo del Arduino debe ser capaz de (1) leer 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 int out = 0;
2 byte in = 0;
3 byte pinOut = 10;
4
5 void setup() {
6 // inicializar puerto serie
7 Serial.begin(9600);
8 // preparar output
9 pinMode(pinOut, OUTPUT);
10 }
11
12 void loop() {
13 // leer del pin A0 como
14 out = analogRead(A0);
15 // escalar para obtener formato uint8
16 out = map(out, 0, 1023, 0, 255);
17 // enviar en base 10 en ASCII
18 Serial.write(out);
19 // leer del serie si hay datos
20 if(Serial.available()){
21 in = Serial.read();
22 // escribir en el pin 10
23 analogWrite(pinOut, in);
24 }
25 // esperar para estabilizar el conversor
26 delay(20);
27 }

3.2. Simulink: bucle de control


https://wechoosethemoon.es/2011/07/21/arduino-matlab-simulink-controlador-pid/ 4/16
12/10/2017 Arduino + Matlab/Simulink: controlador PID

Por otra parte, nuestro programa de Simulink debe recibir este dato de
V () a travs del puerto serie, compararlo con una referencia Vref que
controlaremos nosotros con un slider en la propia interfaz gr ca 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):

https://wechoosethemoon.es/2011/07/21/arduino-matlab-simulink-controlador-pid/ 5/16
12/10/2017 Arduino + Matlab/Simulink: controlador PID

Arduino + Matlab: Controlador PID - test 1

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

3.3. Matlab: postproceso de los datos


recogidos
Si nos jamos 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: identi cacin de sistemas, exportacin a Excel en este
caso, nos contentamos con emplear la til funcin externa
savefigure() para obtener un gr co vectorial PDF:

https://wechoosethemoon.es/2011/07/21/arduino-matlab-simulink-controlador-pid/ 6/16
12/10/2017 Arduino + Matlab/Simulink: controlador PID

1 %% Preparar la figura
2 f = figure('Name','Captura');
3 axis([0 length(ref_out) 0 5.1])
4 grid on
5 xlabel('Medida (-)')
6 ylabel('Voltaje (V)')
7 title('Captura de voltaje en tiempo real con Arduino')
8 hold all
9
10 %% Tratamiento
11 pos_out = pos_out(:);
12 pid_out = pid_out(:);
13 x = linspace(0,length(ref_out),length(ref_out));
14
15 %% Limpiar figura y dibujar
16 cla
17 plot(x,pid_out,'Color',[0.6,0.6,0.6],'LineWidth',2)
18 plot(x,ref_out,x,pos_out,'LineWidth',2)
19 legend('Control','Referencia','Posicin','Location','Best'
20
21 %% Salvar el grfico
22 savefigure('resultado','s',[4.5 3],'po','-dpdf')

Ejecutando este cdigo tras haber realizado otro ensayo del sistema,
hemos obtenido el siguiente resultado:

https://wechoosethemoon.es/2011/07/21/arduino-matlab-simulink-controlador-pid/ 7/16
12/10/2017 Arduino + Matlab/Simulink: controlador PID

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!

Thanks for reading! To share this post, use this


permalink

ARDUINO + MATLAB: A

ARDUINO + MOTOR DC: CIRCUITO PWM

Comments
Comments Community
1 Login

Sort by Best
Recommend 6 Share

Join the discussion

LOG IN WITH
OR SIGN UP WITH DISQUS ?

https://wechoosethemoon.es/2011/07/21/arduino-matlab-simulink-controlador-pid/ 8/16
12/10/2017 Arduino + Matlab/Simulink: controlador PID
Name

Adrin Martnez 4 months ago


Buenas noches Jorge, solo una pregunta, cmo calculaste
los parmetros PID de tu sistema?
5 Reply Share

Richard 5 years ago


Primero q todo felicitaciones por tan buen proyecto. Me
gustaria saber cuales son las referencias del MOSFET y
diodo zener q utlizaron en la etapa de potencia.

Agradezco su atencion a la presente.


2 Reply Share

Alejandro Suarez 5 years ago


Hola muy bueno tu proyecto me podrias ayudar con el
codigo para el simulink esque se me complica un poco, ya
que no se en donde esta il icono para el serial COM 4
1 Reply Share

Patricio 2 years ago


Buen proyecto me podrias facilitar el codigo de simulink y
arduino gracias.
4 Reply Share

Muhammad Mubarak Hossain 4 months ago


OH, Great work.
Dear respected sir, I'm trying to control Brushless DC
motor with ESC using MATLAB simulink. I'm facing
problem as it is not working. Please could you help me ?
Reply Share

Dario Cuasquer 2 years ago


buen aporte... me gustara alguno con DAQ adamas de
arduino
Reply Share

Frank Soto 2 years ago


Buen proyecto estoy trabajando en uno igual, alguien me
puede facilitar el codigo en simulink! gracias...
Reply Share

saffi 2 years ago


Hola.. Una ayuda para la planta de dos grados de libertad
https://wechoosethemoon.es/2011/07/21/arduino-matlab-simulink-controlador-pid/ 9/16
12/10/2017 Arduino + Matlab/Simulink: controlador PID
y p p g
Reply Share

Abdullah 2 years ago


Nice project, I want to create this and use an experimental
setup in control courses. Can you write the motor model
number with gearbox and airfoil? Thank you so much.
Reply Share

car 2 years ago


como podria cambiar el puerto serial "com 6" a otro??
espero su respuesta de ante mano muchas gracias
Reply Share

Mike Martinez 2 years ago


los archivos donde se descargan?
Reply Share

erick 3 years ago


amigos de donde se descargan los archivos?
Reply Share

DAVIER MALDONADO PAUTT 3 years ago


hola.....el nombre del puerto a configurar en simulink es el
mismo en el que esta conectado el arduino?
Reply Share

erick 3 years ago


wow asombroso podrias ayudareme haciendolo?
o mandandome todo lo necesario para comunicar arduino y
matlab?
Reply Share

Nelson 3 years ago


que mtodo utilizas para sintonizar el PID?
Reply Share

David Yanguas Rojas 3 years ago


Muy til la informacin, muchas gracias
Reply Share

Diego Ospina 3 years ago


que buen trabajo, felicitaciones.... podria poner todos los
materiales que utiliz especificamente? que tipo de motor,
la alimentacion y eso?? tengo que hacer algo muy
parecido... Gracias !!!! o si tiene ms info de este proyecto
https://wechoosethemoon.es/2011/07/21/arduino-matlab-simulink-controlador-pid/ 10/16
12/10/2017 Arduino + Matlab/Simulink: controlador PID
pa ec do... G ac as !!!! o s t e e s o de este p oyecto
depronto algo mas amplio estara muy agradecido !!!
Reply Share

laynasoft 3 years ago


Hola que tal, estoy tratando de hacer un control pid de
velocidad para un motor dc, mi pregunta es, es posible
realizar un control de velocidad sin un encoder?? y si es
posible realizarlo con su programa como puedo ajustar los
parametros de P, I, D para mi planta??
Reply Share

rafa 4 years ago


Hola Jorge tengo un problema haber si me lo puede
solucionar alguien.He realizado un programa exactamente
igual que el tuyo pero con mi COM3 en vez de el COM6 que
ese es el tuyo pero al ejecutar al progrma me da fallo en el
Serial Send y me pone que arregle el 'ode45' y nose como lo
puedo solucionar.Me podeis ayudar?

Gracias
Reply Share

Ricardo Vega 4 years ago


Cmo desarrollaste el modelo matemtico para este
proyecto?
Reply Share

juan 4 years ago


hola como estas? amigo como puedo graficar en matlab 3
datos del arduino, asi como esta este grfico con 3 colores
de legend, quiero graficar un setpoint una lectura de un
sensor de temperatura y una salida de un control PID de la
libreria del arduino todo funciona y lo veo por el monitor
serial del arduino con Serial.print(datos) , pero nesecito
graficarlos en matlab. gracias. muy buena informacin
gracias
Reply Share

Victor Gomez 4 years ago


Como puedo hacer para corregir los Bad link que aparecen
en el simulink?
Reply Share

Angel-UVMCOYOACAN 4 years ago


Disculpa soy nuevo en esto pero me gustara saber que
arduino utilizaste y como se realiza la conexin Simulink-
https://wechoosethemoon.es/2011/07/21/arduino-matlab-simulink-controlador-pid/ 11/16
12/10/2017 Arduino + Matlab/Simulink: controlador PID
arduino utilizaste y como se realiza la conexin Simulink-
Arduino gracias.
Reply Share

Juako 4 years ago


Muchas gracias Joge, estoy omenzando un proyecto para
un pendulo invertido con simulink y este tutorial me aclar
algunas dudas, de todas formas te queria preguntar si sabes
sobre conexion Arduino-Simulink a traves del Shield de
Bluetooth de arduino, si es posible realizarla, espero puedas
aclararme esa duda. Saludos
Reply Share

Benjamn_PUC_CHILE 4 years ago


Muchisimas gracias!
Con tu ayuda podr terminar un proyecto de pndulo
invertido en el que estoy trabajando.
(Quedar la referencia a esta pgina)

Saludos!
Reply Share

Jorge Garca Tscar > Benjamn_PUC_CHILE


4 years ago
Genial! Deja el enlace cuando lo tengas para que lo
veamos! =)
Reply Share

komar 4 years ago


Hola, soy nuevo usando matlab, y me parece interesante el
proyecto, quisiera tomar idea haciendo este proyecto,
puedes, decirnos k mosfet usaste?, te lo agradecer. Y
espero tambin ayudar a otros de igual forma.
Reply Share

Marc 4 years ago


Hola de nuevo, he solucionado el problema del serial
receiver. Ahora tengo un segundo problema. Recibo datos
Int8 correctamente del serial receiver (comprobados).

Quiero que esos datos tengan decimales, si en serial


receiver selecciono "double" los datos que me da no son
correctos.

Una segunda opcin es obtener int8 del serial reciever y


convertirlos a double con un conversor, como tu haces. El
problema es que no se convierten a double, siguen siendo
enteros
https://wechoosethemoon.es/2011/07/21/arduino-matlab-simulink-controlador-pid/ 12/16
12/10/2017 Arduino + Matlab/Simulink: controlador PID
enteros.

En tu video no se aprecia si el bloque "conv2" realiza


realmente la conversin a double. La leyenda del eje de
ordenadas va de 50 en 50. Pusiste un bloque display para
comprobarlo?

Agradecera tu respuesta porque estoy buscando sin cesar


la solucin asumiendo que a ti si te cambia a double.

Gracias por tu tiempo,


Un cordial saludo,
Marc
Reply Share

Marc 4 years ago


Buen ejemplo, sobre todo ilustrativo. Estoy trabajando con
arduino, recibo los datos via serial y los represento
utilizando Processing. Con Processing necesito estar
variando los la forma de representacin, es algo tedioso.

Estoy intentando leer datos con el bloque que tu utilizas


"serial recieve", pero por alguna razn, al intentar elegir el
puerto (COM3) no me deja elegir ninguno, me sale la frase
por defecto. Debo configurar algo antes?

Gracias!
Reply Share

Danilo 5 years ago


Hola, usted podria muestrar el diseo de la planta y la lista
de materiales?

Hi, can you show me the draw of your project and the bill of
materials used?
Reply Share

Manuel Otero 5 years ago


Si ya ests ocupando control digital por qu no
implementas un algoritmo ms adecuado para ello? Seguro
que con el logaritmo de la tangente hiperblica te quedara
de fbula.
Reply Share

Guillermo Sahonero lvarez 5 years ago


Que tal Jorge. Muy interesante el proyecto que realizaste.
Tengo unas dudas sobre la estructura fsica, que MOSFET
usaste? Y como es que el potencimetro puede medir el
https://wechoosethemoon.es/2011/07/21/arduino-matlab-simulink-controlador-pid/ 13/16
12/10/2017 Arduino + Matlab/Simulink: controlador PID

ngulo de inclinacin? Finalmente, no s si podras


publicar una fotografa ms cercana a la plataforma. De
antemano, Muchas Gracias!
Reply Share

Daniel Sanchez 5 years ago


me gustara saber como sacar el puro pwm modulandolo
desde la PC, pues trato de controlar un mecanismo de
3GDL con un PID hecho por mi mismo, buen proyecto,
gracias!
Reply Share

Darwin Ipiales 5 years ago


hola disculpa me podrias informar que materiales usaste
Reply Share

cham 5 years ago


hi, the project is cool. may i know how do you solve the
problem of data transmission delay? i'm trying to do it in a
higher sample time, but i got some delay. thanks in advance
Reply Share

Tonatiuht 5 years ago


Hola! Crees que se pueda hacer lo mismo pero con un
fuzzy? Estoy intentando en hacerlo, espero funcione
Reply Share

JAIME CANDELARIA SOLIS 5 years ago


Hola, oye disculpa una pregunta, como haces para realizar
la simulacion de Simulink en tiempo real?? Que parametros
modificaste en la configuracion de la simulacion. Sabes que
yo tambien necesito controlar un motor mediante el puerto
serial pero cuando intento hacer la simulacion me dice que
el puerto serial no se puede simular en "tiempo continuo".
Agradeceria mucho tu respuesta, gracias y excelente
proyecto!
Reply Share

Julian CHILE 5 years ago


Como calculaste tus parametros para el PID???
Reply Share

Jorge Garca Tscar > Julian CHILE 5 years ago


Probando cuidadosamente. Pero siempre puedes
probar el mtodo de Ziegler-Nichols.
Reply Share
https://wechoosethemoon.es/2011/07/21/arduino-matlab-simulink-controlador-pid/ 14/16
12/10/2017 Arduino + Matlab/Simulink: controlador PID
Reply Share

Julian 5 years ago


Lo mismo, Jorge podrias subir el archivo de simulink??

Excelente aporte!!!
Reply Share

Jorge Garca Tscar > Julian 5 years ago


Listo, ahora est aqu, un saludo!
Reply Share

Isra 5 years ago


Que tal, excelente trabajo! Podras subir el archivo de
simulink?
Reply Share

Miki 5 years ago


Podrias poner el cdigo de simulink nuevamente, esta caido
el enlace :(
Reply Share

Worrent Dark 5 years ago


Gracias exelente me voy a ver si puedo hacerlo funcionar
para controlar un regulador buck para hacer un MPPT para
unos paneles solares
Reply Share

Ivan B 5 years ago


buen dia amigo, oye a ti no te aprecio un problema de que
necesita estar enviando datos simulink al arduino para que
se empiece a graficar en matlab?
Reply Share

Ivan 5 years ago


amigo una pregunta, la comunicacion la haces con el
mismo cable usb con el que conectas el arduino con la PC?
Reply Share

Oscar 5 years ago

CC-BY-SA JorgeGT 2016 | Powered by procrastination

https://wechoosethemoon.es/2011/07/21/arduino-matlab-simulink-controlador-pid/ 15/16
12/10/2017 Arduino + Matlab/Simulink: controlador PID

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

You might also like