Suchcode

Lektion 26/31: Smart Car Teil 4: Hindernisvermeidung mit Ultraschallsensor | SunFounder Robojax

Lektion 26/31: Smart Car Teil 4: Hindernisvermeidung mit Ultraschallsensor | SunFounder Robojax

In dieser Lektion rüsten wir Ihr Smart Car mit der Fähigkeit aus, seine Umgebung mithilfe eines Ultraschallsensors zu sehen und darauf zu reagieren. Durch die Messung der Entfernung zu Objekten vor ihm kann das Auto intelligente Entscheidungen treffen: Es fährt vorwärts, wenn der Weg frei ist, stoppt, wenn sich ein Objekt in einer Warnzone befindet, und fährt rückwärts, wenn ein Hindernis zu nahe kommt. Dieses Projekt baut auf den grundlegenden Motorsteuerungs- und Sensor-Kenntnissen auf, die Sie bereits gelernt haben, und führt zu einem wirklich autonomen Fahrzeug.

26-SunFounder-Car-4-Ultrasonic.mp4_snapshot_00.09.009

Dies ist nicht nur ein Spielzeug; es ist ein grundlegender Schritt zum Bau komplexerer Robotik-Projekte. Die Logik, die Sie hier implementieren—Erfassen, Denken, Handeln—ist dieselbe, die in allem verwendet wird, von Staubsaugerrobotern bis hin zur industriellen Automatisierung. Hier sind einige Ideen, die Sie zu eigenen Projekten inspirieren sollen:

  • Autonomer Rover: Erstellen Sie einen Roboter, der einen Raum oder Flur erkunden kann, ohne gegen Wände oder Möbel zu stoßen.
  • Näherungsalarmsystem: Montieren Sie den Ultraschallsensor auf einem Servo, um einen Bereich zu scannen und einen Alarm oder ein Licht auszulösen, wenn ein Eindringling eine definierte Zone betritt.
  • Intelligenter Parkassistent: Bauen Sie ein System, das Entfernungsmessungen verwendet, um ein Fahrzeug in eine enge Parklücke zu führen und visuelles oder akustisches Feedback zu geben.

Diese Anleitung basiert auf dem SunFounder 3-in-1 Arduino-Kit und dessen Projekt "Play with Ultrasonic Module". Wir gehen die Verkabelung durch, erklären den Entscheidungscode und demonstrieren das Auto in Aktion.

26-SunFounder-Car-4-Ultrasonic.mp4_snapshot_02.26.146

So funktioniert die Hindernisvermeidungslogik

Der Kern dieses Projekts ist ein einfacher, aber leistungsfähiger Entscheidungsbaum. Der Ultraschallsensor misst kontinuierlich die Entfernung zum Objekt direkt vor ihm. Dieser Entfernungswert wird dann verwendet, um die Motoren des Autos zu steuern, wie im folgenden Diagramm gezeigt.

  • Wenn Entfernung > 25 cm: Der Weg ist frei, also fährt das Auto vorwärts.
  • Wenn 10 cm < Entfernung <= 25 cm: Ein Objekt wird in einer "Warnzone" erkannt, also stoppt das Auto, um eine Kollision zu vermeiden.
  • Wenn 2 cm < Entfernung <= 10 cm: Ein Objekt ist gefährlich nah. Das Auto fährt rückwärts, um mehr Abstand zu schaffen.
  • Wenn Entfernung <= 2 cm: Die Messung ist wahrscheinlich ein Fehler (zu nah für eine genaue Messung), also stoppt das Auto als Sicherheitsmaßnahme.

Hardware-Komponenten

Um dieses Projekt zu bauen, benötigen Sie die folgenden Komponenten, die alle im SunFounder 3-in-1-Kit enthalten sind.

  • 1x Arduino Uno (oder kompatibles Board)
  • 1x Smart-Car-Chassis mit zwei Getriebemotoren
  • 1x L298N-Motortreibermodul
  • 1x HC-SR04 Ultraschall-Distanzsensor
  • 1x Steckbrett
  • Jumper-Kabel
  • Stromversorgung für das Auto (z. B. Batteriepack)
26-SunFounder-Car-4-Ultrasonic.mp4_snapshot_00.00.000

Verkabelungsanleitung

Die Verkabelung verbindet den Motortreiber, den Ultraschallsensor und den Arduino. Der Motortreiber steuert die Räder des Autos, während der Ultraschallsensor als seine "Augen" fungiert.

Hier ist das Verbindungsdiagramm aus der SunFounder-Dokumentation:

