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