Arduino-可穿戴运动监测设备
本文最后更新于:2019年6月23日 晚上
项目简介
功能:
设计一款可穿戴设备,能够检测佩戴者是否处在运动或休息状态,从而能够在佩戴者长时间(30min)连续运动(步)后,提醒其饮水并适当休息(亮灯和串口打印提醒语句);在长时间休息(60min)后,提醒其适当运动(灯闪烁和串口打印提醒语句)。
硬件设备:
LilyPad Arduino 328 Main Board ,资料链接
LilyPad Accelerometer - ADXL335, 资料链接
软件&语言
Arduino IDE
C/C++
项目方案
利用 ADXL335三轴加速度传感器获取佩戴者的实时数据,Main Board通过分析采集到的数据来判断佩戴者是否在运动或者休息, 再根据多次连续的运动数据进一步判断佩戴者是否处在连续运动状态,从而做出相对应的处理(亮灯或闪烁并打印消息)。
硬件连接:
ADXL335 分别连接 Main Board 的2,3,4引脚。(不是 a2,a3,a4 ?前者是Digital I/O Pin,后者是 Analog Input Channels,ADX输出信号属于 Analog 模拟信号)
const int accelX = 2; // x-axis pin of the accelerometer
const int accelY = 3; // y-axis pin
const int accelZ = 4; // z-axis pin (only on 3-axis models)
预备知识
更具 ADI官方资料 我们知道:无论如何穿戴计步器,总有至少一个轴具有相对较大的周期性加速度变化,那么我们就可以从这里着手,进行数据分析,判断步伐。
算法
1,均值滤波器—滤波
均值滤波器实现均值滤波,其实就是拿到多组x,y,z三轴数据,相加再求平均值。最后的平均值作为输出结果(采样值)。目的是使输出结果更加平滑。完成初步滤波。
1 |
|
这里我们只使用了 x轴 一个轴。但从实验和理论上来说,任意方向动作都是可以,仅仅有幅度(原始数值)差别,但并不影响计步的判断。
2、运动分析
有了滤波后的值,我们可以将其输出到串口,以图形显示运动状态下的数据特征。下图为AD官方的数据图,显示了来自一名步行者所戴计步器的最活跃轴的滤波数据。对于跑步者,峰峰值(每个山峰的最大值也可以看作最大值)会更高。
FILTERD DATA:1 滤波后的值
THRESHOLD:阈值(步判断的参考值),阈值获取 3 再讲解,目前可以看作是一段时间所有最大最小值(滤波值)的中间值(平均值)
图像分析:绿色线条是运动的实时数据,类似于一个一个三角波(一次运动即一次摆臂来回),可以看到,每步运动绿色线条会有两次跨过橙色线(阈值),那么我们就可以设法先后获取两次滤波值(不相等),判断是否有一个值 > 阈值,另一个值 < 阈值,就可以认为佩戴者是走了一步。
步伐迈出的条件定义为:当加速度曲线跨过动态阈值下方时,加速度曲线的斜率为负值.
3、动态阈值(获取阈值)
系统持续采样,不断更新3轴加速度的最大值和最小值,每50次更新一次平均值(Max + Min)/2称为”阈值”。由于此阈值每50次采样更新一次,因此它是动态的,称为”动态阈值”。这种选择具有自适应性。
1 |
|
3、动态阈值(获取两次不等的滤波值)
1 |
|
4、步判断
1 |
|
主程序
每隔3s获取一次步数值,并保存。下一个3s再次获取步数值,和上一次保存的步数值对比,如果有变化,说明佩戴者是出于运动状态的,否则处于休息状态。每判断为运动状态,就更新一次运动时间,否则更新休息时间,然后比较运动时间和休息时间的差值,从而得出是长时间运动还是休息。
1 |
|
流程图
参考资料链接:
主要程序参考
所有LilyPan配套产品资料
Arduino官网-LilyPan介绍
Arduino官网-LilyPan入门资料
Arduino官方编程语言参考
LilyPan原理图
基于ADXL335的闪光礼帽制作