Nachdem wir den Chassis bereits erfolgreich mit Hilfe der Anleitung Nr. 36a montiert haben, machen wir uns nun an die vollständige Programmierung einer Line Tracking Funktion. Der Chassis soll also selbstständig einer schwarzen Linie folgen können, ohne dabei von dieser abzukommen.
Diese Umsetzung gelingt uns durch Verwendung eines optischen Abstandssensors. Es gibt diese Module in diversen Ausführungen, welche sich technisch jedoch kaum voneinander unterscheiden. Für die Erstellung dieses Tutorials haben wir diesen Abstandssensor verwendet, da die Ausgabe digital (also durch ein HIGH und LOW Signal) erfolgt. Die Sensorempfindlichkeit für das digitale Signal kann per Potentiometer justiert werden.
Fritzing Skizze
Achtung : Die Stromversorgung des Mikrocontrollers und der H-Brücke erfolgt durch sechs 1,5V AA Batterien.
Grundlegend ist das Prinzip der Linienverfolgung relativ einfach erklärt. Wir möchten erzielen, dass der linke Gleichstrommotor des Chassis immer dann betätigt wird, wenn der Abstandssensor das digitale Signal „1“ erfasst. Der Wert „1“ entspricht dabei einem weißen Untergrund.
Zudem möchten wir, dass der rechte Gleichstrommotor des Chassis immer dann betätigt wird, wenn der Abstandssensor das digitale Signal „0“ erfasst. Der Wert „0“ entspricht dabei einem schwarzen Untergrund.
Der Roboter befindet sich also auf einem permanenten „Zick-Zack“-Kurs und verfolgt dabei die vorgegebene schwarze Linie.
int GS = 200; // Geschwindigkeit des Gleichstrommotors - die maximale Geschwindigkeit beträgt 250 int DWert; // Variable für die Erfassung des digitalen Werts // Gleichstrommotor 1 = LINKS int GSM1 = 10; // Die Variable GSM1 gibt den Pin vor, der Drehgeschwindigkeit des Gleichstrommotors steuert int in1 = 9; // Über die Variablen "in1 & in2" wird die Drehrichtung des linken Motors gesteuert int in2 = 8; // Gleichstrommotor 1 = RECHTS int GSM2 = 5; // Die Variable GSM2 gibt den Pin vor, der Drehgeschwindigkeit des Gleichstrommotors steuert int in3 = 7; // Über die Variablen "in3 & in4" wird die Drehrichtung des rechten Motors gesteuert. int in4 = 6; int Sensor = 2; // Die Variable "Sensor" steht für den Pi, an dem der Sensor ausgelesen wird void setup() { Serial.begin(9600); // Herstellen der seriellen Verbindung pinMode(GSM1, OUTPUT); // Die Motoren dienen als Output pinMode(GSM2, OUTPUT); pinMode(in1, OUTPUT); pinMode(in2, OUTPUT); pinMode(in3, OUTPUT); pinMode(in4, OUTPUT); } void loop() { DWert = digitalRead(Sensor); // Auslesen des digitalen Werts an Pin2 Serial.print("Wert : "); // Kontrollinstrument, an dieser Stelle wird der digitale Wert des Sensors an den seriellen Monitor geschickt und kann dort ausgelesen werden. Serial.println(DWert); if (DWert == 1) // Wenn der digitale Wert 1 entspricht (also ein weißer Untergrund erfasst wird) ... { analogWrite(GSM1, GS); // ... soll sich der linke Motor (GSM1) in Bewegung setzen, der Chassis also mit der Geschwindigkeit "GS" nach rechts fahren. digitalWrite(in1, HIGH); // Da sich der Chassis vorwärts bewegen soll, wird das Signal an (in1, HIGH) und das Signal an (in2, LOW) gesetzt. digitalWrite(in2, LOW); // Eine Rückwärtsbewegung würde durch (in1, LOW) und (in2, HIGH) erzeugt werden digitalWrite(in3, LOW); digitalWrite(in4, LOW); } if (DWert == 0) // ... Bis der digitale Wert 0 (also ein schwarzer Untergrund) erfasst wird. ... { analogWrite(GSM2, GS); // ... Dann soll sich der rechte Motor (GSM2) in Bewegung setzen, der Chassis also mit der Geschwindigkeit "GS" nach links fahren. digitalWrite(in1, LOW); digitalWrite(in2, LOW); digitalWrite(in3, HIGH); // Da sich der Chassis vorwärts bewegen soll, wird das Signal an (in3, HIGH) und das Signal an (in4, LOW) gesetzt. digitalWrite(in4, LOW); // Eine Rückwärtsbewegung würde durch (in3, LOW) und (in4, HIGH) erzeugt werden. } }