woshi_ziyu
发表于: 2023-1-12 20:31:15 | 显示全部楼层

惯性测量单元(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)

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模块的硬件连接方式:

NUCLEO-G070RB连接BMI088(I2C)模块_bb.jpg


BMI088模块连接到NUCLEO-G070RB的I2C1接口,对应的引脚分别是PB9(SDA)和PB8(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

STM32CubeMX Pin

然后修改I2C1接口模式和配置信息。I2C模式选择I2C。在参数设置中,I2C速度模式选择Standard Mode,通讯速率选择100KHz。

STM32CubeMX I2C

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功能。

  1. #ifndef BMI08X_ENABLE_BMI088
  2. #define BMI08X_ENABLE_BMI088       1
  3. #endif
复制代码

在main.c文件中包含以下头文件:

  1. #include <stdio.h>
  2. #include "bmi08x.h"
  3. #include "bmi088.h"
复制代码

然后定义一个bmi08x结构体,该结构体定义了使用的是I2C还是SPI接口,以及读写操作所需的函数指针。

  1. struct bmi08x_dev dev = {
  2.         .accel_id = BMI08X_ACCEL_I2C_ADDR_SECONDARY,
  3.         .gyro_id = BMI08X_GYRO_I2C_ADDR_SECONDARY,
  4.         .intf = BMI08X_I2C_INTF,  
  5.         .read = &stm32_i2c_read,//user_spi_read,  
  6.         .write = &stm32_i2c_write,//user_spi_write,  
  7.         .delay_ms = &HAL_Delay//user_delay_milli_sec
  8. };
复制代码

接下来,初始化BMI088传感器,设置加速计和陀螺仪的量程、带宽和工作模式等。然后使用以下函数读取BMI088的传感器数据:

  1. /* Read the sensor data into the sensor data instance */
  2. rslt = bmi08a_get_data(&user_accel_bmi088, &dev);
  3. /* Read the sensor data into the sensor data instance */
  4. rslt = bmi08g_get_data(&user_gyro_bmi088, &dev);
复制代码

将传感器数据打印输出至串口:

  1. printf("z:%d",user_accel_bmi088.x);
  2.                 printf("\t");
  3.                 printf("y:%d",user_accel_bmi088.y);
  4.                 printf("\t");
  5.                 printf("z:%d",user_accel_bmi088.z);
  6.                 printf("\t\t");
  7.                 printf("x:%d",user_gyro_bmi088.x);
  8.                 printf("\t");
  9.                 printf("y:%d",user_gyro_bmi088.y);
  10.                 printf("\t");
  11.                 printf("z:%d",user_gyro_bmi088.z);
  12.                 printf("\t");
复制代码

输出结果

将程序下载到NUCLEO-G070开发板中,运行程序,串口监视器将显示接收到的数据:

output.png


跳转到指定楼层
woshi_ziyu
发表于: 2023-3-2 08:13:48 | 显示全部楼层

最近某客户在使用BMI088模块的过程中遇到问题,使用提供的示例代码,跑起来提示初始化失败(BMI088 Initialization Error),查找代码,卡在了读CHIP_ID错误。下面是客户使用的硬件连接图:

20230302075430.jpg


根据以往的经验,读取ID错误一般都是和硬件连接有关。刚开始还以为是连接线过长导致的,剪短后仍是读取ID错误。


客户将I2C的硬件连接线连接在NUCLEO-G070RB开发板的ST Morpho排针上,而不是Arduino排母的A4和A5接口上面。查看提供的外部接口图,这两个接口是连在一起的。

引脚分布.jpg

查看其硬件原理图,发现CN7的36和38引脚默认是通过SB3和SB4连接到STM32G070微控制器的PB11和PB12引脚,SB2和SB5默认是断开的,因此没有连接到PB8和PB9(这两个是I2C1接口)。Arduino接口的A4和A5接口默认是不能作为I2C使用的,需要调整跳线。

INTERFACE.jpg


最后,将模块的I2C接口连接到NUCLEO开发板的Arduino的数字D14(PB9)和D15(PB8)引脚,这样问题就解决了。


如果你能看到我的世界里那些渐渐消逝的美好,你就能体会到现在所拥有的幸福。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

主题 11 | 回复: 23



手机版|

GMT+8, 2024-11-6 09:45 , Processed in 0.051350 second(s), 8 queries , Gzip On, MemCache On. Powered by Discuz! X3.5

YiBoard一板网 © 2015-2022 地址:河北省石家庄市长安区高营大街 ( 冀ICP备18020117号 )

快速回复 返回顶部 返回列表