ESP32结合EzDIO制作人脸辨识门锁

一、制作介绍
ezdio扩展板是一块三用的i/o扩充板,适用micro:bit、linkit 7697与esp32三种控制板,不同的是以杜邦排针和grove插座取代原先的功能,让用户决定自己要连接什么模块。
本篇文章将以人脸辨识门锁的主题,并用ezdio作为扩充板,示范如何将不同的模块,经由程序整合在一起。
二、所需材料
首先需要选择控制板,不同的控制板将决定你的程序撰写风格,以及项目的走向。例如你比较习惯使用makecode来开发,那只能选择micro:bit ,毕竟linkit 7697与esp32并不支持makecode,并且意味着单靠这块控制板,将没办法开发iot功能,除非外接其他的模块或透过不同的方式达成。
为了之后能将数据上传至google sheet,或是指定的mqtt broker。所以在linkit 7697与esp32中犹豫了好久,最后决定选择目前较少被提及的esp32做为本次主题的控制板。
接着是选择最重要的ai视觉传感器,除了速度要快,还要方便,最好能记录人脸数据并储存下来,综合了以上几点,选择了最多人使用的huskylens。除了人脸辨识开锁外,还希望加上rfid传感器,避免辨识故障时还能用卡片解锁。
其他就是继电器、电磁锁、显示屏幕、触发辨识用按钮与提示用蜂鸣器,然后是供电用的变压器与连接传感器需要的连接线。
● 材料清单
过程中为了将继电器连接电源与电磁锁,会需要用到「剥线钳」与「电烙铁」。线与线焊接后为了保护,可以准备「电工胶带」或是「热缩套管」。
三、接线组装
材料备齐后就可以开始将各模块,透过连接线接在ezdio上面,主控板esp32有自己对应的位置,我想大家应该不陌生,至于其他模块可以参考接下来的介绍。
● 电磁锁加工
在连接之前我们需要先加工电磁锁,将「电源转接头」与「电磁锁」焊接在一起,并针对连接至「继电器」的线头加锡,如下图所示:
分别剪去「电源转接头」与「电磁锁」的连接器后,用剥线钳剥出一小段线,先将黑色线对黑色线焊接在一起,这边是用电工胶带将焊接点包起来保护。接着将两端的红色在线锡,以便较好锁在「继电器」上。
● 连接继电器
选用的「电磁锁」是属于通电后解锁的类型,所以将它安装在「继电器」的常开位置。在未通电的情况下,电磁锁将保持锁上的状态,接线方式如下图所示:
继电器可以连接在任何数字输出的脚位,本次选用的继电器是排针连接的类型,因此采用杜邦线连接,将其连接在ezdio右边的杜邦排针区,接线参照下表所示:
ezdio 与继电器接线图
● 连接oled显示屏幕
oled使用的是i2c接口,i2c的接线对应如下表,我们使用的模块是grove插座,所以只要拿「grove连接线」,一头接在oled上,另一头接在ezdio上方5个i2c插座的其中一个即可。
ezdio 与oled显示屏幕接线图
● 连接rfid传感器
本次选用的rfid传感器与oled一样是i2c接口,也同样都是grove插座。grove连接线一头接在rfid传感器上,另一头接在ezdio上方5个i2c插座的其中一个即可。
ezdio 与rfid传感器接线图
● 连接按钮
按钮是作为触发人脸辨识使用,只有在对准人脸并按下按钮时,才会发动解锁功能。主要用来避免,当人经过时不小心触发解锁。
按钮可连接在具有数字输入功能的脚位上,例如可安装在io15。因为这边使用的按钮是grove插座的,所以在排针旁的gpio插座区,找寻对应的位置连接即可,grove插座位置在「cn16」,接线对应如下表所示:
ezdio 与按钮接线图
● 连接蜂鸣器
蜂鸣器能帮助我们了解装置的状态,透过声音的变化,我们能清楚知道是否感应成功,或是解锁成功。蜂鸣器连接在输出的脚位,这边选择的模块是grove类型,连接方式与按钮模块相同,唯一不同的是,esp32部分脚位只允许输入,需要避开那些脚位,笔者选择连接io14(对应esp32的脚位是27),grove插座位置在「cn15」,接线对应如下表所示:
ezdio 与蜂鸣器接线图
● 连接huskylens
huskylens可以选择i2c或是uart连接,并有附上连接线。笔者选择连接在i2c,因为附赠的连接线另一头为杜邦母头,可连接在ezdio的杜邦排针区,接线对应如下表所示:
ezdio 与huskylens 接线图
完成上述步骤后,所有的模块与装置皆已连接完毕,你可以找一块板子并透过螺丝、螺帽,将所有部件固定起来。板子可以是木板或是压克力,排列完毕后用雷切或电钻钻洞都可以,也能依照自己的需求,安装在适当的位置,自由发挥。
本次范例是用一块3mm大小适中的木板,并使用手持电钻钻孔,将所有东西都固定在木板上,并用标签机打印了一张标示贴纸,看起来有模有样,如下图所示:
四、程序撰写
撰写程序的软件,使用「blocklyduino f1」。
在刻录程序的过程中,发现原先在blocklyduino f1里的huskylens链接库无法使用在esp32上面,后来经由查找huskylens官方说明网站,发现有较新的版本可用于esp32,但反而无法用在linkit 7697。经我们工程师修改后可兼容两块主控板,修改后的链接库连结如下:
提醒大家使用前记得先更新为较新的链接库。
https://github.com/circuspi/circuspi.github.io/raw/main/extlibrary/huskylensarduino-master.zip
●安装huskylens新的链接库
1. 首先打开blocklyduino f1的「文件夹」,接着依照下列顺序依须点开文件夹,以便找到存放总链接库的文件夹:
2. 接着删除原先在文件夹内的旧链接库「huskylens」,删除后先不要关闭文件夹,待会儿要将新的链接库复制过来。
3. 解压缩刚刚下载下来的新链接库,并复制文件夹内的「huskylens」,贴到刚刚blocklyduino f1的链接库文件夹「libraries」内。
完成上述步骤,就完成链接库安装了。新、旧链接库内容差异不小,请不要用覆盖的,确实删除后再贴上新的链接库,比较不会有问题。
● 功能规划
1. 首先是人脸辨识解锁的功能,预先设定huskylens储存要辨识的人脸,当huskylens通电后就会开始执行任务,并经由连接线回传数据,此时若是按下按钮,就让程序去比对是否是记录过的人脸,比对成功则开锁,并于3秒后锁上。
2. 接着是rfid感应解锁,同样得预先知道卡片号码,当感应到相同号码则开锁,并于3秒后锁上。
3. 蜂鸣器与oled可用于感应、开锁与感应错误时发出提示。
● 设定huskylens
在使用人脸辨识功能之前,需要进行一些设定,例如确认是否为i2c通讯,或是记录人脸数据等等,你可以参考官方文件的教学,请记录一张人脸,用于程序比对解锁用。
https://wiki.dfrobot.com/huskylens_v1.0_sku_sen0305_sen0336#target_15
● 范例程序链接
完成上述功能的程序不会太复杂,可以直接下载「范例程序」,解压缩后请用blocklyduino开启,我们可以从程序中学习。
https://github.com/circuspi/circuspi.github.io/raw/main/example/ezdio_example.zip
其中共有两个范例程序,一个是单纯读取rfid卡片号码的程序,用来读出手边卡片的编号,比对卡片号码时使用;另一个则是完成上述功能的辨识解锁程序。
● 读取rfid卡片号码程序说明(ezdio_read_rfid)
rfid传感器在感测到卡片数据时会读到号码,反之为空值。透过变量「card」将数据储存下来后比对,若有读到数据则显示在oled上面。
将程序刻录后执行,请将读取到的数据记下来,以便填入「ezdio_face_unlock」这个程序中。
● 辨识解锁程序说明(ezdio_face_unlock)
程序可以分成三部份,分别是「初始化」、「重复执行」与「函式群」。初始化不外乎就是功能设定与状态赋予,重复执行则处理所有功能,包含辨识、rfid感应、开锁……等。最后的函式群是指,将一些重复用到的功能包成函式(或称子程序),主要用于简化程序并提升修改时的效率,进而增加可读性。接下来让我们观看每个部份:
1. 初始化
在这部份我们针对需要预先初始化的功能,进行初始化,像是oled与huskylens。并设定两个全局变量「door」、「card」,用来记录是否开门以及储存卡片的号码。
因为oled显示的文字大小有限,所以采用图片转换xbm的方式,即可显示任意图案或文字,自定义的位图有"open"(开锁)、"lock"(上锁)、"n1~n3"(显示数字)、"noperson"(没有纪录)等六个,最后是在所有功能不停执行前,先于oled屏幕显示「上锁」。
2. 函式群
共有四个函式:
【check_ok】开锁成功并设定显示与音效,并将「door」这个变量设定为1。
【check_error】解锁失败并设定屏幕显示没有纪录与连续音效,最后显示上锁。
【start_sound】感应卡片或按下辨识按钮时发出音效。
【open_and_lock】启动电磁锁开锁并显示倒数,待3秒过后将「door」这个变量设定为0,并上锁与显示。
3. 重复执行
在重复执行内也分成三个部份,分别是「huskylens运行时间」、「rfid读取阶段」、「是否开锁阶段」。
huskylens运行时间:首先从huskylens取得一组辨识数据,接着确认是否按下按钮,来进行身份比对,若比对成功则执行【check_ok】,若没有辨识到或身份比对错误,则执行【check_error】。
rfid读取阶段:一样先取得感应号码,若没有感应到卡片则会取得「空字符串」,感应到号码后将进行比对,比对成功则执行【check_ok】,比对错误则执行【check_error】。
是否开锁阶段:上述两大阶段若有开锁成功,均会调整变量「door」的数值为1,在这阶段只要侦测到「door」数值为1,则执行【open_and_lock】,执行完毕后会将「door」这个变量设定为0。
三个阶段执行完后,最后的「延迟100毫秒」是为了避免程序重复执行过快,导致数据接收错误。
3. 重复执行
在重复执行内也分成三个部份,分别是「huskylens运行时间」、「rfid读取阶段」、「是否开锁阶段」。
huskylens运行时间:首先从huskylens取得一组辨识数据,接着确认是否按下按钮,来进行身份比对,若比对成功则执行【check_ok】,若没有辨识到或身份比对错误,则执行【check_error】。
rfid读取阶段:一样先取得感应号码,若没有感应到卡片则会取得「空字符串」,感应到号码后将进行比对,比对成功则执行【check_ok】,比对错误则执行【check_error】。
是否开锁阶段:上述两大阶段若有开锁成功,均会调整变量「door」的数值为1,在这阶段只要侦测到「door」数值为1,则执行【open_and_lock】,执行完毕后会将「door」这个变量设定为0。
三个阶段执行完后,最后的「延迟100毫秒」是为了避免程序重复执行过快,导致数据接收错误。
以上就是以esp32为控制板,结合ezdio扩展板与相关模块制作的人脸辨识门锁项目。


