基于STM32 的智能防疫门禁装置设计
2022-07-11何文华
何文华
(贵州商学院 贵州省贵阳市 550000)
1 智能防疫门禁装置的总体设计方案
本智能防疫门禁装置的设计主要包括硬件、软件两部分设计。
1.1 智能防疫门禁装置硬件设计
硬件的制作设计时需要经过制定方案、选则器件、绘制电路原理图、绘制PCB 图、制作PCB 板、焊接元器件、调试硬件七个步骤。方案制定时需要考虑各模块通信方式、各模块电源需求、各模块布局结构、各器件封装结构、主控制器资源等情况。本文的硬件设计主要由主控制器STM32、OpenMV 模块、OpenMV_LCD、红外无线测温传感器、语音播报、舵机、电源模块组成。该装置硬件组成框图如图1所示。本文通过OpenMV 模块的摄像头采集人脸及健康码信息,并进行是否配戴口罩和健康码类型的识别,识别结果通过串口发送给控制器STM32,OpenMV_LCD 将实时显示采集的影像;红外测温传感器将无接触检测人体温度并将信息传给控制器STM32;控制器STM32 将口罩佩戴识别结果信息、健康码的识别结果信息、人体温度信息传送给LCD 屏幕进行显示;控制器STM32 控制语音播报器进行相关播报,控制门禁舵机的开和关。
图1:硬件组成框图
1.2 软件设计
1.2.1 OpenMV 端的程序设计
OpenMV 端程序的开发环境是OpenMV IDE,开发语言使用Python 语言。OpenMV 端程序主要包括口罩识别、健康码识别、串口通信几个部分。
1.2.2 STM32 端的控制程序设计STM32 端程序的开发环境是Keil μvison5,开发语言使用C 语言。STM32 端程序内容主要包括STM32 主控制程序、串口通信程序、红外测温程序、语音播报程序、舵机驱动程序、LCD 显示几个部分。
2 智能防疫门禁装置的硬件电路设计及实现
2.1 电源模块的设计
本文设计的智能防疫门禁装置主要用到5V 和3.3V 两种电压。本文设计的电源模块输入方式有两种,一种是采用直流电源模块,该模块一路输入,输入直流范围为6.5V-12V;两路输出,输出直流电压为3.3V 和5V,可以给各模块提供需要的电压。第二种是采用USB 供电输入,可以给各模块提供5V 电压。本文在USB 供电输入部分加入了CH340 模块。CH340 模块可以将USB 通信方式转为UART 串口通信方式,该模块可为控制器STM32 的程序下载提供接口。该模块的串口管脚RXD、TXD 分别与与控制器STM32 的串口管脚PA9、PA10 相连。
2.2 控制器STM32接口及外围电路设计
该部分包括控制器STM32 接口模块、LCD 模块、语音模块、无线测温模块、舵机模块,控制器STM32 模块负责各模块的信息读取、信息处理、控制信号的输出。
2.2.1 LCD 显示模块
LCD 模块用于显示智能防疫装置的提示信息、人体温度测量值等。本文设计选用TFT-LCD(以下简称LCD)显示屏幕,它是用TFT(薄膜场效应晶体管)控制液晶像素的液晶屏,是众多LCD 中最常用的一类。本设计选用的LCD 显示模块为3.5 寸彩屏,14 个管脚,其驱动芯片是ILI9341,电源电压3.3V~5V,逻辑IO 口电压3.3V(TTL),采用SPI(Serial Peripheral Interface)串行总线,可选触摸功能。本文设计的LCD 模块电源电压使用5V,不选择触摸功能。STM32 通过SPI 接口向LCD 模块发送命令和要显示的数据LCD 模块。LCD 模块与STM32 模块的管脚连接关系如表1所示。
表1:LCD 模块与STM32 模块的管脚连接关系
2.2.2 语音模块
语音模块可以直观的表达智能防疫装置的提示信息、人体温度测量值等。本文设计选用中文TTS 文字转语音合成模块,该模块5V 单电源供电,支持数字、字母、中文的播报,5V 和3.3 单片机串口直接控制,串口输出什么该模块就报什么语音,串口通信默认波特率参数为为9600,8,n。该模块引出红白黄黑4 条不同颜色的杜邦线,红色是该模块的电源管脚,白色是该模块的串口接收(RX)管脚,黄色是该模块的串口发送(TX)管脚,黑色是该模块的接地。TTS 语音模块的串口管脚RX、TX 分别与STM32 的串口管脚PA2(TXD)、PA3(RXD)连接。STM32 通过PA2 管脚向TTS 语音模块发送需要播报的内容。
2.2.3 无线测温模块
该模块负责温度数据的采集、测量,并将采集到的数据通过数据端口传送给STM32。本文设计选用可编程人体红外线检测的热释电传感器TN901,无需和人体接触,它能接收人体发射出的红外线并使之转换成数字号输出。这种传感器内部集成了滤波、放大和数模转换的功能,可以直接与STM32 单片机完成数据的采集和处理,不需要复杂的信号调理电路。它使用的通信方式是SPI 的协议流程,它的工作温度是-33℃~220℃,特别适合测量人体的温度。
该模块总共5 个引脚,本设计中该模块电源V 管脚接5V,数据接收管脚D 与STM32 的PC3 管脚相连,没有数据接收时D 为高电平;2KHz Clock 输出管脚C 与STM32的PC2 管脚相连,用于同步TN901 与STM32 的通信;测温启动信号管脚A 与STM32 的PA0 管脚相连,低电平有效。
2.2.4 舵机模块
模拟门的开与关,该模块信号引脚与STM32 的PA1 引脚相连。
2.3 OpenMV模块电路接口设计
OpenMV 是一个开源、低成本、功能强大的机器视觉模块。OpenMV 模块以STM32H7 为核心,集成了OV7725 摄像头芯片,在小巧的硬件模块上,向开发者提供Python 编程接口。本文设计了OpenMV 与STM32 模块的接口设计以及OpenMV 与OpenMV_LCD 的接口设计。OpenMV 模块电源引脚连接5V 电压,该模块与STM32 通过串口通信,该模块的串口P4(TX)引脚与STM32 的串口PB11(RX)相连,该模块的串口P5(RX)与STM32 的PB10(TX)相连。OpenMV 模块与OpenMV_LCD 通过SPI 串口进行通信。
3 智能防疫门禁装置的软件设计与实现
本文的程序设计包含OpenMV 端程序设计、STM32 端程序设计两部分。
3.1 OpenMV端程序的设计与实现
OpenMV 端程序的功能:采集图像,进行是否带口罩的识别,健康码图片的识别,驱动OpenMV_LCD 实时显示采集到的图像,驱动串口和STM32 进行通信。
OpenMV 程序开发过程是:1)电脑上安装集成开发环境OpenMV IDE,2)连接OpenMV 模块与电脑,使用USB数据线将电脑的USB 口与OpenMV 的USB 口相连,正常情况下,电脑会自动安装驱动3)编写程序4)运行程序。程序可以运行在电脑端,也可以脱机运行,程序编译好后直接在OpenMV 端运行。这种模式需要在OpenMV 模块插入一张SD 卡,在烧录固件的时候,直接把脚本文件复制到这个SD 卡中。本设计开发调试阶段程序运行在电脑端,后期是脱机运行在SD 卡中。
EDGE IMPULSE 是一个应用于嵌入式领域的在线的机器学习网站,可以为用户提供了一些现成的神经网络模型以供训练,还能直接将训练好的模型转换成能在各种MCU 上运行的代码,使用方便。将基于STM32H7 的OpenMV 机器视觉模组和云端AI 平台EDGE IMPULSE 合作,可以很好打通从数据收集、打标,NN 模型训练、优化到部署的整个流程。
3.1.1 口罩佩戴识别功能的实现
本文利用EDGE IMPULSE 在线网站训练神经网络的模型实现是人脸否佩戴口罩的识别。开发主要有四个步骤:
(1)利用OpenMV IDE 采集数据集,本设计采集了两个类别的数据,人脸各种角度戴口罩的数据集200 张和没戴口罩的数据集200 张;
(2) 将OpenMV IDE 采集的图像上传到EDGE IMPULSE 在线网站;
(3)在EDGE IMPULSE 在线网站上经过配置处理模块、图像预处理、配置迁移学习模型、开始训练、训练完成后,将使用测试数据来验证模型;
(4)完成了训练设计、模型训练和模型验证的步骤,将“Build”生成的trained.tflite(网络模型)、labels.txt(分类标签)、ei_image_classification.py (Python 代码)三个文件导出到OpenMV 的SD 卡里,
(5)在OpenMV 的主程序main.py 文件里编写口罩佩戴识别程序:通过语句net = "trained.tflite"加载神经网络模型,通过语句labels = [line.rstrip(' ') for line in open("labels.txt")]读取分类标签,当收到STM32 通过串口发来识别口罩的命令后对口罩佩戴进行识别。
3.1.2 健康码识别功能的实现
利用OpenMV 平台的NCC(归一化积相关算法)实现模版匹配,NCC 常做作为相似性的度量。当NCC 为-1 时,两向量负相关,当NCC 为0 时,两向量不相关,当NCC 为1 时,两向量正相关。因此,NCC 值越大,两向量越相似,反则不相似。本设计将贵州健康码正常、自我观察、居家隔离、集中隔离、医院隔离五种图片作为模板与OpenMV 摄像头扫描到的健康码进行匹配,从而判断出扫描到的健康码属于哪一种类型,然后将判断结果通过串口传送给STM32。
3.1.3 串口通信功能的实现
STM32 模块通过串口向OpenMV 机器视觉模组发送健康码识别、佩戴口罩识别的命令;OpenMV 机器视觉模组通过串口将健康码识别、佩戴口罩识别的结果信息传输到STM32 模块。设置与STM32 串口通信的参数uart.init(9600, bits=8, parity=None, stop=1),读取STM 32 串口数据if uart.any(): a = uart.readchar();向串口写入识别结果,uart.write("3") 语句表示已向串口写入口罩已经佩戴的标志信号“3”,该标志信号“3”就可以通过串口传到STM32 模块。
3.2 STM32端程序的设计与实现
STM32 端程序的开发采用集成开发环境Keil μvison5,采用C 语言。功能:实现和OPenMV 的串口通信,驱动无线测温传感器进行人体温度采集,驱动LCD 显示口罩识别结果、健康码识别结果、温度测量结果,驱动舵机的开和关。
STM32 主程序流程包括:开始→初始化各模块→扫描按键→根据按键状态与检测状态进行发送相应的命令(识别健康码命令、识别口罩命令、红外测温命令)→判断可通行标志是否为真,如果可通行标志为真自动打开舵机,否侧进行语音播报,手动打开舵机→返回进行扫描按键。
3.2.1 初始化程序设计
初始化包括系统时钟、按键、定时器、红外测温传感器、LCD 显示屏的初始化。其主要语句如下。初始化各变量:u8 key_value=0,i;设置系统中断优先级分组2:NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);初始化延时函数:delay_init(168); 初始化串口1 用来和显示屏的板子通信:USART1_Init(9600); 语言模块波特率设置:USART2_Init(9600); 和OpenMV 通信波特率设置uart3_init(9600); 初始化按键GPIO 口:KEY_Init(); 初始化LED 灯GPIO 口LED_Init(); 定时器5 PWM 初始化,时钟84M,分频系数84,所以84M/84=1Mhz 的计数频率,计数500 次为500us:TIM5_PWM_Init(199,8400); 测温模块初始化:TN901_Init(); 液晶屏初始化LCD_Init()。
3.2.2 STM32 端与OpenMV 端的串口通信程序设计
两端的串口波特率设置为9600bps,利用STM32 的串口中断服务函数实现。STM32 与OpenMV 的串口中断程序处理流程如图2 所示。
图2:STM32 与OpenMV 的串口通信流程图
在串口中断服务函数里用语句if(USART_GetITStatus(USART1,USART_IT_RXNE)!=RESET)接收中断→用语句rebuf[i++] =USART_ReceiveData(USART1);读取接收到的数据→对读取的数据进行帧头判断if(rebuf[0]!=1) i=0;→再判断是否结束,如果判断结束清除串口中断标志位→中断结束。
3.2.3 红外温度测量模块程序设计
TN901 程序流程如图3 所示。
图3:TN901 程序流程图
TN901 红外温度传感器模块的程序流程主要有TN901初始化→检测测试管脚A →读取数据→判断首字节→判断第5 字节→计算处理→送LCD 模块显示→关闭TN901。
3.2.3.1 TN901 红外温度传感器的工作时序
当STM32 控制器的PA0 管脚给红外传感器TN901 的A 管脚置低电平时,进入测量状态。TN901 红外传感器时钟输出管脚C 输出2KHz 时钟信号(时钟周期是500us)给STM32 控制器,STM32 在该时钟下降沿时一位一位读走数据。STM32 在时钟得下降沿接收数据,一次温度测量需接收5 个BYTE(字节)的数据,每次有脉冲来时先读取头部,当头部是环境温度,或者是目标温度时再继续读取下一字节。5 个字节的信息格式如表2 所示。
表2:信息格式
STM32 读取TN9015 个字节的程序如下:
3.2.3.2 红外测温模块温度值计算
无论测量环境温度还是目标温度,只要检到测头部帧Item 为0x4CH 或者0x66H, 同时检测到CR 为0x0DH,STM32 度读取到的有效数据进行计算,否则返回继续读取数据。温度计算公式为:实际温度值=temp/16 - 273.15f。公式中273.15 为华氏转摄氏的单位转换差值,temp 为十进制。
4 结语
后疫情时代对各种出入口场所需要人工进行来往人员人体温度的测量、健康码的识别、口罩佩戴识别与提醒,这种模式存在交叉感染风险,工作人员疲惫易出纰漏等问题。本文设计了基于STM32 和OpenMV 的防疫智能门禁装置。通过该装置可以实现无接触测量人体体温、自动识别贵州健康码类型、自动识别人员是否佩戴口罩、自动开启门禁的功能,符合当前的防疫需要。