Anda di halaman 1dari 10

21/2/2014

Comunicar Matlab con arduino | jjchop

jjchop

usuarios de Akai mpc's y ms cosas

Comunicar Matlab con arduino


15 junio 2012 esta nueva entrada nace porque me he visto en deuda con el blog que mencion en una entrada anterior (http://jjchop.wordpress.com/2012/04/20/we-choose-the-moon/). Gracias a estos simpticos chicos pude redondear mi proyecto fin de carrera, y como al final, echando unas horitas en ello, pudimos (mi compi Gonzalo y yo) por fin lograr una comunicacin bidireccional entre Matlab y la tarjeta Arduino uno rev3. Si estamos en Matlab empezaremos por crear el objeto serial: %crear objeto serie s = serial(COM8,BaudRate,9600,Terminator,'CR/LF); Para abrir el puerto serial mediante este comando: %abrir puerto fopen(s); Y para enviar datos a arduino en formato byte: fwrite(s,comando,uint8); ahora ya en arduino debemos escribir un skecth con la siguiente estructura para poder recibir los datos. #include <EEPROM.h> byte comando; //va a ser el byte a recibir void setup() {
http://jjchop.wordpress.com/2012/06/15/comunicar-matlab-con-arduino/ 1/10

21/2/2014

Comunicar Matlab con arduino | jjchop

//configuramos el puert serial Serial.begin(9600); } void loop() { if (Serial.available()>0){ //si hay datos disponibles en el serial delay(50); //esperemos a que se terminen de recibir comando=Serial.read(); //leemos el primer datos byteEEPROM.write(0,comando);//lo escribimos en la EPROM para cualquier uso que se nos ocurra. Serial.flush();//limpiamos el serial. } } Para recibir datos en matlab desde arduino, como este puedes escribir cadenas alfanumricas con retorno de carro en el puerto serial, recibiremos los datos de esta manera: en arduino escribimos: Serial.println(dato); y en Matlab no tedramos ms que recoger los datos enviados por el puerto serial con el comando: a=fscanf(s,%d); no olvidaros de cerrar el puerto serial mediante fclose(s); porque si no nos dar todo tipo de errores y habr que reiniciar Matlab. Qu aproveche! CATEGORA: About these ads (http://en.wordpress.com/aboutthese-ads/) ELECTRNICA, PROGRAMACIN GRFICA - DEMOSCENE 21 COMENTARIOS

Comentarios en: "Comunicar Matlab con arduino" (21)


http://jjchop.wordpress.com/2012/06/15/comunicar-matlab-con-arduino/ 2/10

21/2/2014

Comunicar Matlab con arduino | jjchop

1. holalluis dijo: 4 julio 2012 en 11:27 pm Genial! Yo tambin estoy usando matlab en la uni, estoy en un proyecto para crear un toolbox (encarado a temas de biologa), y tambin toco arduino en mi tiempo libre! Cuando tenga un poco de tiempo voy a correr este script y a conectar arduino a ver qu tal! Sigue as! 2. drnocore dijo: 5 julio 2012 en 6:51 am estupendo, cualquier duda, ya sabes, pregunta, que quizs te pueda ayudar. salu2. 3. jose francisco juarez valtierra dijo: 28 julio 2012 en 6:16 pm tengo una pregunta y como es al reves enviar datos analogicos a matlab y estos a su vez sean graficados en matlab? espero que me puedas ayudar seria de mucha a yuda mi correo es sworzred@hotmail.com estoy haciendo un proyecto de sensado de temperatura matlab arduino se les agradeceria mucho 4. drnocore dijo: 29 julio 2012 en 9:48 am Hola Jose Fco. creo que lo que pides est contestado en el post. Si quieres recibir en matlab los datos de arduino es a=fscanf(s,%d); y los datos los envias desde arduino con la siguiente lnea Serial.println(dato); jose francisco juarez valtierra dijo: 10 agosto 2012 en 9:01 pm hola de nuevo como puedo plotear los datos que recivo de arduino en un guid? esto es lo que tengo espero me puedas ayudar se te agradeceria mucho. este es el codigo de arduino que tengo: int valor=0; int analogin=1; void setup() { Serial.begin(115200); } void loop() { valor=analogRead(analogin); Serial.println(valor); delay(100); } y este es el codigo de matlab que tengo
http://jjchop.wordpress.com/2012/06/15/comunicar-matlab-con-arduino/ 3/10

21/2/2014

Comunicar Matlab con arduino | jjchop

clear all; close all; y = zeros(5000); s1 = serial(COM7); %define serial port s1.BaudRate=115200; %define baud rate %open serial port fopen(s1); clear data; for i= 1:2000 %acquisition of 100 points data=fscanf(s1);%read sensor y(i) = str2double(data); plot(i,y(i),+-b) title(Dados de LDR Aquisitados); xlabel(Pontos); ylabel(Valores); drawnow; hold on if y(i) > 10 fprintf(s1, 1); end if y(i) < 10 fprintf(s1, '0'); end end % close the serial port fclose(s1); mi pregunta es como puedo plotear la variable y(i) como se muestra el plot : plot(i,y(i),'+-b') pero lo necesito en un guid en matlab ya lo he intentado y me da error de no reconocer los handles y la exprecion de plot(handles.axes1,i,y(i),'+-b') me podrias ayudar como poder hacer esto posible te agradeceria mucho espero tu respuesta, saludos y seria todo gracias por tu atencion. drnocore dijo: 21 septiembre 2012 en 7:36 am Hola Jos Francisco, pues siento no poder ayudarte, no tengo ni idea de los guid en matlab. 5. Giancarlo Daravia P dijo: 21 septiembre 2012 en 3:36 am hey men!! tengo una pregunta yo como hago para enviar datos analogicos desde matlab a mi arduino es que ando en un proyecto de manejar el posicionamiento de un servomotor y quiero enviar los datos desde matlab como hago ese proceso me seria de gran ayuda si me colaboras . Gracias !!
http://jjchop.wordpress.com/2012/06/15/comunicar-matlab-con-arduino/ 4/10

21/2/2014

Comunicar Matlab con arduino | jjchop

drnocore dijo: 21 septiembre 2012 en 7:43 am creo que ya coment al principio del post, yo hara as: en matlab Para abrir el puerto serial mediante este comando: %crear objeto serie s = serial(COM8,BaudRate,9600,Terminator,CR/LF); %abrir puerto fopen(s); Y para enviar datos a arduino en formato byte: fwrite(s,comando,uint8); donde comando en una variable tipo byte(8bits). si necesitas enviar datos en forma decimal, piensa en la precisin que necesites (por ejemplo 2 decimales mutltiplicas el numero por 100) ya tienes la parte entera, si el rango es 8, 16 o 32 bits, tendrs que enviar 1,2 o 4 bytes en funcin del rango que necesites. salu2. 6. Tonatiuht dijo: 28 noviembre 2012 en 1:38 pm Hola! Se puede utilizar con simulink? queremos implementar el toolbox de logica difusa de matlab 7. drnocore dijo: 29 noviembre 2012 en 9:29 am Hola Tonatiuht, en este estupendo blog trae informacin muy ltil sobre el uso de arduino con simulink, a lo mejor te puede ayudar, saludos. http://wechoosethemoon.es/2011/07/21/arduino-matlab-simulink-controlador-pid/ 8. ej dijo: 26 mayo 2013 en 5:23 pm a que te refieres con comando? 9. drnocore dijo: 27 mayo 2013 en 7:23 am ah! XDD comando, que antiguo soy, me refiero a parte del cdigo que he puesto, ms arriba: %crear objeto serie s = serial(COM8,BaudRate,9600,Terminator,CR/LF); %abrir puerto fopen(s); 10. Miguel Angel Baez dijo: 27 julio 2013 en 7:57 pm Hola, primero q nada buen post, me ayudo mucho, pero tengo un problema, ya tengo mi codigo en matlab que envia por puerto serial tal como tu lo planteas aqui, y el programa de matlab tambien ya lo tengo, pero como le hago para visualizar el numero que envie de matlab en el arduino, puede
http://jjchop.wordpress.com/2012/06/15/comunicar-matlab-con-arduino/ 5/10

21/2/2014

Comunicar Matlab con arduino | jjchop

ser un poco tonta la pregunta pero no se como hacerlo, podrias explicarme eso, o en q variable se guardan los datos para despues poder trabajar con el? de antemano gracias por tu respuesta 11. drnocore dijo: 28 julio 2013 en 10:08 am MIguel Angel, te refieres a una vez enviado un byte desde matlab a arduino, que hace arduino para leerlo? en matlab enviamos un byte a arduino as: fwrite(s,comando,uint8); %donde s es el puerto, comando es el byte a enviar y en arduino recibimos ese byte as: comando=Serial.read(); //leemos el byte, donde comando es una variable byte despus con esa variable ya podemos hacer lo que se te ocurra, espero que te haya ayudado. saludos. 12. Giancarlo Daravia dijo: 31 agosto 2013 en 8:03 pm Hey men! mira que tengo un problema con el envio de datos desde matlab a arduino, estoy tomando la lectura de datos de un sersor de temperatura lm35. pero quiero enviar datos desde matlab a arduino para activar una salida digital para activar un actuador. En matlab hice el siguiente codigo close all; clc; temp=input(Ingrese el valor a medir: ); %Inicializo el puerto serial que utilizar %borrar previos delete(instrfind({Port},{COM10})); %crear objeto serie puerto_serial = serial(COM10,BaudRate,9600,Terminator,'CR/LF); warning(off,'MATLAB:serial:fscanf:unsuccessfulRead); %abrir puerto fopen(puerto_serial); fwrite(puerto_serial,temp,uint16); Por ejemplo ingreso el valor numerico 30, en el cual ese valor es enviado al arduino y lo compara con los valores del sensor de temperatura, de que cuando mi sensor de temperatura iguale o supere los 30 grados me active una salida.. pero no logro llegar a este objetivo de activar mi salida digital este es mi codigo en arduino

http://jjchop.wordpress.com/2012/06/15/comunicar-matlab-con-arduino/

int pin=0; //Analog 0

6/10

21/2/2014

Comunicar Matlab con arduino | jjchop

int pin=0; //Analog 0 int valor_temp=0; int tem = 12; void setup(){ Serial.begin(9600); pinMode(tem,OUTPUT); } void loop() { valor_temp= (5.0 * analogRead(pin)*100)/1024; // iteraciones entre resolucion Serial.println(valor_temp,DEC); delay(100); if (Serial.available()>0) // pregunta si hay datos { delay(50); byte Dato; Dato = Serial.read(); if (valor_temp > Dato) //cambiar numero en funcion de lo que se desee { digitalWrite(tem, HIGH); // Activa el pin 12 //Serial.print(Ventilador ON); // Imprime en Pantalla } else digitalWrite(tem,LOW); // Desactiva el Pin 13 //Serial.print(Ventilador OFF); Serial.flush();//limpiamos el serial. } } hasta ahora no he logrado este paso. me seria de gran ayuda si me colaboraras en esta parte. Gracias. drnocore dijo: 1 septiembre 2013 en 7:13 am creo que tienes un error en el formato de envo de datos desde matlab, ests enviando integer que son dos bytes y despus en arduino lees del puerto serial, slo un byte en la variable dato, con lo que las lectura seguramente es erronea, intenta cambiar en matlab el dato que envas por el serial sea en formato uint8, tal como lo tena yo en mi cdigo, porque si ests enviando un dato de temperatura, con un byte tienes 256 valores diferentes, que puede ser vlido para leer temperatura ambiente.
http://jjchop.wordpress.com/2012/06/15/comunicar-matlab-con-arduino/ 7/10

21/2/2014

Comunicar Matlab con arduino | jjchop

Giancarlo Daravia dijo: 1 septiembre 2013 en 5:55 pm Hola! mira q intente cambiar el formato que tenia errneo en matlab que era (uint16) por (uint8) los cambie pero a la hora de aplicar otra vez mi sistema, aun no se me activa mi salida digital. todava persiste el problema. en realidad no se que es lo que pasa. aplique el mismo cdigo que tienes ac en el foro y nada :(. Muchas gracias ! 13. Nery Orlando del Valle Soto dijo: 20 octubre 2013 en 10:14 pm Tengo una duda bsica soy nuevo en matlab quisiera resivir varios datos desde el puerto serial pero no se como hacerlo creo que solo se puede mandar uno o puedo enviar varios como los tomaria no se si esta bien lo que estoy haciendo> x = str2double (fscanf(s,%d)); y = str2double (fscanf(s,%d)); z = str2double (fscanf(s,%d)); esto desde matlab en arduino Serial.println(outputValue0); Serial.println(outputValue1); Serial.println(outputValue2); no se si esto se puede hacer? drnocore dijo: 21 octubre 2013 en 6:54 am en principio no veo problema en el cdigo, pero por experiencia me ha dado bastantes problemas con matlab este tipo de envos, y nos cuentas si te ha dado resultado. 14. Daniel Flores dijo: 24 octubre 2013 en 1:10 am tengo un problema con mi codigo quiero hacer lo siguiente graficar lo q grabe mi sensor de temperatura despues guardarlo en el arduino cada media hora que grafique y guarde #include int pin=0; LiquidCrystal lcd(9, 8, 13, 12, 11, 10); float TC, TF; void setup(){ lcd.begin(16,2); } void loop (){ TC=analogRead(pin); TC=TC*0.5094; TF=(TC*1.8)+32; lcd.setCursor(8,0);
http://jjchop.wordpress.com/2012/06/15/comunicar-matlab-con-arduino/ 8/10

21/2/2014

Comunicar Matlab con arduino | jjchop

lcd.print(Bienvenido); delay(1000); lcd.clear(); lcd.setCursor(8,0); lcd.print(profe bernardo); delay(1000); lcd.clear(); lcd.setCursor(8,0); lcd.print(Termometro); delay(1000); lcd.clear(); lcd.setCursor(0,0); lcd.print(TC,1); lcd.print(Celcius); lcd.setCursor(0,0); delay(5000); lcd.clear(); lcd.print(TF, 1); lcd.print(Farenheit); delay(5000); } drnocore dijo: 24 octubre 2013 en 9:17 am yo intentaria poner los datos que no cambian en LCD metidos en el Setup(), y slo poner en loop los datos que van cambiando, se me ocurre algo as setup(){ lcd.setCursor(0,0); lcd.print(temp:) } loop(){ lcd.setCursor(5,0); lcd.print(Tc); delay(5000); } prueba algo parecido y me comentas (parto de la base que tienes bien conectada el lcd) salu2

Blog de WordPress.com. | El tema Spectrum.


http://jjchop.wordpress.com/2012/06/15/comunicar-matlab-con-arduino/ 9/10

21/2/2014

Comunicar Matlab con arduino | jjchop

Seguir

Seguir jjchop
Ofrecido por WordPress.com Ads by CouponDropDown

http://jjchop.wordpress.com/2012/06/15/comunicar-matlab-con-arduino/

10/10

Anda mungkin juga menyukai