Linefollower
Funktion
Der Segway ist im Freifach "Technisch Innovative Projekte" am TGM entstanden.
Mein Teil des Projektes war eine Erweiterung zu entwerfen, die es dem Gefährt
ermöglichen soll, sich autonom fortzubewegen. Die Stabilisierung des Roboters
übernimmt ein LPC1768 Microcontroller von NXP Semiconductors. Zu diesem Zweck
wurde ein PID-Regler in C implementiert, dessen Ein- und Ausgabe über ein Cyclone-IV
FPGA von Altera geregelt wird. Auf der ersten Abbildung ist die Rückseite des
Segways zu sehen. Auf der linken Bildhälfte ist das Microcontrollerboard zu sehen,
während sich auf der rechten das FPGA befindet. Das FPGA wurde in VHDL programmiert
und ist über ein Binary Unit System (BUS) mit einer Datenleitung von 8 Bit und
einer Addressleitung von 3 Bit mit dem vorher genannten Microcontroller verbunden.
Die Schrittmotorcontroller befinden sich direkt unterhalb der Piezolautsprecher.
Es werden sieben der acht Adressen für den Beschleunigungssensor, das Gyroskop,
die Drucktaster, die Motorcontroller, das Display und den Rotaryencoder verwendet.
Dadurch bleibt für meine kameragesteuerte Erweiterung noch ein Byte im BUS über.
Da ein USB-Core in VHDL ein Ding der Unmöglichkeit für mich als Einzelperson
darstellt, habe ich mich für eine andere Schnittstelle mit dem Smartphone
entschieden. Die Wahl ist auf den Klinkenstecker des Handys gefallen, da er
durch sein zwangsläufig genaues Timing eine ideale asynchrone serielle Schnittstelle
abgibt. Ich verwende ihn aber trotz seiner analogen Möglichkeiten ausschließlich
als digitalen Ausgang.
Um das zu realisieren, wird mit dem FPGA ein auf dem Altera-PCB verbauter ADC
eingelesen und dessen zurückgelieferter Wert mit einem anhand des Oszilloskops
gewählten Threshhold verglichen. Auf dem rechten Bild ist ein solches Signal zu
sehen. Nachdem das Signal auf diese Weise digitalisiert wurde, muss es nur noch
parallelisiert und an das mbed zur Verarbeitung weitergegeben werden. Das weitergegebene
Signal ist eine 6 Bit Zahl (0-63), bei der "0 = linker Anschlag" und "63 = rechter
Anschlag" gilt. Die beiden übrigen Bits sind für ein Ende der Linie, beziehungsweise
für einen Blinker reserviert. Das mbed lässt diese Zahl nun separat in die Berechnung
des linken und des rechten Motorwertes einfließen. Falls das Bit, welches ein Linienende
signalisiert, gesetzt ist, versucht das mbed das Segway möglichst schnell zum Stillstand
zu bringen.
Das dritte Bild ist eine Bildschirmaufnahme der von mir geschriebenen App.
Um den Segway einer Linie nachfahren zu lassen, muss der Audio-Klinkenstecker
des Android-Smartphones mit den Analogeingängen des FPGAs verbunden werden
und die Medienlautstärke auf das absolute Maximum gestellt werden. Danach muss
durch Toucheingabe die Helligkeit der gewünschten Linie eingestellt werden.
Sobald das geschehen ist, wird unter Verwendung der Computervision-Library
OpenCV die Linie automatisch von der App erkannt und die Daten werden in das
oben beschriebene Binärformat konvertiert. Im Bild habe ich zu Demonstrationszwecken
die Binärzahl ausgeben lassen, welche zufälligerweise gerade eine genau zentrierte
Linie beschreibt. (1000002=3210, was der gerundeten Hälfte
von 64 entspricht) Die führende 1 signalisiert nur die rechts oben aktivierten
Blinker. Falls mehrere Linien erkannt werden, so wird die binär Repräsentierte
grün umrandet, während die Restliche(n) rot markiert werden. Mithilfe der rechten
und der linken Pfeiltasten kann eine Tendenz in die jeweilige Richtung bei einer
Kreuzung eingestellt werden, so wie es im anschließenden Video zu sehen ist.
Beim Entwickeln der App gab es Anfangs ein Problem, das die ausgegebenen Werte vollkommen wertlos gemacht hat, weil die Linie so gut wie nicht erkannt wurde. OpenCV verwendet das sogenannte HSV (Hue, Saturation und Value) Format. Als ich mit der App begonnen habe, habe ich mich dafür entschieden einen Spektralbereich des Hue-Wertes auszuwählen (wird in Grad angegeben), was bei verschiedenfarbigem Untergrund und Linie hervorragend funktioniert hat. Als ich das ganze aber versucht habe bei einem schwarz-weißen Kontrastverhältnis anzuwenden, hat sich herausgestellt, dass der Hue-Wert vollkommen zufällige Ergebnisse liefert.
Deshalb habe ich mich dafür entschlossen, wie im Screenshot zu sehen,
ein Spektrum auf einer Graustufenskala zu definieren. Ich habe die App bereits auf
4 verschiedenen Smartphones mit unterschiedlichen API-Levels getestet, es hat bei
allen zufriedenstellend funktioniert. Die App läuft sogar noch auf dem 2012
veröffentlichten Testgerät füssig und zuverlässig. Bei einem Galaxy S6 hat sich
der Rahmen jedoch innerhalb kürzester Zeit stark erhitzt, was wahrscheinlich auf
die dauerhaft aktivierte Hochleistungs-LED zurückzuführen ist. Den Blitz habe ich
per Programm angeschalten, da er für eine gleichmäßigere Ausleuchtung und somit
für zuverlässigere Ergebnisse der optischen Bilderkennung sorgt. Aktuell hat die
Firmware des Microcontrollers noch einen Bug, der zur Überhitzung der
Schrittmotoren führt, falls man sich zu lange in der Menüauswahl aufhält.