diff --git a/docs/examples.rst b/docs/examples.rst index b7dc02b..b1b94d8 100644 --- a/docs/examples.rst +++ b/docs/examples.rst @@ -6,3 +6,9 @@ Ensure your device works with this simple test. .. literalinclude:: ../examples/vl53l1x_simpletest.py :caption: examples/vl53l1x_simpletest.py :linenos: + +Use set_address to update the I2C address of additional connected sensors. + +.. literalinclude:: ../examples/vl53l1x_set_address_multiple_sensors.py + :caption: examples/vl53l1x_set_address_multiple_sensors.py + :linenos: diff --git a/examples/vl53l1x_multiple_on_same_i2c_bus.py b/examples/vl53l1x_multiple_on_same_i2c_bus.py deleted file mode 100644 index 249d1e9..0000000 --- a/examples/vl53l1x_multiple_on_same_i2c_bus.py +++ /dev/null @@ -1,73 +0,0 @@ -# SPDX-FileCopyrightText: 2022 wrdaigle for Adafruit Industries -# -# SPDX-License-Identifier: MIT - -""" -Example of how to use the adafruit_vl53l1x library to change the assigned address of -multiple VL53L1X sensors on the same I2C bus. This example only focuses on 2 VL53L1X -sensors, but can be modified for more. BE AWARE: a multitude of sensors may require -more current than the on-board 3V regulator can output (typical current consumption during -active range readings is about 19 mA per sensor). -""" -import time -import board -from digitalio import DigitalInOut -from adafruit_vl53l1x import VL53L1X - -# declare the singleton variable for the default I2C bus -i2c = board.I2C() - -# declare the digital output pins connected to the "SHDN" pin on each VL53L1X sensor -xshut = [ - DigitalInOut(board.D16), - DigitalInOut(board.D17), - # add more VL53L1X sensors by defining their SHDN pins here -] - -for power_pin in xshut: - # make sure these pins are a digital output, not a digital input - power_pin.switch_to_output(value=False) - # These pins are active when Low, meaning: - # if the output signal is LOW, then the VL53L1X sensor is off. - # if the output signal is HIGH, then the VL53L1X sensor is on. -# all VL53L1X sensors are now off - -# initialize a list to be used for the array of VL53L1X sensors -vl53 = [] - -# now change the addresses of the VL53L1X sensors -for i, power_pin in enumerate(xshut): - # turn on the VL53L1X to allow hardware check - power_pin.value = True - # instantiate the VL53L1X sensor on the I2C bus & insert it into the "vl53" list - vl53.insert(i, VL53L1X(i2c)) # also performs VL53L1X hardware check - # no need to change the address of the last VL53L1X sensor - if i < len(xshut) - 1: - # default address is 0x29. Change that to something else - vl53[i].set_address(i + 0x30) # address assigned should NOT be already in use -# there is a helpful list of pre-designated I2C addresses for various I2C devices at -# https://learn.adafruit.com/i2c-addresses/the-list -# According to this list 0x30-0x34 are available, although the list may be incomplete. -# In the python REPR, you can scan for all I2C devices that are attached and detirmine -# their addresses using: -# >>> import board -# >>> i2c = board.I2C() -# >>> if i2c.try_lock(): -# >>> [hex(x) for x in i2c.scan()] -# >>> i2c.unlock() - - -def detect_range(count=5): - """take count=5 samples""" - while count: - for index, sensor in enumerate(vl53): - print("Sensor {} Range: {}mm".format(index + 1, sensor.distance)) - time.sleep(1.0) - count -= 1 - - -detect_range() -print( - "Multiple VL53L1X sensors' addresses are assigned properly\n" - "execute detect_range() to read each sensors range readings" -) diff --git a/examples/vl53l1x_set_address_multiple_sensors.py b/examples/vl53l1x_set_address_multiple_sensors.py new file mode 100755 index 0000000..338e678 --- /dev/null +++ b/examples/vl53l1x_set_address_multiple_sensors.py @@ -0,0 +1,68 @@ +# SPDX-FileCopyrightText: 2022 wrdaigle for Adafruit Industries +# SPDX-FileCopyrightText: 2022 Kattni Rembor for Adafruit Industries +# +# SPDX-License-Identifier: MIT +""" +VL53L1X multiple sensor I2C set_address demo. + +This example is written for two sensors, but it can easily be modified to include more. + +NOTE: A multitude of sensors may require more current than the on-board 3V regulator can output. +The typical current consumption during active range readings is about 19 mA per sensor. +""" + +import time +import board +import digitalio +import adafruit_vl53l1x + +# Define the I2C pins. +i2c = board.I2C() + +xshut = [ + # Update the D6 and D5 pins to match the pins to which you wired your sensor XSHUT pins. + digitalio.DigitalInOut(board.D6), + digitalio.DigitalInOut(board.D5), + # Add more VL53L1X sensors by defining their XSHUT pins here. +] + +for shutdown_pin in xshut: + # Set the shutdown pins to output, and pull them low. + shutdown_pin.switch_to_output(value=False) + # These pins are active when Low, meaning: + # If the output signal is LOW, then the VL53L1X sensor is off. + # If the output signal is HIGH, then the VL53L1X sensor is on. +# All VL53L1X sensors are now off. + +# Create a list to be used for the array of VL53L1X sensors. +vl53l1x = [] + +# Change the address of the additional VL53L1X sensors. +for pin_number, shutdown_pin in enumerate(xshut): + # Turn on the VL53L1X sensors to allow hardware check. + shutdown_pin.value = True + # Instantiate the VL53L1X I2C object and insert it into the vl53l1x list. + # This also performs VL53L1X hardware check. + sensor_i2c = adafruit_vl53l1x.VL53L1X(i2c) + vl53l1x.append(sensor_i2c) + # This ensures no address change on one sensor board, specifically the last one in the series. + if pin_number < len(xshut) - 1: + # The default address is 0x29. Update it to an address that is not already in use. + sensor_i2c.set_address(pin_number + 0x30) + +# Print the various sensor I2C addresses to the serial console. +if i2c.try_lock(): + print("Sensor I2C addresses:", [hex(x) for x in i2c.scan()]) + i2c.unlock() + +# Start ranging for sensor data collection. +for sensor in vl53l1x: + sensor.start_ranging() +while True: + # Extract the appropriate data from the current list, and print + # the sensor distance readings for all available sensors. + for sensor_number, sensor in enumerate(vl53l1x): + if sensor.data_ready: + print("Sensor {}: {}".format(sensor_number + 1, sensor.distance)) + sensor.clear_interrupt() + time.sleep(0.5)