Mercurial > micropython-gp2y0e03
changeset 1:e43175de4495 default tip
Use 16-bit register read
| author | Radomir Dopieralski <sheep-devel@sheep.art.pl> |
|---|---|
| date | Sun, 13 Nov 2016 22:08:22 +0100 |
| parents | a0491f551a81 |
| children | |
| files | gp2y0e03.py |
| diffstat | 1 files changed, 26 insertions(+), 10 deletions(-) [+] |
line wrap: on
line diff
--- a/gp2y0e03.py Fri Sep 09 14:51:15 2016 +0200 +++ b/gp2y0e03.py Sun Nov 13 22:08:22 2016 +0100 @@ -1,8 +1,15 @@ +import ustruct _REGISTER_SHIFT_BIT = const(0x35) -_REGISTER_DISTANCE1 = const(0x5e) -_REGISTER_DISTANCE2 = const(0x5f) +_REGISTER_DISTANCE = const(0x5e) + +""" +import gp2y0e03 +from machine import I2C, Pin +i2c = I2C(Pin(0), Pin(2)) +s = gp2y0e03.GP2Y0E03(i2c) +""" class GP2Y0E03: def __init__(self, i2c, address=0x40): @@ -15,18 +22,27 @@ return self.i2c.readfrom_mem(self.address, register, 1)[0] self.i2c.writeto_mem(self.address, register, bytearray([value])) + def _register16(self, register, value=None): + if value is None: + data = self.i2c.readfrom_mem(self.address, register, 2) + return ustruct.unpack(">H", data)[0] + self.i2c.writeto_mem(self.address, register, ustruct.pack(">H", value)) + def shift(self, value=None): - if value not in (1, 2, None): - raise ValueError("shift has to be 1 or 2") + if value not in {1, 2, None}: + raise ValueError("Shift has to be 1 or 2") + reading = self._register8(_REGISTER_SHIFT_BIT, value) if value is not None: self._shift = value - return self._register8(_REGISTER_SHIFT_BIT, value) + else: + self._shift = reading + return reading def read(self, raw=False): - low = self._register8(_REGISTER_DISTANCE2) - high = self._register8(_REGISTER_DISTANCE1) - value = (high << 4 | low & 0x0f) + value = self._register16(_REGISTER_DISTANCE) if raw: - return high, low, value - # value in cm + return value + if value & 0xff00: + return 0 # out of range + # value in mm return (value / 16) / (1 << self._shift)
