12

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.

12
Deja un comentario

avatar
8 Hilos iniciados
4 Respuestas a hilos
0 Followers
 
Most reacted comment
Hottest comment thread
7 Nº autores comentarios
Tr4nsduc7orAndres Bravosuri sinaFrancisco ManuelN4n0 Autores de comentarios recientes
más nuevos primero más antiguos primero
Andres Bravo
Humano
Andres Bravo

Hola. Cual seria la manera de involucrar el tiempo en el eje x dentro de tu ejemplo? Gracias

suri sina
Humano
suri sina

Hola, tengo un problema, mmm tengo una Guide, y digamos que tengo en mi arduino cargados como 4 sensores, los cuales se llamarán conforme vaya abriendo por ejemplo push button 1, “grafica el pot” el push button 2 “grafica un sensor de humedad” y así consecutivamente, pero conforme yo los vaya pidiendo… :S hay forma?

Francisco Manuel
Humano
Francisco Manuel

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

David
Humano
David

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
alexis

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 […]