原相科技公司的 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);
}
}
2.手势识别事情模式在 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;
}
}
}
}
}
3.靠近检测测试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);
}
}
总结
本实验可以通过摆荡手势直不雅观的理解传感器的手势识别的基本功能以及靠近检测的功能。