Nr. 36b – Chassis mit Line Tracking

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.

Material : Funduino Mikrocontroller / Abstandssensor (90°) / Chassis / Breadboardkabel / Batteriefach mit Stecker (Materialbeschaffung : www.funduinoshop.com)


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.

Die Halterung für den Abstandssensor kann im 3D-Druck Verfahren hergestellt werden. Das zugehörige Bauteil finden Sie hier.

 

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.
  }
}