Tutorial

Lectura de la IMU del M5Stack Core2 for AWS

Adquiere aceleraciones y velocidades angulares con PlatformIO/Arduino y actualiza un Gauge desde una aplicación MATLAB orientada a objetos.

En este tutorial programaremos el M5Stack Core2 for AWS desde Visual Studio Code con PlatformIO. El dispositivo leerá su unidad de medición inercial y enviará cada segundo las tres componentes de aceleración y las tres componentes de velocidad angular. MATLAB recibirá cada trama mediante un evento, ejecutará un callback y actualizará un control Gauge sin utilizar un ciclo de consulta continua.

Introducción

El M5Stack Core2 for AWS integra un microcontrolador ESP32, una pantalla táctil y una unidad de medición inercial, o IMU. Esta última combina un acelerómetro y un giroscopio de tres ejes. El acelerómetro mide las componentes ax, ay y az, mientras que el giroscopio proporciona las velocidades angulares gx, gy y gz.

M5Stack Core2 for AWS con sus principales componentes identificados
M5Stack Core2 for AWS con pantalla táctil, puerto USB-C, base de expansión e IMU integrada.

La aplicación dividirá el trabajo de manera natural. El ESP32 se encargará de acceder al sensor y respetar el periodo de muestreo. MATLAB interpretará los datos y actualizará la interfaz gráfica.

Cada segundo, el M5Stack enviará una línea con el formato siguiente:

Una trama real puede verse así:

Los tres primeros valores se expresan en unidades de gravedad, mientras que los tres últimos corresponden a grados por segundo.

La magnitud que mostrará el Gauge

Un Gauge representa una sola magnitud escalar. Para aprovechar las tres componentes del acelerómetro, mostraremos el ángulo de inclinación o “pitch”:

\[ \theta=\operatorname{\mbox{atan2}}\!\left(-a_x,\sqrt{a_y^2+a_z^2}\right). \]

Esta expresión estima la orientación respecto a la gravedad y produce un ángulo entre \(-90^\circ\) y \(90^\circ\). Funciona bien cuando el dispositivo está quieto o se mueve lentamente; durante movimientos rápidos, el acelerómetro también detecta aceleraciones distintas de la gravedad y el resultado deja de representar únicamente la orientación.

Esquema de orientación de los ejes de la IMU en el Core2 for AWS
Orientación de los ejes de la IMU en el Core2 for AWS.

Preparación de Visual Studio Code y PlatformIO

Para realizar la práctica se necesita el M5Stack Core2 for AWS, un cable USB-C con transmisión de datos, Visual Studio Code con la extensión PlatformIO IDE y MATLAB con soporte para el objeto serialport.

En la página principal de PlatformIO, selecciona New Project y utiliza esta configuración:

PlatformIO identifica la tarjeta mediante m5stack-core2. Esta definición es adecuada para el Core2 for AWS porque su unidad principal utiliza el hardware del Core2. La biblioteca M5Unified detecta la IMU disponible y ofrece una interfaz de alto nivel común para las versiones con MPU6886 y las revisiones que incorporan BMI270.

Configuración de PlatformIO

Al crear el proyecto aparecerán el archivo platformio.ini y la carpeta src. Sustituye el contenido de platformio.ini por lo siguiente:

La dependencia M5Unified proporciona una interfaz común para la pantalla, los botones, la alimentación y la IMU. También incorpora la dependencia gráfica M5GFX que necesita la pantalla.

Firmware para leer y transmitir la IMU

Abre src/main.cpp y sustituye su contenido por este programa:

La condición basada en millis() evita bloquear el microcontrolador durante un segundo completo. La resta entre valores sin signo conserva además un comportamiento correcto cuando se desborda el contador de millis().

M5.Imu.update() solicita una medición reciente. A continuación, M5.Imu.getImuData() devuelve una estructura con los vectores accel y gyro. El programa transmite seis valores con seis cifras decimales y termina cada trama con \n, es decir, con el carácter LF que MATLAB utilizará como terminador.

