/ examples / vl53l0x_multiple_sensors.py
vl53l0x_multiple_sensors.py
 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")