changeset 0:d22f43e8bb96 draft default tip

Initial commit
author Radomir Dopieralski <sheep-devel@sheep.art.pl>
date Sun, 14 May 2017 13:58:39 +0200
parents
children
files gp2y0e03.py
diffstat 1 files changed, 52 insertions(+), 0 deletions(-) [+]
line wrap: on
line diff
--- /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)