bno055 --- BNO055 IMU 驱动

本模块提供通过 I2C 操作 Bosch BNO055 九轴绝对方位传感器的驱动。BNO055 在芯片内部融合加速度计、磁力计和陀螺仪数据,除原始传感器通道外,还提供四元数、欧拉角、线性加速度和重力输出。

用法示例:

import time
from machine import I2C
import bno055

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

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

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

构造一个 BNO055 驱动实例。

  • bus 是一个已配置的 machine.I2C 总线对象,用于与传感器通信。

  • address 是设备的 7 位 I2C 地址。默认为 0x28

  • mode 是设备复位后进入的操作模式。请参见下方的操作模式常量。默认为 NDOF_MODE

  • axis 是一个 2 字节的坐标轴重映射配置值。请参见下方的坐标轴放置常量。默认为 AXIS_P4

构造函数会校验芯片 ID、执行软复位、切换到正常电源模式、应用坐标轴配置,并使用外部振荡器进入所请求的操作模式。如果读回的 ID 寄存器值与预期不符,则引发 RuntimeError

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

从给定的设备寄存器读取 size 个字节,并将其作为 bytes 对象返回。

write_registers(register: int, data: bytes) None

将给定的 data 字节从 register 开始写入设备。

operation_mode(mode: int = None) int

获取或设置操作模式寄存器。不带参数时,以 int 形式返回当前模式。带 mode 参数时,将新模式写入设备。请参见下方的操作模式常量。

system_trigger(data: int) None

data 写入系统触发寄存器(0x3F)。它在内部用于发出软复位(0x20)以及选择外部振荡器(0x80)。

power_mode(mode: int = None) bytes

获取或设置电源模式寄存器。不带参数时,返回当前电源模式寄存器的内容。带 mode 参数时,将新电源模式写入设备。

page(num: int = None) None

获取或设置寄存器页。不带参数时,读取当前页寄存器。带 num 参数时,选择对应的页。

temperature() int

以无符号字节形式返回芯片温度寄存器的值。

read_id() bytes

返回从寄存器 0x00 读取的 4 字节 ID 块。预期值为 b'\xA0\xFB\x32\x0F'

axis(placement: bytes = None) bytes

获取或设置坐标轴重映射配置。不带参数时,返回当前的 2 字节坐标轴配置。带 placement 参数时,写入所提供的 2 字节坐标轴配置。请使用下方 AXIS_P0..``AXIS_P7`` 常量之一。

quaternion() list

以缩放到单位四元数范围的浮点数 4 元素列表 [w, x, y, z] 形式返回融合后的方位。

euler() list

以浮点数 3 元素列表 [yaw, roll, pitch](单位为度)形式返回融合后的方位。

accelerometer() list

以浮点数 3 元素列表 [x, y, z](单位为 m/s^2)形式返回加速度计读数。

magnetometer() list

以浮点数 3 元素列表 [x, y, z](单位为微特斯拉)形式返回磁力计读数。

gyroscope() list

以浮点数 3 元素列表 [x, y, z](单位为度每秒)形式返回陀螺仪读数。

linear_acceleration() list

以浮点数 3 元素列表 [x, y, z](单位为 m/s^2)形式返回经重力补偿后的线性加速度。

gravity() list

以浮点数 3 元素列表 [x, y, z](单位为 m/s^2)形式返回重力向量。

常量

操作模式

bno055.CONFIG_MODE: int

配置模式(0x00)。设备必须处于此模式才能更改配置寄存器。

bno055.ACCONLY_MODE: int

仅加速度计的非融合模式(0x01)。

bno055.MAGONLY_MODE: int

仅磁力计的非融合模式(0x02)。

bno055.GYRONLY_MODE: int

仅陀螺仪的非融合模式(0x03)。

bno055.ACCMAG_MODE: int

加速度计 + 磁力计的非融合模式(0x04)。

bno055.ACCGYRO_MODE: int

加速度计 + 陀螺仪的非融合模式(0x05)。

bno055.MAGGYRO_MODE: int

磁力计 + 陀螺仪的非融合模式(0x06)。

