Arduino UNO / Nano
可以用,但要先确认模块是否耐 5V、SDA/SCL 是否需要外加电平转换。不确定时优先用 3.3V 供电测试,常用库是 Adafruit_BNO055(依赖 Adafruit_Sensor)。
BNO055 · 9-DOF Absolute Orientation
BNO055 是 Bosch 的一颗系统级封装(SiP)传感器:内部集成三轴加速度计、三轴陀螺仪、三轴地磁传感器,再加一颗跑传感器融合固件的 32 位 ARM Cortex-M0+。主控不用自己写四元数/互补滤波算法,直接从 I2C 读出解算好的欧拉角、四元数、线性加速度和重力向量,这也是它和普通六轴/裸三合一模块最大的区别。
Quick Facts
Key Point
客户容易把 BNO055 和 MPU6050(六轴,只有加速度计+陀螺仪)或单独的三轴磁力计(如 BMM150、HMC5883)弄混。BNO055 是加速度计+陀螺仪+磁力计三种传感器,再加片内融合芯片算出"绝对方向",所以叫九轴绝对方向传感器。
| 对比 | BNO055 | MPU6050(六轴) | BMM150(三轴磁力计) |
|---|---|---|---|
| 内部传感器 | 加速度计+陀螺仪+磁力计+融合MCU | 加速度计+陀螺仪 | 仅磁力计 |
| 能否直接输出姿态角 | 能,片内已解算(欧拉角/四元数) | 不能,需自己写融合算法或用 DMP | 不能,只能测磁场方向 |
| 需不需要自己写卡尔曼/互补滤波 | 不需要 | 需要(或依赖 DMP) | 不适用 |
| 典型 I2C 地址 | 0x28 / 0x29 | 0x68 / 0x69 | 0x10~0x13 |
| 能不能判断绝对朝向(类似指南针) | 能(有磁力计参与融合) | 不能 | 能,但精度和稳定性不如九轴融合 |
一句话记:MPU6050 只给你原始加速度/角速度,BNO055 直接给你"现在朝哪个方向"。
Specs
| 参数 | 数值 / 说明 | 来源 |
|---|---|---|
| 厂商 / 芯片 | Bosch Sensortec BNO055 | Bosch 官方数据手册 |
| 集成传感器 | 三轴 14-bit 加速度计 + 三轴 16-bit 陀螺仪(±2000°/s)+ 三轴地磁传感器 | Bosch 官方数据手册 |
| 融合处理器 | 32-bit ARM Cortex-M0+,运行 Bosch 传感器融合固件 | Bosch 官方数据手册 |
| 输出数据 | 欧拉角、四元数、角速度、线性加速度、重力向量、标定状态 | Bosch 官方数据手册 |
| 接口 | I2C(常用)或 UART,由 PS1/PS0 引脚选择 | Bosch 官方数据手册 |
| I2C 地址 | 0x28(默认),COM3/ADDR 拉高为 0x29 | Bosch 官方数据手册 |
| 芯片工作电压 | VDD 2.4V~3.6V(3.3V 逻辑器件) | Bosch 官方数据手册 |
| 模块供电(VIN) | 是否支持 5V 输入取决于板载稳压电路,待以实物核实 | 待确认 |
| 工作温度 | -40°C 到 +85°C | Bosch 官方数据手册 |
| 芯片封装 | LGA-28,约 5.2 x 3.8 x 1.13 mm | Bosch 官方数据手册 |
| 模块尺寸 | 约 26.7mm x 20.5mm | 商品图标注 |
| 模块重量 | 约 2.5g(板约 2g,排针约 0.5g) | 商品图标注 |
Pinout
常见 BNO055 面包板模块沿用一套通用丝印(VIN / 3Vo / GND / SDA / SCL / RST / PS1 / PS0 / INT),不同批次板子丝印可能有差异,请以实物丝印为准。
| 引脚 | 说明 | 接线注意 |
|---|---|---|
VIN | 电源输入 | 优先按 3.3V 供电;是否耐 5V 取决于板载稳压芯片,不确定就先接 3.3V |
3Vo | 板载稳压器输出(如果有) | 部分板子会引出这个测试点,不是电源输入脚 |
GND | 地 | 必须和主控共地 |
SDA | I2C 数据线 | 接主控 SDA,需要上拉电阻(多数模块已自带) |
SCL | I2C 时钟线 | 接主控 SCL |
RST | 复位,低有效 | 内部有上拉,不用时可悬空 |
PS1 | 协议选择位1 | 接 GND = I2C 模式;配合 PS0 选 UART 模式 |
PS0 | 协议选择位0 / I2C 地址选择 | I2C 模式下接 GND 用 0x28,接 3.3V 用 0x29 |
INT | 中断输出 | 可选,不用时可悬空 |
PS0/PS1 不是"随便接"的脚——两个都接 GND 才是最常用的 I2C 默认模式;如果模块出厂已经用电阻固定好模式,也可能没有单独引出这两个脚,实际以实物为准。
Wiring
下面按 I2C 模式给出 ESP32 和 Arduino UNO 两种常见接法思路,正式测试代码和实测截图待后续补充实机验证。
| BNO055 模块 | ESP32 | 说明 |
|---|---|---|
| VIN | 3V3 | ESP32 是 3.3V 逻辑,优先用 3V3 |
| GND | GND | 必须共地 |
| SDA | GPIO21(常用默认) | 可用 Wire.begin(21, 22) 自定义 |
| SCL | GPIO22(常用默认) | 同上 |
| RST | 可选,如 GPIO4 | 不接也可以,内部有上拉 |
| PS0 / PS1 | 接 GND | 选择 I2C 模式,地址默认 0x28 |
| BNO055 模块 | Arduino UNO | 说明 |
|---|---|---|
| VIN | 3.3V 优先 | 芯片本身 3.3V 逻辑,UNO 是 5V 逻辑,需确认板载是否有稳压/电平转换 |
| GND | GND | 必须共地 |
| SDA | A4 | UNO 固定 I2C 引脚 |
| SCL | A5 | UNO 固定 I2C 引脚 |
Compatibility
可以用,但要先确认模块是否耐 5V、SDA/SCL 是否需要外加电平转换。不确定时优先用 3.3V 供电测试,常用库是 Adafruit_BNO055(依赖 Adafruit_Sensor)。
3.3V 逻辑天然匹配,接线最省心。可用 Adafruit_BNO055 库,也可以直接用 ESP-IDF 的 I2C 驱动自己读寄存器。
树莓派 I2C 是 3.3V 逻辑,同样天然匹配。Python 可用 Adafruit CircuitPython BNO055 库,通过 i2cdetect -y 1 先确认能不能扫到 0x28/0x29。
Calibration
BNO055 上电后会有一段"未标定"时间,输出的绝对方向在这段时间内可能不准。芯片提供系统、陀螺仪、加速度计、磁力计四个独立的标定状态位(0~3,3 为已标定),一般做法是:
| 子系统 | 常见标定动作 |
|---|---|
| 陀螺仪 | 保持模块静止几秒即可完成 |
| 加速度计 | 把模块摆成几个不同的静止姿态(如六个面朝上) |
| 磁力计 | 缓慢画"8"字形晃动模块几次 |
| 系统 | 以上三项都标定好后系统状态才会到 3 |
代码里应该持续读取标定状态寄存器,等到需要的子系统标定值达标后再信任姿态数据,而不是上电立刻用。
FAQ
依次检查:VIN/GND 是否接对、SDA/SCL 是否接反、PS0/PS1 是否都接了 GND(不是悬空)、主控 I2C 频率是否过高、上拉电阻是否存在。
正常。PS0(或部分板子标注为 ADDR/COM3)接 GND 时是 0x28,接高电平时是 0x29,代码里的地址要和实际接法一致。
不能直接套用。MPU6050 没有磁力计和片内融合,寄存器定义和输出数据完全不同,需要用 BNO055 专用库(如 Adafruit_BNO055)。
属于正常现象,是标定未完成。参考上面"标定状态"一节,等系统标定状态达到 3 再使用。
芯片本身是 3.3V 逻辑器件;模块是否可以直接接 5V 取决于板上是否有稳压和电平转换电路,本资料页暂未实测确认,建议优先用 3.3V。
Customer Reply
References