ESP32 結合 EzDIO 製作人臉辨識門鎖教學

一、製作介紹

相信有不少使用者都是以EZ Start Kit/EZ Start Kit+入門,但隨著製作的專案越來越多樣,需要的功能也不盡相同,單以 EZ Start Kit 目前的擴充性來說,難以滿足不同的需求。

近期CIRCUS Pi推出了EzDIO擴展板,這是一塊三用的 I/O 擴充板。與EZ Start Kit+一樣適用micro:bitLinkIt 7697ESP32三種控制板,不同的是以杜邦排針和 Grove 插座取代原先的功能,讓使用者決定自己要連接什麼模組。

EzDIO 擴展板規格介紹

本篇文章將以人臉辨識門鎖的主題,並用 EzDIO 作為擴充板,示範如何將不同的模組,經由程式整合在一起。

二、所需材料

首先需要選擇控制板,不同的控制板將決定你的程式撰寫風格,以及專案的走向。例如你比較習慣使用 MakeCode 來開發,那只能選擇micro:bit ,畢竟 LinkIt 7697ESP32 並不支援MakeCode,並且意味著單靠這塊控制板,將沒辦法開發IoT功能,除非外接其他的模組或透過不同的方式達成(e.g. Logyun 連雲 Wi-Fi 模組)。

為了之後能將資料上傳至Google Sheet,或是指定的 MQTT Broker。所以在LinkIt 7697ESP32中猶豫了好久,最後決定選擇目前較少被提及的 ESP32 做為本次主題的控制板。

接著是選擇最重要的AI視覺感測器,除了速度要快,還要方便,最好能記錄人臉資料並儲存下來,綜合了以上幾點,選擇了最多人使用的HuskyLens。除了人臉辨識開鎖外,還希望加上RFID感測器,避免辨識故障時還能用卡片解鎖。

其他就是繼電器、電磁鎖、顯示螢幕、觸發辨識用按鈕與提示用蜂鳴器,然後是供電用的變壓器與連接感測器需要的連接線。

● 材料清單

1. 主控板NodeMCU-32S8. 按鈕Circus 輕觸按鍵模組
2. 擴充板EzDIO9. 蜂鳴器Circus 無源蜂鳴器模組
3. AI視覺感測器HUSKYLENS 哈士奇AI辨識鏡頭 (PRO版)10. 電源電子式變壓器 12V-1.5A
4. RFID感測器M5Stack RFID模組11. 電源轉接頭DC JACK 5.5X2.1mm 母轉2.0端子插座電源尾線
5. 顯示螢幕Circus 1.3吋OLED顯示螢幕12. 杜邦連接線彩色杜邦雙頭線(母/母)
6. 繼電器 Circus 1路繼電器模組13. Grove連接線4pin連接線 20cm
7. 電磁鎖 LY-01 DC12V電磁電控鎖14. RFID卡片RFID Card
材料清單

過程中為了將繼電器連接電源與電磁鎖,會需要用到「剝線鉗」與「電烙鐵」。線與線焊接後為了保護,可以準備「電工膠帶」或是「熱縮套管」。

三、接線組裝

材料備齊後就可以開始將各模組,透過連接線接在EzDIO上面,主控板ESP32有自己對應的位置,我想大家應該不陌生,至於其他模組可以參考接下來的教學。

● 電磁鎖加工

在連接之前我們需要先加工電磁鎖,將「電源轉接頭」與「電磁鎖」焊接在一起,並針對連接至「繼電器」的線頭加錫,如下圖所示:

電磁鎖加工

分別剪去「電源轉接頭」與「電磁鎖」的連接器後,用剝線鉗剝出一小段線,先將黑色線對黑色線焊接在一起,這邊是用電工膠帶將焊接點包起來保護。接著將兩端的紅色線上錫,以便較好鎖在「繼電器」上。

● 連接繼電器

選用的「電磁鎖」是屬於通電後解鎖的類型,所以將它安裝在「繼電器」的常開位置。在未通電的情況下,電磁鎖將保持鎖上的狀態,接線方式如下圖所示:

連接繼電器

繼電器可以連接在任何數位輸出的腳位,本次選用的繼電器是排針連接的類型,因此採用杜邦線連接,將其連接在 EzDIO 右邊的杜邦排針區,接線參照下表所示:

繼電器& EzDIO 接線腳位
繼電器& EzDIO 接線腳位
EzDIO 與繼電器接線圖

● 連接 OLED 顯示螢幕

OLED使用的是 I2C 介面,I2C 的接線對應如下表,我們使用的模組是 Grove 插座,所以只要拿「Grove連接線」,一頭接在 OLED 上,另一頭接在 EzDIO 上方5個I2C插座的其中一個即可。

OLED & EzDIO 接線腳位
OLED & EzDIO 接線腳位
EzDIO 與OLED顯示螢幕接線圖

● 連接RFID感測器

本次選用的 RFID 感測器與OLED一樣是I2C介面,也同樣都是Grove插座。Grove連接線一頭接在 RFID 感測器上,另一頭接在 EzDIO 上方5個I2C插座的其中一個即可。

RFID 感測器 & EzDIO 接線腳位
RFID 感測器 & EzDIO 接線腳位
EzDIO 與RFID感測器接線圖

● 連接按鈕

按鈕是作為觸發人臉辨識使用,只有在對準人臉並按下按鈕時,才會發動解鎖功能。主要用來避免,當人經過時不小心觸發解鎖。

按鈕可連接在具有數位輸入功能的腳位上,例如可安裝在IO15。因為這邊使用的按鈕是Grove插座的,所以在排針旁的GPIO插座區,找尋對應的位置連接即可,Grove插座位置在「CN16」,接線對應如下表所示:

按鈕 & EzDIO 接線腳位
按鈕 & EzDIO 接線腳位
EzDIO 與按鈕接線圖

● 連接蜂鳴器

蜂鳴器能幫助我們了解裝置的狀態,透過聲音的變化,我們能清楚知道是否感應成功,或是解鎖成功。蜂鳴器連接在輸出的腳位,這邊選擇的模組是Grove類型,連接方式與按鈕模組相同,唯一不同的是,ESP32部分腳位只允許輸入,需要避開那些腳位,筆者選擇連接IO14(對應ESP32的腳位是27),Grove插座位置在「CN15」,接線對應如下表所示:

蜂鳴器 & EzDIO 接線腳位
蜂鳴器 & EzDIO 接線腳位
EzDIO 與蜂鳴器接線圖

● 連接HuskyLens

HuskyLens可以選擇I2C或是UART連接,並有附上連接線。筆者選擇連接在I2C,因為附贈的連接線另一頭為杜邦母頭,可連接在EzDIO的杜邦排針區,接線對應如下表所示:

HuskyLens & EzDIO 接線腳位
HuskyLens & EzDIO 接線腳位
EzDIO 與HuskyLens 接線圖

完成上述步驟後,所有的模組與裝置皆已連接完畢,你可以找一塊板子並透過螺絲、螺帽,將所有部件固定起來。板子可以是木板或是壓克力,排列完畢後用雷切或電鑽鑽洞都可以,也能依照自己的需求,安裝在適當的位置,自由發揮。

本次範例是用一塊3mm大小適中的木板,並使用手持電鑽鑽孔,將所有東西都固定在木板上,並用標籤機列印了一張標示貼紙,看起來有模有樣,如下圖所示:

ESP32 結合 EzDIO 製作人臉辨識門鎖

四、程式撰寫

撰寫程式的軟體,使用「BlocklyDuino F1」,相關的安裝方法請參閱吉哥的分享-如何安裝吉哥自製積木

在燒錄程式的過程中,發現原先在BlocklyDuino F1裡的HuskyLens程式庫無法使用在ESP32上面,後來經由查找HuskyLens官方說明網站,發現有較新的版本可用於ESP32,但反而無法用在LinkIt 7697。經我們工程師修改後可相容兩塊主控板,修改後的程式庫連結如下:

