🛠 Tracer une courbe d'accélération en temps réel

M5StickC Plus2 (M5Stack) — kit portable « stick » ESP32-PICO-V3-02 (SKU K016-P2) · intermediaire · Schéma : IMG-m5stack-stick-c-plus-2-intermediaire-1-m5stick-c2-courbe-imu.svg — Écran de la M5StickC Plus2 en paysage 240×135 affichant une courbe défilante de la norme d'accélération avec grille de repères et tampon circulaire de 240 échantillons.

Objectifs

Dessiner en temps réel la courbe de la norme d'accélération sur l'écran 240×135 (rotation 1) grâce à un tampon circulaire de 240 échantillons — un par colonne de pixels — et aux primitives graphiques de M5GFX (drawLine, fillRect). Technique de base pour tout oscilloscope ou enregistreur graphique sur ce stick.

Matériel

Code complet

// Oscilloscope d'accélération — tampon circulaire 240 colonnes (écran 240x135)
#include <M5Unified.h>

const int W = 240, H = 135, N = 240;
float buf[N];
int tete = 0;                 // prochaine position d'écriture
const float GMIN = -0.5f, GMAX = 3.0f;   // échelle verticale en g

int yDe(float g) {            // g -> coordonnée écran
  if (g < GMIN) g = GMIN; if (g > GMAX) g = GMAX;
  return H - 1 - (int)((g - GMIN) / (GMAX - GMIN) * (H - 1));
}

void setup {
  auto cfg = M5.config;
  M5.begin(cfg);
  M5.Display.setRotation(1);
  M5.Display.fillScreen(TFT_BLACK);
  M5.Display.setTextColor(TFT_DARKGREY, TFT_BLACK);
  M5.Display.setTextSize(1);
  for (int g = 0; g <= 3; g++)          // grille : 0, 1, 2, 3 g
    M5.Display.drawFastHLine(0, yDe(g), W, TFT_DARKGREY);
}

void loop {
  M5.update;
  float ax, ay, az;
  M5.Imu.getAccel(&ax, &ay, &az);
  float norme = sqrtf(ax * ax + ay * ay + az * az);
  int yAvant = yDe(buf[tete]);          // ancienne valeur de la colonne
  buf[tete] = norme;
  int yApres = yDe(norme);
  M5.Display.drawLine(tete, yAvant, tete, yApres, TFT_BLACK);  // efface colonne
  M5.Display.drawLine(tete, yApres, (tete + 1) % N, yDe(buf[(tete + 1) % N]), TFT_GREEN);
  M5.Display.setCursor(150, 0);
  M5.Display.setTextColor(TFT_GREEN, TFT_BLACK);
  M5.Display.printf("|a| %4.2f g", norme);
  tete = (tete + 1) % N;
  vTaskDelay(20 / portTICK_PERIOD_MS);
  if (M5.BtnB.wasPressed) {           // B = remise à zéro de l'écran
    M5.Display.fillScreen(TFT_BLACK);
    for (int g = 0; g <= 3; g++) M5.Display.drawFastHLine(0, yDe(g), W, TFT_DARKGREY);
  }
}

Vérification attendue

Au repos, la courbe verte est plate à 1 g ; taper sur la table ou secouer le stick produit des pics visibles. La grille grise marque 0/1/2/3 g. Le bouton B efface et redessine la grille.

Erreurs fréquentes

Autres tutoriels pour cette carte

Exemples de code pour cette carte

← Retour à la fiche 🛠 Tous les tutoriels