Lassen Sie uns die Verbindungen aufschlüsseln. Versorgen Sie zunächst die positiven und negativen Schienen des Steckbretts über die 5V- und GND-Pins des Arduinos. Der Ultraschallsensor wird dann wie folgt angeschlossen:

  • VCC (Stromversorgung): Verbunden mit der positiven Schiene auf dem Steckbrett.
  • GND (Masse): Verbunden mit der negativen Schiene auf dem Steckbrett.
  • Trig (Auslöser): Verbunden mit digitalem Pin 3 am Arduino. Dieser Pin sendet den Ultraschallimpuls.
  • Echo (Empfang): Verbunden mit digitalem Pin 4 am Arduino. Dieser Pin empfängt den reflektierten Impuls.

Die Motortreiberverbindungen sind dieselben wie in früheren Lektionen. Die vier Steuerpins (IN1, IN2, IN3, IN4) sind mit den digitalen Pins 5, 6, 9 und 10 des Arduinos verbunden. Diese Pins steuern Geschwindigkeit und Richtung der beiden Motoren. Stellen Sie sicher, dass Stromversorgung und Masse des Motortreibers ordnungsgemäß mit dem Batteriepack und der Masse des Arduinos verbunden sind. (im Video bei 02:24)

Code-Erklärung

Der Code für dieses Projekt steuert das Verhalten des Autos basierend auf der Entfernungsmessung des Ultraschallsensors. Die Logik ist unkompliziert und leicht anpassbar. Schauen wir uns die wichtigsten, vom Benutzer konfigurierbaren Teile an.

1. Pin-Definitionen

Am Anfang des Sketches werden die Pins für die Motoren und den Ultraschallsensor definiert. Sie können diese ändern, wenn Sie Ihre Komponenten an andere Arduino-Pins angeschlossen haben.

const int A_1B = 5;
  const int A_1A = 6;
  const int B_1B = 9;
  const int B_1A = 10;
  
  const int trigPin = 3;
  const int echoPin = 4;

Hier steuern A_1A, A_1B, B_1A und B_1B den linken und rechten Motor über den L298N-Treiber. trigPin und echoPin sind für den Ultraschallsensor.

2. Verhaltensvariablen und Logik

Das Hauptverhalten wird innerhalb der loop()-Funktion gesteuert. Hier können Sie die "Persönlichkeit" des Autos anpassen.

void loop() {
    float distance = readSensorData();
    if (distance > 25) {
      moveForward(200);
    }
    else if (distance < 10 && distance > 2) {
      moveBackward(200);
    } else {
      stopMove();
    }
  }

So können Sie es anpassen:

  • Distanzschwellenwerte: Die Zahlen 25 und 10 definieren die „sicheren" und „gefährlichen" Zonen in Zentimetern. Erhöhen Sie 25, damit das Auto früher anhält, oder verringern Sie sie, damit es näher an Hindernisse heranfahren kann. Die 2 ist eine Sicherheitsmarge, um fehlerhafte Messwerte von Objekten zu ignorieren, die zu nah sind.
  • Motorgeschwindigkeit: Die 200, die an moveForward() und moveBackward() übergeben wird, legt die Geschwindigkeit des Autos fest. Dieser Wert kann zwischen 0 und 255 liegen. Ein niedrigerer Wert wie 150 lässt das Auto langsamer und vorsichtiger fahren.

Der Rest des Codes besteht aus der Funktion readSensorData(), die das Timing des Ultraschallsensors verwaltet, um die Distanz zu berechnen, sowie den Funktionen moveForward(), moveBackward() und stopMove(), die den Motortreiber steuern, um die gewünschte Aktion auszuführen.

Behebung eines häufigen Fehlers

Möglicherweise stoßen Sie auf einen Fehler wie 'moveForward' wurde in diesem Gültigkeitsbereich nicht deklariert. Dies passiert, weil die Arduino-IDE den Code von oben nach unten liest. Wenn sie die Funktion loop() erreicht, kennt sie die darunter definierten Funktionen noch nicht. Um dies zu beheben, müssen Sie „Funktionsprototypen" vor der Funktion setup() hinzufügen. Dies sind einfach Deklarationen des Funktionsnamens und des Rückgabetyps, die mit einem Semikolon enden.

void moveForward(int speed);
  void moveBackward(int speed);
  void stopMove();
  float readSensorData();

Das Hinzufügen dieser Zeilen teilt dem Compiler mit: „Diese Funktionen existieren und werden später definiert", was den Fehler behebt. (im Video bei 09:21)

Verbesserung der Sensorstabilität

Während des Testens stellen Sie möglicherweise fest, dass das Auto anhält oder ruckelt, selbst wenn der Weg frei ist. Dies liegt oft daran, dass die Schleife zu schnell läuft und der Ultraschallsensor nicht genügend Zeit hat, das Echosignal zu empfangen, was zu einem Messwert von 0 cm führt. Um dies zu beheben, fügen Sie am Ende der Funktion loop() eine kleine Verzögerung hinzu, um dem Sensor Zeit zum Arbeiten zu geben.

