日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 人工智能 > pytorch >内容正文

pytorch

STM32驱动K210人脸识别模块经验汇总

發(fā)布時間:2024/3/26 pytorch 44 豆豆
生活随笔 收集整理的這篇文章主要介紹了 STM32驱动K210人脸识别模块经验汇总 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

本次是基于HLK-KT210 AI人臉識別模塊和STM32單片機進行設計的人臉識別項目。主要是人臉識別功能的分析和使用。

1 模塊連接

本次使用了海凌科生產的DEMO板,但是由于板子的客觀因素,TTL串口沒有設計好,需要自行引線才行,故需了解好模塊的引腳。串口TTL進行交叉通信,GND做共地處理。如圖所示,芯片模組的2引腳是RXD,連接到USB-TTL調試器的TXD或者單片機的TXD,模組的3引腳是TXD,接USB-TTL調試器的RXD或者單片機的RXD,波特率設置為115200(出廠默認,后期可自行更改)進行調試。USB-C口可以直接調試和供電,故不再說明C口,因本設計是自己焊接的板子,所以C口用起來不合適。注意的是供電部分一定要接穩(wěn)點電壓,1A以上,保持電源穩(wěn)定才行。

2 上位機調試

根據手冊和官方給的串口調試軟件擴展部分的指令,比較容易的進行測試。需要注意的是自己做指令進行驗證的話需要CRC校驗位,那么可以通過在線網址進行生成,模型和網址如下。

3 根據手冊和調試過程畫的人臉錄入和識別的流程



4 簡單的STM32驅動驗證

本次僅僅只是個開頭,做了人臉信息錄入和識別的功能,其它功能以后有時間再去設計驅動,入門以后其實就不復雜了,框架基本已成,后面有時間會更新。

/*** @說明 由燃燒電子于2022年3月24日做的初始版本V1.0* @TEL Q2772272579* @readme 僅供參考*/ #ifndef __HLK210_h #define __HLK210_h#include "stm32f10x.h" #include <string.h> #include <stdio.h> #include "Def_config.h" #include "delay.h"// #include "usart1.h" #define HLK210_SendByte USART1_SendByte //模組返回的消息類型說明 #define HLK210_CTROK 0x00 // 操作成功 #define HLK210_CHECKEDFACE 0x01 // 檢測到人臉 #define HLK210_LIVINGBODY 0x02 // 活體通過 #define HLK210_STRERROR 0x03 // 存儲操作錯誤 #define HLK210_STRFULL 0x04 // 人臉庫已滿 #define HLK210_CHECKOUT 0x05 // 檢測超時 #define HLK210_IDERROR 0x06 // 人臉編號ID不存在 #define HLK210_FORMERROR 0x07 // 參數或格式錯誤 #define HLK210_OTHERERROR 0x08 // 其他錯誤 #define HLK210_RAMERROR 0x09 // RAM中暫緩的模板不存在 #define HLK210_HAVEDFACE 0x0A // 此人臉已注冊typedef enum {NORMAL,INPUTFACEID,CHECKFACEID,DELETEFACEID}ENUM_HLK210;#define HLK210_NORMALANSWERLEN 18 //命令發(fā)出應答長度 #define HLK210_FACEANSWERLEN 21 //人臉錄入時反饋字節(jié)長度 #define HLK210_RECOANSWERLEN 22 //人類識別時反饋字節(jié)長度#define HLK210_USART_REC_LEN 50 typedef struct SaveData {char HLK210_Buffer[HLK210_USART_REC_LEN];char CmdDataLen; ENUM_JUDGE isGetData; //是否獲取到GPS數據ENUM_JUDGE isParseData; //是否解析完成ENUM_JUDGE isUsefull; //信息是否有效ENUM_HLK210 NowMode;char TimeCount; } _HLK210_Data; extern _HLK210_Data HLK210_Data;void HLK210_ClearDate(void); void HLK210_Receive_Byte(u8 res); void HLK210_InputFaceID(void); void HLK210_CheckFaceID(void);#endif #include "HLK210.h"#include "bsp_i2c_gpio.h" #include "bsp_i2c_OLED.h" #include "delay.h" #include "usart3.h" unsigned char HLK210_FaceStorageCmd[18] ={0x5A, 0x2C, 0x00, 0x00, 0x00, 0x12, 0x03, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0xE5};//人臉錄入指令 unsigned char HLK210_FaceCheckCmd[18] = {0x5A, 0x2C, 0x00, 0x00, 0x00, 0x12, 0x02, 0x0C, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x34, 0xA8}; //人臉識別指令 unsigned char HLK210_FaceDelete[18] = {0x5A, 0x2C, 0x00, 0x00, 0x00, 0x12, 0x0D, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x87, 0x1E}; //人臉清空指令 unsigned char HLK210_LightOn[18] = {0x5A, 0x2C, 0x00, 0x00, 0x00, 0x12, 0x12, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x50, 0xAA, 0x15}; //開補光燈指令unsigned char HLK210_RECEICV_BUFFER[HLK210_USART_REC_LEN];_HLK210_Data HLK210_Data; u8 HLK210_point=0; void HLK210_Receive_Byte(u8 res) //將此函數放到串口中斷函數里,res形參放串口接收值。 {HLK210_RECEICV_BUFFER[HLK210_point++] = res;if(HLK210_point>1 && (HLK210_RECEICV_BUFFER[HLK210_point-2]==0x5a && HLK210_RECEICV_BUFFER[HLK210_point-1]==0x2c)){HLK210_RECEICV_BUFFER[0]=HLK210_RECEICV_BUFFER[HLK210_point-2];HLK210_RECEICV_BUFFER[1]=HLK210_RECEICV_BUFFER[HLK210_point-1];HLK210_point=2;}if(HLK210_point>=HLK210_Data.CmdDataLen){HLK210_Data.isGetData = TRUE;memset(HLK210_Data.HLK210_Buffer, 0, HLK210_USART_REC_LEN); //清空memcpy(HLK210_Data.HLK210_Buffer,HLK210_RECEICV_BUFFER, HLK210_point); //保存數據}if(HLK210_point>HLK210_USART_REC_LEN){HLK210_point=HLK210_USART_REC_LEN-1;} } void HLK210_ClearDate(void) {memset(HLK210_RECEICV_BUFFER, 0, HLK210_USART_REC_LEN); //清空HLK210_point=0;HLK210_Data.CmdDataLen = HLK210_NORMALANSWERLEN;memset(HLK210_Data.HLK210_Buffer, 0, HLK210_USART_REC_LEN); //清空HLK210_Data.isGetData = FALSE;HLK210_Data.isParseData = FALSE;HLK210_Data.isUsefull = FALSE;HLK210_Data.NowMode = NORMAL;HLK210_Data.TimeCount = 0; }void HLK210_Send_Cmd(u8 *cmd) {u8 i=0;for(i=0;i<18;i++){HLK210_SendByte(*cmd++); // == *(cmd++) 取cmd所指單元的值,cmd指向下一單元,即cmd自加1} } void HLK210_InputFaceID(void) {u8 i=0;HLK210_ClearDate();HLK210_Data.CmdDataLen = HLK210_NORMALANSWERLEN;HLK210_Data.NowMode = INPUTFACEID;HLK210_Send_Cmd(HLK210_LightOn); //開補光燈while(HLK210_Data.isGetData == FALSE); //等待接收完應答數據HLK210_Data.isGetData = FALSE;for(i=0;i<HLK210_Data.CmdDataLen;i++){USART3_SendByte(HLK210_Data.HLK210_Buffer[i]);}HLK210_Send_Cmd(HLK210_FaceStorageCmd);while(HLK210_Data.isGetData == FALSE); //等待接收完應答數據HLK210_Data.isGetData = FALSE;for(i=0;i<HLK210_Data.CmdDataLen;i++){USART3_SendByte(HLK210_Data.HLK210_Buffer[i]);}HLK210_Data.CmdDataLen = HLK210_FACEANSWERLEN; // while(HLK210_Data.isGetData == FALSE); //等待接收完應答數據 // HLK210_Data.isGetData = FALSE; // for(i=0;i<HLK210_Data.CmdDataLen;i++) // { // USART3_SendByte(HLK210_Data.HLK210_Buffer[i]); // } } void HLK210_CheckFaceID(void) {u8 i=0;HLK210_ClearDate();HLK210_Data.CmdDataLen = HLK210_NORMALANSWERLEN;HLK210_Data.NowMode = CHECKFACEID;HLK210_Send_Cmd(HLK210_LightOn); //開補光燈while(HLK210_Data.isGetData == FALSE); //等待接收完應答數據HLK210_Data.isGetData = FALSE;for(i=0;i<HLK210_Data.CmdDataLen;i++){USART3_SendByte(HLK210_Data.HLK210_Buffer[i]);}HLK210_Send_Cmd(HLK210_FaceCheckCmd);while(HLK210_Data.isGetData == FALSE); //等待接收完應答數據HLK210_Data.isGetData = FALSE;for(i=0;i<HLK210_Data.CmdDataLen;i++){USART3_SendByte(HLK210_Data.HLK210_Buffer[i]);}HLK210_Data.CmdDataLen = HLK210_RECOANSWERLEN; }

