====== VL53L0X Time of Flight Sensor ====== Der [[ https://www.st.com/en/imaging-and-photonics-solutions/vl53l0x.html | 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 | | | XSHUT | | 3.3V | Vcc | | GND | GND | ==== Python Code ==== Die Sensoren können mit Hilfe des ''vl53l0x_helper'' Treibers im [[ https://gitlab.ost.ch/tech/inf/teaching/sysp/software/python-scripts/driver | 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 ''int''s (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 [[https://www.st.com/en/evaluation-tools/nucleo-l432kc.html | 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: * Ist bereits eine 3.3V Versorgung vorhanden, kann diese benutzt werden * Ist keine vorhanden, kann die 3V3 Versorgung des Nucleo STM32L432KC verwendet werden 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 {{.:vl53l0x_2.bin | 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.