Como leer variables de Arduino en Matlab
Índice:
- Conceptos generales sobre drones
- Material necesario y montaje de los componentes hardware
- Mando RC y receptor. Programación en Arduino
- MPU6050 y su programación en Arduino
- Batería LiPo
- Control de estabilidad y PID
- Motores, ESC y su programación en Arduino
- Calibración de hélices y motores
- Software completo y esquema detallado
- Probando el software completo antes de volar
- → 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.
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:
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.
Impresionante trabajo y detalle en cada punto, gran proyecto.
Gracias por compartirlo será muy util para muchas mentes inquietas (me incluyo) 😉
Saludos!
Buenas Manu!! como se agradecen estos comentarios 🙂
Gracias!
Muchas gracias por compartirnos su tiempo y proyecto amigo
Super util y entendible
😉
Excelente trabajo!…
Es uno si no el más completo que he visto en la red.
Gracias por compartirlo.
Mil gracias Jorge! 🙂
¡¡Enorme Trabajo!!… ¡Muy didáctico!… Y muy loable la disposición para compartirlo. Hay un montón de cosas para aprender. Gracias y por un 2021 que sea mucho mejor para todos. Saludos.
Hola, he montado el arduino perfectamente sin problemas y los programas de calibración de motores me van perfectamente pero, al cargar el último programa, el drone se queda girando los motores mientras pita sin parar. No controlamos mucho el tema de programación y no sé si puede ser un tema de batería del drone o el mando pero si pudieses darnos alguna pista de dónde está el problema nos harías un favor. Gracias.
No le puse pantalla lcd, y los motores no giran completamente, se quedan haciendo pequeños movimientos como si estuviesen calibrandose, sin llegar a completarlo.
Gracias !!!!
Muy buena la explicacion de todo.