Objetivos
- Comprender el bus I2C interno de la M5Stack: SDA = GPIO21, SCL = GPIO22, compartido entre el Grove PORT.A (rojo), el IP5306 (dirección 0x75) y la IMU de los modelos Gray.
- Escribir un escáner I2C para descubrir los periféricos presentes.
- Leer el nivel de batería a través del chip de alimentación IP5306 (indicador de 5 niveles de voltaje, no un verdadero fuel-gauge).
- Recordar las trampas de las variantes: Basic = sin IMU; Gray = MPU6050+MAG3110, luego MPU9250, luego MPU6886+BMM150 según la fecha de fabricación.
Material
- 1 M5Stack Core (Basic o Gray).
- Opcional: 1 sensor Grove I2C en el PORT.A (rojo).
- Pines de 3,3 V únicamente en el conector Grove.
Código completo
#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);
}
Verificación esperada
- El escaneo lista como mínimo 0x75 (IP5306); en un Gray, también aparece una dirección de la IMU (0x68, a veces 0x10 para el magnetómetro BMM150).
- La pantalla muestra un porcentaje y una barra de color; desenchufar el USB hace bajar el voltaje y la barra por niveles (el indicador IP5306 es aproximado: 5 niveles de voltaje).
- Un sensor Grove I2C en el PORT.A aparece en el escaneo con su propia dirección.
Errores frecuentes
- Buscar una IMU en un Basic: no la tiene (la IMU es una funcionalidad de la Gray) — el código de la «IMU» falla silenciosamente.
- Codificar una dirección/chip de IMU de forma fija: el fabricante ha cambiado de sensor varias veces (MPU6050 → MPU9250 → MPU6886+BMM150, o SH200Q); hay que detectarlo mediante el escaneo.
- Esperar una precisión de indicador: el % del IP5306 es una tabla de niveles de voltaje (ej. 3,81-3,55 V = «50 %»).
- Olvidar Wire.begin(21, 22) con un uso directo de Wire: bus mudo.
- Pensar que 0 % = 0 V: la batería LiPo de 110 mAh se corta mucho antes; no vaciar la batería por completo.