本次实用的是PAJ7620U2 手势传感器 Grove 平台评估扩展板,如下图:
PAJ7620一款光学数组式传感器,内置光源和环境光抑制滤波器集成的 LED,镜头和手势感测器在一个小的立方体模组,能在黑暗或低光环境下工作。同时传感器内置手势识别,支持 9个手势类型和输出的手势中断和结果,还提供接近检测功能,可用于感测物体接近或离开。工作原理是通过内部LED驱动器,驱动红外LED向外发射红外信号,当传感器阵列在有效地距离中探测到物体时,目标信息提取阵列会对探测目标进行特征原始数据地获取,获取数据会存在寄存器中,同时手势识别阵列会对原始数据进行识别处理,最后将手势结果存到寄存器中,用户可根据I2C接口对原始数据和手势数据地结果进行读取。
其中I2C_SCL和 I2C_SDA是连接 MCU的 IIC接口, 本模块没有INT引脚。
在PAJ7620内部有两个BANK 寄存器区域,分别是BANK0,BANK1。进入BANK0区域,往传感器0XEF地址写0X00。进入BANK1区域,往传感器0XEF地址写0x01。这方面的驱动文件还是通多的,这里我们通过改写其中一个驱动文件进行传感器的驱动。
在初始化部分对器件进行基本配置:
IIC1_port_Init(); /* 初始化PAJ7620模块 */ ret = PAJ7620_init(); if (ret != 0) { printf("PAJ7620 init failed!\r\n"); while (1) { HAL_GPIO_TogglePin(GPIOA, GPIO_PIN_5); delay_ms(1000); } } /* 配置ATK-MS7620模块为手势检测模式 */ ret = PAJ7620_mode_config(PAJ7620_MODE_GESTURE); if (ret != 0) { printf("PAJ7620 config failed!\r\n"); while (1) { HAL_GPIO_TogglePin(GPIOA, GPIO_PIN_5); delay_ms(1000); } } printf("PAJ7620 config succedded!\r\n");
在tx_app_thread_entry()中添加定时轮询检测程序:
time_cnt++; if(time_cnt >= 200) { time_cnt = 0; /* 获取手势 */ ret = PAJ7620_get_gesture(&gesture); if (ret == PAJ7620_EOK) { switch (gesture) { case PAJ7620_GESTURE_UP: { printf("Gesture: Up\r\n"); break; } case PAJ7620_GESTURE_DOWN: { printf("Gesture: Down\r\n"); break; } case PAJ7620_GESTURE_LEFT: { printf("Gesture: Left\r\n"); break; } case PAJ7620_GESTURE_RIGHT: { printf("Gesture: Right\r\n"); break; } case PAJ7620_GESTURE_FORWARD: { printf("Gesture: Forward\r\n"); break; } case PAJ7620_GESTURE_BACKWARD: { printf("Gesture: Backward\r\n"); break; } case PAJ7620_GESTURE_CLOCKWISE: { printf("Gesture: Clockwise\r\n"); break; } case PAJ7620_GESTURE_ANTICLOCKWISE: { printf("Gesture: Anticlockwise\r\n"); break; } case PAJ7620_GESTURE_WAVE: { printf("Gesture: Wave\r\n"); break; } default: { break; } } }
下面我们就进行具体功能的测试,检测到对应的手势后通过串口进行报告: