单片机 PAJ7620U2 IIC协议 9种手势

一、简介

  1. 由手势辨识传感器、LED和镜头组合而成的小尺寸模组
  2. 可辨识单一物件之手势,并具有手势完成之自动判断功能
  3. 具有两种模式:「手势模式」或「游标模式」
  4. 手势模式:内建多达9种手势
  5. 游标模式:可输出追踪物体的位置、尺寸和亮度的即时数据
  6. 工作距离最多可达20公分
    在这里插入图片描述

二、特性

PAJ7620U2APDS-9960
电源电压3.3V/5V3.3V/5V
工作原理光学数组式环境亮度传感检测光学数组式环境亮度传感检测
通讯接口I²C 接口,400Khz(Max)I²C 接口,400Khz(Max)
识别速度240Hz160Hz
工作环境光<100K Lux(抗灯光干扰)<50K Lux(环境干扰抑制)
有效探测距离5~15cm2~15cm
检测角度范围60°~180°60°
手势识别种类内置 9 个手势类型(上、下、左、右、前、后、顺时针旋转、逆时针旋转、挥动)内置 4 个手势类型(上、下、左、右)
功耗3~10mA(待机功耗电流 15uA)5~15mA(睡眠模式功率2.2μA)

在这里插入图片描述

三、示例代码


/* -----------------------------------------宏定义-----------------------------------------*/

/* -----------------------------------------头文件-----------------------------------------*/
#include "main.h"
#include "PAJ7620U2_cfg.h"
/* -----------------------------------------结构体定义-------------------------------------*/
code IIC_TYPE PAJ7620U2 = {2, 0x73 << 1};
/* -----------------------------------------全局变量定义-----------------------------------*/

/* -----------------------------------------应用程序---------------------------------------*/
/*********************************************
函数名:PAJ7620U2_Write_DATA
功  能:写 地址 数据
形  参:addr 地址   dat 数据
返回值:
备  注:
作  者:薛建强
时  间:2020/03/19
**********************************************/
void PAJ7620U2_Write_DATA(const uint8_t addr, const uint8_t DATA)
{
    IIC_Start();                 // 启动
    IIC_WriteByte(PAJ7620U2.ADDR); // 设备地址
    IIC_Wait_ACK();              // 等待数据响应
    IIC_WriteByte(addr);         // 发送寄存器地址
    IIC_Wait_ACK();              // 等待数据响应
    IIC_WriteByte(DATA);         // 发送数据
    IIC_Wait_ACK();              // 等待数据响应
    IIC_Stop();                  // 停止
}
/*********************************************
函数名:PAJ7620U2_Read_DATA
功  能:读地址数据
形  参:addr--寄存器地址
返回值:
备  注:
作  者:薛建强
时  间:2020/03/19
**********************************************/
uint8_t PAJ7620U2_Read_DATA(const uint8_t addr)
{
    uint8_t GET_DATA = 0;
    IIC_Start();                   // 启动
    IIC_WriteByte(PAJ7620U2.ADDR);   // 发送地址
    IIC_Wait_ACK();                // 等待数据响应
    IIC_WriteByte(addr);           // 发送地址
    IIC_Wait_ACK();                // 等待数据响应

    IIC_Start();                   // 启动
    IIC_WriteByte(PAJ7620U2.ADDR | 1); // 发送地址
    IIC_Wait_ACK();                // 等待数据响应

    GET_DATA = IIC_ReadByte();     // 获取数据
    IIC_Wait_ACK();                // 等待数据响应

    IIC_Stop();                    // 停止
    return GET_DATA;
}
/*********************************************
函数名:PAJ7620U2_get_data
功  能:读取一次寄存器值
形  参:
返回值:
备  注:
作  者:薛建强
时  间:2019/06/11
**********************************************/
uint16_t PAJ7620U2_get_data(const uint8_t addr)
{
    uint8_t i = 0;
    xdata uint8_t GET_DATA[2] = {0};
    IIC_Start();                     // 启动
    IIC_WriteByte(PAJ7620U2.ADDR);   // 发送地址
    IIC_Wait_ACK();                  // 等待数据响应
    IIC_WriteByte(addr);             // 发送地址
    IIC_Wait_ACK();                  // 等待数据响应
    IIC_Start();                     // 启动
    IIC_WriteByte(PAJ7620U2.ADDR | 1); // 发送地址
    IIC_Wait_ACK();                  // 等待数据响应
    for (i = 0; i < 2; i++)
    {
        if (i == 1)
        {
            GET_DATA[i] =  IIC_ReceiveData(0);
        }
        else
        {
            GET_DATA[i] =  IIC_ReceiveData(1);
        }
    }
    IIC_Stop();            // 停止

    return (uint16_t)((GET_DATA[1] << 8) | (GET_DATA[0])); //
}
/*********************************************
函数名:PAJ7620U2_CMD_WakeUp
功  能:PAJ7620唤醒
形  参:
返回值:
备  注:①唤醒命令格式就是I2C通讯的命令格式,在发送写命令后不用等待PAJ7629U2的应答,直接发送停止就可以了。
        ②发送完唤醒命令后,需等待大于700us的时间,然后读取PAJ7620U2的0X00寄存器,判断是否为0X20数值,若不是则继续执行步骤1继续唤醒。
          直到读取0X00寄存器值为0X20,则唤醒成功。
作  者:薛建强
时  间:2020/03/19
使  用:
**********************************************/
void PAJ7620U2_CMD_WakeUp(void)
{
    IIC_Start();                   // 启动
    IIC_WriteByte(PAJ7620U2.ADDR); // 发送地址
    IIC_Stop();                    // 停止
}
/*********************************************
函数名:PAJ7620U2_SelectBank
功  能:选择PAJ7620U2 BANK区域
形  参:bank-->[0,1]
返回值:
备  注:
作  者:薛建强
时  间:2020/03/19
使  用:
**********************************************/
void PAJ7620U2_SelectBank(bank_e bank)
{
    switch (bank)
    {
        case BANK0:
            PAJ7620U2_Write_DATA(PAJ_REGITER_BANK_SEL, PAJ_BANK0);
            break;//BANK0寄存器区域
        case BANK1:
            PAJ7620U2_Write_DATA(PAJ_REGITER_BANK_SEL, PAJ_BANK1);
            break;//BANK1寄存器区域
    }
}
/*********************************************
函数名:PAJ7620U2_wakeup
功  能:PAJ7620U2唤醒
形  参:
返回值:
备  注:连续唤醒两次,防止一次不成功
作  者:薛建强
时  间:2020/03/19
使  用:
**********************************************/
uint8_t PAJ7620U2_wakeup(void)
{
    uint8_t Data = 0x0a;
    PAJ7620U2_CMD_WakeUp();//唤醒PAJ7620U2
    os_wait(K_IVL, 5, 0);//5ms

    PAJ7620U2_CMD_WakeUp();//唤醒PAJ7620U2
    os_wait(K_IVL, 5, 0);//5ms
//return 0; //唤醒失败
    PAJ7620U2_SelectBank(BANK0);//进入BANK0寄存器区域
    Data = PAJ7620U2_Read_DATA(0x00);//读取状态
    if (Data != 0x20) return 0; //唤醒失败
    return 1;
}

/*********************************************
函数名:PAJ7620U2_Init
功  能:手势传感器初始化
形  参:
返回值:0--初始化失败  1--初始化成功
备  注:
作  者:薛建强
时  间:2020/03/19
使  用:
**********************************************/
uint8_t PAJ7620U2_Init(void)
{
    uint8_t i;
    uint8_t status;
    IIC_Init();          // I2C初始化
    status = PAJ7620U2_wakeup();//唤醒PAJ7620U2
    if (!status) return 0;
    PAJ7620U2_SelectBank(BANK0);//进入BANK0寄存器区域
    for (i = 0; i < INIT_SIZE; i++)
    {
        PAJ7620U2_Write_DATA(init_Array[i][0], init_Array[i][1]); //初始化PAJ7620U2
    }
    PAJ7620U2_SelectBank(BANK0);//切换回BANK0寄存器区域
    return 1;
}

/*********************************************
函数名:PAJ7620U2_Set_Gesture_Mode
功  能:设置为手势模式
形  参:
返回值:
备  注:
作  者:薛建强
时  间:2020/03/19
使  用:
**********************************************/
void PAJ7620U2_Set_Gesture_Mode(void)
{
    uint8_t i;
    PAJ7620U2_SelectBank(BANK0);//进入BANK0寄存器区域
    for (i = 0; i < GESTURE_SIZE; i++)
    {
        PAJ7620U2_Write_DATA(gesture_arry[i][0], gesture_arry[i][1]); //手势识别模式初始化
    }
    PAJ7620U2_SelectBank(BANK0);//切换回BANK0寄存器区域
}


uint8_t PAJ7620U2_Read_Gesture_State(void)
{
    switch (PAJ7620U2_get_data(PAJ_GET_INT_FLAG1))
    {
        case GES_UP://向上
            return 1;
        case GES_DOWM://向下
            return 2;
        case GES_LEFT://向左
            return 3;
        case GES_RIGHT://向右
            return 4;
        case GES_FORWARD://向前
            return 5;
        case GES_BACKWARD: //向后
            return 6;
        case GES_CLOCKWISE://顺时针
            return 7;
        case GES_COUNT_CLOCKWISE://逆时针
            return 8;
        case GES_WAVE://挥动
            return 9;
        default:
            return 0;
    }
}

#ifndef _PAJ7620U2_H
#define _PAJ7620U2_H
/* -----------------------------------------宏定义-----------------------------------------*/
#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) //挥动
/* -----------------------------------------头文件-----------------------------------------*/
#include "main.h"

/* -----------------------------------------结构体定义-------------------------------------*/

/* -----------------------------------------全局变量定义-----------------------------------*/


//BANK寄存器枚举
typedef enum{
	BANK0 = 0, //BANK0寄存器
	BANK1,     //BANK1寄存器
}bank_e;
/* -----------------------------------------应用程序---------------------------------------*/
uint8_t PAJ7620U2_Init(void);
uint8_t PAJ7620U2_Read_Gesture_State(void);
void PAJ7620U2_Set_Gesture_Mode(void);
#endif

使用方法:

        if (SystemReg.RunningState == 0 && SystemInit.PAJ7620U2 == 0)
        {
            SystemInit.PAJ7620U2 = PAJ7620U2_Init();
            if (SystemInit.PAJ7620U2 == 1)
            {
                PAJ7620U2_Set_Gesture_Mode();
            }
        }
        if (SystemReg.RunningState == 0 && SystemInit.PAJ7620U2 == 1)
        {
            State = PAJ7620U2_Read_Gesture_State(); //获取手势状态
            if (State != 0)
            {
                printf("State:%d\r\n", (uint16_t)State);
                State = 0;
            }
        }

IIC协议链接

  • 8
    点赞
  • 44
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

jianqiang.xue

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值