前言
人脸,指纹识别已经走进人们的生活,无疑这方便了人们的生活,也提高了安全和可靠性,所以作为未来的学习方向,我也来接触接触人脸识别(有不足之处请见谅😁)
项目选型
为什么选择 K210?
因为这款芯片有充足的开源资料足够支撑我们学习,并将文档也很友好
相关资料连接
使用说明 (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 <string.h>
#include <stdio.h>
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主要的代码块已贴文章来源:https://www.toymoban.com/news/detail-405317.html
文章来源地址https://www.toymoban.com/news/detail-405317.html
到了这里,关于STM32外设集 -- 人脸识别门禁系统(K210--HEX协议版本)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!