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

电子说

1.3w人已加入

描述

一、制作介绍

EzDIO扩展板是一块三用的I/O扩充板,适用micro:bit、LinkIt 7697与ESP32三种控制板,不同的是以杜邦排针和Grove插座取代原先的功能,让用户决定自己要连接什么模块。

ESP32

本篇文章将以人脸辨识门锁的主题,并用EzDIO作为扩充板,示范如何将不同的模块,经由程序整合在一起。

二、所需材料

首先需要选择控制板,不同的控制板将决定你的程序撰写风格,以及项目的走向。例如你比较习惯使用MakeCode来开发,那只能选择micro:bit ,毕竟LinkIt 7697与ESP32并不支持MakeCode,并且意味着单靠这块控制板,将没办法开发IoT功能,除非外接其他的模块或透过不同的方式达成。

为了之后能将数据上传至Google Sheet,或是指定的MQTT Broker。所以在LinkIt 7697与ESP32中犹豫了好久,最后决定选择目前较少被提及的ESP32做为本次主题的控制板。

接着是选择最重要的AI视觉传感器,除了速度要快,还要方便,最好能记录人脸数据并储存下来,综合了以上几点,选择了最多人使用的HuskyLens。除了人脸辨识开锁外,还希望加上RFID传感器,避免辨识故障时还能用卡片解锁。

其他就是继电器、电磁锁、显示屏幕、触发辨识用按钮与提示用蜂鸣器,然后是供电用的变压器与连接传感器需要的连接线。

● 材料清单

ESP32

ESP32

过程中为了将继电器连接电源与电磁锁,会需要用到「剥线钳」与「电烙铁」。线与线焊接后为了保护,可以准备「电工胶带」或是「热缩套管」。

三、接线组装

材料备齐后就可以开始将各模块,透过连接线接在EzDIO上面,主控板ESP32有自己对应的位置,我想大家应该不陌生,至于其他模块可以参考接下来的介绍。

● 电磁锁加工

在连接之前我们需要先加工电磁锁,将「电源转接头」与「电磁锁」焊接在一起,并针对连接至「继电器」的线头加锡,如下图所示:

ESP32

分别剪去「电源转接头」与「电磁锁」的连接器后,用剥线钳剥出一小段线,先将黑色线对黑色线焊接在一起,这边是用电工胶带将焊接点包起来保护。接着将两端的红色在线锡,以便较好锁在「继电器」上。

● 连接继电器

选用的「电磁锁」是属于通电后解锁的类型,所以将它安装在「继电器」的常开位置。在未通电的情况下,电磁锁将保持锁上的状态,接线方式如下图所示:

ESP32

继电器可以连接在任何数字输出的脚位,本次选用的继电器是排针连接的类型,因此采用杜邦线连接,将其连接在EzDIO右边的杜邦排针区,接线参照下表所示:

ESP32

ESP32

EzDIO 与继电器接线图

● 连接OLED显示屏幕

OLED使用的是I2C接口,I2C的接线对应如下表,我们使用的模块是Grove插座,所以只要拿「Grove连接线」,一头接在OLED上,另一头接在EzDIO上方5个I2C插座的其中一个即可。

ESP32

ESP32

EzDIO 与OLED显示屏幕接线图

● 连接RFID传感器

本次选用的RFID传感器与OLED一样是I2C接口,也同样都是Grove插座。Grove连接线一头接在RFID传感器上,另一头接在EzDIO上方5个I2C插座的其中一个即可。

ESP32

ESP32

EzDIO 与RFID传感器接线图

● 连接按钮

按钮是作为触发人脸辨识使用,只有在对准人脸并按下按钮时,才会发动解锁功能。主要用来避免,当人经过时不小心触发解锁。

按钮可连接在具有数字输入功能的脚位上,例如可安装在IO15。因为这边使用的按钮是Grove插座的,所以在排针旁的GPIO插座区,找寻对应的位置连接即可,Grove插座位置在「CN16」,接线对应如下表所示:

ESP32

ESP32

EzDIO 与按钮接线图

● 连接蜂鸣器

蜂鸣器能帮助我们了解装置的状态,透过声音的变化,我们能清楚知道是否感应成功,或是解锁成功。蜂鸣器连接在输出的脚位,这边选择的模块是Grove类型,连接方式与按钮模块相同,唯一不同的是,ESP32部分脚位只允许输入,需要避开那些脚位,笔者选择连接IO14(对应ESP32的脚位是27),Grove插座位置在「CN15」,接线对应如下表所示:

ESP32

ESP32

EzDIO 与蜂鸣器接线图

● 连接HuskyLens

HuskyLens可以选择I2C或是UART连接,并有附上连接线。笔者选择连接在I2C,因为附赠的连接线另一头为杜邦母头,可连接在EzDIO的杜邦排针区,接线对应如下表所示:

ESP32

ESP32

EzDIO 与HuskyLens 接线图

完成上述步骤后,所有的模块与装置皆已连接完毕,你可以找一块板子并透过螺丝、螺帽,将所有部件固定起来。板子可以是木板或是压克力,排列完毕后用雷切或电钻钻洞都可以,也能依照自己的需求,安装在适当的位置,自由发挥。

本次范例是用一块3mm大小适中的木板,并使用手持电钻钻孔,将所有东西都固定在木板上,并用标签机打印了一张标示贴纸,看起来有模有样,如下图所示:

ESP32

四、程序撰写

撰写程序的软件,使用「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的「文件夹」,接着依照下列顺序依须点开文件夹,以便找到存放总链接库的文件夹:

ESP32

2. 接着删除原先在文件夹内的旧链接库「HUSKYLENS」,删除后先不要关闭文件夹,待会儿要将新的链接库复制过来。

ESP32

3. 解压缩刚刚下载下来的新链接库,并复制文件夹内的「HUSKYLENS」,贴到刚刚BlocklyDuino F1的链接库文件夹「libraries」内。

ESP32

完成上述步骤,就完成链接库安装了。新、旧链接库内容差异不小,请不要用覆盖的,确实删除后再贴上新的链接库,比较不会有问题。

● 功能规划

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上面。

ESP32

将程序刻录后执行,请将读取到的数据记下来,以便填入「EzDIO_Face_unlock」这个程序中。

ESP32

● 辨识解锁程序说明(EzDIO_Face_unlock)

程序可以分成三部份,分别是「初始化」、「重复执行」与「函式群」。初始化不外乎就是功能设定与状态赋予,重复执行则处理所有功能,包含辨识、RFID感应、开锁……等。最后的函式群是指,将一些重复用到的功能包成函式(或称子程序),主要用于简化程序并提升修改时的效率,进而增加可读性。接下来让我们观看每个部份:

1. 初始化

在这部份我们针对需要预先初始化的功能,进行初始化,像是OLED与HuskyLens。并设定两个全局变量「door」、「card」,用来记录是否开门以及储存卡片的号码。

因为OLED显示的文字大小有限,所以采用图片转换XBM的方式,即可显示任意图案或文字,自定义的位图有"open"(开锁)、"lock"(上锁)、"n1~n3"(显示数字)、"noperson"(没有纪录)等六个,最后是在所有功能不停执行前,先于OLED屏幕显示「上锁」。

ESP32

2. 函式群

共有四个函式:

【check_OK】开锁成功并设定显示与音效,并将「door」这个变量设定为1。

【check_ERROR】解锁失败并设定屏幕显示没有纪录与连续音效,最后显示上锁。

【start_sound】感应卡片或按下辨识按钮时发出音效。

【open_and_lock】启动电磁锁开锁并显示倒数,待3秒过后将「door」这个变量设定为0,并上锁与显示。

ESP32

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

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

以上就是以ESP32为控制板,结合EzDIO扩展板与相关模块制作的人脸辨识门锁项目。

  审核编辑:汤梓红

 

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分