Linienfolger mit PicoBasic                             

   von Leander Hackmann, DK1LH             

Elektronik-Labor  Projekte  Mikrocontroller  PicoBasic         




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.



https://www.roboter-bausatz.de/p/bausatz-line-follower-linien-folgender-autonomer-roboter

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:



Elektronik-Labor  Projekte  Mikrocontroller  PicoBasic