3470| 6
|
【2020】用古德微制作智能视力测试仪 |
【2020】用古德微制作智能视力测试仪 读了云天老师的【2020】视力智能检测系统(文后提供原文阅读链接),深受启发,能够把一个传统的视力检测用纯软件(Mind+)的方法制作出来,令人敬佩! 在此基础上能否突破纯软件的局限,增加一点实用的功能,于是就有了用古德微树莓派制作智能视力测试仪这个案例。 本案例用到的硬件有古德微树莓派2个,手势板1个,超声波传感器1个,OLED屏1个、小音箱1个。 基本思路:用超声波传感确定测试距离,用OLED屏显示测试图片,用手势板提交测试图片答案,用小音箱播放提示信息和反馈过程结果。按照这个思路走下来,这套测试仪是不是就完全模拟了真实的视力测试过程?而且只需要测试者一人参与,节约了人力?让视力测试变得随时可以进行? 一、用超声波传感确定测试距离。 传统的视力检测需要保持5米的距离,所以,我们的程序设计中也要指定一个规定的距离,如果达不到这个规定距离,就会反复循环,反复提醒用户增大测试距离。直到满足条件后,才开始执行后续的程序。 二、用OLED屏显示测试图片 古德微套件中标配有OLED显示屏,我们就选择它来显示测试图片。从古德微界面中找到了这样的一条积木,它提示我们,可以选择这种类型的图片,存储到树莓派中,然后,OLED屏就能将它们读出来。 1、准备图片素材 对照真实的视力表,我们发现,我们需要的图片就是这样4个不同朝向的E字,一共11个等级,共需要44张,按照顺序给这些图片编号命名。 网上找出相应的图片,把它们都处理成128*64的,这是OLED屏的要求!最小的图片是这个样子的。 所需处理软件,我用的是最原始的画图,强忍着下载PS的冲动。(从古德微开始,这个假期,我跟随童心制物的漂流活动,拿到了光环板,熟悉了MakeBlock;之后又在朱老师的引领下,入手了掌控板,熟悉了MakePython和MakePythonX,最后竟然又使用上了Mind+,现在终于重新回归到古德微的原点上。不想下载PS,其实是担心这条路上又会遇到什么好玩的东西,先完成这个作品!) 2、将所有文件复制到树莓派中,以备调用。 调用图片数据通常有三种方法,一是直接复制,直接调用。二是转化为图片数据(如16进制、2进制数据),将其写入程序的列表中,通过序号来调用列表中的值,三是直接通过在线数据传输。 这里我采用的方法是直接复制,直接调用。不要担心图片太大,44个文件,只有20K大小,128*64的文件实在是很小很小,对于配有32G卡的树莓派而言简单是九牛一毛! 远程登陆,在Pi目录下创建一个E的文件夹,将44张图片全部复制到E文件夹内。这样,第1张图片的地址就是:/home/pi/E/1.png 3、显示第1张图片 显示本地图片,可依次完成以下步骤:初始化显示屏,新建图片并赋值给变量图片对象,指定图片的路径赋值给变量文件路径,在图片上再粘贴上第1张图片,将处理完的图片显示到OLED屏上。 4、按照需要显示相应的图片 动态显示44张图片,只需要动态改变文件路径!也就是要将下图中的1,动态的改变为2、3、4,一直到44,即可由1.png动态改变为44.png。 具体怎么实现? 这里设定了级别和随机数两个变量,我们用级别和随机数构造文件名。 视力表中从0.1至2.0一共设定了11个级别,每个级别中我们按照开口次序准备了4张图片,我们的文件号是依次为1-44,5.png中的5就代表了它是第2个级别(0.2)的第1张图片(开口方向朝上)。再如第12.png中的12就代表了它是第3个级别(0.4)的第4张图片(开口方向朝右),所以的它们的规律就是(级别-1)×4+(1-4间的一个随机数),这个随机数只决定开口朝向,不决定级别。(后面,我们还会用这个随机数,来确定开口朝向作为标准答案。) 三、用手势板提交测试图片答案 1、确定发送方和接收方 将一个树莓派接好手势板,把它当成发送方,另一台树莓派就是接收方。(我的发送方是yangguangfeng,接收方是btzx001)。 2、编写发送方程序 登陆发送方古德微账号,编写以下程序。 创建一个方向触发函数onflick函数。定义它的两个参数,start和end。然后向接收方btzx001,发送主题为FLICK的数据end。 为什么只发送end,不发送start?我们需要的是图片E字的开口方向,所以一个end(上、下、左、右)就足够了。我们的手势可以得到类似从左到右,但是我们的答案只需要最后的右! 四、接收和处理数据 1、接收数据 在接收方(btzx001)编写接收主题数据的程序。 基本步骤如下,监听主题FLICK,如果有新数据传递,收到的数据end赋值给变量手势结果存储下来。 2、获取标准答案 如何得到当前图片的开口方向(标准答案),先得从方向列表说起, 它存储了四个方向,第1个是上,第4个是右,与图片命名顺序完全一致。 在动态显示图片时,我们用到了上面的定义,现在我们只需要从方向列表中取出随机的第几个值就是我们的标准答案,将其赋值为变量开口方向。 3、处理数据 有了测试值所提交的答案(手势结果),对照当前图片的标准答案(开口方向) 比较后,相等,正确次数加1,不相等,错误次数加1。 注意每次比较结束后,都要将手势结果清0,等待接收下一次手势数据。 五、结果输出 视力测试结束包括两种情况,一是完成了12级要退出,二是达到指定的错误次数后也要退出。 这里我们用到了级别列表,11个等级,11个数据。如下图 只需要从列表中取得第几级的值即可获得最后的视力数据,但为什么是级别-1呢? 因为如每一个级别中有4幅图片,答对3次就要引导用户进入下1个等级,我们要用到级别累加1,所以用户完成12级后,级别就会变成13,我们播报结果,当然要级别-1。还有如果用户累计答错2次,也要退出程序,那么他的级别也应该是当前级别-1。 六、详细程序 1、超声测距,确定位置。 2、初始变量,做好准备。 3、显示图片,动态引用。 4、接收数据,处理信息。 5、完成测试,反馈结果。 6、全部函数,最终程序。 最终的程序在基本实现的基础上,还有一些细节处理。例如为了营造轻松友好的氛围,在程序各个部分中加入语音提示,增强用户体验。再如,监听接收数据需要一直重复进行,但是每一幅图片,只能有一次判断。在没有判断之前,当前的图片不能更换,所以,要给图片显示增加开关变量。类似这些问题,给我这样的小白增添了重重困难,所幸终于笨手笨脚实现了最初的想法。最后再次感谢云天老师!(附【2020】视力智能检测系统的阅读地址为:https://mc.dfrobot.com.cn/thread-302570-1-1.html) 作品视频: 视频地址:https://v.youku.com/v_show/id_XNDUyNjM5NTc2MA==.html |
© 2013-2024 Comsenz Inc. Powered by Discuz! X3.4 Licensed