Chassis met lijnvolging voor Arduino

FunduinoLaatst bijgewerkt op

Ein Roboterfahrzeug einer schwarzen Linie folgen lassen

Ein Roboter, der einer aufgeklebten Linie folgt, gehoert zu den dankbarsten Arduino-Projekten überhaupt: Das Ergebnis ist sofort sichtbar, und die Logik dahinter passt in wenige Zeilen.

Erstaunlicherweise genügt dafür ein einziger Sensor, der nur hell und dunkel unterscheiden kann. Das Fahrzeug fährt dann nicht mittig auf der Linie, sondern pendelt im Zickzack an ihrer Kante entlang – und kommt dabei zuverlässig voran.

Schaltplan des Chassis mit L298N-Motortreiber und Liniensensor
Schaltplan: H-Brücke, beide Motoren und der Infrarot-Sensor am Mikrocontroller

Material

Für dieses Projekt brauchst du:

  • 1× Mikrocontroller mit passendem USB-Kabel
  • 1× Roboter-Chassis mit zwei Gleichstrommotoren
  • 1× H-Brücke L298N
  • 1× Infrarot-Hinderniserkennungssensor mit digitalem Ausgang (z. B. TCRT5000)
  • 6× Batterie AA (1,5 V) mit Batteriehalter
  • Steckkabel männlich/männlich

Außerdem brauchst du eine Teststrecke: eine breite schwarze Linie auf hellem Untergrund, zum Beispiel mit Isolierband auf Papier geklebt.

Voraussetzung: das Chassis ist montiert

Diese Anleitung setzt voraus, dass das Chassis bereits zusammengebaut ist – Motoren, Räder und H-Brücke sitzen an ihrem Platz. Falls nicht, hol das zuerst mit der Montageanleitung für das Chassis nach.

Hier geht es um den nächsten Schritt: Das Fahrzeug soll einer schwarzen Linie selbstständig folgen, ohne von ihr abzukommen.

Aufbau

Der Sensor wird vorn am Chassis montiert, mit dem Auge nach unten zum Boden. Verkabelt wird nach diesem Schema:

  • Sensor OUT → Pin 2
  • H-Brücke ENA → Pin 10, IN1 → Pin 9, IN2 → Pin 8 (linker Motor)
  • H-Brücke ENB → Pin 5, IN3 → Pin 7, IN4 → Pin 6 (rechter Motor)

Eine passende Halterung für den Sensor lässt sich im 3D-Druck herstellen.

Sensorhalterung auf Thingiverse

Mikrocontroller und H-Brücke werden zusammen aus sechs AA-Batterien mit je 1,5 Volt versorgt – also aus 9 Volt. Über den USB-Anschluss allein bekommen die Motoren nicht genug Strom.

Schaltplan des Chassis mit L298N-Motortreiber und Liniensensor
Schaltplan: H-Brücke, beide Motoren und der Infrarot-Sensor am Mikrocontroller

Wie die Linienverfolgung funktioniert

Der Infrarot-Sensor liefert nur zwei Zustände: 1 für hellen Untergrund, 0 für dunklen. Mit dieser einen Information lässt sich bereits eine Linie verfolgen – allerdings nicht, indem das Fahrzeug mittig darauf fährt, sondern indem es an ihrer Kante entlangpendelt.

  • Sieht der Sensor Weiß (1), läuft nur der linke Motor. Das Fahrzeug dreht nach rechts – zurück in Richtung Linie.
  • Sieht der Sensor Schwarz (0), läuft nur der rechte Motor. Das Fahrzeug dreht nach links – wieder heraus an die Kante.

Dadurch fährt der Roboter einen dauerhaften Zickzackkurs an der Kante der Linie entlang. Das sieht unruhig aus, funktioniert aber zuverlässig – und kommt mit einem einzigen Sensor aus.

Am Sensor sitzt ein Potentiometer, mit dem du die Empfindlichkeit einstellst. Dreh daran, bis die Leuchtdiode auf dem Modul über der schwarzen Linie zuverlässig umschaltet – vorher braucht der Sketch gar nicht erst zu laufen.

Der Sketch

Lade den Sketch auf den Mikrocontroller und setze das Fahrzeug auf die Kante der Linie. Über den Seriellen Monitor kannst du bei angeschlossenem USB-Kabel mitlesen, was der Sensor gerade erkennt.

Fährt der Roboter zu hektisch oder verliert er die Linie in Kurven, verringere die Geschwindigkeit: Der Wert von GS ganz oben im Sketch lässt sich zwischen 0 und 255 frei wählen.

Sketch: der Linie folgen
int GS = 200;    // Geschwindigkeit der Motoren. Moeglich sind Werte von 0 bis 255.
int DWert;       // Variable fuer den ausgelesenen digitalen Wert

// Gleichstrommotor 1 = LINKS
int GSM1 = 10;   // Enable-Pin: steuert die Drehgeschwindigkeit des linken Motors
int in1 = 9;     // Ueber in1 und in2 wird die Drehrichtung des linken Motors gesteuert
int in2 = 8;

// Gleichstrommotor 2 = RECHTS
int GSM2 = 5;    // Enable-Pin: steuert die Drehgeschwindigkeit des rechten Motors
int in3 = 7;     // Ueber in3 und in4 wird die Drehrichtung des rechten Motors gesteuert
int in4 = 6;

int Sensor = 2;  // Pin, an dem der Liniensensor ausgelesen wird

void setup()
{
  Serial.begin(9600);
  pinMode(GSM1, OUTPUT);
  pinMode(GSM2, OUTPUT);
  pinMode(in1, OUTPUT);
  pinMode(in2, OUTPUT);
  pinMode(in3, OUTPUT);
  pinMode(in4, OUTPUT);
  pinMode(Sensor, INPUT);
}

void loop()
{
  DWert = digitalRead(Sensor);   // Digitalen Wert am Sensor auslesen

  // Zur Kontrolle: der Wert wird an den Seriellen Monitor geschickt
  Serial.print("Wert: ");
  Serial.println(DWert);

  if (DWert == 1)   // Weisser Untergrund erkannt ...
  {
    // ... dann laeuft nur der linke Motor und das Fahrzeug dreht nach rechts,
    // also zurueck in Richtung Linie.
    analogWrite(GSM1, GS);
    digitalWrite(in1, HIGH);   // Vorwaerts. Rueckwaerts waere in1 LOW und in2 HIGH.
    digitalWrite(in2, LOW);

    // Der rechte Motor steht still: beide Richtungspins auf LOW.
    digitalWrite(in3, LOW);
    digitalWrite(in4, LOW);
  }

  if (DWert == 0)   // Schwarzer Untergrund erkannt ...
  {
    // ... dann laeuft nur der rechte Motor und das Fahrzeug dreht nach links,
    // also wieder an die Kante der Linie heran.
    analogWrite(GSM2, GS);
    digitalWrite(in3, HIGH);
    digitalWrite(in4, LOW);

    // Der linke Motor steht still.
    digitalWrite(in1, LOW);
    digitalWrite(in2, LOW);
  }
}
Handleiding beoordelen

Opmerkingen

Stel een vraag of deel je ervaring

Neem contact met ons op als iets niet werkt. Vermeld daarbij je board en de foutmelding.

We controleren elke reactie voordat deze wordt gepubliceerd. Je e-mailadres blijft bij ons.