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.
Wenn Sie den Mikrocontroller programmieren möchten, muss zuerst die VIN-Verbindung zwischen dem Mikrocontroller und der H-Brücke getrennt werden.


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 = RECHTS

int GSM1 = 10;       //  Gleichstrommotor1 liegt an Pin 10
int in1 = 9;     
int in2 = 8;

// Gleichstrommotor 1 = LINKS

int GSM2 = 5;         // Gleichstrommotor2 liegt an Pin 5
int in3 = 7;
int in4 = 6;

int Wert  = 2;        // Die Variable "Wert" steht für 2


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(Wert);    // Auslesen des digitalen Werts an Pin2

  Serial.print("Wert : ");      // Kontrollinstrument 
  Serial.println(DWert);
  
  if (DWert == 1)                     // Wenn der digitale Wert 1 entspricht (also ein weißer Untergrund erfasst wird) ...
  {
        analogWrite(GSM1, 200);       // ... soll sich der linke Motor in Bewegung setzen, der Chassis also nach rechts fahren...
        analogWrite(GSM2, GS);
        
        digitalWrite(in1, HIGH);   
        digitalWrite(in2, LOW);
    
        digitalWrite(in3, LOW);
        digitalWrite(in4, LOW); 
  }

  if (DWert == 0)                      //  ... Bis der digitale Wert 2 (also ein schwarzer Untergrund) erfasst wird. ...
 

  {
        analogWrite(GSM1, 200);        // ... Dann soll sich der rechte Motor in Bewegung setzen, der Chassis also nach links fahren. 
        analogWrite(GSM2, GS);
        
        digitalWrite(in1, LOW);
        digitalWrite(in2, LOW);
    
        digitalWrite(in3, HIGH);
        digitalWrite(in4, LOW);
  }
}