rotation_fusion.ino

Arduino Nicla Sense ME · Fichier : rotation_fusion.ino · Langage : Arduino · Usage : Lire l’orientation fusionnée (quaternion)

Le BHI260AP exécute la fusion Bosch BSX dans son propre cœur : le quaternion d’orientation (accéléro + gyro + boussole) arrive tout calculé, sans consommer le nRF52832. L’assiette d’un objet en 23×23 mm, base d’un stabilisateur ou d’un suivi de geste.

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. Garder la carte immobile quelques secondes au démarrage : le hub s’aligne (gyroscopique + magnétique).

Câblage

Aucun câblage. Éloigner les grosses masses métalliques et aimants du magnétomètre pour une fusion propre (le BMM150 est sensible aux perturbations ferreuses).

Fonctionnement

SensorQuaternion s’active comme les autres capteurs BHY2 ; le hub pousse le quaternion fusionné ; l’exemple en dérive le roulis par atan2. La fusion reste valable même carte en mouvement lent.

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

Basculer sur SensorEuler si disponible pour des angles directs, envoyer le quaternion en BLE pour de la RV, ou combiner avec le pas-compteur du hub pour un tracker d’activité.

rotation_fusion.ino

// Fusion BSX du hub BHI260AP : quaternion d'orientation absolu
// (accéléro + gyro + magnétomètre fondus dans le hub, pas sur le
// nRF52832 — le CPU principal reste libre).

#include "Arduino_BHY2.h"

SensorQuaternion rotation(0);

void setup() {
  Serial.begin(115200);
  BHY2.begin();
  rotation.begin();
  BHY2.update();
}

void loop() {
  BHY2.update();

  if (rotation.checkNewData()) {
    Serial.print("q = [");
    Serial.print(rotation.w()); Serial.print(", ");
    Serial.print(rotation.x()); Serial.print(", ");
    Serial.print(rotation.y()); Serial.print(", ");
    Serial.print(rotation.z());
    Serial.println("]");

    // Exemple : angle de roulis dérivé du quaternion
    float roll = atan2f(2 * (rotation.w() * rotation.x() +
                             rotation.y() * rotation.z()),
                        1 - 2 * (rotation.x() * rotation.x() +
                                 rotation.y() * rotation.y()));
    Serial.print("roll = ");
    Serial.println(roll * 57.2958);   // rad -> degrés
  }
  delay(20);
}

← Retour à la fiche