bno055 — Controlador IMU BNO055

Este módulo proporciona un controlador para el sensor de orientación absoluta de 9 ejes Bosch BNO055 a través de I2C. El BNO055 fusiona los datos del acelerómetro, el magnetómetro y el giroscopio en el propio chip y expone salidas de cuaternión, ángulos de Euler, aceleración lineal y gravedad, además de los canales de sensor en bruto.

Ejemplo de uso:

import time
from machine import I2C
import bno055

bus = I2C(1)
imu = bno055.BNO055(bus)

while True:
    print(imu.euler())
    time.sleep_ms(100)

Clases

class bno055.BNO055(bus: machine.I2C, address: int = 0x28, mode: int = NDOF_MODE, axis: bytes = AXIS_P4)

Construye una instancia del controlador BNO055.

  • bus es un objeto de bus machine.I2C configurado que se utiliza para comunicarse con el sensor.

  • address es la dirección I2C de 7 bits del dispositivo. El valor predeterminado es 0x28.

  • mode es el modo de operación en el que se coloca el dispositivo después del reinicio. Consulta las constantes de modo de operación más abajo. El valor predeterminado es NDOF_MODE.

  • axis es un valor de configuración de reasignación de ejes de 2 bytes. Consulta las constantes de colocación de ejes más abajo. El valor predeterminado es AXIS_P4.

El constructor verifica el ID del chip, realiza un reinicio por software, cambia a la alimentación normal, aplica la configuración de ejes y entra en el modo de operación solicitado utilizando el oscilador externo. Lanza RuntimeError si los valores esperados de los registros de ID no se leen correctamente.

read_registers(register: int, size: int = 1) bytes

Lee size bytes del registro de dispositivo indicado y los devuelve como un objeto bytes.

write_registers(register: int, data: bytes) None

Escribe los bytes data indicados en el dispositivo comenzando en register.

operation_mode(mode: int = None) int

Obtiene o establece el registro de modo de operación. Sin argumentos, devuelve el modo actual como un int. Con un argumento mode, escribe el nuevo modo en el dispositivo. Consulta las constantes de modo de operación más abajo.

system_trigger(data: int) None

Escribe data en el registro de disparo del sistema (0x3F). Esto se utiliza internamente para emitir un reinicio por software (0x20) y para seleccionar el oscilador externo (0x80).

power_mode(mode: int = None) bytes

Obtiene o establece el registro de modo de alimentación. Sin argumentos, devuelve el contenido actual del registro de modo de alimentación. Con un argumento mode, escribe el nuevo modo de alimentación en el dispositivo.

page(num: int = None) None

Obtiene o establece la página de registros. Sin argumentos, lee el registro de página actual. Con un argumento num, selecciona la página.

temperature() int

Devuelve el valor del registro de temperatura del chip como un byte sin signo.

read_id() bytes

Devuelve el bloque de ID de 4 bytes leído del registro 0x00. El valor esperado es b'\xA0\xFB\x32\x0F'.

axis(placement: bytes = None) bytes

Obtiene o establece la configuración de reasignación de ejes. Sin argumentos, devuelve la configuración de ejes actual de 2 bytes. Con un argumento placement, escribe la configuración de ejes de 2 bytes proporcionada. Usa una de las constantes AXIS_P0..``AXIS_P7`` más abajo.

quaternion() list

Devuelve la orientación fusionada como una lista de 4 elementos [w, x, y, z] de números de punto flotante escalados al rango del cuaternión unitario.

euler() list

Devuelve la orientación fusionada como una lista de 3 elementos [yaw, roll, pitch] de números de punto flotante en grados.

accelerometer() list

Devuelve la lectura del acelerómetro como una lista de 3 elementos [x, y, z] de números de punto flotante en m/s^2.

magnetometer() list

Devuelve la lectura del magnetómetro como una lista de 3 elementos [x, y, z] de números de punto flotante en micro-Teslas.

gyroscope() list

Devuelve la lectura del giroscopio como una lista de 3 elementos [x, y, z] de números de punto flotante en grados por segundo.

linear_acceleration() list

Devuelve la aceleración lineal compensada por gravedad como una lista de 3 elementos [x, y, z] de números de punto flotante en m/s^2.

gravity() list

Devuelve el vector de gravedad como una lista de 3 elementos [x, y, z] de números de punto flotante en m/s^2.

Constantes

Modos de operación

bno055.CONFIG_MODE: int

Modo de configuración (0x00). El dispositivo debe estar en este modo para cambiar los registros de configuración.

bno055.ACCONLY_MODE: int

Modo sin fusión, solo acelerómetro (0x01).

bno055.MAGONLY_MODE: int

Modo sin fusión, solo magnetómetro (0x02).

bno055.GYRONLY_MODE: int

Modo sin fusión, solo giroscopio (0x03).

bno055.ACCMAG_MODE: int

