何文華
(貴州商學院 貴州省貴陽市 550000)
本智能防疫門禁裝置的設(shè)計主要包括硬件、軟件兩部分設(shè)計。
硬件的制作設(shè)計時需要經(jīng)過制定方案、選則器件、繪制電路原理圖、繪制PCB 圖、制作PCB 板、焊接元器件、調(diào)試硬件七個步驟。方案制定時需要考慮各模塊通信方式、各模塊電源需求、各模塊布局結(jié)構(gòu)、各器件封裝結(jié)構(gòu)、主控制器資源等情況。本文的硬件設(shè)計主要由主控制器STM32、OpenMV 模塊、OpenMV_LCD、紅外無線測溫傳感器、語音播報、舵機、電源模塊組成。該裝置硬件組成框圖如圖1所示。本文通過OpenMV 模塊的攝像頭采集人臉及健康碼信息,并進行是否配戴口罩和健康碼類型的識別,識別結(jié)果通過串口發(fā)送給控制器STM32,OpenMV_LCD 將實時顯示采集的影像;紅外測溫傳感器將無接觸檢測人體溫度并將信息傳給控制器STM32;控制器STM32 將口罩佩戴識別結(jié)果信息、健康碼的識別結(jié)果信息、人體溫度信息傳送給LCD 屏幕進行顯示;控制器STM32 控制語音播報器進行相關(guān)播報,控制門禁舵機的開和關(guān)。
圖1:硬件組成框圖
1.2.1 OpenMV 端的程序設(shè)計
OpenMV 端程序的開發(fā)環(huán)境是OpenMV IDE,開發(fā)語言使用Python 語言。OpenMV 端程序主要包括口罩識別、健康碼識別、串口通信幾個部分。
1.2.2 STM32 端的控制程序設(shè)計STM32 端程序的開發(fā)環(huán)境是Keil μvison5,開發(fā)語言使用C 語言。STM32 端程序內(nèi)容主要包括STM32 主控制程序、串口通信程序、紅外測溫程序、語音播報程序、舵機驅(qū)動程序、LCD 顯示幾個部分。
本文設(shè)計的智能防疫門禁裝置主要用到5V 和3.3V 兩種電壓。本文設(shè)計的電源模塊輸入方式有兩種,一種是采用直流電源模塊,該模塊一路輸入,輸入直流范圍為6.5V-12V;兩路輸出,輸出直流電壓為3.3V 和5V,可以給各模塊提供需要的電壓。第二種是采用USB 供電輸入,可以給各模塊提供5V 電壓。本文在USB 供電輸入部分加入了CH340 模塊。CH340 模塊可以將USB 通信方式轉(zhuǎn)為UART 串口通信方式,該模塊可為控制器STM32 的程序下載提供接口。該模塊的串口管腳RXD、TXD 分別與與控制器STM32 的串口管腳PA9、PA10 相連。
該部分包括控制器STM32 接口模塊、LCD 模塊、語音模塊、無線測溫模塊、舵機模塊,控制器STM32 模塊負責各模塊的信息讀取、信息處理、控制信號的輸出。
2.2.1 LCD 顯示模塊
LCD 模塊用于顯示智能防疫裝置的提示信息、人體溫度測量值等。本文設(shè)計選用TFT-LCD(以下簡稱LCD)顯示屏幕,它是用TFT(薄膜場效應晶體管)控制液晶像素的液晶屏,是眾多LCD 中最常用的一類。本設(shè)計選用的LCD 顯示模塊為3.5 寸彩屏,14 個管腳,其驅(qū)動芯片是ILI9341,電源電壓3.3V~5V,邏輯IO 口電壓3.3V(TTL),采用SPI(Serial Peripheral Interface)串行總線,可選觸摸功能。本文設(shè)計的LCD 模塊電源電壓使用5V,不選擇觸摸功能。STM32 通過SPI 接口向LCD 模塊發(fā)送命令和要顯示的數(shù)據(jù)LCD 模塊。LCD 模塊與STM32 模塊的管腳連接關(guān)系如表1所示。
表1:LCD 模塊與STM32 模塊的管腳連接關(guān)系
2.2.2 語音模塊
語音模塊可以直觀的表達智能防疫裝置的提示信息、人體溫度測量值等。本文設(shè)計選用中文TTS 文字轉(zhuǎn)語音合成模塊,該模塊5V 單電源供電,支持數(shù)字、字母、中文的播報,5V 和3.3 單片機串口直接控制,串口輸出什么該模塊就報什么語音,串口通信默認波特率參數(shù)為為9600,8,n。該模塊引出紅白黃黑4 條不同顏色的杜邦線,紅色是該模塊的電源管腳,白色是該模塊的串口接收(RX)管腳,黃色是該模塊的串口發(fā)送(TX)管腳,黑色是該模塊的接地。TTS 語音模塊的串口管腳RX、TX 分別與STM32 的串口管腳PA2(TXD)、PA3(RXD)連接。STM32 通過PA2 管腳向TTS 語音模塊發(fā)送需要播報的內(nèi)容。
2.2.3 無線測溫模塊
該模塊負責溫度數(shù)據(jù)的采集、測量,并將采集到的數(shù)據(jù)通過數(shù)據(jù)端口傳送給STM32。本文設(shè)計選用可編程人體紅外線檢測的熱釋電傳感器TN901,無需和人體接觸,它能接收人體發(fā)射出的紅外線并使之轉(zhuǎn)換成數(shù)字號輸出。這種傳感器內(nèi)部集成了濾波、放大和數(shù)模轉(zhuǎn)換的功能,可以直接與STM32 單片機完成數(shù)據(jù)的采集和處理,不需要復雜的信號調(diào)理電路。它使用的通信方式是SPI 的協(xié)議流程,它的工作溫度是-33℃~220℃,特別適合測量人體的溫度。
該模塊總共5 個引腳,本設(shè)計中該模塊電源V 管腳接5V,數(shù)據(jù)接收管腳D 與STM32 的PC3 管腳相連,沒有數(shù)據(jù)接收時D 為高電平;2KHz Clock 輸出管腳C 與STM32的PC2 管腳相連,用于同步TN901 與STM32 的通信;測溫啟動信號管腳A 與STM32 的PA0 管腳相連,低電平有效。
2.2.4 舵機模塊
模擬門的開與關(guān),該模塊信號引腳與STM32 的PA1 引腳相連。
OpenMV 是一個開源、低成本、功能強大的機器視覺模塊。OpenMV 模塊以STM32H7 為核心,集成了OV7725 攝像頭芯片,在小巧的硬件模塊上,向開發(fā)者提供Python 編程接口。本文設(shè)計了OpenMV 與STM32 模塊的接口設(shè)計以及OpenMV 與OpenMV_LCD 的接口設(shè)計。OpenMV 模塊電源引腳連接5V 電壓,該模塊與STM32 通過串口通信,該模塊的串口P4(TX)引腳與STM32 的串口PB11(RX)相連,該模塊的串口P5(RX)與STM32 的PB10(TX)相連。OpenMV 模塊與OpenMV_LCD 通過SPI 串口進行通信。
本文的程序設(shè)計包含OpenMV 端程序設(shè)計、STM32 端程序設(shè)計兩部分。
OpenMV 端程序的功能:采集圖像,進行是否帶口罩的識別,健康碼圖片的識別,驅(qū)動OpenMV_LCD 實時顯示采集到的圖像,驅(qū)動串口和STM32 進行通信。
OpenMV 程序開發(fā)過程是:1)電腦上安裝集成開發(fā)環(huán)境OpenMV IDE,2)連接OpenMV 模塊與電腦,使用USB數(shù)據(jù)線將電腦的USB 口與OpenMV 的USB 口相連,正常情況下,電腦會自動安裝驅(qū)動3)編寫程序4)運行程序。程序可以運行在電腦端,也可以脫機運行,程序編譯好后直接在OpenMV 端運行。這種模式需要在OpenMV 模塊插入一張SD 卡,在燒錄固件的時候,直接把腳本文件復制到這個SD 卡中。本設(shè)計開發(fā)調(diào)試階段程序運行在電腦端,后期是脫機運行在SD 卡中。
EDGE IMPULSE 是一個應用于嵌入式領(lǐng)域的在線的機器學習網(wǎng)站,可以為用戶提供了一些現(xiàn)成的神經(jīng)網(wǎng)絡(luò)模型以供訓練,還能直接將訓練好的模型轉(zhuǎn)換成能在各種MCU 上運行的代碼,使用方便。將基于STM32H7 的OpenMV 機器視覺模組和云端AI 平臺EDGE IMPULSE 合作,可以很好打通從數(shù)據(jù)收集、打標,NN 模型訓練、優(yōu)化到部署的整個流程。
3.1.1 口罩佩戴識別功能的實現(xiàn)
本文利用EDGE IMPULSE 在線網(wǎng)站訓練神經(jīng)網(wǎng)絡(luò)的模型實現(xiàn)是人臉否佩戴口罩的識別。開發(fā)主要有四個步驟:
(1)利用OpenMV IDE 采集數(shù)據(jù)集,本設(shè)計采集了兩個類別的數(shù)據(jù),人臉各種角度戴口罩的數(shù)據(jù)集200 張和沒戴口罩的數(shù)據(jù)集200 張;
(2) 將OpenMV IDE 采集的圖像上傳到EDGE IMPULSE 在線網(wǎng)站;
(3)在EDGE IMPULSE 在線網(wǎng)站上經(jīng)過配置處理模塊、圖像預處理、配置遷移學習模型、開始訓練、訓練完成后,將使用測試數(shù)據(jù)來驗證模型;
(4)完成了訓練設(shè)計、模型訓練和模型驗證的步驟,將“Build”生成的trained.tflite(網(wǎng)絡(luò)模型)、labels.txt(分類標簽)、ei_image_classification.py (Python 代碼)三個文件導出到OpenMV 的SD 卡里,
(5)在OpenMV 的主程序main.py 文件里編寫口罩佩戴識別程序:通過語句net = "trained.tflite"加載神經(jīng)網(wǎng)絡(luò)模型,通過語句labels = [line.rstrip(' ') for line in open("labels.txt")]讀取分類標簽,當收到STM32 通過串口發(fā)來識別口罩的命令后對口罩佩戴進行識別。
3.1.2 健康碼識別功能的實現(xiàn)
利用OpenMV 平臺的NCC(歸一化積相關(guān)算法)實現(xiàn)模版匹配,NCC 常做作為相似性的度量。當NCC 為-1 時,兩向量負相關(guān),當NCC 為0 時,兩向量不相關(guān),當NCC 為1 時,兩向量正相關(guān)。因此,NCC 值越大,兩向量越相似,反則不相似。本設(shè)計將貴州健康碼正常、自我觀察、居家隔離、集中隔離、醫(yī)院隔離五種圖片作為模板與OpenMV 攝像頭掃描到的健康碼進行匹配,從而判斷出掃描到的健康碼屬于哪一種類型,然后將判斷結(jié)果通過串口傳送給STM32。
3.1.3 串口通信功能的實現(xiàn)
STM32 模塊通過串口向OpenMV 機器視覺模組發(fā)送健康碼識別、佩戴口罩識別的命令;OpenMV 機器視覺模組通過串口將健康碼識別、佩戴口罩識別的結(jié)果信息傳輸?shù)絊TM32 模塊。設(shè)置與STM32 串口通信的參數(shù)uart.init(9600, bits=8, parity=None, stop=1),讀取STM 32 串口數(shù)據(jù)if uart.any(): a = uart.readchar();向串口寫入識別結(jié)果,uart.write("3") 語句表示已向串口寫入口罩已經(jīng)佩戴的標志信號“3”,該標志信號“3”就可以通過串口傳到STM32 模塊。
STM32 端程序的開發(fā)采用集成開發(fā)環(huán)境Keil μvison5,采用C 語言。功能:實現(xiàn)和OPenMV 的串口通信,驅(qū)動無線測溫傳感器進行人體溫度采集,驅(qū)動LCD 顯示口罩識別結(jié)果、健康碼識別結(jié)果、溫度測量結(jié)果,驅(qū)動舵機的開和關(guān)。
STM32 主程序流程包括:開始→初始化各模塊→掃描按鍵→根據(jù)按鍵狀態(tài)與檢測狀態(tài)進行發(fā)送相應的命令(識別健康碼命令、識別口罩命令、紅外測溫命令)→判斷可通行標志是否為真,如果可通行標志為真自動打開舵機,否側(cè)進行語音播報,手動打開舵機→返回進行掃描按鍵。
3.2.1 初始化程序設(shè)計
初始化包括系統(tǒng)時鐘、按鍵、定時器、紅外測溫傳感器、LCD 顯示屏的初始化。其主要語句如下。初始化各變量:u8 key_value=0,i;設(shè)置系統(tǒng)中斷優(yōu)先級分組2:NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);初始化延時函數(shù):delay_init(168); 初始化串口1 用來和顯示屏的板子通信:USART1_Init(9600); 語言模塊波特率設(shè)置:USART2_Init(9600); 和OpenMV 通信波特率設(shè)置uart3_init(9600); 初始化按鍵GPIO 口:KEY_Init(); 初始化LED 燈GPIO 口LED_Init(); 定時器5 PWM 初始化,時鐘84M,分頻系數(shù)84,所以84M/84=1Mhz 的計數(shù)頻率,計數(shù)500 次為500us:TIM5_PWM_Init(199,8400); 測溫模塊初始化:TN901_Init(); 液晶屏初始化LCD_Init()。
3.2.2 STM32 端與OpenMV 端的串口通信程序設(shè)計
兩端的串口波特率設(shè)置為9600bps,利用STM32 的串口中斷服務函數(shù)實現(xiàn)。STM32 與OpenMV 的串口中斷程序處理流程如圖2 所示。
圖2:STM32 與OpenMV 的串口通信流程圖
在串口中斷服務函數(shù)里用語句if(USART_GetITStatus(USART1,USART_IT_RXNE)!=RESET)接收中斷→用語句rebuf[i++] =USART_ReceiveData(USART1);讀取接收到的數(shù)據(jù)→對讀取的數(shù)據(jù)進行幀頭判斷if(rebuf[0]!=1) i=0;→再判斷是否結(jié)束,如果判斷結(jié)束清除串口中斷標志位→中斷結(jié)束。
3.2.3 紅外溫度測量模塊程序設(shè)計
TN901 程序流程如圖3 所示。
圖3:TN901 程序流程圖
TN901 紅外溫度傳感器模塊的程序流程主要有TN901初始化→檢測測試管腳A →讀取數(shù)據(jù)→判斷首字節(jié)→判斷第5 字節(jié)→計算處理→送LCD 模塊顯示→關(guān)閉TN901。
3.2.3.1 TN901 紅外溫度傳感器的工作時序
當STM32 控制器的PA0 管腳給紅外傳感器TN901 的A 管腳置低電平時,進入測量狀態(tài)。TN901 紅外傳感器時鐘輸出管腳C 輸出2KHz 時鐘信號(時鐘周期是500us)給STM32 控制器,STM32 在該時鐘下降沿時一位一位讀走數(shù)據(jù)。STM32 在時鐘得下降沿接收數(shù)據(jù),一次溫度測量需接收5 個BYTE(字節(jié))的數(shù)據(jù),每次有脈沖來時先讀取頭部,當頭部是環(huán)境溫度,或者是目標溫度時再繼續(xù)讀取下一字節(jié)。5 個字節(jié)的信息格式如表2 所示。
表2:信息格式
STM32 讀取TN9015 個字節(jié)的程序如下:
3.2.3.2 紅外測溫模塊溫度值計算
無論測量環(huán)境溫度還是目標溫度,只要檢到測頭部幀Item 為0x4CH 或者0x66H, 同時檢測到CR 為0x0DH,STM32 度讀取到的有效數(shù)據(jù)進行計算,否則返回繼續(xù)讀取數(shù)據(jù)。溫度計算公式為:實際溫度值=temp/16 - 273.15f。公式中273.15 為華氏轉(zhuǎn)攝氏的單位轉(zhuǎn)換差值,temp 為十進制。
后疫情時代對各種出入口場所需要人工進行來往人員人體溫度的測量、健康碼的識別、口罩佩戴識別與提醒,這種模式存在交叉感染風險,工作人員疲憊易出紕漏等問題。本文設(shè)計了基于STM32 和OpenMV 的防疫智能門禁裝置。通過該裝置可以實現(xiàn)無接觸測量人體體溫、自動識別貴州健康碼類型、自動識別人員是否佩戴口罩、自動開啟門禁的功能,符合當前的防疫需要。