蜜袋鼯健康管理系统
作者:Justd0
一、作品简介
本项目用RSL10搭建一套蜜袋鼯健康监测系统,配合着良好的运动和饮食,使我的小果冻(蜜袋鼯)可以健康茁壮成长。
项目主要功能设想有以下几个:
1、运动健康监测:将RSL10传感器开发套件安装在摩天轮上,通过光照度计收集光照数据,通过空气质量传感器收集温度信息,通过角速度计监测小蜜在摩天轮奔跑的转动速度数据,记录下一晚上的数据,存储在传感器版上。
2、运动健康数据分析:由于小蜜活动时间都是在夜里,这时候我们都是在睡觉的,那么想要知道它一晚上玩的开心与否,那么就可以通过手机上位机的形式,连接RSL10传感器板来接收汇总数据,形成数据表,记录下小蜜一天的运动量~
3、健康运动奖励机制:结合1中的运动数据来分析小蜜是否运动达标~如果达标的话通过RSL10无线SoC评估板来控制投食奖励器,给小蜜投个最爱吃的玉米虫来作为奖励。
但尴尬的是比赛时间由冬天到了夏天,我的小果冻也都已经长大了,并且已经长成了个胖小子…于是本项目也有了新的意义:运动减肥督促器。
二、系统框图
蜜袋鼯健康管理系统的硬件架构如下图所示,整体由三部分构成:以RSL10-EVALUATION-Board为主控的运动奖励器、以RSL10-SENSE-Board为主控的运动健康监测器和手机上位机端构成。具体软件系统实现将以子系统的方式分别介绍。
三、各部分功能说明
3.1 以RSL10-EVALUATION-Board为主控的运动奖励器子系统
该子系统设计主要分为三部分、硬件设计、机械结构设计和软件设计。
首先是结构设计,结构原理确定了,才能定下硬件的选型,这里主要是给小蜜投递最爱的玉米虫吃,玉米虫一般都在2-3cm长,6mm直径左右。因此我想只要设计个小盒子,当要奖励的时候,就翻开盒子的盖子,我家“小果冻”鼻子很灵,一下子就能找到的,于是有了如下方案草图。方案如图所示,玉米虫放在左边的小盒子中,小盒子上面有个盖子,盖子后端有个固定轴,上端有个连杆连接后端,通过相应的动作机构就可以在奖励的时候打开盖子。
动作机构我考虑了电机和电磁铁两种,由于电机产生旋转动力,还得需要双向驱动桥路电路,并且我希望能够多次奖励,就pass了电机。正巧在taobao上淘到了一款物美价廉,尺寸合适功能合适的电磁铁,这价格不比电机香么,于是就它了!
不过收到货之后才发现,跟设想的有偏差啊!我以为他是默认弹出的,然后通电会缩回去。。结果是通电是弹出的。。。那我上面结构就废了。。弹出去就关上了盖子。。
后来想了想,索性重新设计下,这样还更好实现了,于是就有了如下图的方案,使用这个电磁铁弹簧弹力,将装小虫子的小抽屉弹出去。
弹出去的样子如下:
嗯,结构确定了,小盒子可以放一条虫子,这个结构可以放5条虫子作为奖励,上面可以放下电池和控制电路。
结构原理设计好了,就可以设计硬件了,电磁铁选的3v驱动的,所以驱动电路很简单,只用一个mos外加续流二极管就行了,直接用RSL10的IO就可以驱动,于是画了个原理图
但奈何时间 可能不够了,如果连带RSL10一起打样的话,信号那边出点问题可就费劲了,所以简化了下,打算用RSL10开发板 连接驱动部分来实现。
layout图如下,
软件层面其实内容比较简单,首先是要控制电磁铁的通断只需要实现几个IO的功能,我选择了ble_peripheral_server_bond作为基础工程,在app.h中定义了输出引脚号:
并在app_config.c中做了初始化,代码如下
然后是通讯方面,使用定义好UUID的customss协议实现,BLE最大可发送的包大小为20字节,因为这部分控制也很简单,只要控制对应奖励盒弹出即可,所以协议只用了两个字节,如下
其中 第一个字节为指令,固定0XFF,第二个字节按位控制对应奖励器开关,例如0x01为第一个盒子,0x02为第二个盒子,0x04为第三个盒子…然后在app_customss.c中修改接收、和发送的订阅协议,如下所示
发送给上位机的订阅实现
上位机发送给下位机的接收实现
需要注意的是,这个电磁铁只要通电一下就能弹出来并且自己维持,所以为了避免浪费电量,增加了个软件定时器,来执行关闭电磁铁的操作,代码修改如下:
并在app.c中注册上述函数的回调:
3.2 以RSL10-SENSE-Board为主控的运动健康监测器
运动监测系统,该系统主要部署在RSL10-SENSE-GEVK板子上。依靠开发板上丰富的传感器资源来实现记录环境光照数据、环境温度数据、环境噪声数据和飞鼠滚轮的运动角速度和转动圈数等。
像下图这样,RSL10-SENSE-GEVK板通过双面胶直接粘在了飞轮的中间,这样经过一晚上的收集,第二天早上就可以看到整晚小蜜周围环境和运动数据了。
在这个目标中要实现的功能主要有两大块:数据采集和存储。
3.2.1、数据采集
1)光照采集
光照数据采集方式就相对比较简单,RSL10-SENSE-GEVK板上的LV0104CS由于没有示例代码,因此我按照官方的代码风格实现了个驱动库。
使用时,只要在主函数中初始化I2C和传感器,并创建相应的回调函数,在回调函数中就可以定周期获取光照数据了,这里我为了方便数据保存,按照公式1对亮度数据进行了处理:
这样单个数据就可以存放在一个字节内了。
2) 环境温度数据
RSL10-SENSE-GEVK板上才用的BME680这款芯片,BME680是个多功能的环境空气检测芯片,可以测量温度、湿度、空气质量等。不过我这里仅关心小蜜所在的环境的温度数据,因此只对温度进行了处理,也是为了方便数据保存和传输,将16位的x10温度值并偏移10度,转化为的室温范围,储存在一个字节中。
3)环境噪声数据
RSL10-SENSE-GEVK板上配有一个inmp522,数字mic,可以实时采集环境的声音数据,声音属于实时数据,一般我们会使用分贝计来评估环境噪音的强度,这里我对声音数据进行了一步处理,将其转换成了分贝进行数据保存,具体声音数据转分贝的公式如下:
因为音频采集的中断频率很高,而我要对整晚的环境进行监测,因此我先对音频数据做了均值滤波,并进行分贝计算,然后保留这里最大的分贝值用于存储。
4) 角速度及转动圈数数据
角速度数据和转动圈数数据依靠BHI160进行获取,这里为了减少数据保存的数量,使用了BHI160的运动模式识别功能,也是为了减少数据存储空间的压力, 依靠BHI160芯片内部的运动识别功能,识别到运动后,开始记录角速度数据,静止后则停止记录角速度数据,同时芯片内部还自动拟合角度数据,那么通过对角度象限的判断就可以获取转动的完整圈了,所以圈数和角速度记录逻辑如下:
3.2.2 数据存储
在平时,我们在单片机里对数据进行存储,可以通过RAM中的变量来进行存储,或者需要掉电保存的数据可以储存在FLASH/外部FLASH等介质中,但往往要根据实际情况来决定使用何种方式进行。
本项目中要记录蜜袋鼯一天(我们的一晚上)的运动量和环境数据,具体包括温度、光照、噪声和运动数据等。每种数据又因为数值范围的不同占用空间也不同。
比如温度数据就可以认为室内就10度-35度之间,那么一个8位的数据就可以表示0.1精度的温度了;光照一般室内在0-2000lux不等,那么通过压缩,一个8位数据也可以表示10lux精度的光照了;噪音一般是30-120db不等,也可以通过8位数据表示1db分辨率的噪音;运动数据包括最大角速度、圈数和运动的波形数据,这里我已RPM为角速度单位,按照分析小蜜再怎么快也应该超不过100rpm,所以最大角速度和运动波形数据单位值一个字节也够用了,而运动圈数可能一晚上跑个10000圈,所以就给个两个字节来存储;以上就算都一组数据,如果同时记录一组的话 则需要 7bytes。
一晚上按照8小时计算的话,那就是480分钟,那就是28,800秒钟,如果一秒钟一个数据,那就是28.8k * 7 = 201.6Kbytes。但实际上,1s中记录一次没啥必要。比如像温度、光照、噪声可以频率低一些,这里我采用5分钟记录一个值;运动数据呢,肯定会有大量的静止状态,所以只记录运动时的数据就好了。
那这样的话,24小时的固定记录的温度、光照、噪声数据的空间占用则可以缩小为288bytes*3,运动数据以10hz来记录,按照一小时的活动量,就是3.6kbytes的数据。从下图RSL10的内存资源可以看出,基本上用一个RAM块足够够的了。
不过板子上有个N24RF64,一个NFC芯片带了8Kbytes的片外eeprom,我寻思着就把数据放在这里吧,还可以放置掉电丢失,于是就写了一套简单的数据内存管理模块,可以实现为不同类型的数据申请内存空间,利用缓存机制,来实现数据保存到eeprom的操作,并通过读取接口,可以顺序读取eeprom中的对应数据等功能。
具体是用双缓冲机制来实现,初始化时给数据分配两个缓冲区,读取和写入各一个缓冲区,写入缓冲由wirte方法管理,当写满一个缓冲区后,将该缓冲区写入到eeprom中,读取则从eeprom取出一缓冲区大小数据,使用read函数管理,分块读出内容。
初始化试实现代码如下:
读取方法实现如下:
写入方法的实现:
3.3 手机上位机
上位机系统可以与运动奖励系统和运动数据监测系统进行通讯,接收运动数据监测系统的环境和运动数据,控制奖励系统给小蜜投递奖励。在写上位机之前,需要根据前面设计的功能,对手机与模块间通讯协议进行制定。
首先,运动奖励子系统中主要就实现了单向的IO控制,协议相对简单:
如上图,上位机端发送两字节指令,第一个字节为指令,固定为0xff,第二个字节为要打开的弹窗索引号,索引号见可以或操作,也就是可以一条指令弹出任意个弹窗。
接下来,运动数据监测系统则需要双向通讯,以传输各个状态信息,而BLE协议中稳定传输时,每帧中最多20字节,而运动监测子系统中有些数据量很大,需要多包传输,所以协议相对复杂些,具体如下。
上位机端的协议如下:
下位机端的上发协议如下:
协议格式为 :指令 + 数据长度 + 数据的方式
手机端一共12条协议,3个设置项,9个获取项
下位机端一共12条协议,分别对应上位机端的12条进行回应。
制定好了协议包内容,就可以分别实现上下位机的协议处理了,下位机端结合上面3.2.2中设计的数据存储策略,实现协议解析,具体实现方法就是switch解析指令,具体参见代码protobuf.c中实现过程。
上位机端采用手机软件的方式,在手机端实现上位机,可以有很多种方式,比如坛友有用Android/ios直接编的,也有用针对少年开发的Scratch图形化编程的,还有用微信小程序开发的。因为之前有申请过微信开发账号,所以这个项目 我也选择的微信小程序来 实现的上位机。
小程序上分为三个界面,第一个是欢迎界面,如下图所示,其中是项目标题、”小果冻“照片和两个功能索引按钮,第一个按钮为“来呀,点我看看”实现的是本项目的主要功能,第二个按钮为“或者,调试一下”实现的本项目中需要设置或者调试的功能,接下来分别介绍这两个界面。
3.3.1调试界面
首先介绍下调试界面,点击“或者,调试一下”就可以进入到调试界面。
在这个界面中,分别设置了数据检测器调试区和奖励器弹出调试区,每个区域中默认状态下只要一个按钮,后台蓝牙处于扫描阶段,当扫描到了对应的设备后,界面将会编程如下样子:
点击连接,并且连接成功后,则会显示出各项调试功能。在这里可以清空总圈数,清空数据缓冲区,设置当前时间,获取各项数据,如下图所示:
点击连接奖励器,则会显示出弹窗按钮,按下相应的按钮,奖励器就会弹出相应的窗口:
3.3.2主界面
接下来是主界面,“来呀,点我看看”,进入该界面后,可以看到两个按钮,一个是get,一个是clean,同时左边会显示进度条。
在一点进界面后,后台就会自动搜索设备,当显示设备注册成功后,就可以点击get来获取数据了,如下图所示
此时等待进度条走满后,数据就会加载到下面图表中,图表是采用的eschart for weixin的开源库,图表中会显示出温度、亮度、噪音、和运动角速度的数据,这样小果冻一晚上的环境和他的运动情况我们就了如指掌了~
系统也会自动根据数据来显示出小果冻一晚上的运动情况,并显示“要不要奖励一下?”的功能按钮,此时,如果我们核对了各项数据,觉得没问题了呢,就可以点击该按钮,来进行奖励。
当然了,如果系统都没检测到小果冻跑了,你要是强行开后门给奖励,系统可是不同意的哦,会显示如下界面。
四、作品源码
本项目中设计的代码、电路图、机械结构件等资料均已上传到github
链接如下:HMS Of Glider
五、作品功能演示视频
论坛发帖情况:
蜜袋鼯 第②贴 RSL10-SENSE-GEVK初体验,亮度传感器报错问题求助
蜜袋鼯 第③贴 RSL10-SENSE-GEVK 光照传感器驱动 写好了 分享给大家
蜜袋鼯 第④贴 RSL10-SENSE-GEVK 玩耍BHI160,步数、运动识别?不用处理,直接获取!!
蜜袋鼯 第⑤贴 基于RSL10的蜜袋鼯健康监测系统--项目简介
蜜袋鼯 第⑥贴 基于RSL10的蜜袋鼯--运动奖励系统之硬件设计
蜜袋鼯 第⑦贴 基于RSL10的蜜袋鼯--运动奖励系统之软件设计
蜜袋鼯 第⑧贴 基于RSL10的蜜袋鼯--运动奖励系统之组装测试
蜜袋鼯 第⑨贴 基于RSL10的蜜袋鼯数据监测子系统-设计与实现
蜜袋鼯 第⑩贴 基于RSL10的蜜袋鼯健康监测系统-上位机设计
视频链接:
六、项目总结
首先感谢eeworld和安森美可以举办这么好的比赛,RSL10是个很强的芯片,通过项目比赛还只能开发出他能力的冰山一角,希望后续可以在项目或工作中使用到它。由于受到疫情影响,本比赛产生了半年延期,但这也不是谁能控制的了的事儿,这期间主办方一定是各种的计划变动、商讨对策等等,所以各位辛苦了~
PS:本项目主主要是去年冬天的一个突发奇想,当时正好养了小蜜袋鼯,软软的身体,大大的眼睛,拿在手里十分可爱~
但是毕竟它是夜行动物,白天能在你兜口里安安静静的睡觉,晚上可是要吃饭玩耍的。
所以,当时就像正好又这么蓝牙设备可以控制一些东西,结合些小结构,那就可以设计一套监测小蜜的健康系统了~
于是,保温、环境健康监测、运动监测、喂食等等功能想法一涌而出。
奈何,疫情了,比赛延期了。。半年就这么过去了
我的小果冻,也茁长的长大了,,并且超出了我的预期,已经是个小胖子了。。。
于是,我再次思考这个项目,发现,意义依旧存在啊!虽然保温功能目前用不上了,但是这货长这么胖,得减肥了啊!
索性我把喂食系统改成了运动奖励系统,环境健康检测和运动监测维持不变。
喂食逻辑改为运动达标后奖励食物的逻辑。
而且食物奖励的时候,既然它也看不出我盒子里装了啥,索性就搞个盲盒奖励~
每次随机放进虫子、燕麦、鳕鱼条之类的,让他运动后能够受到奖励,但又让他摸不到头脑跑多久就会有虫子,这样有种神秘感,也许他能坚持得更久!哈哈
“你这主人是真的狗。。”
本帖最后由 justd0 于 2021-7-21 16:12 编辑