atk-paj7620手势传感器驱动

ATK-PAJ7620是一款高性能手势识别传感器模块。该模块采用原相科技(Pixart)公司的 PAJ7620U2
芯片,芯片内部集成了光学数组式传感器,以使复杂的手势和光标模式输出,自带九种手势
识别,支持上、下、左、右、前、后、顺时针旋转、逆时针旋转和挥动的手势动作识别,以
及支持物体接近检测等功能

在这里插入图片描述
代码示例

//手势传感器读取函数
//参数 手势结果
/*
#define GES_UP              BIT(0) //向上
#define GES_DOWM            BIT(1) //向下
#define GES_LEFT            BIT(2) //向左
#define GES_RIGHT           BIT(3) //向右
#define GES_FORWARD         BIT(4) //向前
#define GES_BACKWARD        BIT(5) //向后
#define GES_CLOCKWISE       BIT(6) //顺时针
#define GES_COUNT_CLOCKWISE BIT(7) //逆时针
#define GES_WAVE            BIT(8) //挥动
*/
//返回 0
//定义硬件接口
int pja7620(unsigned char *ges)
{
	static char state = 0;
	unsigned char tmp = 0;

	if(state == 0)
	{
			tmp = paj7620u2_init();
			if(tmp)
				state = 1;
	}
	
	Gesture_test(ges);
	
	return 0;
}


用法,用到i2c,和oled共用一个

unsigned char ges;
pja7620(&ges);

paj7620u2.c

#include "paj7620u2.h"
#include "paj7620u2_cfg.h"
#include "delay.h"
#include "i2c.h"

#define u8 unsigned char
#define u16 unsigned short
	
u8 GS_Write_Byte(u8 REG_Address,u8 REG_data)
{
		i2c_1_write(0x73, 1, REG_Address, &REG_data, 1);
}

u8 GS_Read_Byte(u8 REG_Address)
{
		unsigned char tmp = 0;
		i2c_1_read(0x73, 1, REG_Address, &tmp, 1);
	
		return tmp;
}

u8 GS_Read_nByte(u8 REG_Address,u16 len,u8 *buf)
{
		unsigned char tmp = 0,ret = 0;
	
		ret  = i2c_1_read(0x73, 1, REG_Address, buf, len);
		if(ret) return 0;
		else return 1;
}

void GS_i2c_init(void)
{
	i2c_Init(I2C1,U32BIT( GPIO_12),U32BIT( GPIO_13));
}


//PAJ7620唤醒
void GS_WakeUp(void)
{
	i2c_1_write(0x73, 0, 0, 0, 0);
}

//选择PAJ7620U2 BANK区域
void paj7620u2_selectBank(bank_e bank)
{
	switch(bank)
	{
		case BANK0: GS_Write_Byte(PAJ_REGITER_BANK_SEL,PAJ_BANK0);break;//BANK0寄存器区域
		case BANK1: GS_Write_Byte(PAJ_REGITER_BANK_SEL,PAJ_BANK1);break;//BANK1寄存器区域
	}
			
}

//PAJ7620U2唤醒
u8 paj7620u2_wakeup(void)
{ 
	u8 data=0x0a;
	GS_WakeUp();//唤醒PAJ7620U2
	delay_ms(5);//唤醒时间>400us
	GS_WakeUp();//唤醒PAJ7620U2
	delay_ms(5);//唤醒时间>400us
	paj7620u2_selectBank(BANK0);//进入BANK0寄存器区域
	data = GS_Read_Byte(0x00);//读取状态
	if(data!=0x20) return 0; //唤醒失败
	
	return 1;
}

//PAJ7620U2初始化
//返回值:0:失败 1:成功
u8 paj7620u2_init(void)
{
	u8 i;
	u8 status;
	
	GS_i2c_init();//IIC初始化
    status = paj7620u2_wakeup();//唤醒PAJ7620U2
	if(!status) return 0;
	paj7620u2_selectBank(BANK0);//进入BANK0寄存器区域
	for(i=0;i<INIT_SIZE;i++)
	{
		GS_Write_Byte(init_Array[i][0],init_Array[i][1]);//初始化PAJ7620U2
	}
    paj7620u2_selectBank(BANK0);//切换回BANK0寄存器区域
	
	return 1;
}



