当前位置: 首页 > news >正文

STM32传感器模块编程实践(十六)DIY人脸识别智能垃圾桶模型

文章目录

    • 一.概要
    • 二.实验模型原理
      • 1.硬件连接原理框图
      • 2.控制原理
    • 三.实验模型控制流程
    • 四.人脸识别垃圾桶模型程序
    • 五.实验效果视频
    • 六.小结

一.概要

上次介绍了款语音对话交互的智能垃圾桶,这次我们更复杂点,增加实现人脸识别的功能,就形成了一款人脸识别智能垃圾桶。

在这里插入图片描述

本文就做一个人脸识别感应垃圾桶套件模型,采用STM32F103C8T6单片机+舵机+语音交互模块+人脸识别模块,语音交互模块主要是实现验证语音口令是否正确,只有口令正确的人脸才能注册录入,人脸注册好后,只要刷人脸就能实现垃圾桶打开。

在这里插入图片描述

二.实验模型原理

1.硬件连接原理框图

在这里插入图片描述

模型主要分为五部分:主芯片单元,语音对话单元,执行动作单元,人脸识别单元。
在这里插入图片描述

图中主控芯片为STM32F103C8T6单片机,语音对话单元为ASR-PRO模块,执行传感器为180度SG90舵机,人脸识别单元为人脸识别模块。

信号线连接:SG90(180度)舵机的信号脚橙色线接到单片机的PA6脚。ASR-PRO模块接单片机的PB5,PB6,PB7,PB8,PB9引脚。人脸识别模块接单片机的串口通讯引脚PA9,PA10引脚。

2.控制原理

语音模块交互原理:
语音交互模块是一款集成了离线语音识别功能的模块,用户可以通过该模块实现语音识别功能,外部加上麦克风与喇叭,就能实现语音识别与对话。
在这里插入图片描述

语音核心板固件程序可以通过 USB转 TTL模块连接实现硬件连接下载,接线是 5V,GND,TX,RX四根线。
在这里插入图片描述

使用语音模块的开发软件,天问 Block 编程软件,制作好图形化语音对话控制程序,下图是语音交互程序,接收的语音命令是"打开",生成模型后,点击2M编译下载,连接USB转 TTL模块就能实现对语音模块进行固件程序下载。

在这里插入图片描述

舵机控制原理:
SG90舵机,首先,控制引脚是三根线,分别是GND(棕色)、VCC(红色)、PWM(黄色),控制方式也是一样的PWM时序,具体的方法如下:

(1)采用PWM控制的方式来进行舵机的旋转
(2)舵机的控制需要MCU产生一个20ms周期的脉冲信号,以0.5ms到2.5ms的高电平来控制舵机的角度。
(3)高电平时间跟舵机旋转的角度对应关系:
0.5ms-------------0度;对应函数中占空比为2.5%
1.0ms------------45度;对应函数中占空比为5.0%
1.5ms------------90度;对应函数中占空比为7.5%
2.0ms-----------135度;对应函数中占空比为10.0%
2.5ms-----------180度;对应函数中占空比为12.5%

人脸识别模块原理:
BE5100人脸识别模块是一个串口通讯模块,单片机只要通过UART口就能跟人脸识别模块进行通讯,可以实现人脸的录入,人脸识别,人脸删除等功能。

串口通讯参数:
在这里插入图片描述
指令格式:
在这里插入图片描述

以下对指令包中各域进行说明。
1:同步域(SyncWord):作为指令包开头的字节,固定为 EF AA。
2:消息类别(MsgID):消息类别主要分成 3 类,命令消息(Command)、应答消息(Reply)和通知消息(Note)。
3:数据域字节数(Size):数据域包含的字节数。
4:数据域(Data):需要传输的具体数据,如确认码、参数等。若无数据传输,数据域可为空。
5:校验域(Check):对 MsgID、Size、Data 这三个区域所有字节按位进行异或运算(XOR)。

消息类别MsgID主要定义如下:
在这里插入图片描述

三.实验模型控制流程

1.人脸识别模块先识别人脸,如果是没有录入过的人脸,单片机PB6引脚输出高电平,单片机的PB6与语音交互模块的PA2是相连的,语音模块读到PA2引脚为高电平,语音模块就会输出"人脸未注册,请输入口令",这样操作者就得发出"打开"的语音。语音交互模块收到"打开"的语音后,语音模块的PA4引脚输出高电平,单片机的PB9引脚读到高电平后,程序内部允许人脸识别模块进行录入的动作,录入成功之后,单片机的PB7引脚输出高电平,由于单片机的PB7引脚与语音模块的PA1引脚是相连的,语音交互模块就会读取PA1引脚,如果引脚为高电平,语音模块就输出"人脸录入成功"的语音。

