9.5
清单已经出了一段时间了。买的少部分元器件也到了,今天重新分析一遍清单,找找相关资料。
清单:
二维云台和摄像头很熟悉了,做控制题必选,鉴于TI杯2018年省赛和2019年国赛都出过无线充电小车,两年的赛题出现重叠,因此可以猜一下2020年会不会出现电磁炮类似的题(纯属个人猜测),不过提前把云台和摄像头调好还是有必要的。
关于电磁炮前期的备赛情况,可以参考博主2019年的参赛笔记:
https://blog.csdn.net/weixin_44578655/article/details/99649173
控制题的备赛规划:
使用stm32和MSP430分别实现二维云台控制和openmv通讯、4轮小车控制。
MSP430最好前期准备一下,以防TI限定单片机。
除了控制题,清单中还有一个亮眼的地方,有两个器件给出了具体型号和购买链接:
- 温度传感器LMT70
- 模拟前端芯片ADS1292
另外推荐的测试仪器中也有一个显眼的存在: - 心电信号模拟器
这已经暗示的很明显了,去TI官网搜了一下,ADS1292是TI的一款心电检测专用芯片,特点是小型、便携;LMT70是接触式温度传感器
ADS1292手册截图:
ADS1292可以测量心电信号、呼吸波,LMT70测体温,二者共性:低功耗。
在eeworld搜索关键词ADS1292:
这里有一篇2020年1月发表的、由TI 专家委员会成员 Haroad Chen 整理提供的问答贴,问答的大部分内容都是关于可穿戴设备的传感器,其中就接连出现了ADS1292和LMT70。
看到这,题目名称都呼之欲出了:
(我来猜一个)
低功耗穿戴式人体参数测量仪,
两个传感器的特点都是低功耗,那么MSP430基本没跑了。
这应该算是道测量题,备赛目标:
画一个ADS1292+LMT70评估板,使用MSP430调通,针对“低功耗、穿戴式”部分做好提前准备。
9.6
找ADS1292相关资料,在考虑是自己画还是买,去淘宝买了个资料,包含原理图和STM32驱动程序,参考价值还可以。
接着去TI官网找了找:
多参数患者生命体征监护仪前端参考设计:
https://www.ti.com.cn/cn/lit/ug/zhcu652a/zhcu652a.pdf?ts=1599364363678&ref_url=https%253A%252F%252Fwww.ti.com.cn%252Fsitesearch%252Fcn%252Fdocs%252Funiversalsearch.tsp%253FsearchTerm%253DADS1292
试着找了一下MSP430驱动ADS1292的固件
开始绘制ADS1292评估板的PCB,计划硬件部分包含:
ADS1292R心电采集模块
STM32F103最小系统板
LMT70*2
按键、LED、LCD、蓝牙
9.10
PCB绘制完成
- ADS1292R心电采集模块
- STM32F103C8T6最小系统模块
- LMT70模块
三个模块独立,可以合在一起直接使用,如果要更换MSP430可以直接掰开更换。
9.15
焊接完成(除LMT70),简单测试了一下ADS1292部分(之前购买过例程),ADS1292能够正常识别。
9.20
心电模拟器还没买,接人体实验了一下,能够看到心电波形,效果还不错,和队友高兴坏了!
蓝牙调试APP显示的波形
10.7
这中间两个多周的时间被其他事影响到心态(保研政策变动,成绩不是很好的博主提前下车,打算去考研了)。
电赛一直没动,比赛日期临近,又重新拾起来,电赛是信仰,不能丢。
使用LCD屏显示出实时波形(图上的波形来自心电模拟器)
10.8
解决了心率测量,使用心电模拟器可以准确算出心率。
加到人体上测试了一下。发现跟第一次测试结果不太一样,心电波形干扰特别严重,出大问题。
图上红线是设定的动态阈值,用于检测R波,计算心率,心率测的倒是很稳。
下午和晚上一直在搜心电波形去除噪声的解决办法。
10.9
晚上出题,看了两三道题,果断选了A题(无线运动传感器节点设计):
赛前备赛情况:
ADS1292已调通
已完成模拟器的心电信号LCD显示和上位机显示,能够实现稳定的心率测量(使用心电信号模拟器)
接入人体测试时,存在基线漂移和肌电信号干扰,开题前暂未得到解决(此前搜过不少相关文献,处理办法比较多,但一直没测试)
题目下发后,由于没仔细读要求,以为心电可以接模拟器测(我们此前使用模拟器的效果非常好),因此觉得第一问的分已经拿到,
第二问是送分题,第三题看起来不难,第四题备赛期间已经实现。
当晚很自信的回宿舍睡觉了,睡前水电赛群的时候,发现心电要接到人体上实测,又开始紧张起来。
波形干扰严重,由于此前没有解决过相关的问题,不能保证5天可以调到很好的效果。
群里有大佬使用FIR带通滤波器测试过的,效果很好,交流了一下,当晚将FIR滤波器的相关内容安排给学霸队友。
10.10
早上安排队友任务:
队友A:LMT70标定、解算
队友B:尝试FIR滤波解决心电图的基线漂移和肌电干扰问题。
上午完成陀螺仪(9轴姿态传感器模块)的数据读取,考虑通过加速度进行步数和距离测量(距离是加速的的两次积分),搜文献无获
后在知乎找到大概的方案,首先需要将原始加速度数据变换到地面坐标系中(通过欧拉角解算),动手演算了一下,不简单…
认真权衡后,放弃上述方案,工作量过大,仅仅加速度变换坐标可能就要花掉整整一天时间,且最终解算出来后加速度数据也不一定满足测距精度要求。
在实验室来回走了十多分钟,观察走路的运动特征,想到一个可行方案,9轴模块绑在腿上,通过欧拉角判断抬腿和落腿动作,计步,然后通过抬腿角度和步数大概推算出运动距离。
晚上7点完成上述方案的计步数部分,效果良好。10点测距完成,效果良好。
下午队友的LMT70标定完成,测试效果良好。
晚上队友的FIR滤波基本移植完成,大概看了一下以后睡了,第二天早上再起来测试。
FIR带通滤波器移植参考安富莱的DSP教程:
https://www.stmcu.org.cn/module/forum/thread-601106-1-1.html
10.11
安排任务:
队友A:LMT70部分设计报告
队友B:FIR滤波器部分设计报告
上午完成FIR带通滤波器实际测试
200阶、频带:0.5-30 、采样频率100HZ
matlab仿真出的滤波器幅频特性:
测试效果很好,肌电干扰可以基本滤除,今天给队友测心电时发现他的未处理的心电图基本没有基线漂移,所以实际对于基线漂移的去除效果还未知,后面再测几次。
滤波前效果:
滤波后效果:
图中左下角的数字是每采样10000次的用时(单位ms),可以看到FIR带通滤波引入的延时是很小的。
中午去缝纫店买了松紧带和魔术贴,自己缝了一个腿部的绑带,用来加固腿部的9轴传感器模块,使用起来还不错。
下午写了写设计报告。
此前因为已经使用蓝牙测试过上位机,上位机APP是应用市场下载的,界面可以二次开发,从功能指标上来说完全可以满足要求。
但规则上说需要实现无线上网,蓝牙和上网的概念匹不匹配不好说。
目前来看进度不错,时间也还富余,为保险起见还是改成使用wifi模块,晚上移植esp8266。
傍晚esp8266 TCP收发调通。
开始写服务器端上位机,此前使用C#写过示波器上位机,
这次的心电显示直接使用winform的chart控件就可以方便地实现,除此之外还要搭建TCP服务器。
百度了一下,教程相当丰富,首先使用网上的代码简单完成了一个控制台的服务器,测试成功,参考博文:
https://www.jianshu.com/p/21bad87504fa
接下来做图形界面,测试一下chart控件。
搜了几个chart控件的文章测试了一下,看了一下实现方式,有个缺点:
每次有新的点要画时,需要擦除页面所有的点,再重新画。
用这种方法测试了一下,数据量一多就刷新不动了。chart控件好像不能满足要求。
之前做过示波器上位机,是直接调用C#的画线、画点的库,在窗口直接绘制,尝试复现这种方法。
写到凌晨3点多,没做出来,放弃,睡觉。
10.12
早上起床又搜了几篇chart控件做示波器的博客,找到一篇看起来可行的:
https://blog.csdn.net/ZLK961543260/article/details/80454009?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522160246573519724836704563%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fall.%2522%257D&request_id=160246573519724836704563&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2allfirst_rank_v2~rank_v28-1-80454009.pc_first_rank_v2_rank_v28&utm_term=C%23%E4%B8%ADchart%E6%8E%A7%E4%BB%B6–%EF%BC%88%E5%BD%93%E6%95%B0%E6%8D%AE%E9%87%8F%E8%BE%83%E5%A4%A7%E6%97%B6%EF%BC%8Cx%E8%BD%B4%E5%87%BA%E7%8E%B0%E6%BB%9A%E5%8A%A8%E6%9D%A1%EF%BC%89&spm=1018.2118.3001.4187
按照上面的博客,示波器效果实现了,刷新速度也满足要求,但实时收发时,TCP存在拆包粘包现象,一上午又过了。
这还是有经验能快速定位问题的速度,写这种上位机就是小问题颇多,走一步百度一步,走不通就得退回去换条路。
中午睡了一觉,起床后思路清晰了一些,一开始以为是chart控件效率太低,刷新速度慢导致数据积累,后来发现是TCP本身存在粘包直接导致数据变成一大坨再传入服务器,波形像一页一页ppt导入,没有动态刷新的效果。
查到UDP传输不存在粘包现象:
https://www.cnblogs.com/xwj517537691/archive/2013/06/05/3118971.html
如果改用UDP传输的话,ESP8266部分和服务器基本收发部分都需要重新来,权衡了一下,还是看看TCP透传有没有什么解决办法,之前使用网络调试助手的时候发现连续发送模式下最小发送周期是50ms,这样看来是有道理的(防止TCP粘包)
因此发送端发送周期不超过50ms,就可以避免粘包了,虽然周期需要拉长,但实际波形不能变,所以需要设一个缓存区间断发送。
这样会导致波形的缓存区切换处不连续,不过影响不大。
上述改进方案测试成功,后面又重新测试了一下不使用缓存区,直接实时发送数据,发现TCP粘包现象又消失了,因此在上位机和下位机都设了两种模式,
一种是实时发送模式,另一种是缓存区间断发送模式,测评时默认为实时发送模式,如果在测评现场出现粘包问题,就改为缓存区发送模式。
测试发现数据刷新跟网速关联比较大,存在延时。如果间歇性卡顿比较明显,一样可以采用之前的缓存区发送法,降低数据量。
晚上完成服务器功能(忘了加温度)。
10.13
白天写了一天设计报告,遇上统一核酸检测,耽误了好几个小时。
下午测试时发现波形完全没法看,又重新改了FIR滤波器的参数。
晚上发现是RL导联线接触不良引起波形紊乱,实际FIR滤波器效果良好。
此前测量距离的方案是步长*步数,由于现场步确定是否找其他人测试,步长不可控,因此加入步长校准功能,测距之前先校准:通过按键按照界面提示进入校准模式,走5m,系统会自动记录步数,校准步长 = 5/步数。
由于此前TCP传输存在粘包问题,导致波形显示像放PPT一样。
使用缓存区间断发送后,虽然波形显示顺畅了,但引入了延时。比赛要求有一项是传输时延不能大于1秒。
怕在这栽了跟头。晚上通宵把服务器改成了UDP协议。
结果发现还是一样的效果(存在数据堆积),凌晨5点看到屏幕上一卡一卡的波形,宣告一晚上白给,睡觉去了。
10.14
早上爬起来花了1个多小时给PCB做了个外壳(可以搭配腰带绑在身上)。安装好很精致!
还是很在意题目要求中的延时1s内的问题,由于对TCP粘包做了处理,服务器端的波形显示并非完全实时。
如果在这一点扣分的话就太冤枉了。
重新想方案:蓝牙传输不存在粘包问题,如果测评现场对WIFI和蓝牙不区分的话,就改用蓝牙模块。
由于TCP和蓝牙都是经过串口数据透传,所以下位机端不需要改动,蓝牙和WIFI可以无缝切换。
蓝牙模块在windows上可以映射出虚拟串口:
https://blog.csdn.net/px_528/article/details/70782059
这样只需在上位机服务器上加入串口模式即可,之前写过模板,移植很快。
一个小时完成,粘包终于没了,波形可以实时显示!!!
服务器的最终样貌:
设备端的最终样貌:
做到最后,温度传感器反而是最难调的,有的时候相当准,有的时候温度乱漂,我们也不确定现场到底会怎么样,在设备上加了温度补偿设定功能,防止现场误差太大。
10.15
早上第一组测评:
测评表
第一问
连接心电模拟器:
波形 满分
测量心率 满分
连接人体:
波形 满分
测量心率 满分(老师拿小米手环比照的,数据一模一样)
第二问测体温:
满分(老师测自己手掌,等我们缓过来分都打好了,还挺准的,校准功能没有用到,万幸!)
第三问:
测距离:
满分(我们队友控制步距控制的太棒了,标准20m,走了两次,一次20.27m,另一次19.68m)
测步数:
满分(只要走得慢点,可以百分百识别)
第四问服务器端:
满分
第五问其他项:
可穿戴、屏幕显示、WIFI蓝牙双模式自由切换
4分(老师原话:“不能全满分吧,给4分”)
后面作品会开源出来
包括PCB、设备端程序、服务器程序、文档
FIR滤波器测试效果
滤波器阶数:200
采样率100HZ
最低截止频率Fc1:0.5Hz
最高截至频率Fc2:40Hz
Fir滤波器仿真幅频特性:
滤波前心电波形:
测试滤波后心电波形: