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")