Suchcode

Lektion 25/31: Auto-3 Smart Car vermeidet Hindernisse mithilfe von Infrarotsensoren | SunFounder Robojax

Lektion 25/31: Auto-3 Smart Car vermeidet Hindernisse mithilfe von Infrarotsensoren | SunFounder Robojax

Dieses Projekt verwandelt Ihr SunFounder 3-in-1 Arduino-Smartcar in ein autonomes Hindernis-ausweichendes Fahrzeug. Durch die Montage von zwei Infrarot-Sensoren (IR-Sensoren) – einem auf der linken und einem auf der rechten Seite – kann das Auto Objekte in seinem Weg erkennen und in Sekundenbruchteilen Entscheidungen treffen, um ihnen auszuweichen. Dies ist ein grundlegender Schritt in der Robotik, der Ihnen beibringt, Sensoreingaben mit Motorsteuerungslogik zu kombinieren, um eine reaktive, selbstfahrende Maschine zu erschaffen. Die Prinzipien, die Sie hier lernen, lassen sich auf eine Vielzahl realer Anwendungen übertragen, darunter:

  • Bau eines Saugroboters, der einen Raum navigiert, ohne gegen Möbel zu stoßen.
  • Erstellung eines linienfolgenden oder labyrinth-lösenden Roboters für Wettbewerbe oder Bildungsprojekte.
  • Entwicklung eines automatisierten Sicherheitspatrouillen-Bots, der einen Perimeter ablaufen und Wänden ausweichen kann.
  • Design eines intelligenten Spielzeugautos, das selbstständig spielen kann, ohne stecken zu bleiben.

Diese Anleitung baut direkt auf früheren Lektionen auf, in denen Sie gelernt haben, die Motoren des Autos zu steuern und zu verstehen, wie IR-Sensoren funktionieren. Hier kombinieren wir diese Fähigkeiten, um einen einfachen, aber effektiven Hindernisvermeidungsalgorithmus zu implementieren.

Wie die Hindernisvermeidungslogik funktioniert

Die Kernidee ist einfach: Das Auto verwendet zwei IR-Sensoren, um Hindernisse auf seiner linken und rechten Seite zu erkennen. Jeder Sensor gibt ein digitales Signal aus: LOW (0), wenn er ein Objekt in seiner Reichweite (ca. 20 cm) erkennt, und HIGH (1), wenn der Weg frei ist. Die Logik bestimmt dann die Aktion des Autos basierend auf den Sensorzuständen (im Video bei 02:35):

  • Hindernis links, rechts frei: Das Auto dreht nach rechts, um es zu vermeiden.
  • Hindernis rechts, links frei: Das Auto dreht nach links.
  • Hindernisse auf beiden Seiten: Das Auto fährt rückwärts, um einer möglichen Sackgasse zu entkommen.
  • Keine Hindernisse: Das Auto fährt vorwärts.

Dieser reaktive Ansatz ist ein klassisches Beispiel für einen endlichen Automaten, bei dem das Verhalten des Autos eine direkte Reaktion auf seine aktuellen Sensoreingaben ist.

Sunfounder-Smartcar-Obstacle-avoideance-1

Hardware-Komponenten

Um dieses Projekt abzuschließen, benötigen Sie die folgenden Komponenten, die alle im SunFounder 3-in-1 Arduino-Kit enthalten sind:

  • 1x SunFounder 3-in-1 Arduino Smart Car Kit (oder gleichwertige Teile)
  • 2x Infrarot-Hindernisvermeidungssensoren
  • 1x Arduino Uno (oder kompatibles Board)
  • 1x Motor-Treiber-Shield/Board
  • Jumper-Kabel

Verdrahtungsanleitung

Die korrekte Sensorausrichtung ist entscheidend für den Erfolg dieses Projekts. Die IR-Sensoren müssen nach vorne und leicht nach außen ausgerichtet sein, da sie Hindernisse an den Flanken des Autos erkennen (im Video bei 02:07). Das folgende Verdrahtungsdiagramm zeigt, wie die Sensoren mit dem Arduino verbunden werden. Bitte beachten Sie, dass der Dozent einen spezifischen Stromverteilungspunkt auf dem Breadboard des Autos verwendet hat, aber die Verbindungen zum Arduino sind das, was zählt.

Sunfounder-Smartcar-Obstacle-avoideance-wiring

Die Verdrahtungsverbindungen sind wie folgt (im Video bei 03:47):

  • Stromversorgung (VCC): Verbinden Sie den VCC-Pin beider IR-Sensoren mit dem 5V-Ausgang am Arduino oder der Stromschiene des Autos.
  • Masse (GND): Verbinden Sie den GND-Pin beider IR-Sensoren mit einer gemeinsamen Masse am Arduino oder der Masseschiene des Autos.
  • Rechter Sensorausgang (OUT): Verbinden Sie den digitalen Ausgangspin des rechten IR-Sensors mit digitalem Pin 7 am Arduino.
  • Linker Sensorausgang (OUT): Verbinden Sie den digitalen Ausgangspin des linken IR-Sensors mit digitalem Pin 8 am Arduino.

Die Motor-Treiberverbindungen für die linken und rechten Motoren sind dieselben wie in der vorherigen Lektion zur Motorsteuerung.

Code-Erklärung

Der Code für dieses Projekt ist unkompliziert. Das Hauptprogramm ist unten im Artikel zum Download verfügbar. Hier konzentrieren wir uns auf die benutzerkonfigurierbaren Teile, die Sie für Ihr eigenes Auto anpassen können.

const int A_1B = 5;
const int A_1A = 6;
const int B_1B = 9;
const int B_1A = 10;

const int rightIR = 7;
const int leftIR = 8;

Diese Zeilen definieren die Pins, die für den Motor-Treiber und die IR-Sensoren verwendet werden. Die Motor-Pins (A_1B, A_1A, B_1B, B_1A) steuern Geschwindigkeit und Richtung der beiden Motoren. Die rightIR- und leftIR-Pins sind die Stellen, an denen Sie die Signalkabel Ihrer Sensoren anschließen. Wenn Sie andere Pins verwendet haben, würden Sie diese Werte hier ändern.

int speed = 150;

Diese Variable legt die Grundgeschwindigkeit des Autos fest. Der Wert kann von 0 bis 255 reichen, wobei 255 die maximale Geschwindigkeit ist. Ein Wert von 150 ist ein guter Ausgangspunkt zum Lernen, da er schnell genug ist, um interessant zu sein, aber langsam genug, um Reaktionszeit zu ermöglichen (im Video bei 07:10). Sie können dies anpassen, um Ihr Auto schneller oder langsamer zu machen.

Der Rest des Codes definiert die Logik in der loop()-Funktion. Sie liest den Zustand der linken und rechten Sensoren und ruft dann die entsprechende Bewegungsfunktion auf (moveForward(), moveBackward(), backLeft(), backRight()). Diese Funktionen sind vordefiniert und steuern den Motortreiber, um die gewünschte Bewegung zu erreichen. Der Dozent fügte außerdem in einer späteren Änderung eine stop()-Funktion hinzu, um das Auto nach einem Ausweichmanöver für kurze Zeit anzuhalten und seine Bewegungen gezielter zu machen (im Video bei 10:29).

Live-Projektdemonstration

Im Video demonstriert der Dozent zunächst die Logik mithilfe des Seriellen Monitors. Indem er eine Box in die Nähe der Sensoren stellt, kann man die entsprechenden Meldungen wie „Go Left", „Go Right" oder „Go Backward" auf dem Bildschirm erscheinen sehen, was bestätigt, dass die Sensorwerte und die Logik korrekt sind (im Video bei 09:11).

Nachdem die Logik verifiziert wurde, fügt der Dozent eine entscheidende Verbesserung hinzu: eine stop()-Funktion. Diese Funktion bringt das Auto für einen definierten Zeitraum (z. B. 1 Sekunde) vollständig zum Stillstand, nachdem es eine Kurve gefahren oder rückwärts gefahren ist, wodurch ruckartige Bewegungen vermieden werden und das Auto seine Umgebung neu bewerten kann (im Video bei 10:29).

Schließlich wird das Auto auf dem Boden mit einer Reihe von Hindernissen getestet. Das Video zeigt, wie das Auto erfolgreich um Boxen herum navigiert, nach links und rechts abbiegt und bei Bedarf rückwärts fährt, um einen freien Weg zu finden, und demonstriert so die praktische Anwendung dieses Hindernisvermeidungsalgorithmus (im Video bei 12:13).

Kapitel

  • [00:00] Einführung in die Hindernisvermeidung mit IR-Sensoren
  • [01:24] Voraussetzungen und Projektübersicht
  • [02:35] Wie die Hindernisvermeidungslogik funktioniert
  • [03:47] Verkabelung der IR-Sensoren und Motoren
  • [05:40] Öffnen und Erklären des Codes
  • [09:11] Testen der Logik mit dem Seriellen Monitor
  • [10:29] Hinzufügen einer Stopp-Funktion für sanftere Navigation
  • [11:42] Testen der Stopp-Funktion
  • [12:13] Abschließender praktischer Test auf dem Boden

Bilder

Sunfounder smartcar obstacle avoidance 1
Sunfounder smartcar obstacle avoidance 1
Sunfounder smartcar obstacle avoidance wiring
Sunfounder smartcar obstacle avoidance wiring
894-Lesson 25: SunFounder's 3-in-1 Arduino kit Car-3 Smart Car Avoids Obstacle Using Infrared Sensors
Sprache: C++
const int A_1B = 5;
const int A_1A = 6;
const int B_1B = 9;
const int B_1A = 10;

const int rightIR = 7;
const int leftIR = 8;

void setup() {
  Serial.begin(9600);

  //motor
  pinMode(A_1B, OUTPUT);
  pinMode(A_1A, OUTPUT);
  pinMode(B_1B, OUTPUT);
  pinMode(B_1A, OUTPUT);

  //IR obstacle
  pinMode(leftIR, INPUT);
  pinMode(rightIR, INPUT);

}

void loop() {

  int left = digitalRead(leftIR);  // 0: Obstructed   1: Empty
  int right = digitalRead(rightIR);
  int speed = 150;

  if (!left && right) {
    backLeft(speed);
  } else if (left && !right) {
    backRight(speed);
  } else if (!left && !right) {
    moveBackward(speed);
  } else {
    moveForward(speed);
  }
}

void moveForward(int speed) {
  analogWrite(A_1B, 0);
  analogWrite(A_1A, speed);
  analogWrite(B_1B, speed);
  analogWrite(B_1A, 0);
}

void moveBackward(int speed) {
  analogWrite(A_1B, speed);
  analogWrite(A_1A, 0);
  analogWrite(B_1B, 0);
  analogWrite(B_1A, speed);
}

void backLeft(int speed) {
  analogWrite(A_1B, speed);
  analogWrite(A_1A, 0);
  analogWrite(B_1B, 0);
  analogWrite(B_1A, 0);
}

void backRight(int speed) {
  analogWrite(A_1B, 0);
  analogWrite(A_1A, 0);
  analogWrite(B_1B, 0);
  analogWrite(B_1A, speed);
}

Ressourcen & Referenzen

Dateien📁

Arduino-Bibliotheken (zip)