|
近年来,智能可穿戴设备离普通人的生活越来越近,智能手环、智能手表、智能耳机等一系列的产品逐渐走进了人们的生活中。这些设备通过数据交互、云端交互等方式提供了强大的功能,对我们的生活、感知带来很大的转变。可穿戴设备中的MEMS传感器能够精确捕捉数据,并进行实时更新反馈。惯性测量单元作为一种MEMS传感器,可以用来测量方位、运动或者手势。
博世公司推出的低功耗智能传感器BMI270可以用于穿戴设备,该传感器基于博世的MEMS工艺技术,而且大大提升了加速度计的偏移和灵敏度性能。在本篇文章中,我们将介绍如何基于NUCLEO-G070开发板通过SPI接口读取BMI270的加速度计和陀螺仪数据。
所需的组件 ● NUCLEO-G070RB开发板 ● YBX-BMI270惯性测量单元传感器模块(淘宝链接) ● 连接跳线 ● USB线缆 ● 友善串口调试助手
YBX-BMI270传感器模块
YBX-BMI270模块采用博世传感器的超低功耗智能惯性测量单元BMI270。该IMU针对可穿戴设备进行了优化,提供精确的加速度、角速率测量和智能片上运动触发中断功能,同时该传感器集成了16位三轴陀螺仪和16位三轴加速度计。该模块支持SPI和I2C接口进行系统集成,可以快速实现与Arduino和STM32等控制器直接相连。该模块板载一颗电源芯片,支持3.3-5V供电。
BMI270包含直观的手势、情景和活动识别功能,并集成了针对腕戴式设备专门进行优化的即插即用计步器。该IMU也非常适合其他类型的可穿戴设备,如耳戴式设备、智能服装、智能鞋、智能眼镜和脚踝带。
Bosch的独特静止组件重新调整 (CRT) 功能可提供内置陀螺仪自校准功能,无需旋转激励,从而在测试和制造过程中为OEM节省宝贵的时间和成本。BMI270的嵌入式即插即用功能有助于缩短产品上市时间。
主要特性 ● 采用Bosch超低功耗智能惯性测量单元BMI270 ● 16位数字三轴加速度计 ● 16位数字三轴陀螺仪 ● 电流消耗:685µA(典型值) ● 灵敏度误差:± 0.4% ● 通过静止CRT功能实现自校准陀螺仪: ● SPI和I2C接口 ● 2个独立的可编程I/O引脚,用于中断和同步事件 ● 板载一颗高精度DC-DC芯片 ● LED电源指示灯 ● 支持Arduino和STM32等微控制器 ● 外形尺寸:24mm x 24mm x 5mm
硬件连接 YBX-BMI270模块连接到NUCLEO-G070RB的SPI1接口,对应的引脚分别是PA5(SCK)、PA6(MISO)和PA7(MOSI),片选引脚CSB连接到PB0。YBX-BMI270模块的VCC连接到3V3引脚,GND引脚连接到NUCLEO-G070RB的任意GND引脚。
驱动文件 Bosch博世传感器官方提供了基于BMI270的驱动文件BMI270_SensorAPI,该源码可以在GitHub进行下载。下载地址:BMI270_SensorAPI
代码 首先我们使用STM32CubeMX工具生成工程文件,根据硬件连接方式选择引脚的功能,然后启用SPI1通讯。SPI1选择全双工主机模式(Full-Duplex Master),硬件NSS信号选择Disable。在参数设置中,数据位大小选择8位,MSB优先。选择合适的分频系数。在无法进行通讯的情况下,可以适当降低SPI1外设的频率。
生成KEIL工程后,接下来我们需要将BOSCH官方提供的BMI270_SensorAPI驱动集成到工程里面。
首先,将下载的整个驱动文件复制到工程所在的目录,然后将bmi2.c、bmi270.c、common.c添加到工程中。在common.c中重载以下两个函数:bmi2_spi_read和bmi2_spi_write。
在主函数main中,首先初始化BMI270,然后对加速度计和陀螺仪的参数进行配置。在while循环中,读取寄存器的数据,并打印输出到串口。 - printf("\nBMI270 SPI Test\n");
- printf("Bolgen Studio\n");
- /* Assign accel sensor to variable. */
- uint8_t sensor_list[2] = { BMI2_ACCEL, BMI2_GYRO };
- /* Sensor initialization configuration. */
- struct bmi2_dev bmi;
- /* Structure to define type of sensor and their respective data. */
- struct bmi2_sens_data sensor_data = { { 0 } };
- uint8_t indx = 0;
- float acc_x = 0, acc_y = 0, acc_z = 0;
- float gyr_x = 0, gyr_y = 0, gyr_z = 0;
- struct bmi2_sens_config config;
- /* Interface reference is given as a parameter
- * For I2C : BMI2_I2C_INTF
- * For SPI : BMI2_SPI_INTF
- */
- rslt = bmi2_interface_init(&bmi, BMI2_SPI_INTF);
- bmi2_error_codes_print_result(rslt);
- /* Initialize bmi270. */
- rslt = bmi270_init(&bmi);
- bmi2_error_codes_print_result(rslt);
- if (rslt == BMI2_OK)
- {
- /* Accel and gyro configuration settings. */
- rslt = set_accel_gyro_config(&bmi);
- bmi2_error_codes_print_result(rslt);
- if (rslt == BMI2_OK)
- {
- /* NOTE:
- * Accel and Gyro enable must be done after setting configurations
- */
- rslt = bmi2_sensor_enable(sensor_list, 2, &bmi);
- bmi2_error_codes_print_result(rslt);
- if (rslt == BMI2_OK)
- {
- config.type = BMI2_ACCEL;
- /* Get the accel configurations. */
- rslt = bmi2_get_sensor_config(&config, 1, &bmi);
- bmi2_error_codes_print_result(rslt);
- printf(
- "\nData set, Accel Range, Acc_Raw_X, Acc_Raw_Y, Acc_Raw_Z, Acc_ms2_X, Acc_ms2_Y, Acc_ms2_Z, Gyr_Raw_X, Gyr_Raw_Y, Gyr_Raw_Z, Gyro_DPS_X, Gyro_DPS_Y, Gyro_DPS_Z\n\n");
- }
- }
- }
复制代码
输出结果 将程序下载到NUCLEO-G070开发板中,运行程序,打开友善串口调试助手,选择正确的串口号,稍后将显示接收到的数据:
注意:由于BMI270传感器需要进行配置的参数较多,因此第一组数据出现的时间会比较慢,请多等待一段时间。
|