IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 嵌入式 -> 基于STM32的手势识别检测 -> 正文阅读

[嵌入式]基于STM32的手势识别检测

基于STM32的手势识别检测

1.简介

??手势识别是计算机科学和语言技术中的一个主题,目的是通过数学算法来识别人类手势。 手势可以源自任何身体运动或状态,但通常源自面部或手。 本领域中的当前焦点包括来自面部和手势识别的情感识别。 用户可以使用简单的手势来控制或与设备交互,而无需接触他们。姿势,步态和人类行为的识别也是手势识别技术的主题。手势识别可以被视为计算机理解人体语言的方式,从而在机器和人之间搭建比原始文本用户界面或甚至GUI(图形用户界面)更丰富的桥梁。
??手势识别使人们能够与机器进行通信,并且无需任何机械设备即可自然交互。 使用手势识别的概念,可以将手指指向计算机屏幕,使得光标将相应地移动。 这可能使常规输入设备(如鼠标,键盘甚至触摸屏)变得冗余。
??越来越多的电子设备都在使用手势识别功能。顾名思义,手势识别旨在识别人类的物理运动或“手势”。例如,在设备前面以特定模式挥动您的手可能会告诉它启动特定的应用程序,诸如此类的手势识别经常出现在智能手机和平板电脑中。
??手势识别被分类为一种非接触式用户界面(TUI)。与触摸屏设备不同,TUI设备无需触摸即可控制。像Google Home和Amazon Alexa这样的语音控制智能扬声器是TUI的主要例子。
??手势识别也打开了通向输入可能性的全新世界的大门。用户可以尝试其他基于手势的输入形式,而不是仅限于传统的输入形式。有些设备甚至允许用户设置自己的手势。
??除智能手机和平板电脑外,手机识别还可用于汽车信息娱乐中心、视频游戏控制台、人机界面等。最重要的是,手势识别技术正变得越来越流行,并且没有任何迹象表明它会很快放慢速度。

2.PAJ7620介绍

??PAJ-7620U2是由原相科技公司开发的一款手势识别芯片, 内集成了光学数组式传感器单元,可以快速准确的对输入信号进行感应和输出处理。内置光源和环境光抑制滤波器,能在黑暗或低光环境下工作。它支持上、下、左、右、前、后、顺时针旋转、逆时针旋转和挥动的手势动作识别,以及支持物体接近检测等功能。可大致检测物体体积大小和亮度。使用IIC通信接口可达400KHz通信速率。
???可直接识别 9 种基本手势,支持手势中断输出
??? 内置红外 LED 和光学镜头,能在低光和黑暗环境下工作
??? 支持 I2C 接口通信,仅需两根信号脚即可控制
??? 板载电平转换电路,可兼容 3.3V/5V 的逻辑电平
在这里插入图片描述

2.2 通讯方式

??PAJ7620使用IIC通信接口可达400KHz通信速率。
??功能模块框图如下所示:
在这里插入图片描述
??其中, I2C_SCL 和 I2C_SDA 是连接 MCU 的 IIC 接口, MCU 通过这个 IIC 接口来控制PAJ7620,在上述框图可以看到,该芯片内部自带 LED 驱动器,传感器感应阵列、目标信息提取阵列和手势识别阵列。 芯片工作时通过内部 LED 驱动器,驱动红外 LED向外发射红外线信号,当传感器阵列在有效的距离中探测到物体时,目标信息提取阵列会对探测目标进行特征原始数据的获取,获取的数据会存在寄存器中,同时手势识别阵列会对原始数据进行识别处理,最后将手势结果存到寄存器中,用户可根据 I2C 接口对原始数据和手势识别的结果进行读取。

2.3 硬件驱动

??1.打开STM32CubeMX软件,配置手势识别引脚PB6(IIC_SCL)、PB7(IIC_SDA)。
在这里插入图片描述
??2.设置引脚模式为推挽输出模式,初始化电平为高电平。
在这里插入图片描述
??3.手势模块底层接口IIC协议函数。
在这里插入图片描述
??起始信号
??钟线为高电平时,数据线由高变低为起始信号。

/***************发送起始信号*************
*
*说明:时钟线为高电平时,数据线由高变低为起始信号
*******************************************/
void IIC_Start(void)
{
	IIC_SDA_OUT_MODE();//输出模式
	IIC_SCL(1);
	IIC_SDA_OUT(1);
	DelayUs(2);
	IIC_SDA_OUT(1);
	DelayUs(2);
	IIC_SCL(0);//钳住IIC总线,准发送或者接收数据
}

