rotation_fusion.ino
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);
}