Objectifs
- Comprendre le bus I2C interne de l'M5Stack : SDA = GPIO21, SCL = GPIO22, partagé entre le Grove PORT.A (rouge), l'IP5306 (adresse 0x75) et l'IMU des modèles Gray.
- Écrire un scanner I2C pour découvrir les périphériques présents.
- Lire le niveau de batterie via la puce d'alimentation IP5306 (jauge à 5 paliers de tension, pas un vrai fuel-gauge).
- Rappeler les pièges de variantes : Basic = pas d'IMU ; Gray = MPU6050+MAG3110, puis MPU9250, puis MPU6886+BMM150 selon la date de fabrication.
Matériel
- 1 M5Stack Core (Basic ou Gray).
- Optionnel : 1 capteur Grove I2C sur PORT.A (rouge).
- Broches 3,3 V uniquement sur le connecteur Grove.
Code complet
#include <M5Unified.h>
#include <Wire.h>
void scannerI2C {
Serial.println("Scan I2C (SDA=21, SCL=22) :");
for (uint8_t a = 1; a < 127; a++) {
Wire.beginTransmission(a);
if (Wire.endTransmission == 0) Serial.printf(" trouve 0x%02X\n", a);
}
}
void setup {
Serial.begin(115200);
auto cfg = M5.config;
M5.begin(cfg); // M5Unified initialise I2C et l'IP5306
Wire.begin(21, 22); // SDA, SCL (PORT.A / M-BUS)
scannerI2C; // 0x75 = IP5306 ; 0x68 = IMU (Gray seulement)
M5.Display.setTextSize(2);
}
void loop {
int niveau = M5.Power.getBatteryLevel; // 0..100 par paliers IP5306
M5.Display.fillRect(0, 30, 320, 60, TFT_BLACK);
M5.Display.setCursor(10, 35);
M5.Display.printf("Batterie : %d %%", niveau);
M5.Display.drawRect(10, 100, 300, 30, TFT_WHITE);
M5.Display.fillRect(12, 102, 296 * constrain(niveau, 0, 100) / 100, 26,
niveau > 30 ? TFT_GREEN : TFT_RED);
Serial.printf("Batterie %d%%\n", niveau);
vTaskDelay(2000 / portTICK_PERIOD_MS);
}
Vérification attendue
- Le scan liste au minimum 0x75 (IP5306) ; sur un Gray, une adresse d'IMU (0x68, parfois 0x10 pour le magnétomètre BMM150) apparaît aussi.
- L'écran affiche un pourcentage et une barre colorée ; débrancher le USB fait baisser la tension et la barre par paliers (la jauge IP5306 est grossière : 5 paliers de tension).
- Un capteur Grove I2C sur PORT.A apparaît dans le scan à son adresse propre.
Erreurs fréquentes
- Chercher un IMU sur un Basic : il n'y en a pas (l'IMU est une fonctionnalité Gray) — le code « IMU » échoue silencieusement.
- Coder en dur une adresse/puce IMU : le fabricant a changé de capteur plusieurs fois (MPU6050 → MPU9250 → MPU6886+BMM150, ou SH200Q) ; il faut détecter au scan.
- Attendre une précision de jauge : le % IP5306 est une table de paliers de tension (ex. 3,81-3,55 V = « 50 % »).
- Oublier Wire.begin(21, 22) avec un usage direct de Wire : bus muet.
- Penser que 0 % = 0 V : la batterie LiPo 110 mAh coupe bien avant ; ne pas vider la batterie à blanc.