??停止信号
??时钟线为高电平时,数据线由低变高为停止信号。

/**************发送停止信号*****************
**
**说明:时钟线为高电平时,数据线由低变高为停止信号
************************************************/
void IIC_Stop(void)
{
	IIC_SDA_OUT_MODE();//输出模式
	IIC_SCL(0);
	IIC_SDA_OUT(1);
	DelayUs(2);
	IIC_SCL(1);
	DelayUs(2);
	IIC_SDA_OUT(1);
	DelayUs(2);
}

??发送应答和发送数据
??时钟上升沿读取数据,下降发送数据。
在这里插入图片描述

/****************发送应答信号************
**u8 ack -- 0应答,1非应答
**
******************************************/
void IIC_Send_Ack(u8 ack)
{
	IIC_SDA_OUT_MODE();//输出模式
	IIC_SCL(0);
	if(ack&0X01)IIC_SDA_OUT(1);//非应答
	else IIC_SDA_OUT(1);//应答
	DelayUs(2);
	IIC_SCL(1);//时钟线拉高,数据发送完成
	DelayUs(2);
	IIC_SCL(0);//时钟线拉低,准备下一次数据收发
}
/***************发送一字节数据***************/
void IIC_Send_Byte(u8 txd)
{
	u8 i=0;
	IIC_SDA_OUT_MODE();//输出模式
	for(i=0;i<8;i++)
	{
		IIC_SCL(0);
		if(txd&0X80)IIC_SDA_OUT(1);
		else IIC_SDA_OUT(1);
		DelayUs(2);
		IIC_SCL(1);
		DelayUs(2);
		txd<<=1;
	}
	IIC_SCL(0);;//时钟线拉低,准备下一次数据收发
}

??获取应答信号和读取数据
??时钟上升沿读取数据,下降发送数据。

/***************检测应答信号********************
**
**返回值:1,接收应答失败
					0,接收应答成功
************************************************/
u8 IIC_Check_ACK(void)
{
	u8 i=0;
	IIC_SDA_IN_MODE();//输入模式
	IIC_SDA_OUT(1);
	IIC_SCL(0);
	DelayUs(2);
	IIC_SCL(1);
	while(IIC_SDA_IN)
	{
		i++;
		if(i>=255)return 1;//非应答
	}
	IIC_SCL(0);
	return 0;//应答
}
/**********************接收1字节数据****************/
u8 IIC_ReadByte(void)
{
	u8 i=0;
	u8 rxd=0;
	IIC_SDA_IN_MODE();//输入模式
	for(i=0;i<8;i++)
	{
		IIC_SCL(0);
		DelayUs(2);
		IIC_SCL(1);
		rxd<<=1;
		if(IIC_SDA_IN)rxd|=0x01;
		DelayUs(2);
		
	}
	IIC_SCL(1);
	return rxd;
}

3.软件实现

??1.通过手势实现时间切换、日期切换等;
??2.利用手势实现LED控制、蜂鸣器控制;
??3.实时时间校准,可通过串口校时;

3.1 串口校时

??通过自定义串口协议,通过串口调试助手获取PC端时间,完成RTC时间校准;发送数据格式为:*20220617121220
??以 *作为起始标志,4字节年+2字节月+2字节日+2字节时+2字节分+2字节秒,字符串方式接收数据处理

  if(usart1_flag)
  {
    printf("%s\r\n",usart1_buff_rx);
    if(usart1_buff_rx[0]== '*')
    {
      DateToUpdate.Year=(usart1_buff_rx[3]-'0')*10+(usart1_buff_rx[4]-'0')*1;//年
      DateToUpdate.Month=(usart1_buff_rx[5]-'0')*10+(usart1_buff_rx[6]-'0')*1;//月
      DateToUpdate.Date=(usart1_buff_rx[7]-'0')*10+(usart1_buff_rx[8]-'0')*1;//日

      sTime.Hours=(usart1_buff_rx[9]-'0')*10+(usart1_buff_rx[10]-'0')*1;
      sTime.Minutes=(usart1_buff_rx[11]-'0')*10+(usart1_buff_rx[12]-'0')*1;
      sTime.Seconds=(usart1_buff_rx[13]-'0')*10+(usart1_buff_rx[14]-'0')*1;
      printf("time:%d/%d/%d -- %d:%d:%d\r\n",DateToUpdate.Year,DateToUpdate.Month,DateToUpdate.Date,sTime.Hours,sTime.Minutes,sTime.Seconds);
      HAL_RTC_SetDate(&hrtc, &DateToUpdate,RTC_FORMAT_BIN);
      HAL_RTC_SetTime(&hrtc,&sTime,RTC_FORMAT_BIN);       
    }
    usart1_flag=0;
    usart1_count=0;
  }   

