BNO055 · 9-DOF Absolute Orientation

BNO055 九轴绝对方向传感器模块资料

BNO055 是 Bosch 的一颗系统级封装(SiP)传感器:内部集成三轴加速度计、三轴陀螺仪、三轴地磁传感器,再加一颗跑传感器融合固件的 32 位 ARM Cortex-M0+。主控不用自己写四元数/互补滤波算法,直接从 I2C 读出解算好的欧拉角、四元数、线性加速度和重力向量,这也是它和普通六轴/裸三合一模块最大的区别。

Quick Facts

  • 接口:I2C(默认)/ UART
  • I2C 地址:0x28,可选 0x29
  • 供电:芯片 2.4V~3.6V,模块以实物丝印为准
  • 尺寸/重量:约 26.7×20.5mm,约 2.5g(含排针)
BNO055 9轴传感器模块SKU、淘宝链接待补充;当前批次芯片型号、板载稳压/电平转换电路仍以实物丝印和实测为准。
查看客户话术

Key Point

为什么叫"九轴",和六轴 IMU 不是一回事

客户容易把 BNO055 和 MPU6050(六轴,只有加速度计+陀螺仪)或单独的三轴磁力计(如 BMM150、HMC5883)弄混。BNO055 是加速度计+陀螺仪+磁力计三种传感器,再加片内融合芯片算出"绝对方向",所以叫九轴绝对方向传感器。

对比BNO055MPU6050(六轴)BMM150(三轴磁力计)
内部传感器加速度计+陀螺仪+磁力计+融合MCU加速度计+陀螺仪仅磁力计
能否直接输出姿态角能,片内已解算(欧拉角/四元数)不能,需自己写融合算法或用 DMP不能,只能测磁场方向
需不需要自己写卡尔曼/互补滤波不需要需要(或依赖 DMP)不适用
典型 I2C 地址0x28 / 0x290x68 / 0x690x10~0x13
能不能判断绝对朝向(类似指南针)能(有磁力计参与融合)不能能,但精度和稳定性不如九轴融合

一句话记:MPU6050 只给你原始加速度/角速度,BNO055 直接给你"现在朝哪个方向"。

Specs

基本参数表

参数数值 / 说明来源
厂商 / 芯片Bosch Sensortec BNO055Bosch 官方数据手册
集成传感器三轴 14-bit 加速度计 + 三轴 16-bit 陀螺仪(±2000°/s)+ 三轴地磁传感器Bosch 官方数据手册
融合处理器32-bit ARM Cortex-M0+,运行 Bosch 传感器融合固件Bosch 官方数据手册
输出数据欧拉角、四元数、角速度、线性加速度、重力向量、标定状态Bosch 官方数据手册
接口I2C(常用)或 UART,由 PS1/PS0 引脚选择Bosch 官方数据手册
I2C 地址0x28(默认),COM3/ADDR 拉高为 0x29Bosch 官方数据手册
芯片工作电压VDD 2.4V~3.6V(3.3V 逻辑器件)Bosch 官方数据手册
模块供电(VIN)是否支持 5V 输入取决于板载稳压电路,待以实物核实待确认
工作温度-40°C 到 +85°CBosch 官方数据手册
芯片封装LGA-28,约 5.2 x 3.8 x 1.13 mmBosch 官方数据手册
模块尺寸约 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必须和主控共地
SDAI2C 数据线接主控 SDA,需要上拉电阻(多数模块已自带)
SCLI2C 时钟线接主控 SCL
RST复位,低有效内部有上拉,不用时可悬空
PS1协议选择位1GND = I2C 模式;配合 PS0 选 UART 模式
PS0协议选择位0 / I2C 地址选择I2C 模式下接 GND 用 0x28,接 3.3V 用 0x29
INT中断输出可选,不用时可悬空

PS0/PS1 不是"随便接"的脚——两个都接 GND 才是最常用的 I2C 默认模式;如果模块出厂已经用电阻固定好模式,也可能没有单独引出这两个脚,实际以实物为准。

Wiring

接线图

下面按 I2C 模式给出 ESP32 和 Arduino UNO 两种常见接法思路,正式测试代码和实测截图待后续补充实机验证。

BNO055 接 ESP32 I2C 接线图
BNO055 模块ESP32说明
VIN3V3ESP32 是 3.3V 逻辑,优先用 3V3
GNDGND必须共地
SDAGPIO21(常用默认)可用 Wire.begin(21, 22) 自定义
SCLGPIO22(常用默认)同上
RST可选,如 GPIO4不接也可以,内部有上拉
PS0 / PS1接 GND选择 I2C 模式,地址默认 0x28
BNO055 接 Arduino UNO 接线图
BNO055 模块Arduino UNO说明
VIN3.3V 优先芯片本身 3.3V 逻辑,UNO 是 5V 逻辑,需确认板载是否有稳压/电平转换
GNDGND必须共地
SDAA4UNO 固定 I2C 引脚
SCLA5UNO 固定 I2C 引脚

Compatibility

Arduino / ESP32 / 树莓派使用建议

Arduino UNO / Nano

可以用,但要先确认模块是否耐 5V、SDA/SCL 是否需要外加电平转换。不确定时优先用 3.3V 供电测试,常用库是 Adafruit_BNO055(依赖 Adafruit_Sensor)。

ESP32 系列

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

常见问题排查

I2C 扫描不到设备怎么办

依次检查:VIN/GND 是否接对、SDA/SCL 是否接反、PS0/PS1 是否都接了 GND(不是悬空)、主控 I2C 频率是否过高、上拉电阻是否存在。

扫到的地址是 0x29 不是 0x28,正常吗

正常。PS0(或部分板子标注为 ADDR/COM3)接 GND 时是 0x28,接高电平时是 0x29,代码里的地址要和实际接法一致。

能不能直接用 MPU6050 的代码

不能直接套用。MPU6050 没有磁力计和片内融合,寄存器定义和输出数据完全不同,需要用 BNO055 专用库(如 Adafruit_BNO055)。

刚上电读出来的角度会跳、不稳定

属于正常现象,是标定未完成。参考上面"标定状态"一节,等系统标定状态达到 3 再使用。

能不能接 5V

芯片本身是 3.3V 逻辑器件;模块是否可以直接接 5V 取决于板上是否有稳压和电平转换电路,本资料页暂未实测确认,建议优先用 3.3V。

Customer Reply

淘宝客户简短话术

您好,这款是 BNO055 九轴绝对方向传感器,内部集成加速度计、陀螺仪、磁力计和传感器融合芯片,直接输出解算好的姿态角,不需要自己写融合算法,和普通六轴 IMU(如 MPU6050)不是一回事。

您好,建议 VIN 接 3.3V,GND 共地,SDA/SCL 接主控 I2C 引脚,PS0/PS1 都接 GND 使用默认 I2C 模式,地址是 0x28。是否支持 5V 供电以实物丝印和板载稳压电路为准,不确定建议先用 3.3V 测试。

您好,模块刚上电时角度可能会跳动,这是正常现象,属于传感器还没标定完成。静止几秒完成陀螺仪标定,缓慢画"8"字晃动完成磁力计标定即可,代码里可以读标定状态寄存器判断是否已经标定好。

References

官方与公开资料