STM32外设集 -- 人脸识别门禁系统(K210--HEX协议版本)

前言

人脸,指纹识别已经走进人们的生活,无疑这方便了人们的生活,也提高了安全和可靠性,所以作为未来的学习方向,我也来接触接触人脸识别(有不足之处请见谅)


项目选型

STM32外设集 -- 人脸识别门禁系统(K210--HEX协议版本)_第1张图片

为什么选择 K210?

因为这款芯片有充足的开源资料足够支撑我们学习,并将文档也很友好

STM32外设集 -- 人脸识别门禁系统(K210--HEX协议版本)_第2张图片

相关资料连接

使用说明 (Github): github.com/sipeed/MF1-User-Manual
硬件原理图/数据手册: https://dl.sipeed.com/shareURL/MAIX/HDK
固件/资源包资料下载: http://api.dl.sipeed.com/shareURL/MF_Module
Sipeed HardWare: github.com/sipeed/Sipeed_HardWare


 核心部分(K210)

主要根据 MF 人脸识别模块通信串口协议(Hex版)进行编写程序,本次只是写了添加,删除和查询三个基础功能

使用到 串口2 进行通信(代码未贴,需要自行配置)

MF 人脸识别模块通信串口协议(Hex版)https://github.com/sipeed/MF1-User-Manual/blob/master/zh_CN/p02_mf_protocol_manual_v2_hex_zh_CN.md

K210.h

/*********************************************************************************
* @Function	:  hr建立
	@TEL      :  Q1727606470
	@Others	  :  参考使用
**********************************************************************************/
#ifndef __H210_h
#define __H210_h

#include "stm32f10x.h"
#include 
#include 


typedef struct 
{
  uint8_t Add_User;   //添加用户指令
	uint8_t Delete_User;//删除用户指令
	uint8_t Check_User; //检测用户指令
	uint8_t Set_LED;		//设置LED亮度
		
}State_Flage_TypeDef;

//模组返回的消息类型说明
#define BINCMD_PING           0x00 // ping 指令
#define BINCMD_ABORT     			0x01 // 中断当前执行指令
#define BINCMD_INFO     			0x02 // 查询板卡信息
#define BINCMD_BAUD      		  0x03 // 设置波特率
#define BINCMD_RECORD         0x04 // 开始录入人脸
#define BINCMD_CONFIRM        0x05 // 确认录入人脸
#define BINCMD_DEL        		0x06 // 删除指定 ID 人脸
#define BINCMD_FR_RUN       	0x07 // 开始/停止运行人脸识别
#define BINCMD_FR_RES      		0x08 // 模块返回的人脸识别结果
#define BINCMD_FR_GATE        0x09 // 设置人脸识别门限
#define BINCMD_LED       			0x0A // 设置LED灯状态
#define BINCMD_FR_RUN2       	0x0B // 
/*********************************************************************************
* @Function	:  添加指定ID人脸
* @Input		:  User_ID 用户id(0~254)	
* @Output		:  None 
* @Return		:  None
* @Others		:  未使用CRC16验证
* @Date			:  2022-09-14
**********************************************************************************/
void H210_InputFaceID(u8 User_ID);
/*********************************************************************************
* @Function	:  删除指定ID
* @Input		:  User_ID 用户id(0~254)	
* @Output		:  None 
* @Return		:  None
* @Others		:  None
* @Date			:  2022-09-14
**********************************************************************************/
void H210_ClearDate(u8 User_ID);
/*********************************************************************************
* @Function	:  检测人脸
* @Input		:  None
* @Output		:  None
* @Return		:  None
* @Others		:  未使用CRC16验证
* @Date			:  2022-09-14
**********************************************************************************/
void H210_CheckFacesID(void);

#endif 

K210.c

#include "k210.h"
//k210使用的串口2
#include "usart.h"
#include "usart2.h" 
#include "delay.h"

extern u8 USART2_RX_BUF[USART2_MAX_RECV_LEN]; //获取接收消息
extern vu16 USART2_RX_STA;   	
State_Flage_TypeDef *State_Flage; //枚举一个状态值
/*********************************************************************************
* @Function	:  固定指令(程序中进行修改)
**********************************************************************************/
unsigned char H210_FaceStorageCmd[11] ={0x24,0x24,0x0B,0x00,0xFF,0xFF,0x04,0x00,0x00,0x05,0x01};//录入人脸,设置超时时间为 5 秒
unsigned char H210_FaceOKCmd[8] ={0x24,0x24,0x08,0x00,0xFF,0xFF,0x05,0x01};				 //确认录入成功
unsigned char H210_CheckFaceID[8] ={0x24,0x24,0x08,0x00,0xFF,0xFF,0x07,0x01};			 //开启人脸识别,设置仅上报id,可以观察到红外灯亮起
unsigned char H210_CheckFaceIDMsg[8] ={0x24,0x24,0x08,0x00,0xFF,0xFF,0x07,0x02};	 //开启人脸识别,设置上报id及特征值,可以观察到红外灯亮起
unsigned char H210_CheckFaceNum[7] ={0x24,0x24,0x07,0x00,0xFF,0xFF,0x11};					 //查询录入人数
unsigned char H210_CheckFaceAllmsg[7] ={0x24,0x24,0x07,0x00,0xFF,0xFF,0x12};			 //查询录入的所有信息
unsigned char H210_DeleteFaceID[9] ={0x24,0x24,0x09,0x00,0xFF,0xFF,0x06,0x00,0xFF};//删除指定用户信息	
unsigned char H210_SetLEDLight[8] ={0x24,0x24,0x08,0x00,0xFF,0xFF,0x0A,0x80};			 //删除指定用户信息	
/*********************************************************************************
* @Function	:  设置LED亮度
* @Input		:  User_ID 用户id(0~254)	
* @Output		:  None 
* @Return		:  None
* @Others		:  None
* @Date			:  2022-09-14
**********************************************************************************/
static void Clear_flage(void)
{
	//清空标志位
	State_Flage->Add_User =0;   //添加人脸标志位
	State_Flage->Delete_User =0;//删除人脸标志位
	State_Flage->Check_User =0; //检测人脸标志位
	State_Flage->Set_LED =0;		//设置LED亮度标志位
	H210_FaceStorageCmd[8]=0;   //恢复人脸录入数
}
/*********************************************************************************
* @Function	:  设置LED亮度
* @Input		:  User_ID 用户id(0~254)	
* @Output		:  None 
* @Return		:  None
* @Others		:  None
* @Date			:  2022-09-14
**********************************************************************************/
static void Set_Light(u8 Light)
{
	State_Flage->Set_LED =1;
	H210_SetLEDLight[7] = Light;//修改LED亮度
	Usart_SendArray(USART2,(char*)H210_SetLEDLight,sizeof(H210_SetLEDLight));//发送录入指令
}