2.单片机一直在与人脸识别模块进行串口通讯,在收到人脸识别成功的串口帧之后(标识符ID:0x12),单片机就会通过PA6引脚输出20ms周期的PWM波,PWM波高电平脉冲时间为2.5ms,这样舵机就会旋转180度,从而带动垃圾桶的盖打开,垃圾桶保持打开状态不变。同时单片机还会控制PB5引脚输出高电平,由于单片机的PB5引脚与语音模块的PA3引脚是相连的,语音识别模块的PA3引脚读取到高电平之后,就会输出"人脸识别成功"的语音。

3.垃圾桶盖打开10秒之后,垃圾桶盖就自动闭合。

四.人脸识别垃圾桶模型程序

单片机板子与SG90舵机(180度舵机)用杜邦线连接:
板子5V----红色线
板子A6----橙色线
板子G-----棕色线单片机板子与人脸模块用杜邦线连接:
板子5V------V
板子A9------R
板子A10----T
板子G-------G单片机板子与语音交互模块在底座上直接连接:
板子5V------语音5V
板子B5------语音PA3
板子B6------语音PA2
板子B7------语音PA1
板子B8------语音PA0
板子B9------语音PA4
板子G-------语音GND

USB线需要接小系统板,给STM32板子供5V, 板子与语音模块直接相连,板载麦克风,板子再外接一个喇叭。
在这里插入图片描述

实物地址

打开STM32CubeMX软件,新建工程
在这里插入图片描述
Part Number处输入STM32F103C8,再双击就创建新的工程
在这里插入图片描述
配置下载口引脚
在这里插入图片描述
配置外部晶振引脚
在这里插入图片描述
配置系统主频
在这里插入图片描述
PB5,PB6,PB7配置成输出,PB8,PB9配置成输入,而且是下拉输入,因为要读取语音模块输出的高电平信号。
在这里插入图片描述

配置PWM输出,定时器3通道1,周期20ms
在这里插入图片描述

PA9,PA10配置成USART串口引脚,波特率115200,中断使能,方便接收数据
在这里插入图片描述

配置工程文件名,保存路径,KEIL5工程输出方式
在这里插入图片描述
生成工程
在这里插入图片描述
用Keil5打开工程
在这里插入图片描述

添加代码

添加人脸识别成功控制舵机驱动代码:

在这里插入图片描述

在这里插入图片描述

添加人脸注册成功代码:
在这里插入图片描述

主要程序:

