boussole_bmm150.ino
El BMM150 (12 bits, ±1300/±2500 µT) da el campo magnético crudo: rumbo magnético por atan2, detección de imán o apertura de puerta. Complemento del cuaternión fusionado cuando quieres la materia prima, no la fusión.
Hardware
Una Arduino Nicla Sense ME (nRF52832, solo BLE) con hub Bosch BHI260AP, BMM150, BMP390, BME688, LED RGB en driver I2C y cargador LiPo. La placa sola. Para la brújula, alejarla del metal del escritorio y del altavoz del PC durante la lectura.
Cableado
Sin cableado. El BMM150 va en un bus I2C dedicado (docs-db): el hub se ocupa, nada que hacer en los pines.
Funcionamiento
SensorMag sigue el mismo patrón BHY2 (begin/checkNewData/x-y-z en µT). El rumbo = atan2(y,x) llevado a 0-360°; corregirlo por la declinación local para el norte geográfico.
Ejecución
Programación desde Arduino IDE (core ArduinoCore-mbed); librerías Arduino_BHY2 y Nicla_System; USB por puente serie.
Variantes
Calibrar offsets duros/blandos (movimiento en ocho), detectar paso de objetos férreos por desviación de la norma en reposo, o registrar el rumbo para un trazador de trayectoria.
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);
}