FSW8罗德与施瓦茨R&S FSW13信号和频谱分析仪
“太空三人组”即将返回!细数“神舟十三号”取得的里程碑成果!
人工智能将能够依靠智能手机电池的电量运行?
韩国将投资1万亿韩元应对日本对半导体材料的管制
绝缘子的作用及损坏的原因
ESP32结合EzDIO制作人脸辨识门锁
中银航空租赁有限公司计划将出售17架飞机
振动摩擦焊接机基本原理_振动摩擦焊接机使用方法及注意事项
一文读懂开关电源中的X和Y电容的作用
详解如何使用万用表测电压
比较好的蓝牙耳机精选推荐,降噪听歌「专业实测」看这一篇就够了
2018年第三季度全球电视出货量与去年持平 大尺寸电视成趋势
小米mix2尊享版和普通版有什么区别?入手前须知
如何解决车载以太网辐射超标
从无人机到自动驾驶 大疆越走越远
说什么劳动最光荣都是骗人!这些行业将被工业机器人将取代
业界如何向普通消费者推广5G服务?怎么传达其价值和认知
三星S8 Edge渲染图曝光!其语音助手Bixby更加强大
台积电Q3营收5467亿新台币 同比下滑10.8%
SKYLAB无线模块在物联网应用中的优势