/* USER CODE BEGIN 0 */
uint32_t ShiBieControl;//人脸识别周期计数
uint32_t FaceLuruFlag;//1:录入人脸中
uint32_t FaceLuruTime;//人脸录入周期控制
uint16_t Pluse_Time=500,Old_Pluse_Time;//单位是us
uint8_t OpenFlag;//垃圾桶打开状态标志 1:打开 0:关闭
uint8_t CloseTime;//自动关闭垃圾桶时间计数
/* USER CODE END 0 *//*** @brief  The application entry point.* @retval int*/
int main(void)
{/* USER CODE BEGIN 1 *//* USER CODE END 1 *//* MCU Configuration--------------------------------------------------------*//* Reset of all peripherals, Initializes the Flash interface and the Systick. */HAL_Init();/* USER CODE BEGIN Init *//* USER CODE END Init *//* Configure the system clock */SystemClock_Config();/* USER CODE BEGIN SysInit *//* USER CODE END SysInit *//* Initialize all configured peripherals */MX_GPIO_Init();MX_TIM3_Init();MX_USART1_UART_Init();/* USER CODE BEGIN 2 */HAL_UART_Receive_IT(&huart1,(unsigned char*)&UartRxData,1);//接收中断打开Uart1_Send_Reset();//模组复位命令。HAL_Delay(2000);Data_Send_Cmd=1;//开启人脸识别if (HAL_TIM_PWM_Start(&htim3, TIM_CHANNEL_1) != HAL_OK)//PA6脚PWM输出{/* PWM generation Error */while(1);}HAL_Delay(200);//等待200ms//以180度角度伺服为例,那么对应的控制关系是这样的(t为高电平时间)://t=0.5ms(占空比2.5%)---------0°;//t=1.0ms(占空比5%)-----------45°;//t=1.5ms(占空比7.5%)---------90°;//t=2.0ms(占空比10%)---------135°;//t=2.5ms(占空比12.5%)-------180°;Pluse_Time=500;//0.5ms高电平脉冲,用于控制舵机转到0度HAL_TIM_PWM_Stop(&htim3, TIM_CHANNEL_1);//PWM停止输出HAL_Delay(100);//等待100msMX_TIM3_Init();//重新初始化配置PWM波if (HAL_TIM_PWM_Start(&htim3, TIM_CHANNEL_1) != HAL_OK)//PA6脚PWM输出{/* PWM generation Error */while(1);}HAL_Delay(2000);//等待2000msHAL_TIM_PWM_Stop(&htim3, TIM_CHANNEL_1);//PWM停止输出	/* USER CODE END 2 *//* Infinite loop *//* USER CODE BEGIN WHILE */while (1){/* USER CODE END WHILE *//* USER CODE BEGIN 3 */ShiBieControl++;HAL_Delay(500);//等待500msif(ShiBieControl>=4 &&( FaceLuruFlag==0||FaceLuruFlag==0x55))//没有人脸录入情况下,人脸识别时间可以短点{ShiBieControl=0;Data_Send_Cmd=1;//开启人脸识别}if(ShiBieControl>=10 && FaceLuruFlag==1)//有人脸录入情况下,人脸识别时间需要长点{ShiBieControl=0;Data_Send_Cmd=1;//开启人脸识别}Sound_Control();//控制语音模块输出if(HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_9)==GPIO_PIN_SET && FaceLuruFlag==0)//口令通过可以允许录入人脸{Data_Send_Cmd=2;//启动添加人脸FaceLuruFlag=1;ShiBieControl=0;//手动添加人脸过程中,不进行识别判断}if(FaceLuruFlag==1){FaceLuruTime++;if(FaceLuruTime>=20)//如果添加人脸没有成功,10秒之后再允许添加人脸{FaceLuruFlag=0;FaceLuruTime=0;}}Uart1_Deal();//与人脸识别模块通讯 if(OpenFlag==1)//长时间打开垃圾桶,10秒后自动关闭垃圾桶{CloseTime++;if(CloseTime>=20){CloseTime=0;OpenFlag=0;Pluse_Time=500;HAL_TIM_PWM_Stop(&htim3, TIM_CHANNEL_1);//PWM停止输出MX_TIM3_Init();//重新初始化配置PWM波if (HAL_TIM_PWM_Start(&htim3, TIM_CHANNEL_1) != HAL_OK)//PA6脚PWM输出{while(1);}HAL_Delay(500);}}}/* USER CODE END 3 */
}
//人脸识别模块串口协议解析主函数
void Uart1_Deal(void)  //主循环函数。
{Uart_RecvFlag();//循环调用接收完成函数 是否接收完成。/*发送命令判断*/if(Data_Send_Cmd != 0x00){switch(Data_Send_Cmd) //发送命令{case 0x01: //启动人脸识别 {//Uart1_Send_Verify();HAL_Delay(1000);Data_Send_Cmd = RESET; //单次循环命令清零。break;}case 0x02:    //启动添加人脸命令。。。{Uart1_Send_EnrollSingleWithID_Point_User_ID();HAL_Delay(1000);Data_Send_Cmd = RESET; //单次循环命令清零。break;}case 0x03:    //删除所有人脸特征的命令。。。。{Uart1_Delete_all_User_ID();Data_Send_Cmd = RESET; //单次循环命令清零。break;}case 0x04:    //模组复位命令 备用未使用。。{Uart1_Send_Reset();Data_Send_Cmd = RESET; //单次循环命令清零。break;}case 0x06:    //。。。{Data_Send_Cmd = RESET; //单次循环命令清零。break;}default:{break;}}}Uart_RecvFlag();//循环调用接收完成函数 是否接收完成。// 数据接收完成if(Usart1Data.receive_flag == SET) //接收完成标志位。   在中断里设置的接收完备{Usart1Data.receive_flag = RESET; //重新复位
//接收判断是什么状态。switch(Usart1Data.Uart_RxBuff[5]) //收到模块发送了过来的数据{case 0x10:    //这个是异或校验值{//复位成功/////****复位命令  在自己单独的工程项目中需要时候使用****/////Usart1Data.Uart_RxBuff[5] = 0;break;}case 0x01:    {//通知包/////*****/////备用未使用Usart1Data.Uart_RxBuff[5] = 0;break;}case 0x12: //识别{if(Usart1Data.Uart_RxBuff[6] == 0x00 &&((Usart1Data.Uart_RxBuff[7] << 8) + Usart1Data.Uart_RxBuff[8]) < 101) //ID最大的值是1----100   //识别成功后有数据。   {/*识别成功后的ID*/Face_ID =	Usart1Data.Uart_RxBuff[7]<<8 |Usart1Data.Uart_RxBuff[8];Display_Cmd = 0x02;//人脸识别成功,播放语音"人脸识别成功,打开垃圾桶"   }else if(Usart1Data.Uart_RxBuff[6] == 0x08 && Usart1Data.Uart_RxBuff[7] == 0x18) //没有已录入的用户  未检测到人脸  {Display_Cmd = 0x04;//显示未注册,播放语音"人脸未注册,输入口令录入人脸"  }//如果都不是识别到的数据。都不是识别到的IDelse  ///    EF AA 00 00 26 12 08 FF FF 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 3C  //对应的识别失败。Uart_RxBuff[7]  Uart_RxBuff[8]  是 FF FF 就是识别失败 成功会返回识别到的正确ID。{//识别失败Display_Cmd = 0x03;//人脸识别失败}break;   //正常switch识别到然后退出。。。。//去显示识别成功。}case 0x1D:	 //这个是 添加人脸特征值返回的数据。{if(Usart1Data.Uart_RxBuff[6] == 0x00)//注册成功{Face_ID =	Usart1Data.Uart_RxBuff[7]<<8 |Usart1Data.Uart_RxBuff[8];//添加成功后返回添加的ID值是多少。HAL_Delay(1000);Display_Cmd = 0x07;//注册成功,播放语音"人脸录入成功"  ShiBieControl=0;//刚注册完成,不立即进行识别}			else if(Usart1Data.Uart_RxBuff[6]==0x0D) //杭州模组录入超时  录入的时候没有人脸的情况下。{Display_Cmd = 0x09;//显示录入失败}else{Display_Cmd = 0x09;//显示录入失败}break;}case 0x21:  // 删除所有人脸 回复命令  {Display_Cmd = 0x0A; //显示清除人脸中 然后显示清除成功。break;}default:{break;}	}			}
}

