Files
2024-07-20 22:09:06 +08:00

422 lines
8.4 KiB
C++

/*
* paj7620.cpp
* A library for Grove-Guesture 1.0
*
* Copyright (c) 2015 seeed technology inc.
* Website : www.seeed.cc
* Author : Wuruibin & Xiangnan
* Modified Time: June 2015
*
* The MIT License (MIT)
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
* THE SOFTWARE.
*/
#include <Wire.h>
#include "paj7620.h"
#include <Arduino.h>
// PAJ7620U2_20140305.asc
/* Registers' initialization data */
unsigned char initRegisterArray[][2] = { // Initial Gesture
{0xEF,0x00},
{0x32,0x29},
{0x33,0x01},
{0x34,0x00},
{0x35,0x01},
{0x36,0x00},
{0x37,0x07},
{0x38,0x17},
{0x39,0x06},
{0x3A,0x12},
{0x3F,0x00},
{0x40,0x02},
{0x41,0xFF},
{0x42,0x01},
{0x46,0x2D},
{0x47,0x0F},
{0x48,0x3C},
{0x49,0x00},
{0x4A,0x1E},
{0x4B,0x00},
{0x4C,0x20},
{0x4D,0x00},
{0x4E,0x1A},
{0x4F,0x14},
{0x50,0x00},
{0x51,0x10},
{0x52,0x00},
{0x5C,0x02},
{0x5D,0x00},
{0x5E,0x10},
{0x5F,0x3F},
{0x60,0x27},
{0x61,0x28},
{0x62,0x00},
{0x63,0x03},
{0x64,0xF7},
{0x65,0x03},
{0x66,0xD9},
{0x67,0x03},
{0x68,0x01},
{0x69,0xC8},
{0x6A,0x40},
{0x6D,0x04},
{0x6E,0x00},
{0x6F,0x00},
{0x70,0x80},
{0x71,0x00},
{0x72,0x00},
{0x73,0x00},
{0x74,0xF0},
{0x75,0x00},
{0x80,0x42},
{0x81,0x44},
{0x82,0x04},
{0x83,0x20},
{0x84,0x20},
{0x85,0x00},
{0x86,0x10},
{0x87,0x00},
{0x88,0x05},
{0x89,0x18},
{0x8A,0x10},
{0x8B,0x01},
{0x8C,0x37},
{0x8D,0x00},
{0x8E,0xF0},
{0x8F,0x81},
{0x90,0x06},
{0x91,0x06},
{0x92,0x1E},
{0x93,0x0D},
{0x94,0x0A},
{0x95,0x0A},
{0x96,0x0C},
{0x97,0x05},
{0x98,0x0A},
{0x99,0x41},
{0x9A,0x14},
{0x9B,0x0A},
{0x9C,0x3F},
{0x9D,0x33},
{0x9E,0xAE},
{0x9F,0xF9},
{0xA0,0x48},
{0xA1,0x13},
{0xA2,0x10},
{0xA3,0x08},
{0xA4,0x30},
{0xA5,0x19},
{0xA6,0x10},
{0xA7,0x08},
{0xA8,0x24},
{0xA9,0x04},
{0xAA,0x1E},
{0xAB,0x1E},
{0xCC,0x19},
{0xCD,0x0B},
{0xCE,0x13},
{0xCF,0x64},
{0xD0,0x21},
{0xD1,0x0F},
{0xD2,0x88},
{0xE0,0x01},
{0xE1,0x04},
{0xE2,0x41},
{0xE3,0xD6},
{0xE4,0x00},
{0xE5,0x0C},
{0xE6,0x0A},
{0xE7,0x00},
{0xE8,0x00},
{0xE9,0x00},
{0xEE,0x07},
{0xEF,0x01},
{0x00,0x1E},
{0x01,0x1E},
{0x02,0x0F},
{0x03,0x10},
{0x04,0x02},
{0x05,0x00},
{0x06,0xB0},
{0x07,0x04},
{0x08,0x0D},
{0x09,0x0E},
{0x0A,0x9C},
{0x0B,0x04},
{0x0C,0x05},
{0x0D,0x0F},
{0x0E,0x02},
{0x0F,0x12},
{0x10,0x02},
{0x11,0x02},
{0x12,0x00},
{0x13,0x01},
{0x14,0x05},
{0x15,0x07},
{0x16,0x05},
{0x17,0x07},
{0x18,0x01},
{0x19,0x04},
{0x1A,0x05},
{0x1B,0x0C},
{0x1C,0x2A},
{0x1D,0x01},
{0x1E,0x00},
{0x21,0x00},
{0x22,0x00},
{0x23,0x00},
{0x25,0x01},
{0x26,0x00},
{0x27,0x39},
{0x28,0x7F},
{0x29,0x08},
{0x30,0x03},
{0x31,0x00},
{0x32,0x1A},
{0x33,0x1A},
{0x34,0x07},
{0x35,0x07},
{0x36,0x01},
{0x37,0xFF},
{0x38,0x36},
{0x39,0x07},
{0x3A,0x00},
{0x3E,0xFF},
{0x3F,0x00},
{0x40,0x77},
{0x41,0x40},
{0x42,0x00},
{0x43,0x30},
{0x44,0xA0},
{0x45,0x5C},
{0x46,0x00},
{0x47,0x00},
{0x48,0x58},
{0x4A,0x1E},
{0x4B,0x1E},
{0x4C,0x00},
{0x4D,0x00},
{0x4E,0xA0},
{0x4F,0x80},
{0x50,0x00},
{0x51,0x00},
{0x52,0x00},
{0x53,0x00},
{0x54,0x00},
{0x57,0x80},
{0x59,0x10},
{0x5A,0x08},
{0x5B,0x94},
{0x5C,0xE8},
{0x5D,0x08},
{0x5E,0x3D},
{0x5F,0x99},
{0x60,0x45},
{0x61,0x40},
{0x63,0x2D},
{0x64,0x02},
{0x65,0x96},
{0x66,0x00},
{0x67,0x97},
{0x68,0x01},
{0x69,0xCD},
{0x6A,0x01},
{0x6B,0xB0},
{0x6C,0x04},
{0x6D,0x2C},
{0x6E,0x01},
{0x6F,0x32},
{0x71,0x00},
{0x72,0x01},
{0x73,0x35},
{0x74,0x00},
{0x75,0x33},
{0x76,0x31},
{0x77,0x01},
{0x7C,0x84},
{0x7D,0x03},
{0x7E,0x01},
};
/****************************************************************
* Function Name: paj7620WriteReg
* Description: PAJ7620 Write reg cmd
* Parameters: addr:reg address; cmd:function data
* Return: error code; success: return 0
****************************************************************/
uint8_t paj7620WriteReg(uint8_t addr, uint8_t cmd)
{
char i = 1;
Wire.beginTransmission(PAJ7620_ID); // start transmission to device
//write cmd
Wire.write(addr); // send register address
Wire.write(cmd); // send value to write
i = Wire.endTransmission(); // end transmission
if(0 != i)
{
Serial.print("Transmission error!!!\n");
}
return i;
}
/****************************************************************
* Function Name: paj7620ReadReg
* Description: PAJ7620 read reg data
* Parameters: addr:reg address;
* qty:number of data to read, addr continuously increase;
* data[]:storage memory start address
* Return: error code; success: return 0
****************************************************************/
uint8_t paj7620ReadReg(uint8_t addr, uint8_t qty, uint8_t data[])
{
uint8_t error;
Wire.beginTransmission(PAJ7620_ID);
Wire.write(addr);
error = Wire.endTransmission();
if(0 != error)
{
Serial.print("Transmission error!!!\n");
return error; //return error code
}
Wire.requestFrom((int)PAJ7620_ID, (int)qty);
while (Wire.available())
{
*data = Wire.read();
#ifdef debug //debug
Serial.print("addr:");
Serial.print(addr++, HEX);
Serial.print(" data:");
Serial.println(*data, HEX);
#endif
data++;
}
return 0;
}
/****************************************************************
* Function Name: paj7620SelectBank
* Description: PAJ7620 select register bank
* Parameters: BANK0, BANK1
* Return: none
****************************************************************/
void paj7620SelectBank(bank_e bank)
{
switch(bank){
case BANK0:
paj7620WriteReg(PAJ7620_REGITER_BANK_SEL, PAJ7620_BANK0);
break;
case BANK1:
paj7620WriteReg(PAJ7620_REGITER_BANK_SEL, PAJ7620_BANK1);
break;
default:
break;
}
}
/****************************************************************
* Function Name: paj7620Init
* Description: PAJ7620 REG INIT
* Parameters: none
* Return: error code; success: return 0
****************************************************************/
uint8_t paj7620Init(void)
{
//Near_normal_mode_V5_6.15mm_121017 for 940nm
int i = 0;
uint8_t error;
uint8_t data0 = 0, data1 = 0;
//wakeup the sensor
delayMicroseconds(700); //Wait 700us for PAJ7620U2 to stabilize
Wire.begin();
Serial.println("INIT SENSOR...");
paj7620SelectBank(BANK0);
paj7620SelectBank(BANK0);
error = paj7620ReadReg(0, 1, &data0);
if (error)
{
return error;
}
error = paj7620ReadReg(1, 1, &data1);
if (error)
{
return error;
}
Serial.print("Addr0 =");
Serial.print(data0 , HEX);
Serial.print(", Addr1 =");
Serial.println(data1 , HEX);
if ( (data0 != 0x20 ) || (data1 != 0x76) )
{
return 0xff;
}
if ( data0 == 0x20 )
{
Serial.println("wake-up finish.");
}
for (i = 0; i < INIT_REG_ARRAY_SIZE; i++)
{
paj7620WriteReg(initRegisterArray[i][0], initRegisterArray[i][1]);
}
/**
* Setting normal mode or gaming mode at BANK1 register 0x65/0x66 R_IDLE_TIME[15:0]
* T = 256/System CLK = 32us,
* Ex:
* Far Mode: 1 report time = (77+R_IDLE_TIME)T
* Report rate 120 fps:
* R_IDLE_TIME=1/(120*T)-77=183
*
* Report rate 240 fps:
* R_IDLE_TIME=1/(240*T)-77=53
*
* Near Mode: 1 report time = (112+R_IDLE_TIME)T
*
* Report rate 120 fps:
* R_IDLE_TIME=1/(120*T)-120=148
*
* Report rate 240 fps:
* R_IDLE_TIME=1/(240*T)-112=18
*
*/
Serial.println("Set up gaming mode.");
paj7620SelectBank(BANK1); //gesture flage reg in Bank1
// paj7620WriteReg(0x65, 0xB7); // far mode 120 fps
paj7620WriteReg(0x65, 0x12); // near mode 240 fps
paj7620SelectBank(BANK0); //gesture flage reg in Bank0
Serial.println("Paj7620 initialize register finished.");
return 0;
}