惯性测量单元(Inertial Measurement Unit,IMU)在无人机和机器人中是不可忽却的一部分,它帮助设备识别方向,变得更加智能,用于测量物体角速率以及加速度。本文将使用STM32开发板通过I2C方式连接BMI088惯性测量单元模块,实现获取加速度值和角速度值,并通过串口打印输出。
所需的组件 ● STM32 NUCLEO-G070RB开发板 ● YBX-BMI088(I2C)加速度传感器模块(淘宝链接) ● 连接跳线 ● Micro USB线缆
YBX-BMI088模块 YBX-BMI088(I2C)传感器模块是博根工作室推出的扩展板,基于博世传感器的BMI088芯片,这是一款高性能惯性测量单元(IMU),具有卓越的抗振性,专为无人机和机器人应用而设计。该传感器是一款六轴传感器模块,内部集成了一个三轴16位的加速度传感器和一个三轴16位的陀螺仪模块,该传感器支持SPI和I2C接口。该模块采用4针I2C接口,通讯速率最高可支持400KHz。可以与Arduino、STM32等控制器直接相连。在之前的帖子中,我们使用NUCLEO-G070RB开发板通过SPI方式读取BMI088传感器的数据。 该模块加速度传感器的I2C地址是0x19,陀螺仪的I2C地址是0x69。
YBX-BMI088(I2C)
主要特点: ● 采用Bosch高性能惯性测量单元BMI088 ● 量程:加速度计±24g,陀螺仪±2000°/s ● 零点漂移:加速度计±20mg,陀螺仪±1°/s ● 低温度系数偏移:加速度计±0.2mg/K,陀螺仪±0.015°/s/K ● 输出速率:12.5Hz ~ 2KHz ● I2C接口,时钟频率最大支持400KHz ● I2C默认地址:0x19(A),0x69(G) ● 板载一颗高精度LDO芯片,支持3.3-5V电源输入 ● 红色LED电源指示灯 ● 支持Arduino、STM32和PIC等微控制器 ● 外形尺寸:24mm x 24mm x 5mm
硬件连接 以下是NUCLEO-G070RB开发板与BMI088模块的硬件连接方式:
硬件连接
BMI088模块连接到NUCLEO-G070RB的I2C1接口,对应的引脚分别是A4(SDA)和A5(SCL)。BMI088模块的VCC连接到+5V引脚,GND引脚连接到NUCLEO-G070RB开发板的任意GND引脚。
代码 首先我们使用STM32CubeMX工具生成工程文件,根据硬件连接方式选择引脚的功能。在引脚配置中,启用I2C1功能,PB8接口选择I2C1_SCL,PB9接口选择I2C1_SDA。同时启用USART2串口通讯,PA2选择USART2_TX,PA3选择USART2_RX。
STM32CubeMX Pin
然后修改I2C1接口模式和配置信息。I2C模式选择I2C。在参数设置中,I2C速度模式选择Standard Mode,通讯速率选择100KHz。
STM32CubeMX I2C
最后生成KEIL工程,接下来我们需要将BOSCH官方提供的BMI088驱动集成到工程里面。
首先,将bmi085.c、bmi085.h、bmi088.c、bmi088.h、bmi08a.c、bmi08g.c、bmi08x_defs.h以及bmi08x.h文件复制到工程所在的目录,然后添加到工程中。在bmi08x_defs.h使能以下宏定义来启用BMI088功能。 - #ifndef BMI08X_ENABLE_BMI088
- #define BMI08X_ENABLE_BMI088 1
- #endif
复制代码在main.c文件中包含以下头文件: - #include <stdio.h>
- #include "bmi08x.h"
- #include "bmi088.h"
复制代码然后定义一个bmi08x结构体,该结构体定义了使用的是I2C还是SPI接口,以及读写操作所需的函数指针。 - struct bmi08x_dev dev = {
- .accel_id = BMI08X_ACCEL_I2C_ADDR_SECONDARY,
- .gyro_id = BMI08X_GYRO_I2C_ADDR_SECONDARY,
- .intf = BMI08X_I2C_INTF,
- .read = &stm32_i2c_read,//user_spi_read,
- .write = &stm32_i2c_write,//user_spi_write,
- .delay_ms = &HAL_Delay//user_delay_milli_sec
- };
复制代码
接下来,初始化BMI088传感器,设置加速计和陀螺仪的量程、带宽和工作模式等。然后使用以下函数读取BMI088的传感器数据: - /* Read the sensor data into the sensor data instance */
- rslt = bmi08a_get_data(&user_accel_bmi088, &dev);
- /* Read the sensor data into the sensor data instance */
- rslt = bmi08g_get_data(&user_gyro_bmi088, &dev);
复制代码将传感器数据打印输出至串口: - printf("z:%d",user_accel_bmi088.x);
- printf("\t");
- printf("y:%d",user_accel_bmi088.y);
- printf("\t");
- printf("z:%d",user_accel_bmi088.z);
- printf("\t\t");
- printf("x:%d",user_gyro_bmi088.x);
- printf("\t");
- printf("y:%d",user_gyro_bmi088.y);
- printf("\t");
- printf("z:%d",user_gyro_bmi088.z);
- printf("\t");
复制代码
输出结果 将程序下载到NUCLEO-G070开发板中,运行程序,串口监视器将显示接收到的数据: 
|