Funpack第三季第三期活动已经完美落幕啦,本期的主角是来自ST的运动MEMS和环境传感器扩展板X-NUCLEO-IKS4A1。大部分活动参与者都成功完成了本期活动任务一。
今天我们就来跟大家分享一下由我们的活动用户【obrulviser】带来的X-NUCLEO-IKS4A1编程笔记。这份开发笔记内容丰富,主要涵盖了板卡示例程序配置、传感器数值读取以及电极触摸识别思路与实现介绍。
相信大家看完之后对X-NUCLEO-IKS4A1的开发会有更进一步的学习和了解。没有完成第三季任务一的同学可以参考看看哦,开发过程讲解可谓是非常详细啦!
原文知乎链接:
https://zhuanlan.zhihu.com/p/695604281
本教程仅测试部分nucleo-64系列开发板,介绍如何让示例程序配置、运行、并能与mems-studio完成通信,使用CubeMX或CubeIDE作为配置/开发环境。
使用CubeMX/IDE选择相应的官方开发板(具体过程需自行百度解决),创建工程。填写完成项目名称后,点击完成后,出现如下对话框,点击yes。
a、选择RTC页面,配置如下。选择框内两个选项即可。
b、选择TIM3界面,配置如下。请先按照图二配置时钟源,再在同一页面下方按照图三配置中断。
a、打开I2C1页面,配置如下。请先按照图4使能I2C1,然后按照图5配置I2C1最后请按照图6配置设置管脚。
b、打开USART2页面,请先按图7,再按照图8配置。
3、打开computing分组,点击CRC,按图9配置即可
4、打开Middleware and Software Packs,双击X-CUBE-MEMS1
a、若未安装,图10处为install,请点击安装。
c、按照图11配置完成后,重新点击X-CUBE-MEMS1,按照图12、图13配置。
6、编译、下载
先点击左侧齿轮图标生成代码,再点击右侧运行编译、下载代码。初次运行时会弹出调试选项,直接确认即可。
知乎原文链接:https://zhuanlan.zhihu.com/p/697676662
本教程仅测试F401RE、G0B1、L476,但是也适用于其他STM32芯片,基于CubeIDE,CubeMX+Keil需要自行研究如何将文件添加到路径。本文从.IOC文件的配置开始。
全部源码请参见下方链接,HARDWARE内就是全部源码,程序下载后以115200/921600波特率打开串口即可读取QVAR数据:https://link.zhihu.com/?target=https%3A//gitee.com/First_Emperor/X-NUCLEO-IKS4A1-senser-control
a、打开I2C1页面,配置如下。请先按照图1使能I2C1。然后按照图2配置I2C1。最后请按照图3配置设置管脚。
2、打开Middleware and Software Packs,双击X-CUBE-MEMS1
a、若未安装,图4处为install,请点击安装。
c、按照图11配置完成后,重新点击X-CUBE-MEMS1,按照图6、图7配置。
5、进入下方链接网页内,下载HARDWARE文件夹,并复制到项目文件夹内。完成后,项目文件夹的结构应与图10类似。
ZERO/X-NUCLEO-IKS4A1传感器控制库:
https://gitee.com/First_Emperor/X-NUCLEO-IKS4A1-senser-control
6、配置HARDWARE文件夹路径,请依次按照图11、图12、图13、图14、图15、图16配置。
注意:Keil请自行查找如何将项目文件添加到路径中
知乎原链接:https://zhuanlan.zhihu.com/p/695520811
通过采集了QVAR电极的原始数据,并尝试自建算法进行单击及滑动识别。
测定官方例程采集频率约1.8KHz,经过多次测量发现,该数据变化范围为+420mv~-420mv。理想情况下,触摸电极2时,数值应为420mv,电极1为-420mv。较为理想的数据截图如图1所示,整体可以近似看作方波信号,数据变化极快,但仍存在毛刺与尖峰。
与此同时,也发现部分情况下信号噪声极大,信号变化幅度不能达到±420mv,完全无法近似认为是方波信号,数据如图2所示。
由于待采集的触摸信号本身就不是一个周期性的信号,噪声大多也与触摸本身而非环境相关。因此,常见的滤波器,如低通滤波器等,并不能对数据进行一个较好的处理。此时,应当考虑非线性滤波器方法,如滑动均值等,参考各类文章,同时考虑到该数据更新速率较快,最终采用中位数滤波算法。当取值窗口在10以上时,已经具备一定的滤波作用,当窗口大于100的时候,部分极快速的点按信号可能会被滤除。考虑到系统响应速度,最终将窗口定为20。滤波后的数据与原始数据对比见图3。
图3可见,系统响应延时与窗口长度近似相等,为20。其中,多数尖峰噪声都被滤除或者抑制,仅对极少数幅度较大,且处于震荡中的的杂波失效。此时,使用每次滤波后的数据与原始数据进行加权平均,加强滤波效果。需要注意的是,这同样会造成系统在上升/下降到临近峰值/谷值时会出现响应速度大幅下降,短时信号甚至可能无法上升到±420mv。选用原始数据权重0.4,滤波数据权重0.6,改善后的效果请见图4。
在经过滤波后,就要尝试将连续的模拟信号离散为数字信号,按照阈值分为1、0、-1三个状态,分别代表触摸左键、无触摸及触摸右键。但是这个方法有一个致命的的缺陷,QVAR数据并不稳定,阈值过低会导致状态反复震荡,而阈值过高又会导致灵敏度降低。图5展示了阈值为±150的时候的数字化情况。
反复震荡的问题确实可以通过加强滤波的方式解决,尝试在中值滤波后加入50点的平均值滤波,振荡问题大幅改善,但是延时也可见的大幅增加。加入中值滤波的效果请参见图片6。
显然多重滤波的效果并不完美,需要一种新的形式来代替增加大幅延时的平均值滤波和利用阈值进行数字化的组合。很容易想到,可以利用数据的变化幅度来检测当前数据的状态,即模电中迟滞比较器、数电中的施密特触发器的输入输出形式。此类思想我们称之为“迟滞”。
虽然上文提到只有两种输出状态,但是类似的我们也可以引入迟滞思想,将算法的输出设为三种状态。设定变化阈值为350mv,引入迟滞后的效果请参见图7。可以看见震荡消失,系统整体的延迟变化不大,效果极好。
此时,QVAR的数据已经量化为1、0、-1。为进一步防抖和降低下一步程序的复杂度,使用延时,设定变化长于50个ms的时候才认为状态改变。现在,原始的电平信号进一步量化为有效的触摸信号,利用数电中序列检测器的思想,如010为左键单击,01-1为向右滑动,01010为左键双击等等。
虽然整套算法识别离线数据时效果良好,但是,在移植到Matlab的AppDesigner中时,却始终不能完成识别。测试发现,由于过高的数据量,会导致AppDesigner的APP直接卡死,无法接收数据。因此,只能将该算法移植到STM32中。由于STM32中并不原生提供中位数等函数,因此尝试放弃中值滤波,直接使用迟滞算法进行数据分析,效果依旧良好,源码请参见链接。
gitee链接:https://gitee.com/First_Emperor/IKS4A1-QVAR-TouchRecognition#%E8%AF%86%E5%88%AB%E5%8E%9F%E7%90%86%E5%8F%8A%E6%B5%81%E7%A8%8B
Github链接:https://github.com/songzhe2001/IKS4A1-QVAR-TouchRecognition
看完我们的热心用户【obrulviser】的开发笔记是不是对X-NUCLEO-IKS4A1的开发过程和本期Funpack第三季第三期活动任务一的具体实现有了进一步的认识和了解。没有完成任务的小伙伴们快来跟着教程笔记再来试试吧!
不仅如此哦,Funpack第三季第四期活动板卡FRDM-MCXN947编程笔记专栏在该作者的知乎主页也在同步更新中哦~
(https://www.zhihu.com/column/c_1796279134449721344)
现在Funpack第三季第四期活动还能下单参加活动,所以你懂我意思吧?赶快下单板卡跟着专栏教程一起开始你的开发之旅吧~