Ich habe mich an einem kleinen Roboter mit dem CH32V003-Board und
PicoBasic versucht. Auf den chinesischen Großhandelsplattformen wird
ein günstiger (ca. 3,50€ inklusive Versand) Bausatz für einen
Linienfolger angeboten. Die Steuerungslogik ist normalerweise analog
mit einem Komparator LM393 ausgeführt und wird in diesem Aufbau durch
den Microcontroller ersetzt.
Ein Blick in den Schaltplan zeigt, dass der Komparator einfach
weggelassen und der Microcontroller diesen direkt ersetzen kann. Ich
habe dazu anstatt des IC-Sockels feine Litzen eingelötet und mit Hilfe
von zwei M3-Abstandsbolzen und einem Stück Lochrasterkarte ein kleines
Steckbrett montiert. Die passenden Bohrungen waren schon vorhanden. So
lassen sich Änderungen und Erweiterungen einfach umsetzen. Als
Stromversorgung kam ein Akku aus einer verbrauchten E-Zigarette anstatt
der vorgesehenen AA-Zellen zum Einsatz.
Das Board wurde mit dem Sockel des LM393 folgendermaßen verbunden:
Zunächst habe mit den beiden Potentiometern R1 und R2 die Sensoren
abgestimmt. Hierbei hat sich das TestLab als sehr hilfreich erwiesen,
da ich die Werte von AD0 und AD1 zeitgleich plotten und somit
abgleichen konnte. Im Plot konnte auch die Wertänderung beim Überfahren
der schwarzen Linie getestet werden:
Wertänderung beim Überfahren der schwarzen Linie mit dem rechten LDR (AD1)
Auch die Motoren konnten mit den beiden Schiebereglern für PWM1 und
PWM2 getestet werden. Es ist ersichtlich, dass durch den Einsatz der
LDRs als unterer Widerstand in den Spannungsteilern die Spannung und
dadurch der von den ADCs gemessene Wert beim Überfahren einer Linie
ansteigt. Zudem ist die Ansteuerung der Motoren invertiert: je
niedriger der Wert für den Duty-Cycle der PWMs, desto höher ist die
Drehzahl der Motoren. Ich habe keine Invertierung eingebaut, um den
Aufbau so einfach wie möglich zu halten. Es würde sich natürlich
anbieten die PNP-Transistoren durch beliebige NPN-Transistoren zu
ersetzen oder auf dem Steckbrett eine Inverter-Stufe vorzuschalten.
In dem angefügten Listing befindet sich ein einfacher Algorithmus,
welcher auf einfachste Art und Weise die Funktionalität des
Linienfolgers umsetzt. Wenn kein Objekt erkannt wurde, fährt der
Roboter geradeaus. Wird die Linie mit dem rechten LDR überfahren, wird
nach rechts gedreht. Für die linke Seite wird analog verfahren. Zur
Objekterkennung werden die Messwerte der ADCs miteinander verglichen.
Für den Vergleich wird ein Trick angewendet, da durch den erlaubten
Wertebereich der Variablen von 0-255 die beiden Messwerte nicht direkt
voneinander subtrahiert werden dürfen, weil es ansonsten zu einem
Underflow kommen könnte. Stattdessen wird auf den Messwert eines
Sensors eine Konstante addiert und getestet, ob der Messwert des
anderen Sensors größer ist als das Ergebnis der Addition. Ist der Wert
des anderen Sensors (auf dessen Messwert die Konstante nicht addiert
wurde) größer, so muss sich dieser auf der Linie befinden.
Die Größe der Konstante (im Listing 20) ergibt sich aus der
Wertänderung beim Überfahren der schwarzen Linie und muss experimentell
ermittelt werden. Sie muss allerdings kleiner als der Betrag der
Differenz der beiden Messwerte sein, wenn sich ein Sensor auf der Linie
befindet. Natürlich sind auch diverse andere kleine Projekte mit dieser
Plattform möglich; der Fantasie sind keine Grenzen gesetzt. Die
Lochrasterplatine lädt zum Experimentieren und Erweitern ein. Mit
PicoBasic lassen sich spielerisch die verschiedensten Funktionalitäten
umsetzen.
L1:
Rem Messung AD0
0x3C00 A = AD0
0x3600 C = A
Rem Messung AD1
0x3D00 A = AD1
0x3800 D = A
Rem Test Linie rechts
0x3700 A = C
0x0214 B = 20
0x2A00 A = A + B
0x3400 B = A
0x3900 A = D
0x2313 If A>B Goto L2:
Rem Test Linie links
0x3900 A = D
0x0214 B = 20
0x2A00 A = A + B
0x3400 B = A
0x3700 A = C
0x2316 If A>B Goto L3:
Rem Geradeaus
0x1014 PWM1 = 20
0x1114 PWM2 = 20
0x2000 Goto L1:
Rem Rechtsdrehung
L2:
0x1014 PWM1 = 20
0x11FF PWM2 = 255
0x2000 Goto L1:
Rem Linksdrehung
L3:
0x10FF PWM1 = 255
0x1114 PWM2 = 20
0x2000 Goto L1: