inclinometre.ino

M5StickC Plus2 (M5Stack) — kit portable « stick » ESP32-PICO-V3-02 (SKU K016-P2) · Fichier : inclinometre.ino · Langage : Arduino · Usage : Lire l'accéléromètre et afficher l'inclinaison

L'IMU MPU6886 donne le vecteur gravité : deux atan2 et le stick devient niveau à bulle numérique, bille incluse. Le filtre n'est même pas nécessaire pour de l'inclinaison statique.

Matériel requis

Un M5StickC Plus2 (ESP32-PICO-V3-02, écran 135×240, boutons A/B/C, buzzer passif G2, IR + LED rouge G19, IMU MPU6886, micro, batterie 200 mAh). Aucun.

Branchement

Aucun câblage ; MPU6886 sur le bus I2C interne (adresse 0x68).

Fonctionnement

getAccel renvoie l'accélération en g par axe ; roll/pitch se déduisent par atan2 du vecteur gravité. La bille est le même angle mappé sur les coordonnées écran. Dans l'Arduino IDE (paquet esp32), carte « M5StickCPlus2 » ; bibliothèque « M5StickCPlus2 » ou M5Unified. Sur la v2 sans PMIC, maintenez le bouton C > 2 s pour allumer ; HOLD (G4) maintient l'alimentation.

Pour aller plus loin

Compteur de pas par seuil sur |a|, détecteur de chute (chute de la norme), ou pilotage de jeu avec le poignet.

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);
}

← Retour à la fiche