Como leer variables de Arduino en Matlab


Índice:

  1. Conceptos generales sobre drones
  2. Material necesario y montaje de los componentes hardware
  3. Mando RC y receptor. Programación en Arduino
  4. MPU6050 y su programación en Arduino
  5. Batería LiPo
  6. Control de estabilidad y PID
  7. Motores, ESC y su programación en Arduino
  8. Calibración de hélices y motores
  9. Software completo y esquema detallado
  10. Probando el software completo antes de volar
  11. → Como leer variables de Arduino en Matlab

Por qué utilizar Matlab.

En esta entrada voy a explicar cómo leer las variables que manejamos en Arduino en el entorno Matlab.

Logo Matlab

La función Serial Plotter que incluye Arduino es muy útil para proyectos simples y con pocas variables pero a medida que vamos avanzando en complejidad, esta función se queda corta. La principal desventaja de la función Serial Plotter es que únicamente se puede dibujar una variable cada vez (han actualizado la función y permite visualizar mas variables), lo que limita mucho sus posibilidades de uso.

Una de las herramientas para procesamiento de datos más potente que conozco es Matlab. Permite además leer el puerto serie y graficar tantas variables como queramos, procesar la información de forma bastante fácil.

Código para Arduino y Matlab.

Para el siguiente ejemplo vamos a crear 4 variables aleatorias utilizando la función random() de Arduino y después las enviaremos al PC donde las visualizaremos utilizando Matlab. El código Arduino es muy sencillo de entender, simplemente hay que enviar las 4 señales que queramos visualizar en Matlab formando un vector como hago en el siguiente sketch. Para no consumir demasiado tiempo en el envío de los datos solo enviamos una variable cada ciclo:

float loop_timer, senal_1, senal_2, senal_3, senal_4;
int t, loop_counter, periodo;

void setup() {
  Serial.begin(115200);  // Inicializamos el puerto serie
}

void loop() {

  while (micros() - loop_timer < 5000);  // Mandamos los datos a Matlab cada Xms
  loop_timer = micros();

  // Señales que queremos enviar
  senal_1 = random(10, 20);
  senal_2 = random(-20, -10);
  senal_3 = random(0, 10);
  senal_4 = random(-10, 0);

  // Enviamos las señales a Matlab por el puerto serie. MANTENER SIEMPRE ESTE FORATO!! Podéis añadir mas variables.
  if (loop_counter == 0)Serial.print(senal_1);
  if (loop_counter == 1)Serial.print("\t");
  if (loop_counter == 2)Serial.print(senal_2);
  if (loop_counter == 3)Serial.print("\t");
  if (loop_counter == 4)Serial.print(senal_3);
  if (loop_counter == 5)Serial.print("\t");
  if (loop_counter == 6)Serial.println(senal_4);

  loop_counter ++;
  if (loop_counter == 7)loop_counter = 0;

  t++;
  if (t == 10)t = 0;
}

Y el código de Matlab aquí:

clear all
close all
clc

format short
canal_serie = serial('COM4','BaudRate',115200,'Terminator', 'CR/LF');
fopen(canal_serie);
xlabel('Puntos'); ylabel('Datos');
grid on; hold on; grid minor;
prop = line(nan,nan,'Color','b','LineWidth',1);
prop1 = line(nan,nan,'Color','r','LineWidth',1);
prop2 = line(nan,nan,'Color','g','LineWidth',1);
prop3 = line(nan,nan,'Color','y','LineWidth',1);
legend('Senal 1','Senal 2','Senal 3', 'senal 4');  %% Podeis poner el mombre que querais. Las señales llegan en el mismo orden que las pongamos en Arduino
dato = fscanf(canal_serie, '%f %f %f %f',[4,1]); 

i = 1;
figure(1);
while 1 

    dato = fscanf(canal_serie, '%f %f %f %f',[4,1]);
    y(i) = dato(1,:);  %% POTENCIA
    x(i) = dato(2,:);  %% PITCH
    z(i) = dato(3,:);  %% ROLL
    t(i) = dato(4,:);  %% ROLL

    if i<1000      
    set(prop,'YData', y(1:i),'XData',(1:i));
    set(prop1,'YData', x(1:i),'XData',(1:i));
    set(prop2,'YData', z(1:i),'XData',(1:i));
    set(prop3,'YData', t(1:i),'XData',(1:i));
    end
    
    if i>1000      
    set(prop,'YData', y(i-1000:i),'XData',(i-1000:i));
    set(prop1,'YData', x(i-1000:i),'XData',(i-1000:i));
    set(prop2,'YData', z(i-1000:i),'XData',(i-1000:i));
    set(prop3,'YData', t(i-1000:i),'XData',(i-1000:i));
    end
    
    xlim([i-400 i])
    drawnow;
    i = i+1; 
end

Y esto es lo que veríamos en Matlab:

Lectura de variables en Matlab
Arduino & Matlab | Data Acquisition, Adquisición de datos (Code included)

El código es bastante fácil de entender y de modificar para adecuarlo a vuestras necesidades: se pueden visualizar las variables que queramos, se puede poner leyenda, podemos modificar los colores… Como veis, se abre un mundo de posibilidades.

5/5 - (6 votos)
10 Comentarios

Añadir un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *