Saltar al contenido principal

Módulo BNO055 BMP280

Este módulo combina dos sensores en una sola placa:

  • BNO055: Sensor de orientación absoluta de 9 grados de libertad (acelerómetro, giroscopio, magnetómetro) con fusión de sensores integrada.
  • BMP280: Sensor de presión barométrica y temperatura de alta precisión.

Perfecto para proyectos de robótica, navegación inercial, drones, monitoreo ambiental y IoT.

Características

  • BNO055

    CaracterísticaDescripción
    Fusión de sensores integradacuaterniones, ángulos Euler, vectores de gravedad, etc.
    Rangos del acelerómetro±2/4/8/16 g
    Rangos del giroscopio±125/250/500/1000/2000 °/s
    Rangos del magnetómetro±1.3/1.9/2.5/4.0/4.7/5.6/8.1 gauss
    ProtocoloI²C, UART (selección mediante PS0/PS1)
  • BMP280

    CaracterísticaDescripción
    Rango de presión300…1100 hPa (±10…+1 m)
    Precisión de temperatura±1 °C
    ProtocoloI²C, UART, SWD

Aplicaciones del Módulo

AplicaciónDescripción
📈 Estación meteorológica portátilMide temperatura, humedad y presión con precisión.
🪂 Altímetro / variómetroCalcula la altitud basada en la presión atmosférica.
🧍 Seguimiento de posturaDetecta inclinación o rotación del cuerpo.
🛰️ Navegación inercialRastrea movimiento y orientación sin GPS.
🕹️ Realidad aumentada / virtualProporciona orientación para entornos 3D.
🚁 Controlador de vueloEstabilización para drones o robots.
🤖 Interfaz de gestosUsa movimiento para controlar dispositivos.
🌐 Registro ambiental IoTRecopila y transmite condiciones ambientales.

Código de Ejemplo


#include <Wire.h>
#include <Adafruit_Sensor.h>
#include <Adafruit_BNO055.h>
#include <Adafruit_BMP280.h>
#include <utility/imumaths.h>

// BNO055: orientación y movimiento
Adafruit_BNO055 bno(55, 0x28, &Wire);

// BMP280: temperatura y presión
Adafruit_BMP280 bmp;
Adafruit_Sensor* bmp_temp = bmp.getTemperatureSensor();
Adafruit_Sensor* bmp_pressure = bmp.getPressureSensor();

void setup() {
Serial.begin(115200);
while (!Serial);

// Inicializar BNO055
if (!bno.begin()) {
Serial.println("{\"error\":\"BNO055 no detectado\"}");
while (1);
}
delay(1000); // Estabilizar BNO055

// Inicializar BMP280 en dirección 0x76
if (!bmp.begin(0x76)) {
Serial.println("{\"error\":\"BMP280 no detectado en 0x76\"}");
while (1);
}

bmp.setSampling(Adafruit_BMP280::MODE_NORMAL,
Adafruit_BMP280::SAMPLING_X2,
Adafruit_BMP280::SAMPLING_X16,
Adafruit_BMP280::FILTER_X16,
Adafruit_BMP280::STANDBY_MS_500);
}

void loop() {
// Eventos del BNO055
sensors_event_t orientation, gyro, linearAccel, magnetometer, accel, gravity;
bno.getEvent(&orientation, Adafruit_BNO055::VECTOR_EULER);
bno.getEvent(&gyro, Adafruit_BNO055::VECTOR_GYROSCOPE);
bno.getEvent(&linearAccel, Adafruit_BNO055::VECTOR_LINEARACCEL);
bno.getEvent(&magnetometer, Adafruit_BNO055::VECTOR_MAGNETOMETER);
bno.getEvent(&accel, Adafruit_BNO055::VECTOR_ACCELEROMETER);
bno.getEvent(&gravity, Adafruit_BNO055::VECTOR_GRAVITY);

// BMP280: temperatura y presión
sensors_event_t temp_event, pressure_event;
bmp_temp->getEvent(&temp_event);
bmp_pressure->getEvent(&pressure_event);

// Calibración BNO055
int8_t temp_bno = bno.getTemp();
uint8_t sys, gyroCal, accelCal, magCal;
bno.getCalibration(&sys, &gyroCal, &accelCal, &magCal);

// JSON OUTPUT
Serial.print("{");

// BMP280
Serial.print("\"bmp280\":{\"temperature\":"); Serial.print(temp_event.temperature, 2);
Serial.print(",\"pressure\":"); Serial.print(pressure_event.pressure, 2); Serial.print("},");

// BNO055 - orientación
Serial.print("\"orientation\":{\"x\":"); Serial.print(orientation.orientation.x, 2);
Serial.print(",\"y\":"); Serial.print(orientation.orientation.y, 2);
Serial.print(",\"z\":"); Serial.print(orientation.orientation.z, 2); Serial.print("},");

// BNO055 - giroscopio
Serial.print("\"gyroscope\":{\"x\":"); Serial.print(gyro.gyro.x, 2);
Serial.print(",\"y\":"); Serial.print(gyro.gyro.y, 2);
Serial.print(",\"z\":"); Serial.print(gyro.gyro.z, 2); Serial.print("},");

// BNO055 - aceleración lineal
Serial.print("\"linear_accel\":{\"x\":"); Serial.print(linearAccel.acceleration.x, 2);
Serial.print(",\"y\":"); Serial.print(linearAccel.acceleration.y, 2);
Serial.print(",\"z\":"); Serial.print(linearAccel.acceleration.z, 2); Serial.print("},");

// BNO055 - magnetómetro
Serial.print("\"magnetometer\":{\"x\":"); Serial.print(magnetometer.magnetic.x, 2);
Serial.print(",\"y\":"); Serial.print(magnetometer.magnetic.y, 2);
Serial.print(",\"z\":"); Serial.print(magnetometer.magnetic.z, 2); Serial.print("},");

// BNO055 - aceleración total
Serial.print("\"acceleration\":{\"x\":"); Serial.print(accel.acceleration.x, 2);
Serial.print(",\"y\":"); Serial.print(accel.acceleration.y, 2);
Serial.print(",\"z\":"); Serial.print(accel.acceleration.z, 2); Serial.print("},");

// BNO055 - gravedad
Serial.print("\"gravity\":{\"x\":"); Serial.print(gravity.acceleration.x, 2);
Serial.print(",\"y\":"); Serial.print(gravity.acceleration.y, 2);
Serial.print(",\"z\":"); Serial.print(gravity.acceleration.z, 2); Serial.print("},");

// Temperatura interna y calibración
Serial.print("\"bno055_temp\":"); Serial.print(temp_bno); Serial.print(",");
Serial.print("\"calibration\":{\"sys\":"); Serial.print(sys);
Serial.print(",\"gyro\":"); Serial.print(gyroCal);
Serial.print(",\"accel\":"); Serial.print(accelCal);
Serial.print(",\"mag\":"); Serial.print(magCal); Serial.print("}");

Serial.println("}");
delay(500);
}