STM32驱动PAJ7620手势识别传感器

请添加图片描述

点击图片购买

传感器简介

PAJ-7620U2是由原相科技公司开发的一款手势识别芯片, 内集成了光学数组式传感器单元,可以快速准确的对输入信号进行感应和输出处理。内置光源和环境光抑制滤波器,能在黑暗或低光环境下工作。它支持上、下、左、右、前、后、顺时针旋转、逆时针旋转和挥动的手势动作识别,以及支持物体接近检测等功能。可大致检测物体体积大小和亮度。使用IIC通信接口可达400KHz通信速率。
传感器内部自带 LED 驱动器,传感器感应阵列、目标信息提取阵列和手势识别阵列。传感器工作时通过内部 LED 驱动器,驱动红外 LED 向外发射红外线信号,当传感器阵列在有效的距离中探测到物体时,目标信息提取阵列会对探测目标进行特征原始数据的获取,获取的数据被保存在寄存器中,同时手势识别阵列会对原始数据进行识别处理,最后将手势结果存到寄存器中,用户可根据 I2C 接口对原始数据和手势识别的结果进行读取。
功能框图

模块原理图

在这里插入图片描述

VIN供电输入3.3-5V,GND供电负极,SDA数据线,SCL时钟线,INT中断输出

手势方向定义
在这里插入图片描述

STM32F407ZGT6开发板与传感器连接

STM32开发板 手势传感器模块
GND GND
5V VIN
PB11 SDA
PB10 SCL
在这里插入图片描述  

代码片

手势传感器获取感应信息,将结果通过开发版 usart1 串口输给串口调试助手程序显示出来。
在 main 函数中,首先对 USART 串口与 KEY 按键进行初始化配置。然后对传感器paj7620u2 进行初始化配置。当对传感器初始化成功后则退出 while 循环,进入第 21 行paj7620u2 传感器功能测试阶段。

int main(void)
{		
  /*初始化USART 配置模式为 115200 8-N-1,中断接收*/
  Debug_USART_Config();
  EXTI_Key_Config(); 
  
  printf(" 欢迎使用野火开发板\r\n");
  printf(" 手势识别传感器实验\r\n");
  
  while(!paj7620u2_init())  //PAJ7620U2传感器初始化
	{
	  printf("PAJ7620U2 初始化失败!!!\r\n");
	  delay_ms(600);	
	}
    printf("PAJ7620U2 初始化成功\r\n");
  while(1)
	{
		paj7620u2_sensor_test();//PAJ7620U2传感器测试
	}	
 }

在 test 函数中,第 12 行使用 scanf 函数,使开发板获取来自串口调试助手发出的控制指令。当开发板接收到的指令字符为“1”时,开发板控制传感器进入手势识别工作模式;当接收到的指令字符为“2”时,开发板控制传感器进入接近检测工作模式;当接收的字符既不是“1”也不是“2”时,则打印提示用户输入合法指令。

/**
  * @brief  PAJ7620U2传感器测试
  * @param  无
  * @retval 无
  */
void paj7620u2_sensor_test(void)
{   
	uint32_t   ch;
  
	Show_Mode_Message();//显示普通测量模式UI
	while(1)
	{
		scanf("%d",&ch);
    printf("接收到字符:%d\r\n",ch);

		switch(ch)
		{
			case 1:  Gesrure_test();                    break;//手势检测模式
			case 2:  Ps_test();                         break;//接近检测模式 
      default: printf("请输入合法指令!\r\n");     break;
		}
		Show_Mode_Message();
	} 
}

手势识别传感器可以工作在手势识别与接近检测 2 种模式状态下。为了进行工作模式
的切换,我们采用了 KEY 按钮外部中端的方式。

  1. KEY 外部中断
    当我们想退出当前的工作模式时,可通过按住 key1 按钮,激发产生 EXTI 中断响应。在 IRQHandler 中断处理函数中,(第 9 行)当接受到中断信号时,变量 flag 赋值为 1。
    中断代码如下
void KEY1_IRQHandler(void)
{
  //确保是否产生了EXTI Line中断
	if(EXTI_GetITStatus(KEY1_INT_EXTI_LINE) != RESET) 
	{
	    flag=1;
    //清除中断标志位
		EXTI_ClearITPendingBit(KEY1_INT_EXTI_LINE);     
	}  
}
  1. 手势识别工作模式
    在 Gesrure_test()函数中,首先对 PAJ7620U2 手势识别检测进行初始化,(第 14 行代码)配置其 gesture_arry 数组的参数值。该数组有使能 9 个手势识别的中断标志输出的配置,初始化完毕后,在 while 循环中一直读取手势中断标志寄存器(第 26 行代码),当识别到相应的手势,手势标志会置 1,读取寄存器标志会自动清 0。根据手势的标志手势结果将被打印到串口上。当按下 KEY 按键,在中断处理函数中标志变量 flag 被赋值 1(第 20 行代码),此时关闭 9 个手势识别的检测输出,退出当前的手势识别测试模式。
