一、PAJ7620手势传感器
PAJ-7620U2是由原相科技公司开发的一款手势识别芯片,内部集成了光学数组式传感器单元,可以快速准确的对输入信号进行感应和输出处理。内置光源和环境光抑制滤波器,能在黑暗或低光环境下工作。它支持上、下、左、右、前、后、顺时针旋转、逆时针旋转和挥动的手势动作识别,以及支持物体接近检测等功能。可大致检测物体体积大小和亮度。使用IIC通信接口可达400KHz通信速率。
传感器内部自带 LED 驱动器,传感器感应阵列、目标信息提取阵列和手势识别阵列。传感器工作时通过内部 LED 驱动器,驱动红外 LED 向外发射红外线信号,当传感器阵列在有效的距离中探测到物体时,目标信息提取阵列会对探测目标进行特征原始数据的获取,获取的数据被保存在寄存器中,同时手势识别阵列会对原始数据进行识别处理,最后将手势结果存到寄存器中,用户可根据 I2C 接口对原始数据和手势识别的结果进行读取。
模块示意图,其引出的引脚有供电VCC、GND引脚,IIC通信引脚
二、CubeMX配置
开发板与手势传感器的通信方式为IIC,这里使用芯片自带的硬件IIC进行通信。将手势传感器的SDA引脚连接至开发板PB10引脚,SCL引脚连接至PC8引脚。
三、程序设计
从手势传感器读取数据的方式是通过IIC发送指定的读取数据指令,再从IIC总线总线上读取返回的手势数据。
关键代码:
#define PAJ7620U2_I2C_ADDRESS 0x73<<1 /*paj7620的i2c地址,左移一位后为左对齐七位地址*/ #define PAJ_BANK_SELECT 0xEF /*寄存器页选择寄存器,Bank0=0x00,Bank1=0x01*/ #define PAJ_INT_FLAG1 0x43 /*检测结果数据低八位数据所在地址*/ #define PAJ_INT_FLAG2 0x44 /*检测结果数据高八位数据所在地址*/ //Gesture detection interrupt flag #define PAJ_UP 0x01 #define PAJ_DOWN 0x02 #define PAJ_LEFT 0x04 #define PAJ_RIGHT 0x08 #define PAJ_FORWARD 0x10 #define PAJ_BACKWARD 0x20 #define PAJ_CLOCKWISE 0x40 #define PAJ_COUNT_CLOCKWISE 0x80 #define PAJ_WAVE 0x100
//初始化,返回0则初始化失败 uint8_t PAJ7620U2_init(void) { uint8_t i,State,n; State = 0; while(HAL_OK != HAL_I2C_Mem_Write(&hi2c1,PAJ7620U2_I2C_ADDRESS,0xef,I2C_MEMADD_SIZE_8BIT,&State,1,500)){HAL_Delay(10);printf("1");} for (i=0;i< 219 ;i++) { while(HAL_OK != HAL_I2C_Mem_Write(&hi2c1,PAJ7620U2_I2C_ADDRESS,Init_Register_Array[i][0],I2C_MEMADD_SIZE_8BIT,&Init_Register_Array[i][1],1,500)){HAL_Delay(5);printf("2");} HAL_Delay(5); } while(HAL_OK != HAL_I2C_Mem_Write(&hi2c1,PAJ7620U2_I2C_ADDRESS,0xef,I2C_MEMADD_SIZE_8BIT,&State,1,500)){HAL_Delay(5);printf("3");} HAL_Delay(5); while (HAL_OK != HAL_I2C_Mem_Read(&hi2c1,PAJ7620U2_I2C_ADDRESS,0x32,I2C_MEMADD_SIZE_8BIT,&n,1,500)){HAL_Delay(5);printf("4");} if(n != 0x29) { return 0; } return 1; } //检测手势并输出 void gesture(void) { uint8_t Data[2]={0,0}; uint16_t Gesture_Data; HAL_I2C_Mem_Read(&hi2c1,PAJ7620U2_I2C_ADDRESS,PAJ_INT_FLAG1,I2C_MEMADD_SIZE_8BIT,&Data[0],1,500); HAL_Delay(5); HAL_I2C_Mem_Read(&hi2c1,PAJ7620U2_I2C_ADDRESS,PAJ_INT_FLAG2,I2C_MEMADD_SIZE_8BIT,&Data[1],1,500); HAL_Delay(5); Gesture_Data= Data[1]<<8 | Data[0]; printf("\n %x \r\n",Gesture_Data); if(Gesture_Data !=0) { switch (Gesture_Data) { case PAJ_UP: printf("Up\r\n"); break; case PAJ_DOWN: printf("Down\r\n"); break; case PAJ_LEFT: printf("Left\r\n"); break; case PAJ_RIGHT: printf("Right\r\n"); break; case PAJ_FORWARD: printf("Forward\r\n"); break; case PAJ_BACKWARD: printf("Backward\r\n"); break; case PAJ_CLOCKWISE: printf("Clockwise\r\n"); break; case PAJ_COUNT_CLOCKWISE: printf("AntiClockwise\r\n");break; case PAJ_WAVE: printf("Wave\r\n"); break; default: break; } Gesture_Data=0; } }
四、运行结果
实际测试过程中,只有上下左右、前后六个手势相对容易识别出来,其他的手势不太好识别。