/*********************************************************************************
* @Function	:  添加指定ID人脸
* @Input		:  User_ID 用户id(0~254)	
* @Output		:  None 
* @Return		:  None
* @Others		:  未使用CRC16验证
* @Date			:  2022-09-14
**********************************************************************************/
void H210_InputFaceID(u8 User_ID)
{
	State_Flage->Add_User =1;
	H210_FaceStorageCmd[7] = User_ID;//修改用户ID
	Usart_SendArray(USART2,(char*)H210_FaceStorageCmd,sizeof(H210_FaceStorageCmd));//发送录入指令
}
/*********************************************************************************
* @Function	:  删除指定ID
* @Input		:  User_ID 用户id(0~254)	
* @Output		:  None 
* @Return		:  None
* @Others		:  未使用CRC16验证
* @Date			:  2022-09-14
**********************************************************************************/
void H210_ClearDate(u8 User_ID)
{
	State_Flage->Delete_User =1;
	H210_DeleteFaceID[7] = User_ID;//修改用户ID
	Usart_SendArray(USART2,(char*)H210_DeleteFaceID,sizeof(H210_DeleteFaceID));//发送删除指令
}
/*********************************************************************************
* @Function	:  检测人脸
* @Input		:  None
* @Output		:  None
* @Return		:  None
* @Others		:  未使用CRC16验证
* @Date			:  2022-09-14
**********************************************************************************/
void H210_CheckFacesID(void)
{
	State_Flage->Check_User =1;
	Set_Light(90); //亮度设置(补光)
	Usart_SendArray(USART2,(char*)H210_CheckFaceID,sizeof(H210_CheckFaceID));//发送删除指令
}
/*********************************************************************************
* @Function	:  循环检测是否符合指令
* @Input		:  None
* @Output		:  None 
* @Return		:  None
* @Others		:  None
* @Date			:  2022-09-14
**********************************************************************************/
void H210_CheckHex(void){
	if(USART2_RX_STA){
		if(State_Flage->Check_User){//检测用户
			if(USART2_RX_BUF[2]==BINCMD_FR_RES&&USART2_RX_BUF[4] ==0x83){//40 40 08 00 83 CE 87 00 检测成功
				printf("用户ID: %d",USART2_RX_BUF[7]);//输出检测成功的用户ID
				Clear_flage(); //清除标志位
				Set_Light(0);  //关闭补光
			}
		}
		else if(State_Flage->Add_User){//添加用户
			if(USART2_RX_BUF[2]==BINCMD_FR_RES&&USART2_RX_BUF[4] ==0x2A){//录入第一次人脸信息
				
				switch(H210_FaceStorageCmd[8]){
					case 0x00:H210_FaceStorageCmd[8]++;break;//开始录入第二次录入人脸信息
					case 0x01:H210_FaceStorageCmd[8]++;break;//开始录入第三次录入人脸信息
					case 0x02:H210_FaceStorageCmd[8]++;break;//超过我们限定(3)的录入次数(发送确认录入信息)
				}
				if(H210_FaceStorageCmd[8]>0x02){
					Usart_SendArray(USART2,(char*)H210_FaceOKCmd,sizeof(H210_FaceOKCmd));//确认录入指令
					Clear_flage(); //清除标志位
				}else{
					Usart_SendArray(USART2,(char*)H210_FaceStorageCmd,sizeof(H210_FaceStorageCmd));//发送录入指令
				}
			}
		}
		else if(State_Flage->Delete_User){//删除用户
			if(USART2_RX_BUF[2]==BINCMD_FR_RES&&USART2_RX_BUF[4] ==0x5B){//40 40 08 00 5B D7 86 00 删除成功
				Clear_flage(); //清除标志位
			}
		}
		else if(State_Flage->Set_LED){//设置LED亮度
			if(USART2_RX_BUF[2]==BINCMD_FR_RES&&USART2_RX_BUF[4] ==0xFB){//40 40 08 00 5B D7 86 00 删除成功
				Clear_flage(); //清除标志位
			}
		}
	}
}

人脸设别的STM32主要的代码块已贴

STM32外设集 -- 人脸识别门禁系统(K210--HEX协议版本)_第3张图片

你可能感兴趣的:(毕设(物联网),STM32外设集,stm32,单片机,嵌入式硬件,嵌入式,物联网)