|
| 1 | +""" |
| 2 | +Example of how to use the adafruit_vl53l0x library to change the assigned address of |
| 3 | +multiple VL53L0X sensors on the same I2C bus. This example only focuses on 2 VL53L0X |
| 4 | +sensors, but can be modified for more. BE AWARE: a multitude of sensors may require |
| 5 | +more current than the on-board 3V regulator can output (typical current consumption during |
| 6 | +active range readings is about 19 mA per sensor). |
| 7 | +""" |
| 8 | +import time |
| 9 | +import board |
| 10 | +from digitalio import DigitalInOut |
| 11 | +from adafruit_vl53l0x import VL53L0X |
| 12 | + |
| 13 | +# declare the singleton variable for the default I2C bus |
| 14 | +i2c = board.I2C() |
| 15 | + |
| 16 | +# declare the digital output pins connected to the "SHDN" pin on each VL53L0X sensor |
| 17 | +xshut = [ |
| 18 | + DigitalInOut(board.D7), |
| 19 | + DigitalInOut(board.D9), |
| 20 | + # add more VL53L0X sensors by defining their SHDN pins here |
| 21 | + ] |
| 22 | + |
| 23 | +for power_pin in xshut: |
| 24 | + # make sure these pins are a digital output, not a digital input |
| 25 | + power_pin.switch_to_output(value=False) |
| 26 | + # These pins are active when Low, meaning: |
| 27 | + # if the output signal is LOW, then the VL53L0X sensor is off. |
| 28 | + # if the output signal is HIGH, then the VL53L0X sensor is on. |
| 29 | +# all VL53L0X sensors are now off |
| 30 | + |
| 31 | +# initialize a list to be used for the array of VL53L0X sensors |
| 32 | +vl53 = [] |
| 33 | + |
| 34 | +# now change the addresses of the VL53L0X sensors |
| 35 | +for i, power_pin in enumerate(xshut): |
| 36 | + # turn on the VL53L0X to allow hardware check |
| 37 | + power_pin.value = True |
| 38 | + # instantiate the VL53L0X sensor on the I2C bus & insert it into the "vl53" list |
| 39 | + vl53.insert(i, VL53L0X(i2c)) # also performs VL53L0X hardware check |
| 40 | + # no need to change the address of the last VL53L0X sensor |
| 41 | + if i < len(xshut) - 1: |
| 42 | + # default address is 0x29. Change that to something else |
| 43 | + vl53[i].set_address(i + 0x30) # address assigned should NOT be already in use |
| 44 | +# there is a helpful list of pre-designated I2C addresses for various I2C devices at |
| 45 | +# https://learn.adafruit.com/i2c-addresses/the-list |
| 46 | +# According to this list 0x30-0x34 are available, although the list may be incomplete. |
| 47 | +# In the python REPR, you can scan for all I2C devices that are attached and detirmine |
| 48 | +# their addresses using: |
| 49 | +# >>> import board |
| 50 | +# >>> i2c = board.I2C() |
| 51 | +# >>> if i2c.try_lock(): |
| 52 | +# >>> [hex(x) for x in i2c.scan()] |
| 53 | +# >>> i2c.unlock() |
| 54 | + |
| 55 | +def detect_range(count=5): |
| 56 | + """ take count=5 samples """ |
| 57 | + while count: |
| 58 | + for index, sensor in enumerate(vl53): |
| 59 | + print('Sensor {} Range: {}mm'.format(index + 1, sensor.range)) |
| 60 | + time.sleep(1.0) |
| 61 | + count -= 1 |
| 62 | + |
| 63 | +print("Multiple VL53L0X sensors' addresses are assigned properly\n" |
| 64 | + "execute detect_range() to read each sensors range readings") |
0 commit comments