boussole_bmm150.ino

Arduino Nicla Sense ME · Fichier : boussole_bmm150.ino · Langage : Arduino · Usage : Lire le magnétomètre BMM150

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);
}

← Retour à la fiche