調用人臉識別方法(本次沒有識別ID號,只是做了有沒有識別成功的功能,后面再更新別的,數組19位存的就是有沒有成功標識,成功位0,否則為其他值,常見為0x02:檢測到人臉但未識別)

void Proc_CVHK210(void) {if(HLK210_Data.isGetData == TRUE && HLK210_Data.NowMode == CHECKFACEID){HLK210_Data.isGetData = FALSE;HLK210_Data.TimeCount = 0; // for(i=0;i<HLK210_Data.CmdDataLen;i++) // { // USART3_SendByte(HLK210_Data.HLK210_Buffer[i]); // }if(HLK210_Data.HLK210_Buffer[6]==0x02 && HLK210_Data.HLK210_Buffer[7]==0x0D && HLK210_Data.HLK210_Buffer[19]==0X00) {LCD_Show.personNum = 2;}if(HLK210_Data.HLK210_Buffer[6]==0x02 && HLK210_Data.HLK210_Buffer[7]==0x0D && HLK210_Data.HLK210_Buffer[19]!=0X00) {LCD_Show.personNum = 1;}LCD_Display();} }

調用超時檢測方法,因沒有人臉時需要更新屏幕顯示為“無人”狀態(tài),故用定時器設定3秒時間,沒有收到人臉數據時,設定為無人。

if(TIM4_FlagStatus.Flag_1000MS == TRUE) {HLK210_Data.TimeCount ++;if(HLK210_Data.isGetData == FALSE && HLK210_Data.TimeCount>2){LCD_Show.personNum = 0;LCD_Display();HLK210_Data.TimeCount = 3;} }

串口1設定為和K210模塊通信串口,調試過程進行串口3輸出串口1接收到的人臉識別模塊數據,以驗證接收設計程序是否有問題。

HLK210_InputFaceID(); if(HLK210_Data.isGetData == TRUE && HLK210_Data.NowMode == INPUTFACEID) {HLK210_Data.isGetData = FALSE;for(i=0;i<HLK210_Data.CmdDataLen;i++){USART3_SendByte(HLK210_Data.HLK210_Buffer[i]);}if(HLK210_Data.HLK210_Buffer[6]==0x03 && HLK210_Data.HLK210_Buffer[7]==0x0D && HLK210_Data.HLK210_Buffer[18]==0X00) //錄入成功{HLK210_CheckFaceID();} } if(HLK210_Data.isGetData == TRUE && HLK210_Data.NowMode == CHECKFACEID) {HLK210_Data.isGetData = FALSE;for(i=0;i<HLK210_Data.CmdDataLen;i++){USART3_SendByte(HLK210_Data.HLK210_Buffer[i]);} }

5 效果如下

總結

以上是生活随笔為你收集整理的STM32驱动K210人脸识别模块经验汇总的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。