语音模块是通过图形化编程,用天问软件,流程代码如下:
在这里插入图片描述

五.实验效果视频

STM32单片机人脸识别智能垃圾桶模型

六.小结

融合了舵机,语音交互模块,人脸识别模块的控制,对STM32的单片机的定时器PWM功能,定时器功能,USART串口通讯有更深的了解。


文章转载自:

http://hh2zUN27.shqfr.cn
http://G8ocXd1a.shqfr.cn
http://i86srp5v.shqfr.cn
http://WgzGLIZG.shqfr.cn
http://6Fl2IaBb.shqfr.cn
http://0Z02HwQU.shqfr.cn
http://vCP6A9hM.shqfr.cn
http://Lb3eqZTY.shqfr.cn
http://Q0QfFEmM.shqfr.cn
http://RdG37STG.shqfr.cn
http://BcoXlBnN.shqfr.cn
http://v5RLtKNq.shqfr.cn
http://4gwaHydr.shqfr.cn
http://lS4bHllx.shqfr.cn
http://BMPNjM2d.shqfr.cn
http://dqqkB3AC.shqfr.cn
http://7tVmCNNY.shqfr.cn
http://MLVL1nsI.shqfr.cn
http://2y8kuPXQ.shqfr.cn
http://cMkmmToU.shqfr.cn
http://x50bq2a6.shqfr.cn
http://a8LneBJi.shqfr.cn
http://s0wQaUGk.shqfr.cn
http://RgZdY5zv.shqfr.cn
http://Qz1mWpdF.shqfr.cn
http://wrPSIUex.shqfr.cn
http://fjRvNPfl.shqfr.cn
http://UMPkozH5.shqfr.cn
http://T9UnUL1h.shqfr.cn
http://bUxzyrNp.shqfr.cn
http://www.dtcms.com/a/368464.html

相关文章:

  • vscode连接SSH
  • 在VSCode中更新或安装最新版的npx和uv工具
  • 如何选择文件夹然后用vscode直接打开
  • 命令行中如如何打开目录?vscode中如何打开目录
  • 一阶低通滤波器应用示例(演示)
  • 如何选择适合的实验室铸铁地板和铸铁试验平板?专业人士帮助指南
  • centos sshd:xxx.xxx.xxx.xxx:allow 如何设置
  • 如果要获得Ecovadis认证需要费用是多少?
  • SQL Server全链路安全防护
  • C++_数据结构
  • MySQL数据库精研之旅第十六期:深度拆解事务核心(上)
  • solidity函数篇
  • 数据库(基础操作)
  • Python+DRVT 从外部调用 Revit:批量创建梁
  • 【软考架构】V模型、W模型、增量模型和螺旋模型
  • 华为云昇腾云服务
  • Redis-事务与管道
  • threejs入门学习日记
  • Bug 排查日记:从问题浮现到解决的技术之旅
  • Java观察者模式
  • 深度学习从入门到精通 - BERT与预训练模型:NLP领域的核弹级技术详解
  • DeepSeek:开启智能体驱动对话式数据分析新时代
  • 分布式3PC理论
  • 在本地使用Node.js和Express框架来连接和操作远程数据库
  • Linux应用(2)——标准IO
  • 面试官问:你选择这份工作的动机是什么?
  • 大型语言模型SEO(LLM SEO)完全手册:驾驭搜索新范式
  • Onlyoffice集成与AI交互操作指引(Iframe版)
  • 前端视觉交互设计全解析:从悬停高亮到多维交互体系(含代码 + 图表)
  • 【基础组件】手撕 MYSQL 连接池(C++ 版本)