Modo sin fusión, acelerómetro + magnetómetro (0x04).

bno055.ACCGYRO_MODE: int

Modo sin fusión, acelerómetro + giroscopio (0x05).

bno055.MAGGYRO_MODE: int

Modo sin fusión, magnetómetro + giroscopio (0x06).

bno055.AMG_MODE: int

Modo sin fusión, acelerómetro + magnetómetro + giroscopio (0x07).

bno055.IMUPLUS_MODE: int

Modo de fusión IMU usando acelerómetro + giroscopio (0x08).

bno055.COMPASS_MODE: int

Modo de fusión de brújula usando acelerómetro + magnetómetro (0x09).

bno055.M4G_MODE: int

Modo de fusión de magnetómetro como giroscopio (0x0A).

bno055.NDOF_FMC_OFF_MODE: int

Modo de fusión de 9 grados de libertad con la calibración rápida del magnetómetro deshabilitada (0x0B).

bno055.NDOF_MODE: int

Modo de fusión de 9 grados de libertad con la calibración rápida del magnetómetro habilitada (0x0C). Este es el modo predeterminado usado por el constructor.

Colocaciones de ejes

Los siguientes valores de 2 bytes se pasan a BNO055.axis() para reasignar el sistema de coordenadas del dispositivo. Cada constante es el par de registros (AXIS_MAP_CONFIG, AXIS_MAP_SIGN) de la hoja de datos del BNO055 (Sección 3.4, Axis remap), precodificado para una de las ocho orientaciones de colocación estándar.

Elige la constante cuyos ejes de salida coincidan con la forma en que el chip está montado físicamente en la PCB anfitriona:

Constante

Salida X

Salida Y

Salida Z

Bytes

Montaje

AXIS_P0

-Yc

+Xc

+Zc

21 04

boca arriba, 90° en sentido antihorario respecto a P1

AXIS_P1

+Xc

+Yc

+Zc

24 00

boca arriba, predeterminado de la hoja de datos

AXIS_P2

-Xc

-Yc

+Zc

24 06

boca arriba, rotado 180°

AXIS_P3

+Yc

-Xc

+Zc

21 02

boca arriba, 90° en sentido horario respecto a P1

AXIS_P4

+Xc

-Yc

-Zc

24 03

boca abajo, volteado sobre el eje X (predeterminado del constructor)

AXIS_P5

+Yc

+Xc

-Zc

21 01

boca abajo, rotado 90° en sentido antihorario respecto a P4

AXIS_P6

-Yc

-Xc

-Zc

21 07

boca abajo, rotado 180° respecto a P4

AXIS_P7

-Xc

+Yc

-Zc

24 05

boca abajo, rotado 90° en sentido horario respecto a P4

Xc / Yc / Zc denotan los ejes intrínsecos del chip (tal como están impresos en la hoja de datos del BNO055). Las columnas «Salida» son los ejes que el dispositivo entrega a través de BNO055.euler(), BNO055.gyro(), etc. De P0 a P3 son las cuatro rotaciones de 90° del chip en la orientación con el lado de componentes hacia arriba; de P4 a P7 son las mismas cuatro rotaciones tras voltear el chip sobre su dorso.

bno055.AXIS_P0: bytes

Chip boca arriba, rotado 90° en sentido antihorario respecto a AXIS_P1. Ejes de salida: X = -Yc, Y = +Xc, Z = +Zc.

bno055.AXIS_P1: bytes

Chip boca arriba en la orientación predeterminada de la hoja de datos del BNO055. No se aplica ninguna reasignación: X = +Xc, Y = +Yc, Z = +Zc.

bno055.AXIS_P2: bytes

Chip boca arriba, rotado 180° respecto a AXIS_P1. Ejes de salida: X = -Xc, Y = -Yc, Z = +Zc.

bno055.AXIS_P3: bytes

Chip boca arriba, rotado 90° en sentido horario respecto a AXIS_P1. Ejes de salida: X = +Yc, Y = -Xc, Z = +Zc.

bno055.AXIS_P4: bytes

Chip volteado sobre su dorso (lado de componentes hacia abajo) respecto a AXIS_P1. Ejes de salida: X = +Xc, Y = -Yc, Z = -Zc. Esta es la colocación utilizada por el constructor de BNO055 cuando no se proporciona ningún argumento axis.

bno055.AXIS_P5: bytes

Chip boca abajo, rotado 90° en sentido antihorario respecto a AXIS_P4. Ejes de salida: X = +Yc, Y = +Xc, Z = -Zc.

bno055.AXIS_P6: bytes

Chip boca abajo, rotado 180° respecto a AXIS_P4. Ejes de salida: X = -Yc, Y = -Xc, Z = -Zc.

bno055.AXIS_P7: bytes

Chip boca abajo, rotado 90° en sentido horario respecto a AXIS_P4. Ejes de salida: X = -Xc, Y = +Yc, Z = -Zc.