# HG changeset patch # User Radomir Dopieralski # Date 1494763119 -7200 # Node ID d22f43e8bb96817686a1693f4588dd222fc78299 Initial commit diff -r 000000000000 -r d22f43e8bb96 gp2y0e03.py --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gp2y0e03.py Sun May 14 13:58:39 2017 +0200 @@ -0,0 +1,52 @@ +from adafruit_bus_device import i2c_device +from adafruit_register import i2c_struct + + +class GP2Y0E03: + """ + A driver for the SHARP GP2Y0E03 distance sensor. + """ + _shift_register = i2c_struct.UnaryStruct(0x35, 'B') + _result_register = i2c_struct.Struct(0x5e, 'BB') + _reset_register = i2c_struct.UnaryStruct(0xee, 'B') + + # Advanced features, consult the datasheet + _max_pulse = i2c_struct.UnaryStruct(0x13, 'B') + _symmetry_threshold = i2c_struct.UnaryStruct(0x1c, 'B') + _intensity_threshold = i2c_struct.UnaryStruct(0x2f, 'B') + _max_spot_size = i2c_struct.UnaryStruct(0x33, 'B') + _min_spot_size = i2c_struct.UnaryStruct(0x34, 'B') + _median_filter = i2c_struct.UnaryStruct(0x3f, 'B') + _accumulation = i2c_struct.UnaryStruct(0xa8, 'B') + + def __init__(self, i2c, address=0x40): + self.i2c_device = i2c_device.I2CDevice(i2c, address) + self.shift + + def reset(self): + """Reset the sensor to factory defaults.""" + self._reset_register = 0x06 + self.shift + + @property + def shift(self): + """Range and accuracy of the sensor 1=short, 2=long.""" + self._shift = self._shift_register + return self._shift + + @shift.setter + def shift(self, value): + if value not in {1, 2}: + raise ValueError("shift has to be 1 or 2") + self._shift_register = value + self._shift = value + + @property + def distance(self): + """Measured distance in mm.""" + high, low = self._result_register + if high == 0xff: + return 0 # out of range + value = (high << 4) | low + # value in mm + return value / 1.6 / (1 << self._shift)