Inhaltsverzeichnis

VL53L0X Time of Flight Sensor

Der VL53L0X ist eine neue Generation von ToF Sensoren, die genaue Distanzmessungen bis 2m erlaubt.

Verwendung mit Python unter Linux auf dem Zynq7000

Der VL53L0X wird direkt an eine I2C-Schnittstelle angeschlossen.

Zynq7000 VL53L0X
MIO10 SCL
MIO11 SDA
<FlinkGPIO channel> XSHUT
3.3V Vcc
GND GND

Python Code

Die Sensoren können mit Hilfe des vl53l0x_helper Treibers im driver Repository initialisiert werden.

Der XSHUT Pin jedes VL53L0X Sensor benötigt einen eigenen FlinkGPIO Kanal. Die Pins/Kanäle sind init_vl53l0x als Liste von ints (Ganzzahlen) zu übergenen. Die Anzahl Sensoren leitet sich aus der Anzahl an GPIO Kanälen ab, mit denen init_vl53l0x aufgerufen wird. init_vl53l0x gibt die initialisierten Sensoren als Liste zurück. Das Aufrufen von get_distance() auf einem Listenelement liefert den aktuellen Messwert des entsprechenden Sensors.

Beispiel: sensors = init_vl53l0x([0, 1]) initialisiert 2 Sensoren. sensors[0] verwendet FlinkGPIO Kanal 0 und sensors[1] verwendet FlinkGPIO Kanal 1. sensors[0].get_distance() liefert den aktuellen Messwert des ersten Sensors (GPIO 0), während sensors[1].get_distance() den Messwert des 2. Sensors (GPIO 1) zurück gibt.

Komplettes Beispiel:

from vl53l0x_helper import init_vl53l0x
 
# initialize 2 ToF sensors conected to FlinkGPIO channels 0 and 1
tofs = init_vl53l0x([0, 1])
 
# print measurements
for _ in range(1, 11):
    # combine all measurements into 1 string to print everything on one line
    line = " ".join(["% d" % tof.get_distance() for tof in tofs])
    print("distance %s" % line)

Verwendung mit Deep auf dem MPC555 / Zynq7000

Der VL53L0X kann mit dem MPC55 und dem Zynq7000 verwendet werden. Es wird jedoch ein zweiter Mikrocontroller zum Anschluss an diesen benötigt. Die OST stellt eine fertige Firmware für das Nucleo STM32L432KC Board zur Verfügung. Es können maximal 4 Sensoren angesteuert werden.

Verdrahtung MPC555

MPC555 STM32L432KC
SCK PA1 (A1)
MISO PA11 (D10)
MOSI PA7 (A6)
PCS 2 PB0 (D3)
GND GND

Verdrahtung Zynq7000

Zynq7000 STM32L432KC Funktion
MIO 12 PA1 (A1) CLK
MIO 11 PA11 (D10) MISO
MIO 10 PA7 (A6) MOSI
MIO 13 PB0 (D3) CS
GND GND GND

Anmerkung: die relevanten Pins des STM32L432KC sind 5V tolerant, es sind also keine Pegelwandler nötig.

STM32L432KC VL53L0X
PA9 (D1) SCL
PA10 (D0) SDA
PA3 (A2) XSHUT (Sensor 1)
PA4 (A3) XSHUT (Sensor 2)
PA5 (A4) XSHUT (Sensor 3)
PA6 (A5) XSHUT (Sensor 4)
GND GND

Stromversorgung

Die VL53L0X Sensoren benötigen eine Versorgungsspannung von 3.3V. Hier bieten sich 2 Möglichkeiten an:

Das Nucleo STM32L432KC Board kann mit 3.3V oder 5V gespeist werden.

Nucleo STM32L432KC Board Programmieren

Wird das Nucleo STM32L432KC Board per USB mit dem PC verbunden, meldet es sich als USB Massenspeicher an. Die Firmware kann einfach in Form der .bin Datei auf das Board kopiert werden. Das Board durchläuft automatisch einen Reset und ist nun programmiert.

Die Firmware kann hier bezogen werden.

Verwendung in Deep

Der Deep Treiber ist unter org.deepjava.runtime.mpc555.driver.VL53L0X oder org.deepjava.runtime.zynq7000.driver.VL53L0X zu finden.

Initialisierung

Der/Die Sensor(en) werden im Konstruktor

VL53L0X(int numSensors) 

initialisiert.

Beispiele:

4 Sensoren initialisieren:

VL53L0X tof = new VL53L0X(4);

2 Sensoren initialisieren:

VL53L0X tof = new VL53L0X(2);

Distanzen lesen

Zum Lesen der Sensorwerte wird die read() Methode verwendet. Diese gibt ein Array mit so vielen Elementen zurück, wie Sensoren im Konstruktor initialisert wurden. Die Messwerte sind vom Typ short (16bit Ganzzahl).

data = tof.read();

Ist der Messbereich des Sensors überschritten, wird für diesen Sensor von 16000 zurückgeliefert. Bei einer fehlerhaften Messung wird ein Wert ≤ 0 zurückgeliefert.

Nach der Initialisierung oder einem reset der Sensoren sollte vor dem Auslesen mit der Methode resetDone() überprüft werden, ob die Sensoren bereit sind.

// Nur MPC555
if (tof.resetDone())
{
  short[] data = tof.read();
}

Reset (nur MPC555)

Die reset() Methode veranlasst einen Reset die STM32L432KC und der Vl53L0X Sensoren. Ein Reset kann mehrere Sekunden dauern. Mit resetDone() kann überprüft werden, ob der Reset abgeschlossen ist.

Debugging / Troubleshooting

Das Nucleo STM32L432KC bietet eine virtuelle serielle Schnittstelle über USB, wenn es mit einem PC verbunden ist. Über diese werden Debuginformationen über den internen Zustande des Mirkocontrollers sowie die Messwerte ausgegeben. Funktioniert die Kommunikation nicht korrekt, kann sich hier ein Überblick verschafft werden, wo die Ursache liegen könnte.

Des Weiteren leuchet LD3 (grüne LED unten links, wenn USB Port oben), wenn der STM32L432KC auf einen SPI Transfer wartet und erlischt während dem Messvorgang. Diese sollte im normalen Betrieb blinken. Das GPIO Signal der LED ist auf Pin D13 am Board zu finden.