//手势识别测试
u8 Gesture_test(u8 *ges)
{
	u8 i;
    u8 status;
	u8 data[2]={0x00};
	u16 gesture_data;
	static u8 state = 0;
	
	if(state == 0)
	{
		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寄存器区域
		state = 1;
	}
	else
	{
			status = GS_Read_nByte(PAJ_GET_INT_FLAG1,2,&data[0]);//读取手势状态			
			if(!status)
			{   
				gesture_data =(u16)data[1]<<8 | data[0];
				if(gesture_data) 
					*ges = gesture_data;
			}
	}
	return 0;
}

//接近检测测试
u8 Ps_test(u8 *brightness, u16 *size)
{
    u8 i;
	u8 data[2]={0x00};
	u8 obj_brightness=0;
	u16 obj_size=0;
	static u8 state = 0;
	
	if(state == 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寄存器区域
	}
	else
	{	
		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 = ((u16)data[1] & 0x0f)<<8 | data[0];
	}
	
	return 0;
}




paj7620u2.h

#ifndef __PAJ7620U2_H
#define __PAJ7620U2_H

///#include "paj7620u2_iic.h"
#define u8 unsigned char
#define u16 unsigned short

//BANK寄存器枚举
typedef enum{
	BANK0 = 0, //BANK0寄存器
	BANK1,     //BANK1寄存器
}bank_e;

#define PAJ7620_ID           0x73<<1 //设备地址
#define PAJ_REGITER_BANK_SEL 0XEF    //BANK选择寄存器
#define PAJ_BANK0            0X00    //BANK0
#define PAJ_BANK1            0X01    //BANK1

//BANK0 寄存器组
#define PAJ_SUSPEND_CMD            0X03 //设置设备挂起
#define PAJ_SET_INT_FLAG1          0X41 //设置手势检测中断寄存器1
#define PAJ_SET_INT_FLAG2          0X42 //设置手势检测中断寄存器2
#define PAJ_GET_INT_FLAG1          0X43 //获取手势检测中断标志寄存器1(获取手势结果)
#define PAJ_GET_INT_FLAG2          0X44 //获取手势检测中断标志寄存器2(获取手势结果)
#define PAJ_GET_STATE              0X45 //获取手势检测工作状态
#define PAJ_SET_HIGH_THRESHOLD     0x69 //设置滞后高阀值(仅在接近检测模式下)
#define PAJ_SET_LOW_THRESEHOLD     0X6A //设置滞后低阀值
#define PAJ_GET_APPROACH_STATE     0X6B //获取接近状态 (1:PS data>= PS threshold ,0:PS data<= Low threshold)
#define PAJ_GET_GESTURE_DATA       0X6C //获取接近数据
#define PAJ_GET_OBJECT_BRIGHTNESS  0XB0 //获取被照物体亮度(最大255)
#define PAJ_GET_OBJECT_SIZE_1      0XB1 //获取被照物体大小低八位(bit7:0)(最大900)
#define PAJ_GET_OBJECT_SIZE_2      0XB2 //获取被照物体大小高四位(bit3:0)

//BANK1 寄存器组
#define PAJ_SET_PS_GAIN         0X44 //设置检测增益大小 (0:1x gain 1:2x gain)
#define PAJ_SET_IDLE_S1_STEP_0  0x67 //设置S1的响应因子
#define PAJ_SET_IDLE_S1_STEP_1  0x68 
#define PAJ_SET_IDLE_S2_STEP_0  0X69 //设置S2的响应因子
#define PAJ_SET_IDLE_S2_STEP_1  0X6A 
#define PAJ_SET_OP_TO_S1_STEP_0 0X6B //设置OP到S1的过度时间
#define PAJ_SET_OP_TO_S1_STEP_1 0X6C
#define PAJ_SET_S1_TO_S2_STEP_0 0X6D //设置S1到S2的过度时间
#define PAJ_SET_S1_TO_S2_STEP_1 0X6E
#define PAJ_OPERATION_ENABLE    0X72 //设置PAJ7620U2使能寄存器

//手势识别效果
#define BIT(x) 1<<(x)