提醒大家使用前記得先更新為較新的程式庫

安裝HuskyLens新的程式庫

1. 首先打開BlocklyDuino F1的「資料夾」,接著依照下列順序依須點開資料夾,以便找到存放總程式庫的資料夾:

2. 接著刪除原先在資料夾內的舊程式庫「HUSKYLENS」,刪除後先不要關閉資料夾,待會兒要將新的程式庫複製過來。

HUSKYLENS 程式庫

3. 解壓縮剛剛下載下來的新程式庫,並複製資料夾內的「HUSKYLENS」,貼到剛剛BlocklyDuino F1的程式庫資料夾「libraries」內。

HUSKYLENS 程式庫

完成上述步驟,就完成程式庫安裝了。新、舊程式庫內容差異不小,請不要用覆蓋的,確實刪除後再貼上新的程式庫,比較不會有問題。

● 功能規劃

1. 首先是人臉辨識解鎖的功能,預先設定HuskyLens儲存要辨識的人臉,當HuskyLens通電後就會開始執行任務,並經由連接線回傳資料,此時若是按下按鈕,就讓程式去比對是否是記錄過的人臉,比對成功則開鎖,並於3秒後鎖上。

2. 接著是RFID感應解鎖,同樣得預先知道卡片號碼,當感應到相同號碼則開鎖,並於3秒後鎖上。

3. 蜂鳴器與OLED可用於感應、開鎖與感應錯誤時發出提示。

● 設定HuskyLens

在使用人臉辨識功能之前,需要進行一些設定,例如確認是否為I2C通訊,或是記錄人臉資料等等,你可以參考官方文件的教學,請記錄一張人臉,用於程式比對解鎖用。

● 範例程式連結

完成上述功能的程式不會太複雜,可以直接下載「範例程式」,解壓縮後請用BlocklyDuino開啟,我們可以從程式中學習。

其中共有兩個範例程式,一個是單純讀取RFID卡片號碼的程式,用來讀出手邊卡片的編號,比對卡片號碼時使用;另一個則是完成上述功能的辨識解鎖程式。

● 讀取RFID卡片號碼程式說明(EzDIO_read_RFID)

RFID感測器在感測到卡片資料時會讀到號碼,反之為空值。透過變數「card」將資料儲存下來後比對,若有讀到資料則顯示在OLED上面。

讀取RFID

將程式燒錄後執行,請將讀取到的資料記下來,以便填入「EzDIO_Face_unlock」這個程式中。

● 辨識解鎖程式說明(EzDIO_Face_unlock)

程式可以分成三部份,分別是「初始化」、「重複執行」與「函式群」。初始化不外乎就是功能設定與狀態賦予,重複執行則處理所有功能,包含辨識、RFID感應、開鎖……等。最後的函式群是指,將一些重複用到的功能包成函式(或稱副程式),主要用於簡化程式並提升修改時的效率,進而增加可讀性。接下來讓我們觀看每個部份:

1. 初始化

在這部份我們針對需要預先初始化的功能,進行初始化,像是OLED與HuskyLens。並設定兩個全域變數「door」、「card」,用來記錄是否開門以及儲存卡片的號碼。

因為OLED顯示的文字大小有限,所以採用圖片轉換XBM的方式,即可顯示任意圖案或文字,相關教學可參考「自訂OLED顯示圖案教學步驟」,自訂的點陣圖有"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毫秒」是為了避免程式重複執行過快,導致數據接收錯誤。

人臉辨識解鎖程式-重複執行

請將上述程式燒錄後執行。

五、成品展示

首先將Micro USB接上EzDIO,接著為電磁鎖接上12V的電源後,按下EzDIO上的開關,啟動所有功能。

成品展示

六、結語

以上就是以ESP32為控制板,結合EzDIO擴展板與相關模組製作的人臉辨識門鎖專案,喜歡我們文章的夥伴們,別忘了幫我們多多分享文章,並且定期關注我們的社群,一起學習更多新奇的事物吧!