Professional Documents
Culture Documents
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.
http://wechoosethemoon.es/2011/07/21/arduino-matlab-simulink-controlador-pid/ 1/19
6/4/2014 Arduino + Matlab/Simulink: controlador PID
Como se observa, se trata de un brazo articulado con un motor en un extremo, 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, que devuelve un voltaje entre 0V y 5V, en función del ángulo . 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). Nos
falta pues un bucle de control (que programaremos en Simulink), una variable de entrada y una interfaz
física.
http://wechoosethemoon.es/2011/07/21/arduino-matlab-simulink-controlador-pid/ 2/19
6/4/2014 Arduino + Matlab/Simulink: controlador PID
El microcontrolador enviará a la puerta del transistor una señal PWM, y por tanto esta misma señal PWM
pero de potencia será la que reciba el motor. La representación de este montaje será la siguente:
Esta es toda la parte física 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
continuación la parte de código, tanto de Arduino como de Simulink/Matlab.
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 }
http://wechoosethemoon.es/2011/07/21/arduino-matlab-simulink-controlador-pid/ 3/19
6/4/2014 Arduino + Matlab/Simulink: controlador PID
Dentro del
bloque PID, se pueden editar los parámetros P, I y D, siendo los últimos que hemos empleado P = 0.26 , I =
0.9, D = 0.04 y una discretización de 10 ms. Otro dato a tener en cuenta es que la transmisión 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 señal a voltios reales.
A continuación, un vídeo de todo el sistema en funcionamiento (esta es una de las primeras pruebas, con
otros parámetros del PID sin optimizar todavía):
Se puede observar cómo mediante el slider ajustamos la referencia (señal lila). El sistema, 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. Incluso, a pesar de
http://wechoosethemoon.es/2011/07/21/arduino-matlab-simulink-controlador-pid/ 4/19
6/4/2014 Arduino + Matlab/Simulink: controlador PID
estar en una primera fase de pruebas, se observa que es capaz de resistir a Salva perturbaciones.
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','Posición','Location','Best');
20
21 %% Salvar el gráfico
22 savefigure('resultado','s',[4.5 3],'po','-dpdf')
Ejecutando este código tras haber realizado una prueba del sistema, hemos obtenido el siguiente gráfico, que
a pesar de ser originalmente un gráfico vectorial PDF, hemos rasterizado como PNG para poder
representarlo aquí:
http://wechoosethemoon.es/2011/07/21/arduino-matlab-simulink-controlador-pid/ 5/19
6/4/2014 Arduino + Matlab/Simulink: controlador PID
Claro, está aquí; probablemente tengas que ajustar los parámetros del PID a tu planta en concreto!
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 solución
gracias;
Wilker
http://wechoosethemoon.es/2011/07/21/arduino-matlab-simulink-controlador-pid/ 6/19
6/4/2014 Arduino + Matlab/Simulink: controlador PID
MG-Brasil
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.
Hola! Excelente idea, 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, generar 2 señales que se envian
al arduino. No tengo idea como hacerlo ya que sólo veo que funciona con una salida y una entrada. A
ver si me ayudan por favor!
Hola Cristian! Pues nosotros ahora mismo tenemos el proyecto un poco abandonado, 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″, y
que al recibirlo, un switch-case o similar las entiendan como señal 1, señal 2, etc. Colgaremos
cualquier avance! Y si lo consigues, avísanos! =)
Me funcionio bien la primera vez pero ahora se me cierra simulink y no encuentro el problema!!!!!
me podrias ayudar
PS: Un saludo desde España a todos los que se han animado a comentar! Da gusto ver lo activa que
es la comunidad hispanohablante Gracias! =)
http://wechoosethemoon.es/2011/07/21/arduino-matlab-simulink-controlador-pid/ 7/19
6/4/2014 Arduino + Matlab/Simulink: controlador PID
tienes algun codigo sencillo para leer y escribir datos desde matlab hacia el arduino
esta muy chido tu foro!!!!!!
gracias!!!
por tus respuestas
hola queria saber si este proyecto, actualmente lo haz implementado con la libreria “Arduino Target”
del simulink?, pues me intereseria saber si se puede hacer algo como esto pero con esa libreria,
saludos desde Chile
Hola! no, no he usado esa librería, pero es una idea interesante, avisa si lo consigues! En este
proyecto simplemente usamos el Arduino como tarjeta de adquisición/escritura de la señal,
comunicándolo con Simulink mediante puerto serie.
hola buenas noches !!! tengo un problema descargue el programa de simulik y no puedo correrlo !! me
dice que la configuracion del serial en el bloque tiene un error !! agradeceria su ayuda porfavor !!! lo
necesito para un proyecto urgente !!!
Hola! no tengo FDT para el motor, el PID se ajusta empíricamente! Y respecto al error de Carlos,
prueba a comprobar que el puerto serie definido en el bloque es el que realmente está usando el
Arduino!
hola quisiera saber de que tamaño es el potenciometro ya que creo tener problemas al utilizar uno de
50k
Más que la resistencia del potenciómetro lo importante es la facilidad de giro y el recorrido: éste es un
potenciómetro de joystick (un antiguo Microsoft Sidewinder) que gira con mucha facilidad y tiene un
recorrido muy pequeño y muy lineal. Quizás estás usando un potenciómetro logarítmico! Eso sería
muy conflictivo…
Hola Jorge tengo una pregunta, al bajar tu programa de Simulink, y abrirlo el bloque de PID(z) se
abre con error, quiero pensar que es por la versión de Matlab, ¿Cuál versión utilizaste? y ¿Cuál
de los bloques PID implementaste en tu archivo?…..Saludos
Saludos… muy buen apractica… espero poder reproducirla… aunque no he tenido la oportunidad de
trabajar con matlab/simulink… si tienes algún tutorial que pudieras prestar.. se te agradecería…
24. 24 jose benito guillen badillo dijo a las 17:55 del 25/02/2012:
hola Jorge García Tíscar estoi realizando un proyecto casi igual al que estas empleando aqui,trato de
posicionar un motor de cd con arduno,con ,arduino+matlab+simulin y accionarlo desde simulink y que
el motor trabaje como quiero pero lo que no entiendo es como realizar el codigo del arduino si me
pudieras explicar un poco te lo agradeseria o si me puedes mandar el codigo del arduino que
empleastes en esa practica…
este es mi correo.
Hola jorge, me gustaria saber como se hace la comunicacion serie de simulink con arduino, no logro
hacer la conexion no se si podras ayudarme con esto. mi simulink es el 2008
Hola jorge, te escribo porque quiero hacer este proyecto pero tengo una duda en la parte de potencia,
que mosfet has utilizado y que dispositivo es ese otro que aparece en el esquema que has dehajado en
esta pagina..un saludo
hola, todo esta perfecto pero como conectaste el arduino con el puerto serie para que envie y controle
la posicion del pot, solo conectast los 2 pines (tx y rx del arduino ) con los tx y rx del puerto serie de
la compu??
Universidad, hola, no soy jorge pero estoy haciendo este proyecto y te puedo aclarar tu pregunta, la
comunicacion serie se establece a traves del programa de arduino que ha expuesto jorge más arriba, o
sea que es via software, no es una conexión fisica…espero que te sirva mi aclaración, cualquier cosa
podemos seguir comentando..un saludo
Yo eh logrado reproducir exitosamente el proceso por medio de la librería de arduino para simulink el
sistema funciona excelente gracias jorge. Saludos desde mexico
Hola! Sería muy interesante que compartieras tu enfoque del problema Osiris! Y Vladimir tiene razón,
la conexión serie es emulada por software, físicamente está conectado por USB.
Hola que tal!!! La verdad me llamó mucho la atención tu trabajo, en mi caso tengo un motor con
encoder y sensor hall, como me recomiendas adaptarlo para que en vez de potenciómetro use el
encoder
hola amigos!!! muy buen sitio… voy a usar su programa para hallar los coeficientes del pid (una
especie de “autotuning”) para controlar 4 esc con motores brushless, el proyecto es un un quadcopter
controlado por arduino…. saludos de Colombia… cualquier cosita les voy comentando… de
antemano muchas Gracias….
Buenas tardes! Mi nombre es jose mejia y soy estudiante de ultimo semestre de ingenieria de
produccion en la ciudad de Medellin, colombia. Le escribo porque en internet encontre esta pagina
suya donde muestran un sistema de comunicacion en serie con controladores PID en el programa de
Matlab.Estoy muy interesado en saber si usted de pronto me puede colaborar en una asesoria. Yo
tengo que implementar un controlador PID en matlab para un tanque. Entonces tengo que programar
este controlador para este trabajo. Quisiera saber si usted me puede colaborar en realizar este trabajo,
osea programando eso. Espero sus pronta respuesta. Saludos y estoy atento a su respuesta.
Jose Calixto
Ola , me a parecido interesante lo que se puede hacer con simulink, tengo la duda de como puedo leer
un sensor y graficarlo en simulink. es un acelerometro, lo puedo graficar en matlab creando la figura
http://wechoosethemoon.es/2011/07/21/arduino-matlab-simulink-controlador-pid/ 10/19
6/4/2014 Arduino + Matlab/Simulink: controlador PID
pero solo me da aceleracion, lo que quiero es integrarlo dos veces para obtener posicion, y ya me han
dicho que es con simulink , pero no logro hacer graficar nada con el scope, hay algun procedimiento
para configurar mi tarjeta arduino? solo es la señal analoga del acelerometro que se manda por AO.
les agradeceria mucho.
q onda soy alumno de 6 semestre de ing. y y estoy realizando su proyecto pero me tope con un
problema y espero me puedan ayudar pues no se q transistor mosfet y diodo utilizan para el circuito en
la protoboard espero su respuesta
Jorge en el bloke serial send sale (Data type mismatch. Input port 1 of block ‘helicopsimik/serial Send
/S-Function’ expects a signal of data type ‘double’. However, it is driven by a signal of data type
‘uint8′) y le cambio en el primer conv1 a double y grafica una pequena linea amarilla si hacer conexion
fisica , no se cambia nada enel serial paramatros/serial format o se deja tal cual ala hora de pornerlo
Hola xa todos
Primero darle las gracias por tan buenos apuntes que hacen, me sirvio mucho este y otro que hay
sobre comunicacion Arduino+Matlab, quisiera preguntar sobre que lenguaje de programacion realizan
la programacion del Arduino, he tenido unos problemas implementando una serie de codigos que
estoy realizando, y el que encontre aca no me presento ningun problema.
Muchas gracias
chicos yo estoy teniendo un problema con el serial send y no sé por qué ocurre…es el siguiente
he probado a limpiar el buffer de arduino cosa que este estuviese lleno y el serial send no pudiese
escribir..pero nada..si alguien sabe porfa que me eche un cable..saludos
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.
http://wechoosethemoon.es/2011/07/21/arduino-matlab-simulink-controlador-pid/ 11/19
6/4/2014 Arduino + Matlab/Simulink: controlador PID
Hola
Primero darle las gracias por tan buenos aportes que ustedes nos suministran, quería comunicarles que
me funciono perfecto el ejecutable de simulink, les escribo para preguntarles si existe la posibilidad de
facilitarme la programación en matlab ya que para el proyecto que estoy realizando es de vital
importancia este código.
oyee see qiero enviar datos mas grandes qe 255 como lee en matlab ?
Hola amigos primero que nada felicitarlos por lo que hicieron esta muy bueno en segundo lugar estoy
realizando un proyecto similar para mis clases y pues me gustaría saber que bloque utilizaron para la
generación de la referencia en el ambiente de matlab.
Saludos.
amigo una pregunta, la comunicacion la haces con el mismo cable usb con el que conectas el arduino
con la PC?
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?
Gracias exelente me voy a ver si puedo hacerlo funcionar para controlar un regulador buck para hacer
un MPPT para unos paneles solares
Excelente aporte!!!
http://wechoosethemoon.es/2011/07/21/arduino-matlab-simulink-controlador-pid/ 12/19
6/4/2014 Arduino + Matlab/Simulink: controlador PID
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!
Hola! Crees que se pueda hacer lo mismo pero con un fuzzy? Estoy intentando en hacerlo, espero
funcione
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
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
me gustaría 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!
Que tal Jorge. Muy interesante el proyecto que realizaste. Tengo unas dudas sobre la estructura física,
que MOSFET usaste? Y como es que el potenciómetro puede medir el ángulo de inclinación?
Finalmente, no sé si podrías publicar una fotografía más cercana a la plataforma. De antemano,
Muchas Gracias!
http://wechoosethemoon.es/2011/07/21/arduino-matlab-simulink-controlador-pid/ 13/19
6/4/2014 Arduino + Matlab/Simulink: controlador PID
Si ya estás ocupando control digital por qué no implementas un algoritmo más adecuado para ello?
Seguro que con el logaritmo de la tangente hiperbólica te quedaría de fábula.
Hi, can you show me the draw of your project and the bill of materials used?
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
representación, es algo tedioso.
Estoy intentando leer datos con el bloque que tu utilizas “serial recieve”, pero por alguna razón, al
intentar elegir el puerto (COM3) no me deja elegir ninguno, me sale la frase por defecto. Debo
configurar algo antes?
Gracias!
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 opción 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.
En tu video no se aprecia si el bloque “conv2″ realiza realmente la conversión a double. La leyenda del
eje de ordenadas va de 50 en 50. Pusiste un bloque display para comprobarlo?
Agradecería tu respuesta porque estoy buscando sin cesar la solución asumiendo que a ti si te cambia
a double.
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 también ayudar a otros
de igual forma.
Muchisimas gracias!
Con tu ayuda podré terminar un proyecto de péndulo invertido en el que estoy trabajando.
http://wechoosethemoon.es/2011/07/21/arduino-matlab-simulink-controlador-pid/ 14/19
6/4/2014 Arduino + Matlab/Simulink: controlador PID
Saludos!
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
Disculpa soy nuevo en esto pero me gustaría saber que arduino utilizaste y como se realiza la conexión
Simulink-Arduino gracias.
¿Como puedo hacer para corregir los Bad link que aparecen en el simulink?
hola como estas? amigo como puedo graficar en matlab 3 datos del arduino, asi como esta este
gráfico 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 información
gracias
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
Puedes iniciar sesión con Twitter, Faccebook o WordPress o bien introducir un nombre y dirección de
correo (y una página, si quieres!). Sólo tienen que ser verdaderos si quieres que te podamos contestar!
http://wechoosethemoon.es/2011/07/21/arduino-matlab-simulink-controlador-pid/ 15/19
6/4/2014 Arduino + Matlab/Simulink: controlador PID
Etiquetas
Arduino CDF Cocina CUDA DAQ Datos Dropbox Estructuras Facebook Gephi GPGPU
Aeropuerto Altavoz Apocalipsis Zombie
GPU computing Gráficos LabVIEW LaT eX Linux LyX Mathematica MATLAB Miktex MOSFET
Motor Música Navier nVidia PID proxy PWM Redes sociales Sensores Serie Simulink Spotify T ex T exmaker Tutorial Ubuntu
Valencia VI VirtualBox Virtualización Wolfram
Categorías
Aeronáutica
Cosas "útiles"
Engineer-It-Yourself
Recetas
Sin categoría
Tutoriales
Publi de Google
Horror! Los tenebrosos tentáculos del capitalismo se extienden hasta el inmaculado templo de la ciencia! Pero tenemos
que mantener el dominio y adquirir café, pociones, hechizos componentes electrónicos... etc.!
http://wechoosethemoon.es/2011/07/21/arduino-matlab-simulink-controlador-pid/ 16/19
6/4/2014 Arduino + Matlab/Simulink: controlador PID
Pedagogía Infantil
admisionesareandina.com
Estudia en Fund. del
Área Andina. Modalidad
Virtual. ¡Inscríbete ya!
Calendario de publicaciones
julio 2011
LM X J V S D
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 28 29 30 31
« ago ago »
Archivos
febrero 2012
enero 2012
diciembre 2011
noviembre 2011
septiembre 2011
agosto 2011
julio 2011
agosto 2009
Un poquito más de publi! Procuramos que se camufle para que no moleste si estás leyendo la (interesante?) publicación!
Pero si te da mucha rabia, usa Adblock! ;-)
http://wechoosethemoon.es/2011/07/21/arduino-matlab-simulink-controlador-pid/ 17/19
6/4/2014 Arduino + Matlab/Simulink: controlador PID
Gerencia de
Mercadeo
estudiaenelpoli.edu.co/Mercadeo
Posgrado presencial
en el Poli. Inscripciones
Abiertas. Ingresa ya!
Suscríbete!
Introduce tu correo electrónico para suscribirte a este blog y recibir notificaciones de nuevas entradas.
Dirección de email
Suscribir
Más publi!
Desgraciadamente hay que pagar los costes de alojamiento y dominio de la página! Esperamos que no iterfieran
demasiado con el interesantísimo contenido de la izquierda! (:
Meta
Acceder
RSS de las entradas
RSS de los comentarios
WordPress.org
http://wechoosethemoon.es/2011/07/21/arduino-matlab-simulink-controlador-pid/ 18/19
6/4/2014 Arduino + Matlab/Simulink: controlador PID
http://wechoosethemoon.es/2011/07/21/arduino-matlab-simulink-controlador-pid/ 19/19