任务介绍
本次任务的核心目标是设计一款紧凑的IMU模块,其尺寸被严格限定在小于60mmx40mm的范围内,我们尽量做得小一点。该款模块要求至少三轴的数据检测,而且要求在得捷官网上可售的,我们浏览的一下IMU传感器的专栏,也对应的看了一下模块专区,最后我们将目标定在了BMI270这款传感器身上。具体的任务要求如下:
设计一款IMU模块,可实现至少三轴的数据检测,例如加速度计、陀螺仪、磁力计等
板卡尺寸:小于60mmx40mm
包含信号:信号输出口,+3.3V、GND
主要器件:需在DigiKey官网上有货且正常售卖
请注意:PCB设计工具需用KiCad(官方邮件赠送了课程),或最终提交的文件需是KiCad文件,详见大赛主页阶段1要求和项目提交内容。
模块介绍
设计思路
本次设计的IMU模块本着模块化的思想,设计一个紧凑的的而功能全面的IMU模块,本次任务的电路相对还是比较简单的,需要进行基本的外围电路的设计,最后通过2.54的排针或者qwiic的接口进行连接控制。BMI270-IMU模块是一款基于博世超低功耗BMI270的qwiic分线板,使用的主接口是Qwiic,这样的接口可以使用arduino进行快速访问,参考了SPARKFUN 6DOF IMU BREAKOUT - BMI,确实有想要功能尽可能的保留,又希望可以尽可能的简约,主要是将尺寸进行重新的优化,打造自己的传感器模块库。6轴传感器结合了一个16位三轴陀螺仪和一个16位三轴加速度计。
功能介绍
本次设计是实IMU模块集成了以下功能:
qwiic接口,可串联;
IMU数据输出;
支持多种接口连接;
连接框图如下:
硬件介绍
本次设计的IMU模块是基于BMI270设计的,Bosch BMI270超低功耗智能惯性测量单元 (IMU) 专门设计用于各种可穿戴应用,大大提高了加速度计性能。BMI270包含直观的手势、情景和活动识别功能,并集成了针对腕戴式设备专门进行优化的即插即用计步器。该IMU也非常适合其他类型的可穿戴设备,如耳戴式设备、智能服装、智能鞋、智能眼镜和脚踝带。
作为超低功耗IMU,BMI270通过处理多个活动跟踪、计步和手势识别功能来延长系统电池寿命,独立于主系统处理器,无需将其唤醒。这些独立于处理器的功能包括诸如在达到一定步数时发送中断,或在用户站起来并开始行走时通过地理围栏激活GPS等任务。因此,在超低功耗域运行强大而准确的手势和活动识别功能,电流消耗仅为30μA。这显著降低了功耗,用户可以从延长的电池充电时间间隔中受益。
原理图和PCB模块介绍
原理图
PCB
这次的设计主要考虑的跨级接口设计,在PCB布局上注意走线。
实物图
软件调试
本次设计的模块只能说是一个功能模块,用于IMU信息获取,我们需要使用一款主控单元,通过qwiic接口的线根据以下模块引脚定义进行适当的连接,任选一个就可以:
管脚属性 | 管脚名 | 管脚编号 |
P | GND | U2/U5-1 |
P | 3.3V | U2/U5-2 |
I/O | SDA | U2/U5-3 |
I/O | SCL | U2/U5-4 |
这里我们选择了一款arduino开发板作为本次测试验证的主控单元,根据功能需求连接如下:
我们使用arduinoIDE作为主要的开发工具,通过库管理工具搜索BMI270,可以搜到如下的库:
第一个就是官方的库,下面我们就基于这个库进行模块的控制,我们简单实现如下功能功能:输出Accelerometer的信息。
主要代码介绍:
打开开发板的IIC接口和串口打印功能,实时获取数据并打印:
/*
Arduino BMI270 - Simple Accelerometer
This example reads the acceleration values from the BMI270
sensor and continuously prints them to the Serial Monitor
or Serial Plotter.
The circuit:
- Arduino Nano 33 BLE Sense Rev2
created 10 Jul 2019
by Riccardo Rizzo
This example code is in the public domain.
*/
#include "Arduino_BMI270_BMM150.h"
void setup() {
Serial.begin(9600);
while (!Serial);
Serial.println("Started");
if (!IMU.begin()) {
Serial.println("Failed to initialize IMU!");
while (1);
}
Serial.print("Accelerometer sample rate = ");
Serial.print(IMU.accelerationSampleRate());
Serial.println(" Hz");
Serial.println();
Serial.println("Acceleration in G's");
Serial.println("X\tY\tZ");
}
void loop() {
float x, y, z;
if (IMU.accelerationAvailable()) {
IMU.readAcceleration(x, y, z);
Serial.print(x);
Serial.print('\t');
Serial.print(y);
Serial.print('\t');
Serial.println(z);
}
}
模块调试效果图

心得体会
本次我们选择了一个IMU模块的设计,整体硬件电路设计还是挺简单的,软件验证选择了arduino,官方直接支持,用来验证硬件模块非常方便,注意连线一定要正确基本上对全功能进行了引出,如果想要实现更多的功能,请使用2.54mm的扩展接口。