boussole_bmm150.ino
Le BMM150 (12 bits, ±1300/±2500 µT) donne le champ magnétique brut : cap au magnétique par atan2, détection d’aimant ou d’ouverture de porte. Complément du quaternion fusionné quand on veut la matière première, pas la fusion.
Matériel requis
Une Arduino Nicla Sense ME (nRF52832 dans un module ANNA-B112, BLE seul, pas de Wi-Fi) avec hub capteurs Bosch BHI260AP, magnétomètre BMM150, baromètre BMP390, capteur de gaz BME688, LED RVB sur pilote I2C et chargeur LiPo BQ25120. La carte seule. Pour la boussole, éloigner la carte de la masse métallique du bureau et du haut-parleur du PC pendant la lecture.
Câblage
Aucun câblage. Le BMM150 est sur un bus I2C dédié (docs-db) — le hub s’en occupe, rien à faire côté broches.
Fonctionnement
SensorMag suit le même patron BHY2 (begin/checkNewData/x-y-z en µT). Le cap = atan2(y,x) ramené 0-360° ; à corriger de la déclinaison locale pour le nord géographique.
Exécution
Programmation via Arduino IDE (core ArduinoCore-mbed, target NICLA_SENSE_ME) ; bibliothèques Arduino_BHY2 (capteurs) et Nicla_System (LED, chargeur) ; USB via pont série SAMD11.
Variantes
Calibrer les offsets durs/mous (mouvement en huit), détecter le passage d’un objet ferreux par écart à la norme au repos, ou logger le cap pour un enregistreur de trajectoire.
boussole_bmm150.ino
// BMM150 : magnétomètre 3 axes (±1300/±2500 µT) derrière le hub.
// Attention : le hub compense gyro+acc+mag pour l'orientation ;
// ici on lit le champ brut pour une boussole ou un détecteur
// de métal / d'ouverture de porte.
#include "Arduino_BHY2.h"
SensorMag mag(0);
void setup() {
Serial.begin(115200);
BHY2.begin();
mag.begin();
BHY2.update();
Serial.println("Magnétomètre prêt (µT)");
}
void loop() {
BHY2.update();
if (mag.checkNewData()) {
float x = mag.x(), y = mag.y(), z = mag.z();
// Cap magnétique : atan2 sur le plan horizontal
float cap = atan2f(y, x) * 57.2958;
if (cap < 0) cap += 360.0;
Serial.print("X="); Serial.print(x);
Serial.print(" Y="); Serial.print(y);
Serial.print(" Z="); Serial.print(z);
Serial.print(" uT cap="); Serial.println(cap);
}
delay(50);
}