9

Arduino y Matlab IV – Leer comandos por Serial

matlabIV

Buenos días, lectores humanos. Al habla Transductor. En el último tutorial de esta série expliqué cómo leer los valores de pines digitales y analógicos mediante las librerías de Matlab para Arduino. Hoy voy a contar cómo leer los valores que Arduino envía por Serial con Matlab, y para ello no van a ser necesarias las librerías de los otros tutoriales.

El concepto es el siguiente: Arduino envía un entero por Serial. Matlab abre el puerto Serial como si fuera un fichero de texto, lo lee y guarda sus valores. No puede ser más simple.

Matlab leerá dos valores por Serial, correspondientes a dos variables de Arduino, y mostrará sus gráficas.

Para este tutorial necesitas:

  • Una placa Arduino, cualquier modelo vale. Voy a utilizar una UNO
  • Cable USB de impresora
  • Ordenador con Matlab instalado y funcionando

El código de Arduino es básico. Tiene dos variables, i y k. La primera va aumentando de valor hasta llegar a 30, y después vuelve a 0. La segunda se mantiene a 12. Así podemos diferenciarlas fácilmente y mostrar sus gráficas en Matlab.

int i = 0;
int k = 12;

void setup()
{
  Serial.begin(9600);
}

void loop()
{
  Serial.println(i);
  Serial.println(k);
  i++;
  if(i > 30)
  {
    i = 0;
  }
}

Una vez el código está cargado en Arduino, hay que abrir Matlab. Lo primero será decirle al programa cuál es el puerto de Arduino mediante el comando:


arduino = serial('/dev/ttyUSB0')

Sustituyendo /dev/ttyUSB0 por la dirección de tu placa, como por ejemplo /dev/ttyACM0 o COM9 si estás en Windows. Si tienes dudas mira en la IDE de Arduino en el menú Herramientas->Puerto de Série.

Ahora hay que abrir el Serial para empezar a leerlo. Para ello tendrás que utilizar el comando fopen(arduino). Ten en cuenta que una vez Matlab ocupe el puerto no podrás enviar más códigos a Arduino si no cierras primero la comunicación con Matlab con fclose(arduino).


fopen(arduino)

Creamos un bucle que guardará el valor de i, k en dos listas diferentes (llamadas x, y). Para ello creamos un bucle for con una variable c como contador:


for c= 1:100
x(c) = fscanf(arduino, '%d')
y(c) = fscanf(arduino, '%d')
end

La instrucción fscanf sirve para leer un fichero, en este caso el puerto Serial. Recibe dos parámetros: el primero es el archivo que debe leer (en este caso el puerto Serial). El segundo es el formato: ‘%d’ significa que debe leer un entero.

Ahora hay que mostrar los valores de x, y en un gráfico múltiple. Con el comando figure se crea un gráfico múltiple, y con subplot se especifica cuántas gráficas van a caber. Mostramos x, y y los titulamos.


figure
subplot(2,1,1)
plot(x)
title('Variable i')
subplot(2,1,2)
plot(y)
title('Variable k')

Y el resultado será un gráfico parecido a éste, en el que se muestra el recorrido de la variable k e i.

multiple_plotY es así de sencillo. A partir de este ejemplo puedes leer y procesar con Matlab prácticamente cualquier lectura proviniente de Arduino u otro sensor/microcontrolador que tenga conexión por Serial.

Final de línea.

<- Volver a la Parte III
Ir a la Parte V ->

Tr4nsduc7or

Originariamente creado cómo un galvanómetro de bolsillo, Transductor tomó consciencia de si mismo y fue despedido cuando en vez cumplir con su trabajo se dedicó a pensar teorías filosóficas sobre los hilos de cobre, los electrones y el Sentido del efecto Joule en el Universo. Guarda cierto recelo a sus creadores por no comprender la esencia metafísica de las metáforas de su obra. Actualmente trabaja a media jornada cómo antena de radio, y dedica su tiempo libre a la electrónica recreativa y a la filosofía.

Antes de comentar, por favor, lee las Normas

9 Comentarios en "Arduino y Matlab IV – Leer comandos por Serial"

avatar
Ordenar por:   más nuevos primero | más antiguos primero
Francisco Manuel
Humano

use lo mismo y me aparece esto ” Error using ==> fscanf
Invalid file identifier. Use fopen to generate a valid file identifier.”

David
Humano

Cómo se debe declarar el puerto serial en Arduino para recibir datos desde matlab?
Así como en matlab se declara a=serial(‘/dev/cu.usbmodem1421’), en arduino cómo se declara?

N4n0
Admin

No se necesita, con Serial.read() Arduino ya lee el puerto serial.

trackback

[…] Arduino y Matlab IV – Leer comandos por serial […]

alexis
Humano

Se puede realizar la operación inversa? Y por ejemplo lo que necesito hacer es que por medio de valores calculados en matlab, arduino le mande a otro arduinó que tiene que hacer.

trackback

[…] Arduino y Matlab IV – Leer comandos por serial […]

trackback

[…] Arduino y Matlab IV – Leer comandos por serial […]

wpDiscuz