🛠 Tracer une courbe d'accélération en temps réel
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
- 1× M5StickC Plus2 (v2)
- Câble USB-C pour le téléversement
- Arduino IDE / PlatformIO, bibliothèque M5Unified (M5GFX inclus)
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
- Redessiner tout l'écran à chaque tour : on obtient du scintillement ; dessiner colonne par colonne comme ici.
- Oublier d'effacer l'ancienne valeur de la colonne avant d'écrire la nouvelle → traînée verticale.
- Échelle verticale mal bornée : sans clamp dans
yDe, les pics sortent de l'écran et le tracé saute en haut/bas. - Coordonnées en portrait alors que
setRotation(1)est actif : le tampon doit faire 240 colonnes, pas 135. - Trop
vTaskDelay: courbe hachée ; trop peu : l'I2C de l'IMU (bus G21/G22 partagé avec le RTC) sature le rendu.
Autres tutoriels pour cette carte
Exemples de code pour cette carte
hello-stick.inoArduinoboutons.inoArduinobuzzer.inoArduinoinclinometre.inoArduinohorloge.inoArduinoir-tv.inoArduino