-
-
Save fnishio/8e9b5018a7e752569e36 to your computer and use it in GitHub Desktop.
#!/usr/bin/env python3 | |
# -*- coding: utf-8 -*- | |
import wiringpi2 as wp | |
class APDS9960: | |
# Register addresses | |
REG_ENABLE = 0x80 | |
REG_ATIME = 0x81 | |
REG_WTIME = 0x83 | |
REG_AILTL = 0x84 | |
REG_AILTH = 0x85 | |
REG_AIHTL = 0x86 | |
REG_AIHTH = 0x87 | |
REG_PILT = 0x89 | |
REG_PIHT = 0x8B | |
REG_PERS = 0x8C | |
REG_CONFIG1 = 0x8D | |
REG_PPULSE = 0x8E | |
REG_CONTROL = 0x8F | |
REG_CONFIG2 = 0x90 | |
REG_ID = 0x92 | |
REG_STATUS = 0x93 | |
REG_CDATAL = 0x94 | |
REG_CDATAH = 0x95 | |
REG_RDATAL = 0x96 | |
REG_RDATAH = 0x97 | |
REG_GDATAL = 0x98 | |
REG_GDATAH = 0x99 | |
REG_BDATAL = 0x9A | |
REG_BDATAH = 0x9B | |
REG_PDATA = 0x9C | |
REG_POFFSET_UR = 0x9D | |
REG_POFFSET_DL = 0x9E | |
REG_CONFIG3 = 0x9F | |
REG_GPENTH = 0xA0 | |
REG_GEXTH = 0xA1 | |
REG_GCONF1 = 0xA2 | |
REG_GCONF2 = 0xA3 | |
REG_GOFFSET_U = 0xA4 | |
REG_GOFFSET_D = 0xA5 | |
REG_GOFFSET_L = 0xA7 | |
REG_GOFFSET_R = 0xA9 | |
REG_GPULSE = 0xA6 | |
REG_GCONF3 = 0xAA | |
REG_GCONF4 = 0xAB | |
REG_GFLVL = 0xAE | |
REG_GSTATUS = 0xAF | |
REG_IFORCE = 0xE4 | |
REG_PICLEAR = 0xE5 | |
REG_CICLEAR = 0xE6 | |
REG_AICLEAR = 0xE7 | |
REG_GFIFO_U = 0xFC | |
REG_GFIFO_D = 0xFD | |
REG_GFIFO_L = 0xFE | |
REG_GFIFO_R = 0xFF | |
# Enable register bits | |
ENABLE_GEN = 0b01000000 # Gesture enable | |
ENABLE_PIEN = 0b00100000 # Proximity Interrupt Enable | |
ENABLE_AIEN = 0b00010000 # ALS Interrupt Enable | |
ENABLE_WEN = 0b00001000 # Wait Enable | |
ENABLE_PEN = 0b00000100 # Proximity Enable | |
ENABLE_AEN = 0b00000010 # ALS Enable | |
ENABLE_PON = 0b00000001 # Power ON | |
# Congiguration register 2 | |
CONFIG2_LEDBOOST_150 = (1 << 4) # LED boost 150% | |
CONFIG2_LEDBOOST_200 = (2 << 4) # LED boost 300% | |
CONFIG2_LEDBOOST_300 = (3 << 4) # LED boost 300% | |
GCONFIG3_GDIMS_LR = 2 | |
GCONFIG3_GDIMS_UD = 1 # 01 | |
GCONFIG4_GMODE = 1 # Gesture mode | |
def __init__(self, i2c_addr = 0x39): | |
self.i2c_addr = i2c_addr | |
self.i2c = wp.I2C() | |
self.fd = self.i2c.setup(i2c_addr) | |
def _write(register, data8): | |
self.i2c.writeReg8(self.fd, register, data8) | |
def _read(register): | |
self.i2c.readReg8(self.fd, self.register) | |
def initialize(self): | |
if (self.get_device_id() != 0xAB): | |
return false | |
self.write(self.REG_ENABLE, | |
self.ENABLE_PON | self.ENABLE_PEN | self.ENABLE_GEN) | |
self.write(self.REG_CONFIG2, | |
self.CONFIG2_LEDBOOST_300) | |
self.write(self.REG_GOFFSET_U, 70) | |
self.write(self.REG_GOFFSET_D, 0) | |
self.write(self.REG_GOFFSET_L, 10) | |
self.write(self.REG_GOFFSET_R, 34) | |
self.write(self.REG_CONFIG3, | |
self.GCONFIG3_GDIMS_UD | self.GCONFIG3_GDIMS_LR) | |
self.write(self.REG_GCONFIG4, GCONFIG4_GMODE) | |
def get_device_id(self): | |
return _read(self.REG_ID) | |
def gesture(self): | |
level = _read(self.REG_GFLVL) | |
if (level == 0): | |
return # no data | |
fifo_u = _read(self.REG_GFIFO_U) | |
fifo_d = _read(self.REG_GFIFO_D) | |
fifo_l = _read(self.REG_GFIFO_L) | |
fifo_r = _read(self.REG_GFIFO_R) | |
if __name__ == '__main__': | |
sensor = APDS9960() | |
print("device ID: {:#X}".format(sensor.get_device_id())) | |
sensor.initialize() | |
sensor.gesture() |
My main problem is, that I get completely wrong data. For example, get_device_id() returns 0xD0 instead of 0xAB and I have absolutely no clue why it's doing that. I triple checked all registers and addresses, changed the code to use SMbus instead of wiringpi, but I'm still getting the same results. I can control my HD44780 LCD with the same SMbus calls just fine. Also the sensor itself is not broken, because with a C++ program everything works just fine. I am puzzled.
Well, disregard my last comment. I was apparently way overdue to sleep last night. 0xD0 is a different sensor, that I have hooked up to my I2C bus aswell. I put the correct I2C address in my script today and wah la, querying the APDS 9660 with python works as expected. :)
Same error as Stan above. Frank, can you post your working code?
I don''t think this code ever worked. I modified it to some extend so it reads the device ID, but beyond that this code has a) lots more errors and b) does basically nothing.