7 Distanzmessung
Einführung
Ziel dieser Übung ist es Distanzmessungen mit dem VL53L5CX Sensor kennen zu lernen und die Sensordaten auszulesen und testen. Der VL53L5CX ist ein 8x8 Time of Flight (ToF) Array Sensor, der über eine I2C Schnittstelle mit dem Raspberry Pi verbunden wird und einer Python Library angesteuert werden kann.
Unterlagen: E04_Distanzmessung.zip
Vorbereitung
- Schaut folgende von Video von Adafruit Industries zur Funktionsweise des VL53L5CX Sensors an: EYE ON NPI - ST VL53L5CX Time-of-Flight Ranging Sensor
- Studiere das Datenblatt zum VL53L5CX (STMicroelectronics, 2021), sowie die Application Note (STMicroelectronics, 2023)
- In welchen Temperaturbereichen kann der Sensor eingesetzt werden?
- Welches ist die höchste Abtastrate für die Distanzfeldmessungen?
- Was sind Anwendungsgebiete für diesen Sensor?
Unterlagen | |
---|---|
Produkt | VL53L5CX Breakout |
Datenblatt | VL53L5CX |
GitHub | vl53l5cx-python |
VL53L5CX 8x8 Time of Flight (ToF) Array Sensor
Der VL53L5CX ist hochentwickelter Distanzsensor mit einer 8x8-Multizonenmessung und einem großen Sichtfeld, ideal für Roboter und fortschrittliche Bewegungserkennung. Der mit die Entfernung mit Time of Flight (ToF), also mit der Laufzeit von Licht, indem er einen Infrarotlaser mit geringer Leisten auf ein Ziel schickt und die Zeit misst, die das Licht benötigt, um zurückzukehren.
Dieser Sensor hat eine hohe Genauigkeit und Abtastfrequenz (bis zu 60 Hz) und einen großen Erfassungsbereich (von 2 cm bis 4 m). Besonders interessant ist, dass der Sensor nicht nur eine Messung durchführt, sondern eine 8x8 Matrix mit Messwerten zurückgibt. Das bedeutet, das Bewegungen aus bestimmten Richtungen erkannt werden können oder der Sensor benutzt werden kann um Kollisionen zu vermeiden oder Objekte zu verfolgen ohne dass mehrere Sensoren benötigt werden.
VL53L5CX 8x8 Time of Flight (ToF) Array Sensor Breakout
- 8x8 Multizone readings
- Distance 2cm - 4m
- I2C interface, with address: 0x52
- Python, C Library
Übungsaufbau
- Schliesse den Raspberry Pi an Monitor, Keyboard und Maus an oder verbinde Dich mit diesem über SSH (und SFTP).
- Erstelle auf dem Raspberry Pi im
Documents
Ordner einen neuen OrdnerVL53L5CX
, in welchem Du Änderungen und neue Dateien für diese Übung speichern kannst. - Schliesse den Sensor VL53L5CX an den Raspberry Pi über die Breakout Garden I2C Schnittstelle korrekt an (siehe E01 Luftqualität), so dass die Beschriftung der Anschlüsse am Sensor und bei der Schnittstelle übereinstimmen.
- Kontrolliere mit dem Befehl
i2cdetect -y 1
ob der Raspberry Pi mit dem Sensor verbunden ist. Der Sensor sollte auf der Adresse0x29
erkannt werden. - Aktiviere die virtuelle Environment von Python mit
source ~/.env/bin/activate
und kontrolliere, ob die Librariesvl53l5cx_ctypes
undst7789
installiert sind mitpython -c "import st7789"
undpython -c "import vl53l5cx_ctypes"
. Bei einer Fehlermeldung muss die jeweilige fehlende Library in der aktivierten virtuellen Environment mitpip install st7789
oderpip install vl53l5cx_ctypes
installiert werden.
Wechsle in den Ordner Documents und kopiere mit folgenden Befehlen die Library auf Deinen Raspberry Pi.
cd Documents
git clone https://github.com/pimoroni/vl53l5cx-python
cd vl53l5cx-python/examples
Aufgabe 1: Distanzmessung Konsole
Teste das Beispiel test.py
im Ordner examples. Dieses Beispiel liest die Werte der 8x8 Time of Flight Messung aus mit Werten zu motion, distance, reflectance und status aus.
Das Script startet langsam, da die Library jeweils die Firmware beim Starten lädt.
Startet das Script mit python test.py
. Mit Ctrl+C
kann das Script wieder gestopppt werden. Die Ausgabe sollte in etwa so aussehen (gekürzt):
python3 test.py
Uploading firmware, please wait...
Done!
[[ 36 26 2356 543]
[ 38 62 1943 3847]
[ 27 68 530 6744]
[ 14 18 66 458]] [[1254 308 406 2042 365 377 314 237]
[1275 351 397 413 404 403 354 228]
[1297 357 375 432 427 422 391 241]
[1250 348 385 389 415 437 398 315]
[1273 358 358 385 405 429 400 363]
[1238 336 2240 368 424 417 379 336]
[1262 226 2215 180 188 218 202 190]
[ 108 110 113 117 116 120 120 124]] [[23 1 2 30 11 8 27 41]
[16 1 3 4 4 17 43 35]
[23 1 2 6 5 21 58 32]
[21 1 2 4 6 32 62 52]
[27 1 3 5 9 36 65 71]
[27 1 59 5 16 47 52 46]
[26 1 39 6 9 20 20 21]
[13 13 14 14 15 16 17 20]] [[False False False True False False True True]
[ True False False False False True True True]
[ True False False False False True True True]
[ True False False False False True True True]
[ True False False False False True True True]
[ True False True False True True True True]
[ True False False True True True True True]
[ True True True True True True True True]]
Folgendes Code Snippet zeigt eine gekürzte Version des test.py
Python Beispiels für die Ausgabe der Distanzmatrix.
import time
import numpy
import vl53l5cx_ctypes as vl53l5cx
from vl53l5cx_ctypes import STATUS_RANGE_VALID, STATUS_RANGE_VALID_LARGE_PULSE
print("Uploading firmware, please wait...")
1= vl53l5cx.VL53L5CX()
vl53 print("Done!")
28 * 8)
vl53.set_resolution(8 * 8)
vl53.enable_motion_indicator(# vl53.set_integration_time_ms(50)
# Enable motion indication at 8x8 resolution
8 * 8)
vl53.enable_motion_indicator(# Default motion distance is quite far, set a sensible range
# eg: 40cm to 1.4m
400, 1400)
vl53.set_motion_distance(3
vl53.start_ranging()
while True:
if vl53.data_ready():
4= vl53.get_data()
data # 2d array of motion data (always 4x4?)
= numpy.flipud(numpy.array(data.motion_indicator.motion[0:16]).reshape((4, 4)))
motion # 2d array of distance
= numpy.flipud(numpy.array(data.distance_mm).reshape((8, 8)))
distance # 2d array of reflectance
= numpy.flipud(numpy.array(data.reflectance).reshape((8, 8)))
reflectance # 2d array of good ranging data
= numpy.isin(numpy.flipud(numpy.array(data.target_status).reshape((8, 8))), (STATUS_RANGE_VALID, STATUS_RANGE_VALID_LARGE_PULSE))
status print(motion, distance, reflectance, status)
0.1) time.sleep(
- 1
- Sensor initialisieren und Firmware laden
- 2
- Sensor konfigurieren (Auflösung, Bewegungserkennung, Messbereich)
- 3
- Messung initialisieren
- 4
- Warten 0.1 Sekunden (damit die Ausgabe nicht zu schnell ist)
Übung 7.1 Bewegungsmessung
- Führe das Beispiel
test.py
aus und beobachte die Messwerte. - Führe unterschiedliche Tests durch, indem Du ein Objekt vor den Sensor hältst und bewegst.
- Vergleiche die Messwerte und kontrolliere die gemessenen Distanzen.
- Untersuche die einzelnen Matrizen und versuche die Bedeutung der einzelnen Werte zu verstehen.
Aufgabe 2: Distanzmessung mit LCD Bildschirm
Folgende Aufgabe nutzt den 1.54” LCD Bildschirm mit einer 240x240 Pixel Auflösung. Die Library vl53l5cx_ctypes
enthält mehrere Beispiele, die die Distanzmatrizen für die Distanz-, Bewegungs- und Reflektanzmessung auf dem Bildschirm anzeigen. Die Beispiele sind im Ordner examples
zu finden.
Vorbereitung
- Kontrolliert mit
python -c "import st7789"
ob die Library st7789 installiert ist. Testet auch, ob die Bibliothekennumpy
undmatplotlib
installiert sind und installiert diese ansonsten mitsudo apt install python3-matplotlib python3-numpy
. - Kontrolliere, ob der Raspberry Pi den Breakout Garden HAT mit den 2 SPI Anschlüssen und 4 I2C Anschlüssen bestückt ist (Abb. 7.2).
- Montiere den Bildschirm im hinteren SPI Slot des Breakout Garden HATs wie in Abb. 7.2, da er sonst die Messung des VL53L5CX Sensors verdeckt.
Führt nun folgende Scripts aus und beobachtet die Ausgabe auf dem LCD Bildschirm. Auch hier braucht es etwas Geduld, da die Firmware beim Starten geladen wird.
python distance_240x240_lcd.py
python motion_240x240_lcd.py
python reflectance_240x240_lcd.py
python object_tracking.py
Übung 7.2 Distanzmessung
- Führe die Beispiele aus und beobachte die Ausgabe auf dem LCD Bildschirm.
- Untersuche die einzelnen Matrizen und versuche die Bedeutung der einzelnen Werte zu verstehen.
- Führe unterschiedliche Tests durch, indem Du ein Objekt vor den Sensor hälst und bewegst.
- Was passiert wenn Du ein Objekt vor den Sensor hältst? Ist die Form erkennbar?
- Was passiert wenn Du ein Objekt vor den Sensor hältst und bewegst?
- Studiere den Code der Beispiele und versuche die Funktionsweise zu verstehen.
- Überlege Dir Anwendungsfälle für diesen Sensor allgemein und im speziellen für die Geomatik.