Ein LineFollow-Roboter folgt, wie der Name vermuten lässt, autonom einer Linie. Im vorgestellten Projekt dienen zwei Infrarot-Sensoren zur Prüfung, ob und in welche Richtung der Roboter von der Linie abweicht. Diese Information verarbeitet der Calliope mini und steuert entsprechend die Motoren an. In einem Pseudo-Code sähe das simple Programm also so aus:
wiederhole unendlich
{
wenn (abweichung von linie nach links) steuere nach rechts
wenn (abweichung von linie nach rechts) steuere nach links
wenn (keine abweichung von linie) fahre gerade aus
}
VideoVorbereitungZur Vorbereitung des Projekts sollte man die 26 Ein-/Ausgabepins und die 5 bzw. 6 Motorpins (je nach Version) des Calliope mini mit Buchsen- oder Pinleisten verlöten. Ich habe mich für Buchsenleisten entschieden, da diese stabiler sind als Pins, die schneller verbiegen. Es gibt im Fachhandel (oder auch bei Amazon) schon passende 2x13 Buchsenleisten zu kaufen.
Das von mir verwendete Chassis kann ich nicht ohne Einschränkung empfehlen: Die Motoren mit den Rädern sitzen etwas wackelig am Chassis (was allerdings keinen bzw. keinen merkbaren Einfluss auf das Fahrverhalten hat). Außerdem waren an den Motoren keine Kabel verlötet, so dass dies auch manuell vorgenommen werden musste.
Außerdem ist das Chassis mit einem 4, 5V-Batterie-Pack ausgestattet. An den Calliope mini sollten allerdings 9V angeschlossen werden. Daher war der Kauf eines 9V-Blocks und einer entsprechenden Fassung nötig.
Beim Thema Motorspannung ist mir auch folgendes aufgefallen: Die Motoren benötigen eine gewisse Schwellenspannung, um überhaupt zu drehen. Das hat zur Folge, dass die Motoren mit dem makecode-Befehl
motors.dualMotorPower(Motor.A, 43)
erst ab einer Schwelle von 43% anlaufen. Evtl. ist dies bei höherwertigen Motoren nicht der Fall.
Die Ausrichtung der Motoren am Chassis spielt keine Rolle. Durch die spätere Verkabelung am Calliope mini kann man sicherstellen, dass beide Motoren den kleinen Roboter vorwärts (und nicht rückwärts) treiben. Ich habe mich daher aus Symmetriegründen dafür entschieden, die Pole der Motoren nach innen zu legen.
Ansonsten benötigt man natürlich noch Jumper-Kabel und ggf. Platinenabstandshalter, um den Calliope mini sicher am Chassis zu verschrauben. Ich habe solche mit einer Länge von 2cm gewählt, so hat die Batterie unter der Platine Platz.
AufbauNachdem das Chassis und die Motoren aufgebaut sind, die Buchsenleisten an den Motorpins und an den 23 IO-Pins verlötet sind, können wir mit dem Aufbau beginnen:
Die Infrarot-Diode und der Infrarot-Sensor werden zunächst aus ihrer Ausrichtung längs zur Platine verbogen, so dass sie senkrecht zur Platine ausgerichtet sind. Dann werden die beiden Infrarot-Sensoren mit Jumper-Kabeln bestückt und mit 2, 5cm langen Platinenabstandshaltern (ich habe 2cm und 0, 5cm lange kombiniert) vorne am Chassis befestigt. Die Kabel habe ich unter dem Chassis mit Kabelbinder zusammen- und nach hinten zur Platine geführt. Zur Kalibrierung der IR-Sensoren mittels der Potentiometer wird später in einem separaten Abschnitt noch etwas gesagt.
Der + Pol (VCC) des linken IR-Sensors habe ich mit dem linken +3v3-Pin der 26 IO-Pins verbunden, den - Pol (GND) mit dem linken GND der 26 IO-Pins. Den OUT-Ausgang des IR-Sensors habe ich mit dem Pin C0 der 26 IO-Pins verbunden.
Der rechte IR-Sensor wurde entsprechend am rechten Rand der 26 IO-Pins mit +3v3, GND und C19 verkabelt (siehe Skizze).
Der linke Motor wurde an den Motor-Pin A und den benachbarten GND-Pin angeschlossen. Der rechte Motor entsprechend an den Motor-Pin B und GND. An den Motoren selbst sind die Pole nicht gekennzeichnet, daher verkabelt man die Motoren zunächst mit einer beliebigen Polung und polt dann ggf. um, wenn man feststellt, dass einer oder beide Motoren falsch herum drehen.
Der + Pol des 9V-Block wird an den VM (max. 9V) Pin der Motor-Pins (5. Pin von links) angeschlossen. Der - Pol des 9V-Block wird entweder an den seit der Calliope Version 1.3 vorhandenen 6. Motor-Pin oder, wenn nur 5 Motor-Pins vorhanden sind, an einen beliebigen GND Pin, z.B. mittig an den 26 IO-Pins angeschlossen.
CodeDer Code wurde mit dem makecode-Editor erstellt. Der vollständige Code befindet sich am Ende des Projekts. In diesem Abschnitt werden einige Ideen erläutert.
Beim Start werden Initialisierungen vorgenommen:
fConfig = 0
mleft = 0
mright = 0
mleft_before = 0
mright_before = 0
irleft = 0
irright = 0
fCalib = 0
go = 0
vmax = 50
pins.setPull(DigitalPin.P0, PinPullMode.PullUp)
pins.setPull(DigitalPin.C19, PinPullMode.PullUp)
Die letzten beiden Zeilen sind nötig, damit die Pins P0 und C19 zum Auslesen der IR-Sensor Signale verwendet werden können.
In der Hauptschleife gibt es drei Äste:
if (go == 1) {
...
} else if (fCalib == 1) {
...
} else {
basic.showIcon(IconNames.Yes)
}
Ist das Flag go gesetzt (durch Tastendruck A geschieht dies), so befindet sich der Roboter im lineFollow-Modus: Die IR-Sensor-Signale werden ausgelesen
irleft = pins.digitalReadPin(DigitalPin.P0)
irright = pins.digitalReadPin(DigitalPin.C19)
und der Calliope mini steuert die Motoren an, z.B.:
...
} else if (irleft == 0 && irright == 1) {
mleft = 0
mright = vmax
} ...
Hier ist zu beachten, dass
irleft = pins.digitalReadPin(DigitalPin.P0)
eine 0 liefert, wenn der IR-Sensor ein Signal hat und eine 1 liefert, wenn der IR-Sensor kein Signal hat. Im obigen else-if-Zweig hat also der linke IR-Sensor ein Signal, der rechte hat kein Signal. D.h. dass sich unter dem linken IR-Sensor die weiße Linie befindet. Das wiederum heißt, dass der Roboter nach links steuern muss, was dann geschieht indem der Variable mleft auf 0 und mright auf vmax (=50) gesetzt wird. mleft und mright speichern, mit wie viel Prozent der maximalen Drehzahl die Motoren laufen. Diese Variablen werden weiter unten benutzt, um die Motoren anzusteuern.
Ist das Flag fCalib gesetzt (durch Tastendruck B geschieht dies), so befindet sich der Roboter im Kalibrierungsmodus: Die IR-Sensoren werden ausgelesen, aber die Motoren nicht angesteuert, sondern es werden nur auf dem 5x5-Display Pfeile ausgegeben, z.B.:
...
} else if (irleft == 0 && irright == 1) {
basic.showArrow(ArrowNames.West)
} ...
In diesem Betriebsmodus kann man an den Potentiometern der IR-Sensoren schrauben und diese kalibrieren, ohne dass die Motoren ständig laufen. Das Vorgehen beim Kalibrieren der IR-Sensoren wird weiter unten beschrieben.
Ist weder das Flag go noch das Flag fCalib gesetzt, befindet sich der Roboter im Ruhezustand und zeigt ein Häkchen an:
...
else {
basic.showIcon(IconNames.Yes)
}
Die Variablen mleft_before und mright_before dienen dazu die Motorzustände beim letzten Schleifendurchlauf zu speichern. Erst wenn sich der Motorzustand ändert, werden die Motoren auch wirklich vom Calliope mini neu angesteuert. Dies hat zwei Gründe: 1. Beschleunigung des Programmablaufs; 2. Jedes Mal wenn die Motoren vom Calliope mini angesteuert werden, ist ein hörbares Klicken wahrzunehmen (was daran liegt, dass der Motortreiber auch für den Piezo-Pieper verwendet wird; Danke an Balu mit seinem Kommentar). Dies ist störend und klingt für mein Empfinden (subjektiv) in der hohen Frequenz "ungesund", so als könne es den Calliope mini beschädigen.
basic.forever(() => {
...
if (mleft != mleft_before || mright != mright_before) {
motors.dualMotorPower(Motor.A, mleft)
motors.dualMotorPower(Motor.B, mright)
}
mleft_before = mleft
mright_before = mright
}
Kalibrierung der IR-SensorenIch habe die IR-Sensoren so kalibriert: Zunächst habe ich sie "blind" gemacht, also das Potentiometer so eingestellt, dass der IR-Sensor selbst bei voller Beleuchtung (mit IR-Strahlung) kein Signal hat. Dann habe ich ein weißes Blatt Papier direkt auf Sender und Empfänger gehalten. Nun habe ich sehr vorsichtig mittels Drehung am Potentiometer die Empfindlichkeit des IR-Sensors erhöht bis zu dem Punkt, an dem der Sensor mit aufgelegtem Blatt Papier gerade ein Signal erhält. Nimmt man dann das Blatt weg, so sollte er sofort wieder kein Signal haben und erst wieder eines bekommen, wenn man das Blatt wieder sehr nah an den Sensor heranbringt. Dieses Verfahren hat sich für meine Tests als hinreichend gut erwiesen. Aber die IR-Sensoren bzw. deren Kalibrierung sind sicher eine Schwachstelle des Roboters. Mit dem beschriebenen Verfahren lässt sich der Roboter aber dann verwenden, wenn man einen sehr dunklen bzw. schwarzen Untergrund und weiße Linien verwendet.
Evtl. ist es für die Kalibrierung besser schwarze Linien zu benutzen. Das Programm muss dann an wenigen Stellen angepasst werden.
Comments