void loop() {
    float distance = readSensorData();
    if (distance > 25) {
      moveForward(200);
    }
    else if (distance < 10 && distance > 2) {
      moveBackward(200);
    } else {
      stopMove();
    }
    delay(100); // Fügen Sie eine Verzögerung von 100 ms für stabile Messwerte hinzu
  }

Eine Verzögerung von 100 Millisekunden ist normalerweise ausreichend, um stabile und konsistente Distanzmessungen zu erhalten. (im Video bei 10:56)

Live-Projektdemonstration

Sobald der Code hochgeladen ist, öffnen Sie den seriellen Monitor. Sie sehen Text, der den Zustand des Autos anzeigt, wie „Vorwärts", „Rückwärts" oder „Stopp".

In der Demonstration wird das Auto mit einem Hindernis vor sich platziert. Wenn das Hindernis mehr als 25 cm entfernt ist, fährt das Auto vorwärts. Wenn Sie Ihre Hand näher bewegen, stoppt das Auto, sobald die Distanz unter 25 cm fällt. Wenn Sie Ihre Hand sehr nah, innerhalb von 10 cm, bringen, fährt das Auto rückwärts. Dieses Verhalten ist im Video deutlich sichtbar und bestätigt, dass die Hindernisvermeidungslogik korrekt funktioniert. (im Video bei 11:53)

Fazit

Glückwunsch! Sie haben erfolgreich ein intelligentes Auto gebaut, das seine Umgebung erkunden und Hindernisse vermeiden kann. Dieses Projekt kombiniert Sensoreingabe, Entscheidungslogik und Motorsteuerung in einem einzigen, funktionalen System. Sie haben nicht nur gelernt, wie man einen Ultraschallsensor verwendet, sondern auch, wie man einen einfachen Steueralgorithmus implementiert, der die Grundlage für viel komplexere autonome Roboter bildet.

Kapitel

  • [00:00] Einführung in die Hindernisvermeidung
  • [01:16] Projektübersicht und Voraussetzungen
  • [02:24] Verkabelung des Ultraschallsensors und des Motortreibers
  • [04:56] Öffnen des Projektcodes
  • [05:12] Code-Erklärung: Logik und Funktionen
  • [08:34] Hochladen des Codes und erster Test
  • [09:21] Fehlerbehebung: Funktionsprototypen
  • [10:56] Fehlerbehebung: Hinzufügen einer Verzögerung für Stabilität
  • [11:53] Live-Demonstration der Hindernisvermeidung

Bilder

27 SunFounder Car 5 follow hand
27 SunFounder Car 5 follow hand
26 SunFounder Car 4 ultrasonic video snapshot 00.09.009
26 SunFounder Car 4 ultrasonic video snapshot 00.09.009
26 SunFounder Car 4 ultrasonic video snapshot 02.26.146
26 SunFounder Car 4 ultrasonic video snapshot 02.26.146
26 SunFounder Car 4 ultrasonic video snapshot 00.00.000
26 SunFounder Car 4 ultrasonic video snapshot 00.00.000
899-Lesson 26/31: Avoiding Obstacle Using Ultrasonic Sensor
Sprache: C++
/*
Lesson 26/31: Avoiding Obstacle Using Ultrasonic Sensor 
Get this code and watch video Download and resource page https://robojax.com/RJT609
YouTube video https://www.youtube.com/watch?v=uLBmRvaemxA

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

const int trigPin = 3;
const int echoPin = 4;

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

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

  //ultrasonic
  pinMode(echoPin, INPUT);
  pinMode(trigPin, OUTPUT);
}

void loop() {
  float distance = readSensorData();
  if (distance > 25) {
    moveForward(200);
  }
  else if (distance < 10 && distance > 2) {
    moveBackward(200);
  } else {
    stopMove();
  }
}

float readSensorData() {
  digitalWrite(trigPin, LOW);
  delayMicroseconds(2);
  digitalWrite(trigPin, HIGH);
  delayMicroseconds(10);
  digitalWrite(trigPin, LOW);
  float distance = pulseIn(echoPin, HIGH) / 58.00; //Equivalent to (340m/s*1us)/2
  return distance;
}


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 stopMove() {
  analogWrite(A_1B, 0);
  analogWrite(A_1A, 0);
  analogWrite(B_1B, 0);
  analogWrite(B_1A, 0);
}

Ressourcen & Referenzen

Dateien📁

Arduino-Bibliotheken (zip)