rotation_fusion.ino

Arduino Nicla Sense ME · Archivo : rotation_fusion.ino · Lenguaje : Arduino · Uso : Lire l’orientation fusionnée (quaternion)

El BHI260AP ejecuta la fusión Bosch BSX en su propio núcleo: el cuaternión de orientación (acelerómetro + giro + brújula) llega calculado, sin gastar el nRF52832. La actitud del objeto en 23×23 mm: base de un estabilizador o seguidor de gestos.

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. Mantenerla quieta unos segundos al arrancar: el hub se alinea (giroscópico + magnético).

Cableado

Sin cableado. Alejar grandes masas metálicas e imanes del magnetómetro para una fusión limpia (el BMM150 es sensible a perturbaciones férreas).

Funcionamiento

SensorQuaternion se activa como los demás sensores BHY2; el hub empuja el cuaternión fusionado; el ejemplo deriva el alabeo con atan2. La fusión sigue válida incluso en movimiento lento.

Ejecución

Programación desde Arduino IDE (core ArduinoCore-mbed); librerías Arduino_BHY2 y Nicla_System; USB por puente serie.

Variantes

Cambiar a SensorEuler si existe para ángulos directos, enviar el cuaternión por BLE para RA, o combinar con el contador de pasos del hub para un tracker de actividad.

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

← Volver a la ficha