#define GES_UP              BIT(0) //向上
#define GES_DOWM            BIT(1) //向下
#define GES_LEFT            BIT(2) //向左
#define GES_RIGHT           BIT(3) //向右
#define GES_FORWARD         BIT(4) //向前
#define GES_BACKWARD        BIT(5) //向后
#define GES_CLOCKWISE       BIT(6) //顺时针
#define GES_COUNT_CLOCKWISE BIT(7) //逆时针
#define GES_WAVE            BIT(8) //挥动

u8 paj7620u2_init(void);
u8 Gesture_test(u8 *ges);
u8 Ps_test(u8 *brightness, u16 *size);

#endif


paj7620u2_cfg.h

#ifndef __PAJ7620U2_CFG_H
#define __PAJ7620U2_CFG_H


#define INIT_SIZE sizeof(init_Array)/2
//上电初始化数组
const unsigned char init_Array[][2] = {

    {0xEF,0x00},
	{0x37,0x07},
    {0x38,0x17},
	{0x39,0x06},
	{0x41,0x00},
	{0x42,0x00},
	{0x46,0x2D},
	{0x47,0x0F},
	{0x48,0x3C},
	{0x49,0x00},
	{0x4A,0x1E},
	{0x4C,0x20},
	{0x51,0x10},
	{0x5E,0x10},
	{0x60,0x27},
	{0x80,0x42},
	{0x81,0x44},
	{0x82,0x04},
	{0x8B,0x01},
	{0x90,0x06},
	{0x95,0x0A},
	{0x96,0x0C},
	{0x97,0x05},
	{0x9A,0x14},
	{0x9C,0x3F},
	{0xA5,0x19},
	{0xCC,0x19},
	{0xCD,0x0B},
	{0xCE,0x13},
	{0xCF,0x64},
	{0xD0,0x21},
	{0xEF,0x01},
	{0x02,0x0F},
	{0x03,0x10},
	{0x04,0x02},
	{0x25,0x01},
	{0x27,0x39},
	{0x28,0x7F},
	{0x29,0x08},
	{0x3E,0xFF},
	{0x5E,0x3D},
	{0x65,0x96},
	{0x67,0x97},
	{0x69,0xCD},
	{0x6A,0x01},
	{0x6D,0x2C},
	{0x6E,0x01},
	{0x72,0x01},
	{0x73,0x35},
	{0x74,0x00},
	{0x77,0x01},
};

#define PROXIM_SIZE sizeof(proximity_arry)/2
//接近检测初始化数组
const unsigned char proximity_arry[][2]={

	{0xEF,0x00},
	{0x41,0x00},
	{0x42,0x00},
	{0x48,0x3C},
	{0x49,0x00},
	{0x51,0x13},
	{0x83,0x20},
	{0x84,0x20},
	{0x85,0x00},
	{0x86,0x10},
	{0x87,0x00},
	{0x88,0x05},
	{0x89,0x18},
	{0x8A,0x10},
	{0x9f,0xf8},
	{0x69,0x96},
	{0x6A,0x02},
	{0xEF,0x01},
	{0x01,0x1E},
	{0x02,0x0F},
	{0x03,0x10},
	{0x04,0x02},
	{0x41,0x50},
	{0x43,0x34},
	{0x65,0xCE},
	{0x66,0x0B},
	{0x67,0xCE},
	{0x68,0x0B},
	{0x69,0xE9},
	{0x6A,0x05},
	{0x6B,0x50},
	{0x6C,0xC3},
	{0x6D,0x50},
	{0x6E,0xC3},
	{0x74,0x05},

};

#define GESTURE_SIZE sizeof(gesture_arry)/2
//手势识别初始化数组
const unsigned char gesture_arry[][2]={
	
	{0xEF,0x00},
	{0x41,0x00},
	{0x42,0x00},
	{0xEF,0x00},
	{0x48,0x3C},
	{0x49,0x00},
	{0x51,0x10},
	{0x83,0x20},
	{0x9F,0xF9},
	{0xEF,0x01},
	{0x01,0x1E},
	{0x02,0x0F},
	{0x03,0x10},
	{0x04,0x02},
	{0x41,0x40},
	{0x43,0x30},
	{0x65,0x96},
	{0x66,0x00},
	{0x67,0x97},
	{0x68,0x01},
	{0x69,0xCD},
	{0x6A,0x01},
	{0x6B,0xB0},
	{0x6C,0x04},
	{0x6D,0x2C},
	{0x6E,0x01},
	{0x74,0x00},
	{0xEF,0x00},
	{0x41,0xFF},
	{0x42,0x01},

};
#endif 

