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


    前言

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


    项目选型

    为什么选择 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

    1. /*********************************************************************************
    2. * @Function : hr建立
    3. @TEL : Q1727606470
    4. @Others : 参考使用
    5. **********************************************************************************/
    6. #ifndef __H210_h
    7. #define __H210_h
    8. #include "stm32f10x.h"
    9. #include
    10. #include
    11. typedef struct
    12. {
    13. uint8_t Add_User; //添加用户指令
    14. uint8_t Delete_User;//删除用户指令
    15. uint8_t Check_User; //检测用户指令
    16. uint8_t Set_LED; //设置LED亮度
    17. }State_Flage_TypeDef;
    18. //模组返回的消息类型说明
    19. #define BINCMD_PING 0x00 // ping 指令
    20. #define BINCMD_ABORT 0x01 // 中断当前执行指令
    21. #define BINCMD_INFO 0x02 // 查询板卡信息
    22. #define BINCMD_BAUD 0x03 // 设置波特率
    23. #define BINCMD_RECORD 0x04 // 开始录入人脸
    24. #define BINCMD_CONFIRM 0x05 // 确认录入人脸
    25. #define BINCMD_DEL 0x06 // 删除指定 ID 人脸
    26. #define BINCMD_FR_RUN 0x07 // 开始/停止运行人脸识别
    27. #define BINCMD_FR_RES 0x08 // 模块返回的人脸识别结果
    28. #define BINCMD_FR_GATE 0x09 // 设置人脸识别门限
    29. #define BINCMD_LED 0x0A // 设置LED灯状态
    30. #define BINCMD_FR_RUN2 0x0B //
    31. /*********************************************************************************
    32. * @Function : 添加指定ID人脸
    33. * @Input : User_ID 用户id(0~254)
    34. * @Output : None
    35. * @Return : None
    36. * @Others : 未使用CRC16验证
    37. * @Date : 2022-09-14
    38. **********************************************************************************/
    39. void H210_InputFaceID(u8 User_ID);
    40. /*********************************************************************************
    41. * @Function : 删除指定ID
    42. * @Input : User_ID 用户id(0~254)
    43. * @Output : None
    44. * @Return : None
    45. * @Others : None
    46. * @Date : 2022-09-14
    47. **********************************************************************************/
    48. void H210_ClearDate(u8 User_ID);
    49. /*********************************************************************************
    50. * @Function : 检测人脸
    51. * @Input : None
    52. * @Output : None
    53. * @Return : None
    54. * @Others : 未使用CRC16验证
    55. * @Date : 2022-09-14
    56. **********************************************************************************/
    57. void H210_CheckFacesID(void);
    58. #endif

    K210.c

    1. #include "k210.h"
    2. //k210使用的串口2
    3. #include "usart.h"
    4. #include "usart2.h"
    5. #include "delay.h"
    6. extern u8 USART2_RX_BUF[USART2_MAX_RECV_LEN]; //获取接收消息
    7. extern vu16 USART2_RX_STA;
    8. State_Flage_TypeDef *State_Flage; //枚举一个状态值
    9. /*********************************************************************************
    10. * @Function : 固定指令(程序中进行修改)
    11. **********************************************************************************/
    12. unsigned char H210_FaceStorageCmd[11] ={0x24,0x24,0x0B,0x00,0xFF,0xFF,0x04,0x00,0x00,0x05,0x01};//录入人脸,设置超时时间为 5 秒
    13. unsigned char H210_FaceOKCmd[8] ={0x24,0x24,0x08,0x00,0xFF,0xFF,0x05,0x01}; //确认录入成功
    14. unsigned char H210_CheckFaceID[8] ={0x24,0x24,0x08,0x00,0xFF,0xFF,0x07,0x01}; //开启人脸识别,设置仅上报id,可以观察到红外灯亮起
    15. unsigned char H210_CheckFaceIDMsg[8] ={0x24,0x24,0x08,0x00,0xFF,0xFF,0x07,0x02}; //开启人脸识别,设置上报id及特征值,可以观察到红外灯亮起
    16. unsigned char H210_CheckFaceNum[7] ={0x24,0x24,0x07,0x00,0xFF,0xFF,0x11}; //查询录入人数
    17. unsigned char H210_CheckFaceAllmsg[7] ={0x24,0x24,0x07,0x00,0xFF,0xFF,0x12}; //查询录入的所有信息
    18. unsigned char H210_DeleteFaceID[9] ={0x24,0x24,0x09,0x00,0xFF,0xFF,0x06,0x00,0xFF};//删除指定用户信息
    19. unsigned char H210_SetLEDLight[8] ={0x24,0x24,0x08,0x00,0xFF,0xFF,0x0A,0x80}; //删除指定用户信息
    20. /*********************************************************************************
    21. * @Function : 设置LED亮度
    22. * @Input : User_ID 用户id(0~254)
    23. * @Output : None
    24. * @Return : None
    25. * @Others : None
    26. * @Date : 2022-09-14
    27. **********************************************************************************/
    28. static void Clear_flage(void)
    29. {
    30. //清空标志位
    31. State_Flage->Add_User =0; //添加人脸标志位
    32. State_Flage->Delete_User =0;//删除人脸标志位
    33. State_Flage->Check_User =0; //检测人脸标志位
    34. State_Flage->Set_LED =0; //设置LED亮度标志位
    35. H210_FaceStorageCmd[8]=0; //恢复人脸录入数
    36. }
    37. /*********************************************************************************
    38. * @Function : 设置LED亮度
    39. * @Input : User_ID 用户id(0~254)
    40. * @Output : None
    41. * @Return : None
    42. * @Others : None
    43. * @Date : 2022-09-14
    44. **********************************************************************************/
    45. static void Set_Light(u8 Light)
    46. {
    47. State_Flage->Set_LED =1;
    48. H210_SetLEDLight[7] = Light;//修改LED亮度
    49. Usart_SendArray(USART2,(char*)H210_SetLEDLight,sizeof(H210_SetLEDLight));//发送录入指令
    50. }
    51. /*********************************************************************************
    52. * @Function : 添加指定ID人脸
    53. * @Input : User_ID 用户id(0~254)
    54. * @Output : None
    55. * @Return : None
    56. * @Others : 未使用CRC16验证
    57. * @Date : 2022-09-14
    58. **********************************************************************************/
    59. void H210_InputFaceID(u8 User_ID)
    60. {
    61. State_Flage->Add_User =1;
    62. H210_FaceStorageCmd[7] = User_ID;//修改用户ID
    63. Usart_SendArray(USART2,(char*)H210_FaceStorageCmd,sizeof(H210_FaceStorageCmd));//发送录入指令
    64. }
    65. /*********************************************************************************
    66. * @Function : 删除指定ID
    67. * @Input : User_ID 用户id(0~254)
    68. * @Output : None
    69. * @Return : None
    70. * @Others : 未使用CRC16验证
    71. * @Date : 2022-09-14
    72. **********************************************************************************/
    73. void H210_ClearDate(u8 User_ID)
    74. {
    75. State_Flage->Delete_User =1;
    76. H210_DeleteFaceID[7] = User_ID;//修改用户ID
    77. Usart_SendArray(USART2,(char*)H210_DeleteFaceID,sizeof(H210_DeleteFaceID));//发送删除指令
    78. }
    79. /*********************************************************************************
    80. * @Function : 检测人脸
    81. * @Input : None
    82. * @Output : None
    83. * @Return : None
    84. * @Others : 未使用CRC16验证
    85. * @Date : 2022-09-14
    86. **********************************************************************************/
    87. void H210_CheckFacesID(void)
    88. {
    89. State_Flage->Check_User =1;
    90. Set_Light(90); //亮度设置(补光)
    91. Usart_SendArray(USART2,(char*)H210_CheckFaceID,sizeof(H210_CheckFaceID));//发送删除指令
    92. }
    93. /*********************************************************************************
    94. * @Function : 循环检测是否符合指令
    95. * @Input : None
    96. * @Output : None
    97. * @Return : None
    98. * @Others : None
    99. * @Date : 2022-09-14
    100. **********************************************************************************/
    101. void H210_CheckHex(void){
    102. if(USART2_RX_STA){
    103. if(State_Flage->Check_User){//检测用户
    104. if(USART2_RX_BUF[2]==BINCMD_FR_RES&&USART2_RX_BUF[4] ==0x83){//40 40 08 00 83 CE 87 00 检测成功
    105. printf("用户ID: %d",USART2_RX_BUF[7]);//输出检测成功的用户ID
    106. Clear_flage(); //清除标志位
    107. Set_Light(0); //关闭补光
    108. }
    109. }
    110. else if(State_Flage->Add_User){//添加用户
    111. if(USART2_RX_BUF[2]==BINCMD_FR_RES&&USART2_RX_BUF[4] ==0x2A){//录入第一次人脸信息
    112. switch(H210_FaceStorageCmd[8]){
    113. case 0x00:H210_FaceStorageCmd[8]++;break;//开始录入第二次录入人脸信息
    114. case 0x01:H210_FaceStorageCmd[8]++;break;//开始录入第三次录入人脸信息
    115. case 0x02:H210_FaceStorageCmd[8]++;break;//超过我们限定(3)的录入次数(发送确认录入信息)
    116. }
    117. if(H210_FaceStorageCmd[8]>0x02){
    118. Usart_SendArray(USART2,(char*)H210_FaceOKCmd,sizeof(H210_FaceOKCmd));//确认录入指令
    119. Clear_flage(); //清除标志位
    120. }else{
    121. Usart_SendArray(USART2,(char*)H210_FaceStorageCmd,sizeof(H210_FaceStorageCmd));//发送录入指令
    122. }
    123. }
    124. }
    125. else if(State_Flage->Delete_User){//删除用户
    126. if(USART2_RX_BUF[2]==BINCMD_FR_RES&&USART2_RX_BUF[4] ==0x5B){//40 40 08 00 5B D7 86 00 删除成功
    127. Clear_flage(); //清除标志位
    128. }
    129. }
    130. else if(State_Flage->Set_LED){//设置LED亮度
    131. if(USART2_RX_BUF[2]==BINCMD_FR_RES&&USART2_RX_BUF[4] ==0xFB){//40 40 08 00 5B D7 86 00 删除成功
    132. Clear_flage(); //清除标志位
    133. }
    134. }
    135. }
    136. }

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

  • 相关阅读:
    分布式锁的几种实现方式
    27.阻塞队列
    系统的频域分析法-----Chap4_1-4
    mac输密码麻烦?一位数密码来了!
    通过Java操作Kafka
    系统集成项目管理总结(笔记)
    Android程序设计之学生考勤管理系统
    48V LDO三端稳压IC 60v 100V 300V电源降压芯片系统解决方案
    [SFML] 多个OpenGL上下文
    第十八天最大加号标志
  • 原文地址:https://blog.csdn.net/herui_2/article/details/126850480