Compilación y carga del firmware

Conecta la tarjeta y ejecuta PlatformIO: Upload desde la barra inferior de Visual Studio Code. También puedes hacerlo desde la terminal del proyecto:

Después abre el monitor serial de PlatformIO:

La salida esperada es similar a esta:

Debe aparecer una línea IMU aproximadamente cada segundo. Cierra el monitor antes de abrir MATLAB, ya que dos programas no pueden utilizar simultáneamente el mismo puerto.

Identificación del puerto en MATLAB

Ejecuta la siguiente instrucción para mostrar los puertos disponibles:

En Windows aparecerá normalmente un nombre como COM7. En macOS puede verse como /dev/cu.SLAB_USBtoUART, /dev/cu.usbserial-... o /dev/cu.wchusbserial.... En Linux suele utilizarse /dev/ttyUSB0 o /dev/ttyACM0.

En macOS conviene elegir el dispositivo /dev/cu.* correspondiente, no el dispositivo /dev/tty.* del mismo convertidor.

Aplicación MATLAB orientada a objetos

Crea un archivo llamado LeerIMU.m con el código siguiente. Antes de ejecutarlo, sustituye el valor de portName por el puerto correspondiente a tu equipo:

Guarda el archivo y crea una instancia de la clase:

El constructor abrirá el puerto configurado en portName, creará la interfaz y dejará activo el callback serial. En Windows puedes usar un nombre como "COM7"; en macOS, uno como "/dev/cu.SLAB_USBtoUART".

Al inclinar el M5Stack alrededor del eje transversal, la aguja reaccionará cuando llegue la siguiente muestra. Como el periodo es de un segundo, la actualización se verá deliberadamente pausada.

Captura de pantalla de la aplicación MATLAB
Captura de pantalla de la aplicación MATLAB.

Cómo funciona el callback

La instrucción central es:

MATLAB no consulta periódicamente si llegaron datos. El objeto serialport, almacenado en app.Port, vigila el flujo de entrada y genera un evento cada vez que encuentra el terminador LF. La función anónima conserva la referencia a la aplicación y llama al método privado updateGauge, que realiza cuatro operaciones:

  1. Lee la línea completa mediante readline.
  2. Verifica que la trama comience con IMU y contenga seis valores.
  3. Calcula el ángulo de inclinación.
  4. Asigna el resultado a app.Gauge.Value y actualiza las etiquetas.

La clase hereda de handle, por lo que sus callbacks trabajan sobre la misma instancia. Al cerrar la ventana se ejecuta delete(app); este método desactiva la recepción asíncrona, elimina el objeto serial y cierra la interfaz, dejando disponible el puerto.

Cambiar la variable mostrada

Si se desea mostrar directamente la aceleración en el eje x, cambia los límites del Gauge:

Después sustituye:

por:

Para representar gx puede utilizarse, por ejemplo, un intervalo de \([-250,250]\) grados por segundo. Los límites adecuados dependen del rango del sensor y de la dinámica del experimento.

Problemas frecuentes

Alcance y posibles mejoras

El sistema demuestra una adquisición dirigida por eventos y evita el sondeo continuo desde MATLAB. Para estudiar movimientos rápidos conviene aumentar la frecuencia, agregar una marca de tiempo generada por el ESP32 y, si es necesario, transmitir bloques de muestras o paquetes binarios.

También puede combinarse el acelerómetro con el giroscopio mediante un filtro complementario o un filtro de Kalman. Esto permite obtener una estimación de orientación más estable que la calculada únicamente a partir de la gravedad.

La arquitectura puede ampliarse para construir registradores de movimiento, interfaces de instrumentación, detectores de caídas, sistemas de monitoreo y prototipos de control en los que el M5Stack funcione como una extensión física de MATLAB.

Bibliografía