### 回答1: atk-paj7620手势识别模块用户手册是一份以帮助用户了解和正确使用这款手势识别模块的官方文档。以下是关于该用户手册的简要回答: atk-paj7620手势识别模块用户手册提供了关于模块的详细说明,包括模块的功能、特性和接口等相关信息。用户手册还包含有关如何正确接线和使用模块的说明,以及如何在不同的开发环境中配置和调试模块的指南。此外,用户手册还提供了关于如何编写代码以实现特定手势识别功能的示例和案例。 用户手册中还包含了模块的规格和性能参数,例如工作电压、工作温度、功耗等。这些参数对用户在实际应用中选择合适的工作条件和电源管理方案非常有帮助。 另外,用户手册也包括了手势识别模块的软件开发工具和驱动程序的相关信息,帮助用户进行部署和调试。用户手册中还会涵盖常见问题解答和故障排除等内容,帮助用户在使用过程中遇到问题时能够及时解决。 总之,atk-paj7620手势识别模块用户手册是一份用户了解和正确使用手势识别模块的重要参考文献。用户通过仔细阅读和理解手册内容,能够更好地使用这款模块,并将其应用于各种实际场景中。 ### 回答2: atk-paj7620手势识别模块是一种用于识别手势的硬件设备。它由芯片和相关的电路组成,可通过向芯片发送指令,实现手势识别的功能。 该手势识别模块支持多种手势,包括向左滑动、向右滑动、向上滑动、向下滑动、向前点动、向后点动、顺时针旋转和逆时针旋转等。用户可以根据自己的需要,选择合适的手势作为触发事件,从而实现不同的功能。 在使用该手势识别模块时,首先需要连接模块和主控板,通过串口或者I2C接口进行通信。然后,用户可以使用指定的命令和参数,向芯片发送指令,实现手势的识别。 用户手册提供了关于模块的详细说明和操作指导。用户可以通过阅读手册,了解模块的功能和使用方法。手册中包含了模块的接口定义、通信协议、指令集以及示例代码等内容,帮助用户快速上手和正确使用该模块。 总之,atk-paj7620手势识别模块用户手册是一本指导用户正确使用该硬件设备的参考资料。通过阅读手册,用户可以了解到模块的功能和使用方法,从而实现自己的应用需求。 ### 回答3: ATK-Paj7620是一款用于手势识别的模块,它可以通过检测用户的手势来控制设备的操作。以下是该模块的用户手册的内容简介。 首先,用户手册提供了对ATK-Paj7620模块的基本介绍。它解释了模块的外观特征和安装方法,以及配套的电源要求和接口定义。通过了解这些基本信息,用户可以更好地准备和使用该模块。 接下来,手册详细介绍了ATK-Paj7620模块的工作原理和手势识别原理。它解释了模块如何通过红外传感器检测用户手势,并将手势信息转化为数字信号进行处理和识别。用户可以了解到模块的感应距离和识别能力,以及如何调节模块的灵敏度和响应速度。 手册还提供了详细的手势识别指令和对应的动作控制。例如,用户可以通过特定的手势来实现向上、向下、向左或向右滑动的操作,实现菜单选择、音量调节等功能。该手册还指导用户如何进一步开发和扩展手势识别的功能,以满足个性化需求。 除了手势识别功能,手册还介绍了其他模块的特性和应用示例。比如,模块还具备近距离物体检测的功能,可以用于智能家居、安防监控等场景。手册还提供了模块的编程接口和样例代码,方便开发者进行二次开发和集成。 最后,用户手册还包括了模块的常见问题解答和技术支持联系方式,以便用户在使用过程中遇到问题时能够快速得到解决。 通过查阅ATK-Paj7620手势识别模块的用户手册,用户可以全面了解该模块的功能、特性和使用方法,从而更好地应用于各种场景中。手册的清晰结构和简明内容使得用户能够轻松上手,并能够灵活发挥手势识别的功能优势。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值