BNO055 OpenMV上手初体验:第一次用这么高级的IMU传感器

BNO055是一款由Bosch Sensortec开发的9轴惯性传感器,能够提供三轴加速度计、三轴陀螺仪和三轴磁力计的数据。该传感器还集成了一个ARM Cortex-M0处理器和一个传感器数据融合引擎,用于处理和融合来自多个传感器的数据,并提供稳定和准确的定位、方向和姿态信息。
BNO055可以通过I2C和SPI接口与各种微控制器和单板计算机通信,支持多种输出模式和数据格式。该传感器还提供自动校准和自适应的传感器校准功能,可以显著提高系统精度和可靠性。
由于其高度集成的设计和先进的数据融合算法,BNO055广泛应用于航空航天、机器人、虚拟现实、智能家居和移动设备等领域,是一款性能稳定、易于使用和可靠性高的惯性传感器。
—— ChatGPT

这学期TDPS课程做巡线小车,其中一部分要求是小车顺着一条砖线开一段。实地考察后发现砖块和周围地面颜色不太好区分,于是决定在openMV机器视觉算法的基础上加一个惯导模块辅助导航,保证导航准确率。首先尝试了一下手头的几块钱一块的廉价传感器BMI160,但发现BMI160缺乏地磁传感器,能起到的辅助作用有限,再一看发现openMV官方推荐的传感器bno055能满足我们的需求。BNO055确实是高级玩意,甚至自带了一个MCU,价格大概一百多块钱。也有更便宜的解决方案,但是都需要自己适配,而BNO055已经有官方提供的第三方库可以用了,于是组内讨论之后决定直接一步到位上BNO055。
图摘自官方wiki
采购是另外一个同学负责,板子到货之后发现购买的是dfrobot家的SEN0374芯片,提供了以下几个接口(翻译自官方wiki):

丝印功能描述
VCC+
GND-
SCLI2C 时钟
SDAI2C 数据
INT中断接口
BOOTLEAD模式选择接口
PS1协议选择接口1
PS2协议选择接口2
BL-INDLead Program Guide
RST重制
ADDRI2C 地址选择

PS1 和 PS2的具体功能如下:(默认均为0)(翻译自官方wiki):

PS1PS2功能
00标准/快速I2C
01HID OVER I2C
10UART
11预留

看着挺花哨,实际使用的时候用I2C通信最少只用接VCC、GND、SCL、SDA四个脚就够了。SCL、SDA分别接上OpenMV的P4、P5,VCC接3V3,GND接地。传感器I2C默认地址是0X28(用官方提供的第三方库其实也不用管)。查阅datasheet发现这个芯片支持很多种工作模式,包括不同的功耗模式和不同的传感器模式,对于小车来说只需要用普通功耗模式和使用全部传感器的模式,输出传感器智能融合之后的数据,所以这些也都先不管。先看看能不能顺利拿到我们最关心的磁航向数据,直接上修改过的官方例程:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
from machine import Pin, I2C
from bno055 import BNO055, AXIS_P7
import time
i2c = I2C(sda=Pin('P5'), scl=Pin('P4'), freq=400000)
imu = BNO055(i2c)
while True:
#temperature = imu.temperature()
#print('temperature: ℃',temperature)
yaw, roll, pitch = imu.euler()
#print('yaw, roll, pitch: °', yaw, roll, pitch)
w, x, y, z = imu.quaternion()
#print('Quaternion:', w, x, y, z)
x, y, z = imu.accelerometer()
#print('Accelerometer (m/s^2):', x, y, z)
x, y, z = imu.magnetometer()
print('Magnetometer (microteslas):', x, y, z)
x, y, z = imu.gyroscope()
#print('Gyroscope (deg/sec):', x, y, z)
x, y, z = imu.linear_acceleration()
#print('Linear acceleration (m/s^2)', x, y, z)
x, y, z = imu.gravity()
#print('Gravity (m/s^2):', x, y, z)
time.sleep_ms(100)

上电,简单摇晃传感器对地磁传感器进行校准后查看输出:

1
2
3
4
5
6
7
Magnetometer (microteslas): -27.375 18.6875 -17.0
Magnetometer (microteslas): -27.375 18.25 -18.1875
Magnetometer (microteslas): -28.0625 18.25 -16.5625
Magnetometer (microteslas): -27.75 18.0 -16.5625
Magnetometer (microteslas): -28.0625 18.25 -16.1875
Magnetometer (microteslas): -27.75 17.5625 -18.1875
Magnetometer (microteslas): -28.5 18.6875 -17.0

顺利拿到了我们需要的数据。

后续装车可能需要注意一下传感器校准的问题,目前的模式下启用了快速校准模式,但可能也需要随机移动传感器对其进行校准。Datasheet提到可以校准一次后存储校准数据以便以后上电之后使用,装车之后再看看有没有这个需要。


BNO055 OpenMV上手初体验:第一次用这么高级的IMU传感器
https://sidiexplore.xyz/2023/03/27/bno055/
作者
LIANG Sidi
发布于
2023年3月27日
许可协议