usuarios de Akai mpc's y más cosas

esta nueva entrada nace porque me he visto en deuda con el blog que mencioné en una entrada anterior. Gracias a estos simpáticos 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 comunicación 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() {

//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 –byte-

 EEPROM.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 alfanuméricas con retorno de carro en el puerto serial, recibiremos los datos de esta manera:

en arduino escribimos:

Serial.println(dato);

y en Matlab no tedríamos más 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!

Anuncios

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

  1. Genial! Yo también estoy usando matlab en la uni, estoy en un proyecto para crear un toolbox (encarado a temas de biología), y también 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. estupendo, cualquier duda, ya sabes, pregunta, que quizás te pueda ayudar. salu2.

  3. jose francisco juarez valtierra dijo:

    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. 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 línea Serial.println(dato);

    • jose francisco juarez valtierra dijo:

      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

      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.

  5. Giancarlo Daraviña P dijo:

    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 !!

    • creo que ya comenté al principio del post, yo haría 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 precisión 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, tendrás que enviar 1,2 o 4 bytes
      en función del rango que necesites.
      salu2.

  6. Hola! Se puede utilizar con simulink? queremos implementar el toolbox de logica difusa de matlab

  7. Hola Tonatiuht, en este estupendo blog trae información 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. a que te refieres con comando?

  9. ah! XDD comando, que antiguo soy, me refiero a parte del código que he puesto, más arriba:
    %crear objeto serie
    s = serial(‘COM8′,’BaudRate’,9600,’Terminator’,’CR/LF’);
    %abrir puerto
    fopen(s);

  10. Miguel Angel Baez dijo:

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

    • Creo entender un poco mejor tu pregunta.

      Yo utilizo un Arduino Mega, lo que me permite tener mas de una comunicación serial, en caso de que no tengas un Arduino Mega puedes usar la libreria softwareserial.

      Ademas de una comuncación serial aparte requieres un bluetooth y yo lo sincronizo con android por medio de BlueTerminal la cual puedes bajar de Play Store.

      Y este es el codigo que ingreso en Arduino:

      byte comando;

      void setup ()
      {
      Serial.begin(9600);
      Serial2.begin(9600);
      pinMode(13, OUTPUT);
      }

      void loop ()
      {
      //Serial1.println(“JESUS”);

      if(Serial.available()>0)
      {
      comando = Serial.read();
      delay(100);
      Serial2.println(comando);

      if(comando == ‘M’)
      {
      digitalWrite(13,HIGH);
      }

      if(comando == ‘P’)
      {
      digitalWrite(13,LOW);
      }
      Serial.flush();
      }
      }

      De esta forma mando lo que leo de matlab y lo mando por el puerto serial2 del arduino mega y me aparece lo que mando en el celular usándolo como el monitor serial.

      No se si eso te ayude a resolver tu duda.

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

    después con esa variable ya podemos hacer lo que se te ocurra,
    espero que te haya ayudado. saludos.

  12. Giancarlo Daraviña dijo:

    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

    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.

    • creo que tienes un error en el formato de envío de datos desde matlab, estás enviando integer que son dos bytes y después en arduino lees del puerto serial, sólo un byte en la variable dato, con lo que las lectura seguramente es erronea, intenta cambiar en matlab el dato que envías por el serial sea en formato uint8, tal como lo tenía yo en mi código, porque si estás enviando un dato de temperatura, con un byte tienes 256 valores diferentes, que puede ser válido para leer temperatura ambiente.

      • Giancarlo Daraviña dijo:

        Hola! mira q intente cambiar el formato que tenia erróneo 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. todavía persiste el problema. en realidad no se que es lo que pasa. aplique el mismo código que tienes acá en el foro y nada :(.

        Muchas gracias !

  13. Tengo una duda básica 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?

    • en principio no veo problema en el código, pero por experiencia me ha dado bastantes problemas con matlab este tipo de envíos, y nos cuentas si te ha dado resultado.

  14. 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);
    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);
    }

    • yo intentaria poner los datos que no cambian en LCD metidos en el Setup(), y sólo 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

  15. daniel felipe dijo:

    Les comento mi situación debo por medio de una webcam tomar una foto de un numero desde matlab despues procesar la imagen para convertir aquel numero en uno numero digital y por ultimo este numero llevarlo a arduino donde se ira llenando una matriz el problema es que uso el codigo del inicio donde el valor de comando sera mi numero digital y pretendo llevarlo a arduino y lo que pasa es que hago la parte del codigo de matlab y no hay problema pero cuando hago el de arduino y lo cargo dice que hay un problema que el puerto serial ya esta en uso que cierre el programa que lo pueda estar usando y no se que se pueda hacer. mi matlan es 2013b

  16. yony munoz dijo:

    bueno el aporte pero quisiera saber como hago para que desde matlab me active o ponga auno uno salida de mi arduino; sinceramente no se con que comparar lo leido en el puerto le he dado vueltas y no he podido; si me puedes dar una idea; inmensamente agradecido

  17. Hola, quisiera atravez de matlab y usando la webcam de la laptop enviar esa imagen a travez de un arduino para a este incurporarle un modulo xbee y recibir ese videos en utra pc con un modulo xbee conectado tambien, es decir 2 pc con xbee conectado pero enviar lo que la webcam esta biendo para la otra pc a traves de un arduino, saludos

  18. sergio734 dijo:

    Muy buen aporte!

    Tengo un problema, creo la señal que quiero enviar desde Matlab a Arduino, pero claro ocupo el COM3 y al cargar el sketch a Arduino me dice ‘Acceso denegado’, porque puede ser?

    • si, a mi también me pasaba a veces. La solución que encontré era cerrar matlab, y apagar arduino, reiniciando todo, quedaba libre.

      • sergio734 dijo:

        muchas gracias! quiero modificar ese codigo para conseguir mover un servomotor, como seria el codigo mas o menos??

  19. Jesús Castañeda dijo:

    Buenas noches.

    Disculpa que te moleste, no se si me puedas ayudar. Desde hace tiempo hetenido problemas con la comunicación de MATLAB a Arduino, porque de Arduino a MATLAB no tengo problemas.

    Lo que pasa es que quiero mandar una cadena de caracteres de MATLAB a Arduino con el siguiente formato: s1,100,100,100. pero no lo consigo. Sin embargo quisiera mandar al menos un caracter y con ese caracter prender alguna salida digital y tampoco he conseguido realizarlo.

    Arduino:

    byte comando;

    void setup ()
    {
    Serial.begin(9600);
    Serial2.begin(9600);
    pinMode(13, OUTPUT);
    }

    void loop ()
    {
    if(Serial.available()>0)
    {
    comando = Serial.read();
    delay(100);
    Serial2.println(comando);

    if(comando == ‘M’)
    {
    digitalWrite(13,HIGH);
    }

    if(comando == ‘P’)
    {
    digitalWrite(13,LOW);
    }
    Serial.flush();
    }
    }

    MATLAB:

    s = serial(‘COM4′,’BaudRate’,9600,’Terminator’,’CR/LF’);
    fopen(s);
    fwrite(s,’M’,’uint8′);
    fclose(s);
    delete(s);

    Si utilizo el monitor serial para enviarle una M una P si funciona el programa de Arduino pero al mandarlo desde MATLAB no pasa nada, puse lo de Serial2 para utilizar una conexion por bluettoth como un monitor serial para ver lo que le llegaba al arduino pero no me manda nada.

    No se si me puedas ayudar.

    Saludos

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s

Nube de etiquetas

A %d blogueros les gusta esto: