inclinometre.ino
La IMU MPU6886 da el vector gravedad: dos atan2 y el stick se vuelve un nivel de burbuja digital, burbuja incluida. El filtro ni hace falta para inclinación estática.
Hardware necesario
Un M5StickC Plus2 (ESP32-PICO-V3-02, pantalla de 135×240, botones A/B/C, zumbador pasivo en G2, IR + LED rojo en G19, IMU MPU6886, micrófono, batería de 200 mAh). Ninguno.
Cableado
Sin cableado; MPU6886 en el bus I2C interno (dirección 0x68).
Funcionamiento
getAccel devuelve aceleración en g por eje; roll/pitch salen del atan2 del vector gravedad. La burbuja es el mismo ángulo mapeado a coordenadas de pantalla. En el Arduino IDE (paquete esp32), placa « M5StickCPlus2 »; biblioteca « M5StickCPlus2 » o M5Unified. En la v2 sin PMIC, mantenga el botón C más de 2 s para encender; HOLD (G4) mantiene la alimentación.
Para ir más lejos
Contador de pasos por umbral en |a|, detector de caídas (caída de la norma), o juego controlado por muñeca.
inclinometre.ino
// MPU6886 : inclinaison en degres via M5.Imu (M5Unified).
#include <M5Unified.h>
void setup() {
auto cfg = M5.config();
M5.Imu.setRotation(M5_IMU_COORDS_SYSTEM_ESP32);
M5.begin(cfg);
M5.Display.setRotation(1);
}
void loop() {
M5.update();
M5.Imu.update();
auto data = M5.Imu.getAccel();
// data.x/y/z en g ; angle = atan2 sur le plan pertinent
float roll = atan2f(data.y, data.z) * 180.0f / M_PI;
float pitch = atan2f(-data.x, sqrtf(data.y * data.y + data.z * data.z))
* 180.0f / M_PI;
M5.Display.fillRect(0, 0, 240, 135, TFT_BLACK);
M5.Display.setTextSize(2);
M5.Display.setCursor(6, 6);
M5.Display.printf("roll %+6.1f\n", roll);
M5.Display.printf("pitch %+6.1f\n", pitch);
// bille : position d'un point selon l'inclinaison
int x = 120 + constrain((int)roll, -45, 45) * 2;
int y = 68 - constrain((int)pitch, -30, 30);
M5.Display.fillCircle(x, y, 6, TFT_CYAN);
delay(50);
}