Skip to content

Time of Flight Distance Sensor Lab

In this lab we create a program that will show the distance measured by the Time-of-Flight sensor by printing the distance on the console and also displaying the distance on 11 blue LEDs.

First, make sure you have your driver for the Time-of-Flight sensor installed.

You can copy the code from here and save it in the file VL53L0X.py. Note the zero between the "L" and "X" in the file name, not the letter "O".

We use a non-linear distance scale as we get closer to an object. We store the numbers of each LED and the distance it should change in a lists:

1
2
blue_led_pins = [2, 3, 4,  5,  6,  7,  16, 17, 26, 27, 28]
dist_scale =    [2, 6, 10, 20, 30, 40, 50, 60, 80, 110, 150]

Calibration

There are three numbers you can change when you calibrate the sensor:

1
2
3
ZERO_DIST = 60 # The value of the sensor when an object is 0 CM away
MAX_DIST = 1200 # max raw distance we are able to read
SCALE_DIST = .3 # multiplier for raw to calibrated distance in CM

Full Program

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
# Demo for Maker Pi RP2040 board using the VL32L0X time of flight distance sensor
# Note the driver I used came from here: https://github.com/CoderDojoTC/micropython/blob/main/src/drivers/VL53L0X.py
# Perhaps derived from here: https://github.com/uceeatz/VL53L0X/blob/master/VL53L0X.py

# This demo makes the blue LEDs show the distance and prints the distance on the console
import machine
import time
import VL53L0X

sda=machine.Pin(0) # row one on our standard Pico breadboard
scl=machine.Pin(1) # row two on our standard Pico breadboard
i2c=machine.I2C(0, sda=sda, scl=scl, freq=400000)
# print("Device found at decimal", i2c.scan())

# The Maker Pi RP2040 has 13 fantastic blue GPIO status LEDs which we can use 11
# The distance scale is non linear
# GP0 and GP1 will always be on since they are the I2C Data and Clock
blue_led_pins = [2, 3, 4,  5,  6,  7,  16, 17, 26, 27, 28]
dist_scale =    [2, 6, 10, 20, 30, 40, 50, 60, 80, 110, 150]
number_leds = len(blue_led_pins)
led_ports = []
delay = .05

# initial calibration parameters
ZERO_DIST = 60
MAX_DIST = 1200 # max raw distance we are able to read
SCALE_DIST = .3 # multiplier for raw to calibrated distance

# create a list of the ports
for i in range(number_leds):
   led_ports.append(machine.Pin(blue_led_pins[i], machine.Pin.OUT))

# Create a VL53L0X object
tof = VL53L0X.VL53L0X(i2c)


# get the normalized time-of-flight distance
def get_distance():
    global zero_dist, scale_factor
    tof_distance = tof.read()
    if tof_distance > MAX_DIST:
        return tof_distance
    # if our current time-of-flight distance is lower than our zero distance then reset the zero distance
    if tof_distance < ZERO_DIST:
        zero_dist = tof_distance
    return  int((tof_distance - ZERO_DIST) * SCALE_DIST)

# use the dist_scale to turn on LEDs
def led_show_dist(in_distance):
    global number_leds
    for led_index in range(0, number_leds):
        if in_distance > dist_scale[led_index]:
            led_ports[led_index].high()
        else:
            led_ports[led_index].low()

print('Using', number_leds, ' blue leds to show distance.')

# blue up
for i in range(0, number_leds):
    led_ports[i].high()
    time.sleep(delay)
    led_ports[i].low()
# blue down
for i in range(number_leds - 1, 0, -1):
    led_ports[i].high()
    time.sleep(delay)
    led_ports[i].low()

# start our time-of-flight sensor
tof.start()
# autocalibrate the minimum distance
min_distance = 1000


# loop forever
while True:
    raw_distance = get_distance()
    # recalibrate if we have a new min distance
    if raw_distance < min_distance:
        min_distance = raw_distance
    calibrated_distance = raw_distance - min_distance
    print(raw_distance, calibrated_distance)
    led_show_dist(calibrated_distance)
    time.sleep(0.05)

# clean up
tof.stop()

References

Kevin McAleer's GitHub Repo on the Vl53lx0 Kevin McAleer's 662 line driver - I am not sure we need all 662 lines of code. Kevin McAleer's Time of Flight Test