Una de las mayores utilidades para operar con Arduino es establecer una comunicación de la placa con Matlab via Serial.

Arduino tiene sus limitaciones en cuanto a su respuesta en tiempo real y su rendimiento de cálculo. Por ello, lo que se puede hacer es establecer una comunicación por el puerto USB serial que recoja los datos, sean procesados y devueltos a la placa para ejecutar otra serie de acciones.

Esto mismo se puede hacer de muchas maneras, ya sea por terminal, con otros lenguajes como Python, Java, etc… Pero supongamos que tenemos una toolbox concreta en Matlab que conocemos de antemano y nos es conveniente recoger los datos con este programa.

Para empezar estuve probando la opción de leer datos con la librería de ArduinoIO que ofrece Matlab, pero esta librería requiere programar un sketch en la placa previamente para interactuar con el programa. Por lo que no podemos utilizarlo de la manera que a nosotros nos convenga a menos que modifiquemos unas cuantas lineas.

Es por ello, que esta opción hay que desecharla y utilizar otra función que ofrece Matlab, que es la función Serial.

En este ejemplo lo que vamos a hacer es conectar un módulo Bluetooth a la placa para comunicarnos con ella a través de una aplicación. Y todo lo que reciba la placa lo podremos leer en Matlab.

De la misma manera se podría hacer si conectamos cualquier otro dispositivo que requiera cálculos complejos, como son los datos de un acelerómetro, un giroscopio, una webcam,etc…

Para empezar cargamos el siguiente código en la placa, cortesía de TechBiTar


#include <SoftwareSerial.h>

SoftwareSerial mySerial(0, 1); // RX, TX

void setup(){
// Open serial communications and wait for port to open:
   Serial.begin(38400);
   while (!Serial) {
      ; // wait for serial port to connect. Needed for Leonardo only
   }

   digitalWrite(13,HIGH);
   Serial.println("Hello Matlab!");

// set the data rate for the SoftwareSerial port
   mySerial.begin(38400);

}

void loop() {
   while (mySerial.available()){
      Serial.write(mySerial.read());
   }
   delay(500);

   while (Serial.available()){

      mySerial.write(Serial.read());
   }
   delay(500);
}

Se han elegido los puertos 0 y 1 que son los que son los puertos serie por defecto. Acordarse de no tener nada conectado a estos pines antes de cargar el sketch.

Ahora podemos descargarnos cualquiera de las aplicaciones que nos permiten establecer comunicación por Bluetooth. En nuestro caso la del mismo desarrollador ArduDroid, pero puede ser cualquiera, solo necesitamos que exista circulación de datos por el puerto serie.

Ahora hemos de meternos en Matlab y ejecutar los siguientes comandos para leer los datos desde el puerto serie.


arduino = serial('COMX', 'BaudRate',38400);

fopen(arduino)

while true

data=fscanf(arduino)

end


De esta manera entramos en un bucle en el que se irán leyendo los datos y se introducen dentro de una variable data. Esto es muy útil si por ejemplo tenemos un montón de datos que son leidos desde la placa y los queremos almacenar dentro de un fichero o procesarlos dentro de Matlab. Al tener los datos ya contenidos en variables se pueden manipular a placer.

En este ejemplo establezco conexión desde la aplicación y voy pulsando los botones de la aplicación que me aparecen en la siguiente captura de pantalla.

ArduDroid

MatlabArduino

 

Esto nos puede servir para descubrir cómo se mandan las instrucciones desde la aplicación de ArduDroid y así descubrir su significado para operar con ella.

Como se ve en la imagen salen unos número y símbolos raros. Pues esos datos son las instrucciones que manda la aplicación para referirse al pin, si es analógico o digital o si mandamos datos por escrito.

En la primera y segunda linea he ido pulsando todos los botones que se asocian a los pines digitales. En la siguiente linea he ido arrastrando los sliders de los pines analógicos.  Y finalmente he mandado unos mensajes.

Los datos han pasado de una aplicación móvil a un receptor Bluetooth que se comunica con una placa Arduino y ésta que se comunica con Matlab.

Como ya digo se puede hacer con cualquier cacharro que haya conectado y que saque valores con un simple Serial.println().

Hay que tener cuidado a la hora de establecer el BaudRate, ya que deben ser iguales para que no haya ningún error.

Como comentario adicional, la aparición de los datos se va almacenando dentro de un buffer y cada vez que ejecutamos fscanf va leyendo linea por linea. Es decir que es posible que no haya sincronía con lo que leemos en la pantalla de Matlab y los que lee actualmente la placa. Según el tipo de aplicación puede resultar un inconveniente. Pero para ir guardando los datos en un fichero, filtrarlos y obtener posteriormente una serie de gráficas va muy bien.