驱动PAJ7620U2手势传感器
PAJ7620U2简介
PAJ7620U2是一款由台湾省的原相科技(PixArt)生产的手势识别传感器。它由手势辨识传感器、LED和镜头组合而成的小尺寸模组组成,并且内置的红外LED和光学镜头,可以在低光和黑暗环境下工作,它有两种不同的工作模式,分别是「手势模式」或「游标模式」。工作在手势模式:识别9种不同的手势,工作在:游标模式:可输出追踪物体的位置、尺寸和亮度的实时数据。本次我们需要使用的就是手势模式。
手势模式可以识别包括上、下、左、右、前、后、顺时针、逆时针、摇摆在内的9种基本手势,PAJ7620U2使用I2C接口与MCU通信,通信速度可达400kHz,工作距离最多可达20公分。
PAJ7620U2驱动获取
从上文的介绍中得知了PAJ7620U2的生产商,所以获取PAJ7620U2资料最好的途径常常是该原厂的官网,****如下:
https://www.pixart.com/products-detail/cn/37/PAJ7620U2
打开后,会发现没有地方下载规格书等任何信息,点击支援中心,会发现要登录账号,如下图。
其实原相科技一直都是这样的以前在调试一款原相科技生产的心率传感器(PAH8009ES)想要一份规格书 和 驱动,千辛万苦找到原厂深圳办公室得知,资料可以给但是要签NDA,非常费劲!所以这一次要通过别的路径去获取资料了!
最简单,也是最有效的方法就是:淘宝!!
随便找一家有售卖PAJ7620U2模块的商家,简介中可以非常容易的获得驱动 与 相关的规格书!资料收集完毕后,就开始调试了
I2C驱动
Cube mx配置
随意选择一组I2C口,初始化后,使用杜邦线连接模块即可。
以上就完成了I2C初始化!
测试代码
# define ADDR 0x2C uint8_t cmd[3]={0x01,0x02,0x03}; HAL_I2C_Master_Transmit(&hi2c1,ADDR,(uint8_t *)cmd,3,100);
在I2C初始化后,添加以上的代码就可以测试I2C初始化正常与否。
引脚确认
上文可知P6B、PB7分别是I2C的SCL 与 SDA,两引脚在开发板上的具体位置如下图
电源正负极,直接直接接到3V3 和 GND即可
实验发现
Cube Mx默认把I2C的IO配置为开漏、悬空、低速模式,这样会在外围没有上拉的情况下根本采集不到I2C的波形(开发板上因为不清楚你会把这IO作为什么功能使用所以没有,外接模块的话要取决于你的模块,我习惯先使用逻辑分析仪确认初始化成功与否,所以在默认的情况下根本捕捉不到正确波形,进而才发现这里!)
将IO配置为下图的模式(推挽、上拉、高速)后,逻辑分析仪就可以正确捕获波形了
如图,初始化成功后,发送了从机地址0X2C,但是没有应答就结束了(我没接从机,只接了逻辑分析仪),所以波形是正确的!
驱动移植
驱动流程理解
这个传感器驱动起来比较简单。
一、上电后配置通电顺序
发送Init_Register_Array[][2]
二、配置Bank
两个不同的模式下有些寄存器会共用,为了区分开要配置不同的Bank,同理配置为手势模式。
往0xEF寄存器,写0
三、配置工作模式
上文我们提到这个传感器有两个不同的模式手势模式 和 游标模式。工作模式取决于传感器初始化配置的参数,分别为以下两个数组二维数组名:
1、Init_Gesture_Array[][2] 手势模式
2、Init_PS_Array[][2] 游标模式
所以在上电进行初始化的时候把Init_Register_Array的数据发送出去,就可以了。
四、读取手势
之后就可以向0x43读取两个字节的,手势码来区分手势即可。
手势代码如下:
#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
按照以上的流程就可以初始化并驱动传感器了!
测试实验
int main(void) { 。 。 。 MX_GPIO_Init(); MX_USART3_UART_Init(); MX_I2C1_Init(); MX_ICACHE_Init(); uint8_t str[] = "Hello EEPW & DigKey! Hello STM32H503!\r\n"; HAL_UART_Transmit(&huart3,(uint8_t*)str,sizeof(str)-1,1000); paj7620u2_updata(); while (1) { get_paj7620u2_state(); HAL_GPIO_TogglePin(LED_GPIO_Port, LED_Pin); HAL_Delay(500); } }
测试成果
GIF效果