项目描述
本项目的硬件环境使用了 NUCLEO-G0B1RE 开发板和 X-NUCLEO-IKS4A1 传感器评估板。
NUCLEO-G0B1RE 属于STM32的Nucleo-64系列,板载集成有ST-LINK调试器/编程器,无需单独的探头。该系列的开发板支持Arduino与ST Morpho扩展接口,方便开发者进行快速原型制作和应用测试,ST为其提供了广泛的软件库、文档资源和社区支持帮助开发者最大化利用这些开发板。
X-NUCLEO-IKS4A1是一款运动MEMS和环境传感器评估板套件,包括X-NUCLEO-IQS4A1主板(搭载运动MEMS和环境传感器)和可拆卸的STEVAL-MKE001A附加板(搭载Qvar滑动电极)。
板载传感器:
- LSM6DSO16IS:MEMS 3D加速度计 + 3D陀螺仪 与ISPU
- LIS2MDL:MEMS 3D磁力计
- LIS2DUXS12:超低功耗MEMS 3轴加速度计
- LPS22DF:低功率和高精度MEMS绝对数字输出气压计
- SHT40AD1B:高精度超低功耗的温湿度传感器
- STTS22H:低电压,超低功耗,0.5°C精度的温度传感器
- LSM6DSV16X:MEMS 3D加速度计+ 3D陀螺仪
此传感器评估板可以完美对插 NUCLEO-G0B1RE 开发板,同时也对板载传感器提供了非常完备的测试功能,不仅可以单独关闭任何一个传感器,通过跳线切换传感器IIC通信地址,还可以通过替换采样电阻实现任意单个传感器的功率监测。
设计思路
本次任务是基于stm32进行软件开发,过去我所习惯的环境是keil,不过因为这两年我更喜欢arduino下跨平台的易用性,同时也一直有听闻stm32是支持arduino环境的,所以先去搜索了下arduino下开发stm32的一些文档和帖子。
搜索后我发现了stm32duino,st官方也为此开发板在arduino环境下开发了丰富的例程。在stm32duino环境的安装上我着实废了一些力气,和esp32的arudino环境一样,stm32duino受限于网络环境,部分步骤需要手动安装,尝试了多次后,环境终于是安装成功了。和常规的arduino开发,stm32duino首先的区别是选择开发板时有一个更多的选项,也许是因为支持芯片太多,所以在开发板选项中其实只有nucleo32/64/144的三款开发板可选。
具体板载处理器则需要在工具-Board part number中进行选择(本项目选择Nucleo G0B1RE)
后续的软件开发在Arduino环境中则相对简单,st为此传感器评估板开发了12个示例
- X_NUCLEO_IKS4A1_HelloWorld: 此应用程序提供了X-NUCLEO-IKS4A1扩展板的简单使用示例。它展示了如何在串口中显示所有板载MEMS和环境传感器的值。
- X_NUCLEO_IKS4A1_LSM6DSO16IS_ISPU_Sensor_Fusion: 此应用程序展示了如何使用LSM6DSO16IS传感器融合功能通过ISPU读取四元数并在串口中显示数据。
- X_NUCLEO_IKS4A1_LSM6DSV16X_6DOrientation: 此应用程序展示了如何使用LSM6DSV16X加速度计找出6D方向并在串口中显示数据。
- X_NUCLEO_IKS4A1_LSM6DSV16X_DoubleTap: 此应用程序显示如何使用 LSM6DSV16X加速度计检测双击事件。
- X_NUCLEO_IKS4A1_LSM6DSV16X_FreeFallDetection: 此应用程序展示了如何使用LSM6DSV16X加速度计检测自由落体事件。
- X_NUCLEO_IKS4A1_LSM6DSV16X_MLC: 此应用程序展示了如何使用LSM6DSV16X加速度计的MLC检测活动。
- X_NUCLEO_IKS4A1_LSM6DSV16X_Pedometer: 此应用程序展示了如何使用LSM6DSV16X加速度计来计算步数。
- X_NUCLEO_IKS4A1_LSM6DSV16X_Qvar_Polling: 此应用程序显示如何在轮询模式下使用 LSM6DSV16X Qvar 功能。
- X_NUCLEO_IKS4A1_LSM6DSV16X_Sensor_Fusion: 此应用程序展示了如何使用LSM6DSV16X传感器融合功能在串口中显示四元数数据。
- X_NUCLEO_IKS4A1_LSM6DSV16X_SingleTap: 此应用程序展示了如何使用LSM6DSV16X加速度计检测单次点击事件。
- X_NUCLEO_IKS4A1_LSM6DSV16X_TiltDetection: 此应用程序展示了如何使用LSM6DSV16X加速度计检测倾斜事件。
- X_NUCLEO_IKS4A1_LSM6DSV16X_WakeUpDetection: 此应用程序展示了如何使用LSM6DSV16X加速度计检测唤醒事件。
对应于本次任务,我进行了如下代码测试:
QVAR滑块
此功能的详细描述可以参考ST的官方应用手册:an5744。板载的LSM6DSV16X 6轴IMU内嵌QVAR静电传感器功能,在参考了X_NUCLEO_IKS4A1_LSM6DSV16X_Qvar_Polling例程后,可以学习到QVAR功能的开启和数据读取代码:
accGyr.QVAR_Enable();//LSM6DSV16X的QVAR功能使能
accGyr.QVAR_GetData(&qvar_data);//QVAR电极数据读取
上传测试后可以看到当没有按键被按下时,读取到的数值是一个接近0的数值
当按下左键,读取到的是一个稳定大于380的数值
当按下右键,读取到的是一个稳定小于380的负值
另外需要注意的是,当使用LSM6DSV16X的Qvar功能时,需要将传感器评估板的J4,J5跳线的3和4引脚短接(板载为2.0接口的排针但是配了2.54的短接帽,所以当数据读取有异常时需要先判断是否接触不良)
基础传感器数据读取功能及高度转换
此部分功能参考X_NUCLEO_IKS4A1_HelloWorld例程
高度计算使用公式:altitude=(1013.25-pressure)*9
空间姿态计算
这块传感器评估板其实板载了3组姿态传感器,分别是LSM6DSO16IS,LIS2MDL+LIS2DUXS12,LSM6DSV16X。其中LSM6DSV16X被计划用于QVAR触摸按键功能(当然也可以同时进行姿态检测),LIS2MDL和LIS2DUXS12是两颗单独的传感器,而LSM6DSO16IS内嵌有意法半导体的一款新型处理器件ISPU(智能传感器处理单元),支持依赖传感器数据的实时应用,可以在边缘执行信号处理和AI算法。最终我选择使用LSM6DSO16IS来进行空间姿态计算。
参考X_NUCLEO_IKS4A1_LSM6DSO16IS_ISPU_Sensor_Fusion例程,如果要获得四元数数据,需要首先在初始化阶段对ISPU进行编程:
ProgramPointer = (ucf_line_ext_t *)ispu_conf;
TotalNumberOfLine = sizeof(ispu_conf) / sizeof(ucf_line_ext_t);
SerialPort.println("LSM6DSO16IS ISPU Sensor Fusion");
SerialPort.print("UCF Number Line=");
SerialPort.println(TotalNumberOfLine);
for (LineCounter = 0; LineCounter < TotalNumberOfLine; LineCounter++) {
if (ProgramPointer[LineCounter].op == MEMS_UCF_OP_WRITE) {
if (sensor.Write_Reg(ProgramPointer[LineCounter].address, ProgramPointer[LineCounter].data)) {
SerialPort.print("Error loading the Program to LSM6DSO16ISSensor at line: ");
SerialPort.println(LineCounter);
while (1) {
// Led blinking.
digitalWrite(LED_BUILTIN, HIGH);
delay(250);
digitalWrite(LED_BUILTIN, LOW);
delay(250);
}
}
} else if (ProgramPointer[LineCounter].op == MEMS_UCF_OP_DELAY) {
delay(ProgramPointer[LineCounter].data);
}
之后在loop函数中等待ispu计算完成,使用如下函数得到四元数数据:
sensor.Read_ISPU_Output(LSM6DSO16IS_ISPU_DOUT_00_L, &quaternions.raw_data[0], 16);
从串口得到的结果如图
此时使用Adafruit的串口数据——3D显示页面https://adafruit.github.io/Adafruit_WebSerial_3DModelViewer/就可以在电脑上看到开发板在空间中运动的演示。
最终项目代码流程图如下
基于Qvar触摸按键的数据读取判断左按键和右按键是否被按下,基于左右按键进行模式变换,然后根据不同模式选择不同传感器数据输出,mode7状态下会将四元数数据和高度数据输出到串口,同时在上位机中显示开发板的实时姿态。
如图,此时开发板在桌面倒置,串口输出四元数数据和高度数据,上方用于显示开发板姿态的兔子也处于倒置状态。
总结
本次活动的过程比我想象中的有趣,感谢eetree的活动,让我有机会尝试使用Arduino进行stm32开发,ST官方例程无论是丰富程度,还是代码的易读性,在我玩过的Arduino开发板中都是非常优秀的。同时也感谢Adafruit开发了如此有趣的在线3D预览网页。