3.2 LED呼吸灯

??呼吸灯通过定时器PWM模式实现;设置定时器分频系数为72,周期时间为300us;

  TIM_ClockConfigTypeDef sClockSourceConfig = {0};
  TIM_MasterConfigTypeDef sMasterConfig = {0};
  TIM_OC_InitTypeDef sConfigOC = {0};

  /* USER CODE BEGIN TIM4_Init 1 */

  /* USER CODE END TIM4_Init 1 */
  htim4.Instance = TIM4;
  htim4.Init.Prescaler = 72;
  htim4.Init.CounterMode = TIM_COUNTERMODE_UP;
  htim4.Init.Period = 300;
  htim4.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
  htim4.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_ENABLE;

??通过改变PWM波占空比来实现呼吸灯效果;

  if(flag==0)j++;
  else j--;
  if(j>=300)flag=1;
  if(j==0)flag=0;
  Delay_Ms(2);
  htim4.Instance->CCR3=j;//调节占空比
  htim4.Instance->CCR4=j;

3.3 手势识别检测

??PAJ7620支持上、下、左、右、前、后、顺时针旋转、逆时针旋转和挥动的手势动作识别。用户可根据 I2C 接口对原始数据和手势识别的结果进行读取。

paj7620u2_selectBank(BANK0);//切换BANK0寄存器区域
status = GS_Read_nByte(PAJ_GET_INT_FLAG1,2,&data[0]);//读取手势状态
if(!status)
{
	gesture_data =(u16)data[1]<<8 | data[0];
	if(gesture_data) 
	{
		switch(gesture_data)
		{
			case GES_UP:  //向上  		
				printf("向上 Up\r\n"); 
          		HAL_GPIO_WritePin(BEEP_GPIO_Port,BEEP_Pin, GPIO_PIN_RESET);//关闭蜂鸣器        
				ledflash=1;     
				break; 
			case GES_DOWM:  //向下
          		HAL_GPIO_WritePin(BEEP_GPIO_Port,BEEP_Pin, GPIO_PIN_SET);//开启蜂鸣器
				printf("向下 Dowm\r\n");          
				ledflash=1;      
				break; 
			case GES_LEFT: //向左 		
	          	if(rtc_stat==0)
	            {
	              rtc_stat=3;
	            }
	            else rtc_stat--;
            	printf("rtc_stat=%d\n",rtc_stat);
				printf("向左 Left\r\n");          
				ledflash=1;      
				break; 
			case GES_RIGHT:  //向右	
	            if(rtc_stat==4)
	            {
	              rtc_stat=0;
	            }
	            else rtc_stat++;						      
				printf("向右 Right\r\n");      
				ledflash=1;      
				break; 
			case GES_FORWARD:  //向前							     
				printf("向前 Forward\r\n");       
				ledflash=1;     
				break; 
			case GES_BACKWARD: //向后 		       
				printf("向后 Backward\r\n");     
				ledflash=1;     
				break; 
			case GES_CLOCKWISE:   //顺时针							
				printf("顺时针 Clockwise\r\n");     
				ledflash=1;     
				break;
			case GES_COUNT_CLOCKWISE:  //逆时针 			
				printf("逆时针 AntiClockwise\r\n"); 
				ledflash=1;      
				break; 
			case GES_WAVE: 											
				printf("挥动 Wave\r\n");          
				ledflash=1;     
				break; //挥动
			default:  ledflash=0; break;
		}
	}
}

在这里插入图片描述

  嵌入式 最新文章
基于高精度单片机开发红外测温仪方案
89C51单片机与DAC0832
基于51单片机宠物自动投料喂食器控制系统仿
《痞子衡嵌入式半月刊》 第 68 期
多思计组实验实验七 简单模型机实验
CSC7720
启明智显分享| ESP32学习笔记参考--PWM(脉冲
STM32初探
STM32 总结
【STM32】CubeMX例程四---定时器中断(附工
上一篇文章      下一篇文章      查看所有文章
加:2022-06-18 23:30:55  更:2022-06-18 23:31:36 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 0:50:17-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码