bno055.AMG_MODE: int

加速度计 + 磁力计 + 陀螺仪的非融合模式(0x07)。

bno055.IMUPLUS_MODE: int

使用加速度计 + 陀螺仪的 IMU 融合模式(0x08)。

bno055.COMPASS_MODE: int

使用加速度计 + 磁力计的指南针融合模式(0x09)。

bno055.M4G_MODE: int

以磁力计替代陀螺仪的融合模式(0x0A)。

bno055.NDOF_FMC_OFF_MODE: int

禁用快速磁力计校准的 9-DOF 融合模式(0x0B)。

bno055.NDOF_MODE: int

启用快速磁力计校准的 9-DOF 融合模式(0x0C)。这是构造函数使用的默认模式。

坐标轴放置

以下 2 字节值会传递给 BNO055.axis() 以重映射设备坐标系。每个常量都是来自 BNO055 数据手册(第 3.4 节,Axis remap)的 (AXIS_MAP_CONFIG, AXIS_MAP_SIGN) 寄存器对,针对八种标准放置方位之一进行了预编码。

请选择其输出坐标轴与芯片在主机 PCB 上的物理安装方式相匹配的常量:

常量

输出 X

输出 Y

输出 Z

字节

安装方式

AXIS_P0

-Yc

+Xc

+Zc

21 04

正面朝上,相对 P1 逆时针旋转 90°

AXIS_P1

+Xc

+Yc

+Zc

24 00

正面朝上,数据手册默认方位

AXIS_P2

-Xc

-Yc

+Zc

24 06

正面朝上,旋转 180°

AXIS_P3

+Yc

-Xc

+Zc

21 02

正面朝上,相对 P1 顺时针旋转 90°

AXIS_P4

+Xc

-Yc

-Zc

24 03

正面朝下,绕 X 翻转(构造函数默认)

AXIS_P5

+Yc

+Xc

-Zc

21 01

正面朝下,相对 P4 逆时针旋转 90°

AXIS_P6

-Yc

-Xc

-Zc

21 07

正面朝下,相对 P4 旋转 180°

AXIS_P7

-Xc

+Yc

-Zc

24 05

正面朝下,相对 P4 顺时针旋转 90°

Xc / Yc / Zc 表示芯片的固有坐标轴(如 BNO055 数据手册中所印)。“输出”各列是设备通过 BNO055.euler()BNO055.gyro() 等输出的坐标轴。P0P3 是芯片在元件面朝上方位下的四种 90° 旋转;P4P7 是将芯片翻转到背面后的相同四种旋转。

bno055.AXIS_P0: bytes

芯片正面朝上,相对 AXIS_P1 逆时针旋转 90°。输出坐标轴:X = -YcY = +XcZ = +Zc

bno055.AXIS_P1: bytes

芯片正面朝上,处于 BNO055 数据手册的默认方位。不应用重映射:X = +XcY = +YcZ = +Zc

bno055.AXIS_P2: bytes

芯片正面朝上,相对 AXIS_P1 旋转 180°。输出坐标轴:X = -XcY = -YcZ = +Zc

bno055.AXIS_P3: bytes

芯片正面朝上,相对 AXIS_P1 顺时针旋转 90°。输出坐标轴:X = +YcY = -XcZ = +Zc

bno055.AXIS_P4: bytes

芯片相对 AXIS_P1 翻转到背面(元件面朝下)。输出坐标轴:X = +XcY = -YcZ = -Zc。当未提供 axis 参数时,这是 BNO055 构造函数所使用的放置方位。

bno055.AXIS_P5: bytes

芯片正面朝下,相对 AXIS_P4 逆时针旋转 90°。输出坐标轴:X = +YcY = +XcZ = -Zc

bno055.AXIS_P6: bytes

芯片正面朝下,相对 AXIS_P4 旋转 180°。输出坐标轴:X = -YcY = -XcZ = -Zc

bno055.AXIS_P7: bytes

芯片正面朝下,相对 AXIS_P4 顺时针旋转 90°。输出坐标轴:X = -XcY = +YcZ = -Zc