/**
  * @brief  手势识别测试
  * @param  无
  * @retval 无
  */
void Gesrure_test(void)
{
  uint8_t status,i;
	uint8_t data[2]={0x00};
	uint16_t gesture_data;

	paj7620u2_selectBank(BANK0);//进入BANK0
	for(i=0;i<GESTURE_SIZE;i++)
	{
		GS_Write_Byte(gesture_arry[i][0],gesture_arry[i][1]);//手势识别模式初始化
	}
	paj7620u2_selectBank(BANK0);//切换回BANK0
  printf("按KEY1键退出当前模式\r\n");
	
	while(1)
	{       
		if(flag)
		{
      flag=0;
			GS_Write_Byte(PAJ_SET_INT_FLAG1,0X00);//关闭手势识别中断输出
			GS_Write_Byte(PAJ_SET_INT_FLAG2,0X00);
			break;
		}			
    status = GS_Read_nByte(PAJ_GET_INT_FLAG1,2,&data[0]);//读取手势状态			
		if(!status)
		{   
			gesture_data =(uint16_t)data[1]<<8 | data[0];
			if(gesture_data) 
			{
				switch(gesture_data)
				{
					case GES_UP:              
					                           printf("Up\r\n");                break; //向上
					case GES_DOWM:                 
               						           printf("Dowm\r\n");              break; //向下
					case GES_LEFT:                     
  						                       printf("Left\r\n");              break; //向左
					case GES_RIGHT:                  
                						         printf("Right\r\n");             break; //向右
					case GES_FORWARD:                 
						                         printf("Forward\r\n");           break; //向前
					case GES_BACKWARD:           
            						             printf("Backward\r\n");          break; //向后
					case GES_CLOCKWISE:         
                						         printf("Clockwise\r\n");         break; //顺时针
					case GES_COUNT_CLOCKWISE:  
                   						       printf("AntiClockwise\r\n");     break; //逆时针
					case GES_WAVE:               
						                         printf("Wave\r\n");              break; //挥动
					default:  break;	
				}	          
			}	
		}		   
	}
}
  1. 接近检测测试
    Ps_test()函数实现接近检测,获取接近物体的体积大小和亮度的数据。首先对PAJ7620U2 接近检测进行初始化,配置其 proximity_arry 的数组参数值(第 16 行代码),初始化完成后,在 while(1)循环中,读取获取体积大小和亮度的寄存器,并将读取结果打印到串口上。当按下 KEY 按键,在中断处理函数中标志变量 flag 被赋值 1(第 23 行代码),退出当前的接近检测测试模式。
/**
  * @brief  接近检测测试
  * @param  无
  * @retval 无
  */
void Ps_test(void)
{
  
  uint8_t i;
	uint8_t data[2]={0x00};
	uint8_t obj_brightness=0;
	uint16_t obj_size=0;
	
	paj7620u2_selectBank(BANK0);//进入BANK0
	for(i=0;i<PROXIM_SIZE;i++)
	{
		GS_Write_Byte(proximity_arry[i][0],proximity_arry[i][1]);//接近检测模式初始化
	}
	paj7620u2_selectBank(BANK0);//切换回BANK0
	printf("按KEY1键退出当前模式\r\n");
	
	while(1)
	{	
		if(flag) 
    {
      flag=0;
      break;
    }
		obj_brightness = GS_Read_Byte(PAJ_GET_OBJECT_BRIGHTNESS);//读取物体亮度
		data[0] = GS_Read_Byte(PAJ_GET_OBJECT_SIZE_1);//读取物体大小
		data[1] = GS_Read_Byte(PAJ_GET_OBJECT_SIZE_2);
		obj_size = ((uint16_t)data[1] & 0x0f)<<8 | data[0];
		printf("obj_brightness: %d\r\n",obj_brightness);
    printf("obj_size: %d\r\n",obj_size);
	
		delay_ms(500);	
	}	
}

在这里插入图片描述
在这里插入图片描述

总结

本实验可以通过挥舞手势直观的了解传感器的手势识别的基本功能以及接近检测的功能。

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

热门文章

收藏
浏览量:0
创建时间:2022-06-10 15:12