diff --git a/paj7620.cpp b/paj7620.cpp new file mode 100644 index 0000000..a1f467a --- /dev/null +++ b/paj7620.cpp @@ -0,0 +1,374 @@ +/* + * 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 "paj7620.h" +#include +#include + +/** neale 2020-12-08 + * + * I went through these registers to see which ones were actually required to make the thing work. + * It wasn't very many. + * This does sort of screw with the accuracy of the proximity detection, + * I think that's somewhere at the start of bank 1. + * There may be other stuff this screws with that I'm not testing. + * + * Notably, though, a lot of these values were the defaults specified in the datasheet. + * I think somebody just copied everything over and nobody's ever bothered to check what's actually needed. + * Well, I'm almost out of RAM, so I checked. + */ + +unsigned char initRegisterArray[][2] = { + /* Bank 0 */ + // {0xEF, 0x00}, // Select bank 0 + // {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}, + + + /* Bank 1 */ + {0xEF, 0x01}, // Select bank 1 + // {0x00, 0x1E}, + // {0x01, 0x1E}, + // {0x04, 0x02}, // Setting this inverts the notion of left and right + // {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 + 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) { + return error; //return error code + } + + Wire.requestFrom((int)PAJ7620_ID, (int)qty); + + while (Wire.available()) { + *data = Wire.read(); + + 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(); + + paj7620SelectBank(BANK0); + paj7620SelectBank(BANK0); + + error = paj7620ReadReg(0, 1, &data0); + if (error) { + return error; + } + error = paj7620ReadReg(1, 1, &data1); + if (error) { + return error; + } + + if ((data0 != 0x20) || (data1 != 0x76)) { + return 0xff; + } + + for (i = 0; i < INIT_REG_ARRAY_SIZE; i++) { + paj7620WriteReg(initRegisterArray[i][0], initRegisterArray[i][1]); + } + + paj7620SelectBank(BANK0); //gesture flage reg in Bank0 + + return 0; +} diff --git a/paj7620.h b/paj7620.h new file mode 100644 index 0000000..73f6e24 --- /dev/null +++ b/paj7620.h @@ -0,0 +1,125 @@ +/* + * paj7620.h + * 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 + +#ifndef __PAJ7620_H__ +#define __PAJ7620_H__ + +#define BIT(x) 1 << x + +// REGISTER DESCRIPTION +#define PAJ7620_VAL(val, maskbit) ( val << maskbit ) +#define PAJ7620_ADDR_BASE 0x00 + +// REGISTER BANK SELECT +#define PAJ7620_REGITER_BANK_SEL (PAJ7620_ADDR_BASE + 0xEF) //W + +// DEVICE ID +#define PAJ7620_ID 0x73 + +// REGISTER BANK 0 +#define PAJ7620_ADDR_SUSPEND_CMD (PAJ7620_ADDR_BASE + 0x3) //W +#define PAJ7620_ADDR_GES_PS_DET_MASK_0 (PAJ7620_ADDR_BASE + 0x41) //RW +#define PAJ7620_ADDR_GES_PS_DET_MASK_1 (PAJ7620_ADDR_BASE + 0x42) //RW +#define PAJ7620_ADDR_GES_PS_DET_FLAG_0 (PAJ7620_ADDR_BASE + 0x43) //R +#define PAJ7620_ADDR_GES_PS_DET_FLAG_1 (PAJ7620_ADDR_BASE + 0x44) //R +#define PAJ7620_ADDR_STATE_INDICATOR (PAJ7620_ADDR_BASE + 0x45) //R +#define PAJ7620_ADDR_PS_HIGH_THRESHOLD (PAJ7620_ADDR_BASE + 0x69) //RW +#define PAJ7620_ADDR_PS_LOW_THRESHOLD (PAJ7620_ADDR_BASE + 0x6A) //RW +#define PAJ7620_ADDR_PS_APPROACH_STATE (PAJ7620_ADDR_BASE + 0x6B) //R +#define PAJ7620_ADDR_PS_RAW_DATA (PAJ7620_ADDR_BASE + 0x6C) //R + +// REGISTER BANK 1 +#define PAJ7620_ADDR_PS_GAIN (PAJ7620_ADDR_BASE + 0x44) //RW +#define PAJ7620_ADDR_IDLE_S1_STEP_0 (PAJ7620_ADDR_BASE + 0x67) //RW +#define PAJ7620_ADDR_IDLE_S1_STEP_1 (PAJ7620_ADDR_BASE + 0x68) //RW +#define PAJ7620_ADDR_IDLE_S2_STEP_0 (PAJ7620_ADDR_BASE + 0x69) //RW +#define PAJ7620_ADDR_IDLE_S2_STEP_1 (PAJ7620_ADDR_BASE + 0x6A) //RW +#define PAJ7620_ADDR_OP_TO_S1_STEP_0 (PAJ7620_ADDR_BASE + 0x6B) //RW +#define PAJ7620_ADDR_OP_TO_S1_STEP_1 (PAJ7620_ADDR_BASE + 0x6C) //RW +#define PAJ7620_ADDR_OP_TO_S2_STEP_0 (PAJ7620_ADDR_BASE + 0x6D) //RW +#define PAJ7620_ADDR_OP_TO_S2_STEP_1 (PAJ7620_ADDR_BASE + 0x6E) //RW +#define PAJ7620_ADDR_OPERATION_ENABLE (PAJ7620_ADDR_BASE + 0x72) //RW + +// PAJ7620_REGITER_BANK_SEL +#define PAJ7620_BANK0 PAJ7620_VAL(0,0) +#define PAJ7620_BANK1 PAJ7620_VAL(1,0) + +// PAJ7620_ADDR_SUSPEND_CMD +#define PAJ7620_I2C_WAKEUP PAJ7620_VAL(1,0) +#define PAJ7620_I2C_SUSPEND PAJ7620_VAL(0,0) + +// PAJ7620_ADDR_OPERATION_ENABLE +#define PAJ7620_ENABLE PAJ7620_VAL(1,0) +#define PAJ7620_DISABLE PAJ7620_VAL(0,0) + +typedef enum { + BANK0 = 0, + BANK1, +} bank_e; + +#define GES_LEFT_FLAG PAJ7620_VAL(1,0) +#define GES_RIGHT_FLAG PAJ7620_VAL(1,1) +#define GES_UP_FLAG PAJ7620_VAL(1,2) +#define GES_DOWN_FLAG PAJ7620_VAL(1,3) +#define GES_FORWARD_FLAG PAJ7620_VAL(1,4) +#define GES_BACKWARD_FLAG PAJ7620_VAL(1,5) +#define GES_CLOCKWISE_FLAG PAJ7620_VAL(1,6) +#define GES_COUNT_CLOCKWISE_FLAG PAJ7620_VAL(1,7) +#define GES_WAVE_FLAG PAJ7620_VAL(1,0) + +/* +enum { + // REGISTER 0 + GES_RIGHT_FLAG = BIT(0), + GES_LEFT_FLAG = BIT(1), + GES_UP_FLAG = BIT(2), + GES_DOWN_FLAG = BIT(3), + GES_FORWARD_FLAG = BIT(4), + GES_BACKWARD_FLAG = BIT(5), + GES_CLOCKWISE_FLAG = BIT(6), + GES_COUNT_CLOCKWISE_FLAG = BIT(7), + //REGISTER 1 + GES_WAVE_FLAG = BIT(0), +}; +*/ + + +#define INIT_REG_ARRAY_SIZE (sizeof(initRegisterArray)/sizeof(initRegisterArray[0])) + + +uint8_t paj7620Init(void); +uint8_t paj7620WriteReg(uint8_t addr, uint8_t cmd); +uint8_t paj7620ReadReg(uint8_t addr, uint8_t qty, uint8_t data[]); +void paj7620SelectBank(bank_e bank); + + +#endif