【DigiKey创意大赛】家庭共享智能药盒06+作品提交
<p><!--importdoc--></p><div><strong>家庭共享智能药盒</strong></div>
<div>作者:oet</div>
<div>一、<strong>作品简介</strong><br />
以往的智能药盒主要是针对单个用户设计,实际应用中,随着老龄化越发严峻,家中有两位甚至更多老人长期吃药,维持血压,血糖水平的需求越来越多,单用户药盒就不太适用了。为了解决这个痛点,我设计这个家庭共享智能药盒,支持多个用户使用。本方案采用STM32H7B3I-DK作为主控,使用OpenMV进行人脸识别,配合屏幕显示和语音提示,做成自动识别用户,主动显示药品格子号,并点亮药品格子指示灯,让用户尽量少做选择。该作品还安装了BME280传感器,用来采集室内温湿度信息并显示。下图是最终的作品照片,我用带方格的白纸代替药盒,方便演示,看起来更直观。</div>
<div></div>
<div>本次作品从得捷电子采购的器件:</div>
<table border="1">
<tbody>
<tr>
<td>序号</td>
<td>型号</td>
<td>名称</td>
<td>用途</td>
</tr>
<tr>
<td>1</td>
<td>OPENMV4 CAM H7</td>
<td>OPENMV开发板</td>
<td>用于识别人脸</td>
</tr>
<tr>
<td>2</td>
<td>BME280</td>
<td>BME280传感器</td>
<td>采集湿度,温度参数</td>
</tr>
<tr>
<td>3</td>
<td>T1341MND</td>
<td>白色发光管</td>
<td>用于常规指示灯</td>
</tr>
</tbody>
</table>
<div>本次作品自备的器件:</div>
<table border="1">
<tbody>
<tr>
<td>序号</td>
<td>型号</td>
<td>名称</td>
<td>用途</td>
</tr>
<tr>
<td>1</td>
<td>STM32H7B3I-DK</td>
<td>STM32开发板</td>
<td>实现主控的操作界面</td>
</tr>
<tr>
<td>2</td>
<td>DFR0745</td>
<td>语音录放模块+小喇叭</td>
<td>用于播放各种提示语音</td>
</tr>
<tr>
<td>3</td>
<td>PicoW</td>
<td>树莓派单片机开发板</td>
<td>用于控制语音模块和灯带</td>
</tr>
<tr>
<td>4</td>
<td>WS2812B</td>
<td>RGB灯带</td>
<td>用作药盒指示灯</td>
</tr>
</tbody>
</table>
<div><strong>二、系统框图</strong><br />
整个系统框图如下图。</div>
<div><strong></strong></div>
<div>如上图所示,我选用了一块STM32H7B3I-DK开发板作为主控。该开发板自带480*272分辨率电容触摸屏,采用STM32H7系列CPU,运算能力强大,外设接口丰富。OpenMV模块通过串口与主控连接,将人脸识别结果传递给主控。BME280传感器通过I2C接口与主控连接,负责采集温度和湿度参数。这里为了方便调试程序,模块化处理,我选用了一块PicoW开发板控制灯带和语音录放模块,实现药盒的指示灯提示和语音提示。PicoW开发板通过串口与主控连接。</div>
<div><strong>三、各部分功能说明</strong></div>
<ol>
<li>STM32H7B3I-DK开发板主控<br />
使用该开发板可以基于TouchGFX很容易做出漂亮的人机交互程序。本作品人机交互共三个界面,分别是主页,取药页面,管理页面,下面分别介绍。<br />
(1)主页<br />
该页面是开机就显示的界面,设计图片如下。<br />
<br />
左半边是信息界面,主要显示年月日时间和温湿度。右半面放了两个按钮,分别指向两个主要功能页面。<br />
其中时间数据来自单片机自带的RTC。温湿度数据来自湿度温度传感器BME280。此时还未建立连接,显示随机数。<br />
(2)取药页面<br />
该页面是自动或手动取药界面,支持最多6个人存药,每个人最多支持十六种药品。设计图片如下。<br />
<br />
取药方式分为两种情况:自动人脸识别方式和手动方式。当在主页点击“取药”按钮后,会启动摄像头自动识别人脸,如果识别成功,自动显示取药人和对应药盒编号。如果识别失败,则只能手动方式点击对应的人物按钮,在右边会显示药盒编号。取药人按照编号拿取药品即可。<br />
(3)管理页面<br />
该页面用于设置人物和药品,并录入人脸信息。支持的人数和药品数和取药界面是一致的。设计图片如下。<br />
<br />
设置时,先点击左边人物角色,然后点击右边药盒号码,点亮哪个药盒号按钮就代表选中对应的药盒。然后点保存按钮存储设置信息。最后点击录入按钮启动人脸拍摄,人脸存储编号和选中的人物角色对应。</li>
<li>OpenMV人脸识别模块</li>
</ol>
<div>最开始我使用官网例程进行设计,例程需要手工在TF卡上建立文件夹,然后分别录入图片,整个操作流程繁琐,结构松散,想整合到我这次作品中,有点无从下手。思虑后我打算参考例程自己从新写个程序,实现本次作品特定的功能。我使用Kimi做辅助,经过几次不断调试,终于把程序调好。主要实现以下功能。</div>
<div>(1)、如果通过串口3接收字符指令'1','2','3','4','5','6',分别对应录入6个人脸图片,放在sd卡中以'1','2','3','4','5','6'命名的6个文件夹中。</div>
<div>(2)、每个人脸要录入10张图片,规格为128*128分辨率的灰度pgm格式,录入间隔1秒,用绿色指示灯闪烁一下表示存储每张图片完成;</div>
<div>(3)、如果通过串口3接收字符指令'r',则启动人脸识别程序,使用find_lbp函数进行特征提取;</div>
<div>(4)、用match_descriptors函数对上一步提取的特征和所有存储的人脸图片的特征做对比计算差异度,找出差异度最小的值。</div>
<div>(5)、如果这个最小值小于预先设置的一个阈值,代表识别成功。通过串口3发送最小差异值图片所在的文件夹名称;</div>
<div>(6)、如果这个最小值不小于预先设置的一个阈值,代表识别失败。通过串口3发送'0'。</div>
<div>这些功能对应的串口通讯协议如下:</div>
<div>(1)、MCU发送字符‘1’-‘6’分别对应6个人物角色,录入人脸,录入完成后OpenMV返回字符‘k’。</div>
<div>(2)、MCU发送字符‘r’进行人脸识别,识别成功后OpenMV返回字符‘1’-‘6’分别对应6个人物角色,识别失败返回字符‘0’。</div>
<div>代码编辑好后就是做实验了。这个时候再找真人不停地拍照太麻烦了,我就想直接从网上找现成的照片进行测试也一样啊。经过资料查找,最终确定使用《CK表情分类数据集》。这个数据集中,包含多个人的各种表情图片,每种表情记录了几张到十几张图片不等,每个人图片总数都在几十张以上,我选取了7个人,使用每个人部分图片作为训练对比参考,剩余的作为测试图片,这样一下子解决了需要不同人拍照问题。</div>
<div>我只需在另外一个显示器上显示参考或测试图片,把摄像头调整好距离,就能完美测试了。下图是实际调试拍照,测试效果很好。</div>
<div></div>
<div>在OpenMV IDE输出调试信息显示程序运行正确无误。</div>
<div></div>
<div>在串口终端也完全实现了预期的发送指令和接收结果的功能。</div>
<div></div>
<div>3、BME280传感器</div>
<div>本次作品由于金额限制,只够选购一个BME280芯片,该芯片封装很小,需要自己做一个PCB。我就在立创EDA上设计了简单的电路,主要实现3个功能:a、屏幕转接;b、湿度温度传感器BME280转接;c、预留了一个MLX90640红外热成像传感器的封装。</div>
<div>具体电路见下图:</div>
<div></div>
<div>原理图画好后,PCB设计先把一些电源走线连好,剩下信号线直接自动布线,基本不用费脑汁,一下就搞定了。如下图。</div>
<div></div>
<div>BME280传感器具有SPI和I2C两种接口,我采用I2C接口和主控板连接,从GitHub上找到驱动程序,配置到主程序中就好用,使用非常简单。读取温湿度参数成功后,显示到屏幕上的效果如下图。</div>
<div></div>
<div>4、PicoW驱动的语音模块和灯带显示</div>
<div>在最初的计划中,是想用STM32主控直接驱动语音模块和灯带显示,但是在调试过程中,发现STM32H7连接WS2812B灯带的时序比较难搞,手头还没有逻辑分析仪用于找原因,就在中间加了一块PicoW开发板做转接。以前用这个PicoW开发板调试过WS2812B灯带,程序比较好设计。同样语音模块在PicoW开发板上也有调试经验,就整合到一起了。</div>
<div>首先介绍一下灯带指示灯设计。按照计划,药盒有16个格子,每次取药,需要按照预先的设置亮起对应格子的灯。在软件中,我使用一个16位的变量存储设置值,每一个位代表一个灯。我买的灯带是1米长度共30个灯,为了不破坏整条灯带,我采用蛇形布局,如下图。</div>
<div></div>
<div>在每个拐弯处空闲3个灯,在灯带末端还有5个闲置灯,这样就造成我要用的16个灯不是连续的,需要在设计程序的时候,重新映射一下,将16位数和这些灯对应起来。具体实现是做了一个表格,通过查表把顺序排好,具体程序见下图。</div>
<div></div>
<div>PicoW开发板的程序采用CircuitPython编写,点灯程序实现了每点亮4个灯珠间隔3个闲置灯珠的功能,代码如下。</div>
<div></div>
<div>通过两部分配合就实现了预期功能。</div>
<div>语音部分比较简单,就是通过串口发AT命令就行,具体参见附件代码,这里介绍一下语音生成的方法。我找到一个免费的网站,如下:</div>
<div><a href="https://d1tools.com/tools/ai-tts/">https://d1tools.com/tools/ai-tts/</a></div>
<div>可以将文字合成多种语音,非常方便。</div>
<div></div>
<div>将合成的MP3格式的语音文件按照语音芯片规定的顺序号存到芯片内,在程序中就可以指定播放相应的音频了。</div>
<div><strong>四、作品源码</strong></div>
<div>STM32H7B3I-DK程序基于TouchGFX开发。</div>
<div>OpenMV程序采用OpenMV IDE开发。</div>
<div>PicoW程序采用CircuitPython开发。</div>
<div>家庭共享智能药盒源代码</div>
<div><a href="https://download.eeworld.com.cn/detail/oet/634874">https://download.eeworld.com.cn/detail/oet/634874</a></div>
<div><strong>五、</strong><strong>作品功能演示视频</strong></div>
<div>ed5c1a05da40b4f848b4550a32176699<br />
</div>
<div><strong>六、项目总结</strong></div>
<div>感谢EEWorld和得捷电子提供的这次机会,让我体验了OpenMV的各种奇妙应用。本次作品中用到的其他板卡,也是历次参加咱们论坛活动得到了,感觉参加这些活动不但能尝试新技术新方案,还能不断提高自己的技术水平,希望论坛活动不断,板卡也不断更新。</div>
<div>下面链接是本次作品开发过程中的经验分享贴,本文中没有详细介绍的内容,在下面帖子中都能找到。</div>
<div><a href="https://bbs.eeworld.com.cn/thread-1290209-1-1.html">https://bbs.eeworld.com.cn/thread-1290209-1-1.html</a></div>
<div><a href="https://bbs.eeworld.com.cn/thread-1292085-1-1.html">https://bbs.eeworld.com.cn/thread-1292085-1-1.html</a></div>
<div><a href="https://bbs.eeworld.com.cn/thread-1294161-1-1.html">https://bbs.eeworld.com.cn/thread-1294161-1-1.html</a></div>
<div><a href="https://bbs.eeworld.com.cn/thread-1296531-1-1.html">https://bbs.eeworld.com.cn/thread-1296531-1-1.html</a></div>
<div><a href="https://bbs.eeworld.com.cn/thread-1296930-1-1.html">https://bbs.eeworld.com.cn/thread-1296930-1-1.html</a></div>
<p><strong>七、其他</strong></p>
<div>无。</div>
<div><!--importdoc--><br />
<br />
</div>
<p>这个项目完成度很高啊 </p>
秦天qintian0303 发表于 2024-11-2 23:25
这个项目完成度很高啊
<p>基本功能都完成了,还有一些细节来不及做了<img height="52" src="https://bbs.eeworld.com.cn/static/editor/plugins/hkemoji/sticker/facebook/titter.gif" width="48" /></p>
页:
[1]