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

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

手势传感器获取感应信息,将结果通过开发版 usart1 串口输给串口调试助手程序显示出来。
在 main 函数中,首先对 USART 串口与 KEY 按键进行初始化配置。然后对传感器paj7620u2 进行初始化配置。当对传感器初始化成功后则退出 while 循环,进入第 21 行paj7620u2 传感器功能测试阶段。
int main(void)
{
/*初始化USART 配置模式为 115200 8-N-1,中断接收*/
Debug_USART_Config();
EXTI_Key_Config();
printf(" 欢迎使用野火开发板rn");
printf(" 手势识别传感器实验rn");
while(!paj7620u2_init()) //PAJ7620U2传感器初始化
{
printf("PAJ7620U2 初始化失败!!!rn");
delay_ms(600);
}
printf("PAJ7620U2 初始化成功rn");
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("接收到字符:%drn",ch);
switch(ch)
{
case 1: Gesrure_test(); break;//手势检测模式
case 2: Ps_test(); break;//接近检测模式
default: printf("请输入合法指令!rn"); break;
}
Show_Mode_Message();
}
}
手势识别传感器可以工作在手势识别与接近检测 2 种模式状态下。为了进行工作模式
的切换,我们采用了 KEY 按钮外部中端的方式。
void KEY1_IRQHandler(void)
{
//确保是否产生了EXTI Line中断
if(EXTI_GetITStatus(KEY1_INT_EXTI_LINE) != RESET)
{
flag=1;
//清除中断标志位
EXTI_ClearITPendingBit(KEY1_INT_EXTI_LINE);
}
}
/**
* @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键退出当前模式rn");
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("Uprn"); break; //向上
case GES_DOWM:
printf("Dowmrn"); break; //向下
case GES_LEFT:
printf("Leftrn"); break; //向左
case GES_RIGHT:
printf("Rightrn"); break; //向右
case GES_FORWARD:
printf("Forwardrn"); break; //向前
case GES_BACKWARD:
printf("Backwardrn"); break; //向后
case GES_CLOCKWISE:
printf("Clockwisern"); break; //顺时针
case GES_COUNT_CLOCKWISE:
printf("AntiClockwisern"); break; //逆时针
case GES_WAVE:
printf("Wavern"); break; //挥动
default: break;
}
}
}
}
}
/**
* @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键退出当前模式rn");
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: %drn",obj_brightness);
printf("obj_size: %drn",obj_size);
delay_ms(500);
}
}


本实验可以通过挥舞手势直观的了解传感器的手势识别的基本功能以及接近检测的功能。
审核编辑 黄宇
全部0条评论
快来发表一下你的评论吧 !