本帖最后由 rmq 于 2024-12-21 09:18 编辑
【导语】
上个星期小喵带大家用纯软结合小喵AI制作了一款智能门锁,现在我们来结合未来板Lite、koi2人工智能摄像头等其他硬件来制作一把现实生活中的智能门锁,可以实现密码、人脸以及刷卡开门。
【材料准备】
上图中的风扇只是装饰道具,不需要编程。
【编程软件使用】
【功能概述】
这里的功能和上星期发布的仿真智能门锁案例很像,在原基础上还增加了RFID刷卡效果,本质上还是通过或运算判断开门的指令。 【前期准备】
门锁结构:
由于是两套木板结构,一套是门锁结构,一套是小屋房门结构。这里先介绍门锁结构。 在门锁中,需要放置RFID模块、矩阵键盘、碰撞模块和KOI模块,这些模块需要提前测量好各个方面的尺寸以确保能够放的进去,所以这里粗略的键了个模型(建模软件这里小喵选择3d某 Cut软件)。这里需要注意建模时需要考虑接线时的尺寸变化,所以在对应的接口部位会有一些凸起。
之后构想出门锁的实现方式,旋转门把手碰到碰撞开关然后把门打开,松手后门把手回到初始位置。根据这个功能简单构建出一个基本模型,仿真软件中可以看到旋转门把手时碰到了碰撞开关。
之后建造一块底板,并补充好门把手的造型,至于怎么样让门把手碰到开关后复位,则需要把木板切出来后才会看到效果,这里主要是给位看一下门把手的组成结构,方便后期安装,安装顺序不是动图顺序。
后面根据底板和模块的位置构建出门锁的顶板,并调整一下位置,大概如下情况,这里唯一值得注意的是要预留好出线孔:
仔细检查后把模型导出为图纸并进行切割,由于尺寸较大,切割时选择两块A4大小的4mm木板。(如果嫌自己画图纸太复杂可以往文末查看白嫖方式哈~)
切割完成后用热熔胶枪组装一下,这个过程蛮久的,需要有点耐心。注意侧面的木板不要装完,可以留一部分,从侧面看的效果大概是这样的。需要注意koi2的4pin线是经过延长的,如果有25cm以上的4pin线则不用延长。
接着找一条5cm大小的橡皮筋按照动图所展示的进行安装,当我转动把手时会拉动皮筋并且碰到碰撞开关,松开门把手后运用皮筋的弹性势能转化为动能从而使门把手复位。虽然结构简陋,但是能用就行~
反复多试几次确认没有问题后再把门锁完整组装完整即可,其中各模块的线从侧面穿出并提前做好标记,免得接错位置。接线图会放在后面。
房屋准备: 这个图纸就简单画一下了,目的是做一个用舵机开门的场景。切割时用3mm的A4大小木板切割。(如果不想画也可以在文末白嫖哈)
准备如下积木,作为舵机与木板门的开门结构,这里最好选择用光滑销,确保不要有太大的摩擦力。
舵机和门的组装方式如图,强烈建议先上传程序把舵机的角度调整为40°后再安装关门时的状态,不然角度不一致容易在舵机运动后损坏结构:
最后不要忘记加上房屋顶,手动测试一下确保能够顺利开门(小喵这里用程序控制):
接线准备: 组装好结构后开始接线
【程序编写】
【模型录入】
这里我们要做的是对koi2的模型进行录入,这部分在接线后进行。未来板Lite和软件连接,使用在线模式进行录入。 首先对koi2初始化,并且将模式调整到特征分类模式并前置摄像头。根据koi2的加载情况依次点击①②③积木即可,注意这里点击①和②后发现koi2会短暂重启,需要等koi2屏幕显示拍摄图像后再点击运行下一个积木。完成后koi2的初始化设置完毕。
创建一个名为【识别数据】的列表,列表存放三个英文字符,字符之间用英文逗号隔开: empty意为没有检测到人脸时的标签; master意为检测到房屋主人的标签; stranger意为检测到陌生人的标签; 创建完之后点击④号积木才能设置这些标签,完成后开始录入图像。
将koi2摄像头对准周围没有人的环境,点击⑤号积木将图像进行学习,每点击一次koi2就学习一次,建议点击30次左右。 将摄像头对准主人的脸,可以是真实的脸也可以是打印出来的脸(可以参考上期小喵AI学习的图像),点击⑥号积木进行学习,建议学习50次左右。 之后对准陌生人的脸,点击⑦号积木,也是学习50次左右。 三个标签都学习了之后更新koi数据并查看学习效果,检测是否识别准确。
检测时舞台角色会说出当前摄像头识别到的分类情况,如果发现某一类标签的识别不太准确,可以单独对标签进行学习,完成后可以看到识别非常准确:
效果不错的话可以点击⑨号积木将学习文件进行保存,文件名必须为英文且不能有空格,小喵这里写的是“open_door”,保存后会看到koi2屏幕会显示1s模型已存储,代表成功保存。如果效果不好可以点击10号积木删除数据重新学习。至此koi2模型学习完毕。接下来开始编写未来板Lite程序。
【初始化】
未来板Lite程序初始化包含以下几个方面: 首先是设备的初始化,由于koi2和键盘都是串口通讯的,在连接前需要根据接线位置进行初始化。 之后是koi2的初始化设置:需要确定识别模式、加载模型和摄像头的朝向。 其次是列表和变量的初始化,其中【开门密码】变量记录键盘开锁的密码1234,这里不能直接写,而是要写成单引号包裹且数字与数字之间要用一个空格隔开,也就是:‘1 2 3 4’ 原因主要是后面列表转字符串时需要每个字符一一对应,而单引号和空格无法通过图形化编程剔除。 最后是舵机位置和屏幕显示初始化,直接参照图片参数设置即可。
【门锁功能】
对本次案例的功能进行拆分,可以分为六大板块,这里可以提前创建函数名称。 【环境录入功能】
首先,在用koi2识别各种复杂环境时,可能会把环境识别成人脸,所以对于新环境需要重新学习,这里我设置了按下板载M键持续学习新环境,直到koi2将当前环境识别成empty即可。
【卡片检测功能】
这个功能同样很简单,只要检测到卡片,就设置【开门】变量为1并且蜂鸣器响起正确音律。
【人脸识别功能】
每次进行分类识别时,和koi1不一样,koi2需要先更新数据,再开始获取结果。如果识别到陌生人会发出警报并等待2s。而如果识别到主人则使【人脸检测】变量设为1,意为关闭检测,并且设置【开门】变量为1。其实人脸识别程序的部分就这么多,难的就是前面koi2对图像的学习录入。
【键盘程序功能】
首先需要使用【键位】变量记录按下的键位,如果键盘上的某个键位被摁下,再键位松开后开始进行判断。先判断按下的键位是不是数字,判断的方法如图所示,如果是则需要把输入的键位存入【输入密码】列表中,并且在后面设置【显示密码】为1,这个意思为密码会在屏幕上显示出来。 由于在屏幕中显示列表的数字是会出现【】 ‘ ,等不希望出现的字符,所以需要用【密码】变量对列表的内容进行剔除。
很多人可能不理解,为什么要用列表存储密码而不是直接用变量,其实为了还原一个一个删除已输入的密码的功能,在图形化编程中只能用列表实现。下面来说一下如果键盘没有按下数字实现哪些功能: 如果按下键盘A键,播放门铃; 按下键盘*号键,删除最后一位密码; 按下键盘#号键,删除所有密码。
这里唯一特别的是*号,由于在micropython中*号是操作符,代表对数字类型的数据做乘法等等用法,为了使判断的使字符类型的数据,需要在*号前后加上单引号,不然会报错。具体情况我们可以打开代码模式查看两者的差异:
【显示内容功能】
在显示内容中需要根据变量的情况显示不同的内容,如果是在输密码时,则显示密码;如果什么都没做,则始终保持开机画面。 如果【密码】=【开门密码】则设置【开门】变量。
【开门程序功能】
无论是哪种方式实现的开门效果,都可以使【开门】变量设为1进入开门程序,此时屏幕会显示旋转把手开门,当木板结构中的把手碰到碰撞开关后会触发舵机转到180°自动把门打开,并且在一定时间后关上(这里可以替换为按下未来板按键按下关上),同时重置相应变量和列表。至此所有程序已完成。
【程序获取】
如果需要获取程序源文件和加工图纸的友友,可以在下方回复帖子免费获取哈!
【功能演示】
智能门锁演示视频
|