Smart Robot Car als autonomer Linienfolger - AZ-Delivery

Das Smart Robot Car Kit diente bereits einigen Blogbeiträgen als Grundlage. Ich hatte in diesem Beitrag ein Spielzeugauto modifiziert und das Robot Car mit Sensoren ausgestattet. Mit dem Front-Ultraschallsensor kann er Hindernisse erkennen und ihnen ausweichen, indem er seine Bewegungsrichtung ändert. Da das Auto modular aufgebaut ist, bietet es uns Möglichkeiten zur Modifikation. In diesem Projekt werden wir einen vierfachen Linienfolger hinzufügen, so dass es einer auf den Boden gemalten schwarzen Linie folgt. Dazu werden einen vier Infrarotsensoren hinzugefügt und ein neuer Sketch programmiert.

Die schwarze Farbe der Linie absorbiert das Licht, die weiße Farbe reflektiert. Der reflektierte Anteil wird vom Sensor detektiert. Diese Eigenschaften werden genutzt, um der Linie zu folgen. Es muss der Sketch dann nur noch so programmiert werden, dass das Robot Car entlang der Linie fährt.

Benötigte Hardware und Materialien

1

Smart Robot Car Kit

1

4-Kanal Infrarot Hindernis Sensor

2

Batterien 5V 1A

 

Mini Breadboard und Jumper Kabel

 

Balsaholz 3mm

 

Holzleim (schnelltrocknend)

                                                

Benötigte Software und Sketches

Schaltung und Beschreibung der verwendeten Module

Download der Schaltung

Wir verwenden einen Mikrocontroller, ein Sensor Shield Modul, um die Komponenten und Module zu verbinden und mit dem AZ-L298N Controller-Modul steuern wir die Geschwindigkeit sowie die Drehrichtung der Motoren. Alle diese Komponenten sind im Smart Robot Car Kit enthalten. Um der Linie zu folgen, kommt ein 4-Kanal Infrarot-Sensor Modul hinzu. Die notwendige Spannung zur Versorgung des Infrarotsensormoduls muss 5V betragen, während die Versorgungsspannung des Mikrocontrollers und des AZ-L298N-Moduls 10 V beträgt. Wie Sie in der Schaltung sehen können, verwende ich zwei 5-Volt-Batteriepacks und schalte sie in Reihe. So erhalte ich die 10 Vdc (rote Linie) für die Spannungsversorgung des Mikrocontrollers und des AZ-L298N-Moduls und die 5 Vdc für das Infrarotsensormodul (grüne Linie).

Einstellen des Infrarotsensors

Aus Balsaholz habe ich das Robot Car so modifiziert, dass die Batteriepacks untergebracht werden können. Außerdem habe ich eine Halterung gebaut, um das Sensormodul zu befestigen. Es wird in einer Höhe von 10 mm über dem Boden angebracht. Der maximale Abstand, in dem es zufriedenstellend funktioniert, beträgt 15 mm.

Nachdem wir alle Module und Komponenten des Smart Robot Car zusammengebaut haben, müssen wir als Erstes die Erkennung des Farbwechsels von Schwarz zu Weiß einstellen. Dazu positionieren wir das Smart Robot Car auf einer schwarzen Linie, der es folgen soll und laden den Sketch sensor_adjust.ino auf den Mikrocontroller. Die Motoren werden damit nicht angesteuert. Wir verwenden diesen Sketch, um die Sensoren auszulesen und uns den Status im seriellen Monitor anzuzeigen. Für die Justierung gehen wir folgende Schritte durch:

  • Wir platzieren das Smart Robot Car mit den vier Sensoren auf der schwarzen Linie. Jeder Sensor muss auf dem seriellen Monitor einen HIGH-Wert anzeigen und die LEDs D1, D2, D3 und D4 auf dem Sensormodul müssen aus sein. Wir verwenden die Potentiometer R9, R10, R11 und R12, um die Sensorwerte einzustellen, bis die LEDs auf der Platine aus sind.
  • Wir verschieben das Auto seitlich, bis der erste Satz von Sender- und Empfängersensoren aus dem schwarzen Bereich der Linie heraustritt. In diesem Moment sollte der Messwert im seriellen Monitor dieses Sensors LOW sein und die entsprechende LED des Anpassungsmoduls aufleuchten. Wenn sich der Messwert nicht ändert und die LED nicht erlischt, stellen wir das entsprechende Potentiometer ein, bis sich der Wert ändert. Um sicherzugehen, wiederholen wir diesen Schritt.
  • Die anderen drei Sensoren werden auf die gleiche Weise eingestellt. So soll erkannt werden, dass das Robot Car die Linie verlässt.

Wie Sie sehen können, funktioniert es in diesem Fall so, dass alle Sensoren komplett über einer schwarzen Linie stehen. Alternativ könnte es auch so programmiert werden, dass die inneren Sensoren über einer dünneren Linie stehen und die äußeren Sensoren außerhalb der Linie.

Beschreibung des Programmablaufs und des Sketches

Unser modifiziertes intelligentes Roboterauto muss der schwarzen Linie auf dem Boden folgen und dabei die Richtung ändern. Die Infrarotsensoren erkennen, wenn der Roboter abweicht und den Pfad der schwarzen Linie verlässt, die wir auf einen weißen Hintergrund gemalt haben, so dass der Mikrocontroller die notwendigen Änderungen an der Geschwindigkeit der beiden Radmotoren vornimmt, damit das Auto auf den Pfad der Linie zurückkehrt.

Wenn das Smart Robot Car von der schwarzen Linie abweicht und die äußeren Sensoren dies erkennen, gibt der Mikrocontroller den Befehl, den Motor auf der Seite, die die Linie verlassen hat, etwas schneller zu drehe. Wenn die beiden Sensoren auf der gleichen Seite erlöschen, bedeutet dies, dass das Auto weit genug von der Linie abgewichen ist. Wir haben die normale Geschwindigkeit der Motoren car_advances() für das normale Vorwärtskommen und zwei etwas schnellere Geschwindigkeiten slight_turn_motor() und sharp_motor_turn(), um die Position des Autos anzupassen.

Beginnen wir mit der Analyse des Sketches line_follower_Smart_Car_robot.ino. Da die Sensoren jeweils einen digitalen Ausgang bieten, brauchen wir keine Bibliothek hinzuladen. Wir werden nur ein HIGH- oder LOW-Pegel-Signal an ihrem Ausgang erfassen.

Als Erstes definieren wir die Mikrocontroller-Pins, an die wir die Signalausgänge der Infrarotsensoren anschließen werden. Sensor 1 ist der rechte äußere Sensor des Fahrzeugs, es ist der IN1-Pin der Sensorempfindlichkeits-Einstellplatine. Wir verbinden ihn mit Port 9 des Shields, während der IN4-Pin der linke äußere Sensor ist und mit Port 12 des Shields verbunden wird.

#define IR_sensor_1 9
#define IR_sensor_2 10
#define IR_sensor_3 11
#define IR_sensor_4 12
Damit der Mikrocontroller die richtigen Befehle an die Motoren senden kann, müssen wir den Status der Sensorsignale abfragen. Dafür definieren wir vier Variablen, eine für jeden Sensor des Moduls.
int value_IR_sensor_1;
int value_IR_sensor_2;
int value_IR_sensor_3;
int value_IR_sensor_4;

Wir werden nun die Mikrocontroller-Pins für die Motoren definieren. Wir benötigen drei Pins für jeden Motor. Zwei der digitalen Pins werden jeweils für die Drehrichtung des Motors verwendet. Sie werden später als Ausgang konfiguriert. Der jeweils dritte digitale Pin muss PWM-fähig (Pulse Width Modulation) sein. Wir verwenden die Funktion analogWrite(name_motor, value), um die Geschwindigkeit der Motordrehung zu steuern.

#define enable_left_motor 5
#define connection_1_motor_left 2
#define connection_2_motor_left 4

#define enable_right_motor 6
#define connection_1_motor_right 7
#define connection_2_motor_right 8
Als Nächstes werden in der setup()-Methode die Pins konfiguriert. Mit pinMode(pin_number, OUTPUT) werden die Motor-Pins als Ausgänge eingestellt.
pinMode(enable_right_motor,OUTPUT); 
pinMode(connection_2_motor_right, OUTPUT);
pinMode(enable_left_motor,OUTPUT);
pinMode(connection_1_motor_left, OUTPUT); 
pinMode(connection_2_motor_left, OUTPUT);

Die Sensorpins werden mit pinMode(IR_sensor_1, INPUT) als Eingänge konfiguriert.

pinMode(IR_sensor_1, INPUT);
pinMode(IR_sensor_2, INPUT);
pinMode(IR_sensor_3, INPUT);
pinMode(IR_sensor_4, INPUT);

Das war es auch schon. Es folgt nun die loop()-methode, diejenige, die kontinuierlich ausgeführt wird. Sie enthält die Aufrufe der Methoden zum Lesen der Zustände der Infrarotsensorsignale.

state_IR_1();
state_IR_2();
state_IR_3();
state_IR_4();

Der Zustand der Sensoren kann HIGH oder LOW sein. Das Auslesen geschieht mit der Anweisung digitalRead(IR_sensor_number), um dann den erhaltenen Wert in der entsprechenden Variablen (value_IR_sensor_number) zu speichern. Die gemessenen Werte werden dann im seriellen Monitor angezeigt. Die Methoden der vier Sensoren sind gleich, wir ändern nur die Nummer des Infrarotsensors.

void state_IR_1() {
        value_IR_sensor_1 = digitalRead(IR_sensor_1);
        Serial.print("State IR sensor 1");
        Serial.print(value_IR_sensor_1);
}
Die Sensorwerte werden nun für eine if-Anweisung verwendet und damit car_advances() ausgführt, wenn die Bedingung wahr ist. Das Entspricht dem Zustand, in dem alle Sensorsignale HIGH sind.
if (value_IR_sensor_1 == HIGH && value_IR_sensor_2 == HIGH && 
    value_IR_sensor_3 == HIGH && value_IR_sensor_4 == HIGH) { 
  car_advances();
}

Wir hätten auch den Code der Methode direkt in die Anweisung schreiben können. Aber so ist es etwas aufgeräumter.

Wir geben im seriellen Monitor die aktuelle Position im Code aus. Mit der Codezeile analogWrite(enable_right_motor, 71) stellen wir die Geschwindigkeit des rechten Motors auf einen Wert von 71 von 244 ein, denn wir verwenden die PWM-Eigenschaft dieses digitalen Ports. Das bedeutet, dass sich der Motor mit etwa 29 % seiner Geschwindigkeit dreht, wenn 5 Vdc angelegt werden. Mit den nächsten beiden Codezeilen digitalWrite(connection_1_motor_right, HIGH) und digitalWrite(connection_2_motor_right, LOW), legen wir die Drehrichtung des rechten Motors in Vorwärtsrichtung des Smart Car Roboters fest. Die letzten drei Zeilen der Methode machen das Gleiche für den linken Motor.

void car_advances() {
  Serial.println("Car advance");
  analogWrite(enable_right_motor, 71);
  digitalWrite(connection_1_motor_right, HIGH);
  digitalWrite(connection_2_motor_right, LOW);
  analogWrite(enable_left_motor, 71);
  digitalWrite(connection_1_motor_left,HIGH);
  digitalWrite(connection_2_motor_left,LOW);
}

Wenn in einer der vier Sensoren keinen HIGH-Wert liefert, wird der vorangegangene Code nicht ausgeführt und das Programm geht zur nächsten if-Anweisung über, die die Methode slight_turn_left() aufruft, wenn Sensor 1 ein LOW- und die anderen Sensoren jeweils ein HIGH-Signal liefern.

if (value_IR_sensor_1 == LOW && value_IR_sensor_2 == HIGH && 
    value_IR_sensor_3 == HIGH && value_IR_sensor_4 == HIGH) { 
  slight_turn_left();
}

Der rechte äußere Infrarotsensor zeigt an, dass das Smart Robot Car ein wenig nach rechts von der schwarzen Linie abgewichen ist.

void slight_turn_left() {
  Serial.println("Car turn right");
  analogWrite(enable_right_motor, 72);
  digitalWrite(connection_1_motor_right, LOW);
  digitalWrite(connection_2_motor_right, HIGH);
  analogWrite(enable_left_motor, 71);
  digitalWrite(connection_1_motor_left,HIGH);
  digitalWrite(connection_2_motor_left,LOW);
}

Es ändert sich die Drehgeschwindigkeit des rechten Motors, so dass sich unser Smart Robot Car leicht nach links dreht und auf die Linie zurückkehrt.

Ist die oben genannte Bedingung nicht erfüllt, folgt die nächste Anweisung, die die Methode sharp_left_turn() aufruft.

if (value_IR_sensor_1 == LOW && value_IR_sensor_2 == LOW &&
    value_IR_sensor_3 == HIGH && value_IR_sensor_4 == HIGH) { 
  sharp_left_turn();
}

Die Bedingung ist erfüllt, wenn die Sensoren 1 und 2 ein LOW-Signal und die anderen beiden ein HIGH-Signal liefern. Das bedeutet, dass das Robot Car so weit von der Linie abgekommen ist, dass die beiden rechten Sensoren außerhalb der Linie sind.

void sharp_left_turn() {
  Serial.println("Car turn right");
  analogWrite(enable_right_motor, 73);
  digitalWrite(connection_1_motor_right, LOW);
  digitalWrite(connection_2_motor_right, HIGH);
  analogWrite(enable_left_motor, 71);
  digitalWrite(connection_1_motor_left,HIGH);
  digitalWrite(connection_2_motor_left,LOW);
}

Die Drehgeschwindigkeit des rechten Motors wird im Gegensatz zu der vorherigen Methode noch weiter erhöht da das Auto eine engere Kurve fahren muss, um wieder auf die Linie zu kommen.

Um das Verlassen der Linie auf der anderen Seite zu erkennen und eine Richtungskorektur durchzuführen, werden mit drei weiteren if-Anweisungen die folgenden Methoden aufgerufen. Der Code ist nahezu gleich. Die Bedingungen beziehen sich auf die anderen beiden Sensoren und es wird die Geschwindigkeit des linken Motors verändert, um eine Korrektur nach links durchzuführen.

/* If sensor number 4 is not on the black line, a call is made to the smooth right turn method. */
if (value_IR_sensor_1 == HIGH && value_IR_sensor_2 == HIGH && 
    value_IR_sensor_3 == HIGH && value_IR_sensor_4 == LOW) { 
  slight_turn_right();
}

/* If sensors 3 and 4 are not on the black line, a call is made to the hard right turn method. */
if (value_IR_sensor_1 == HIGH && value_IR_sensor_2 == HIGH && 
    value_IR_sensor_3 == LOW && value_IR_sensor_4 == LOW) { 
  sharp_right_turn();
}

/* If all sensors are not above the black line, a call is made to the hard left turn method. */
if (value_IR_sensor_1 == LOW && value_IR_sensor_2 == LOW && 
    value_IR_sensor_3 == LOW && value_IR_sensor_4 == LOW) { 
  sharp_left_turn();
}

Ich habe zwei Methoden im Code auskommentiert. Um sie zu verwenden, muss der Kommentar entfernt werden und ein Aufruf dieser Methoden erfolgen. Sie dienen dazu, das Smart Robot Car mit halt() vollständig anzuhalten und mit go_back() rückwärtsfahren zu lassen.

Im Video unten sieht man, dass sich das Smart Robot Car ständig seitwärts bewegt. Das liegt daran, dass es praktisch unmöglich ist, dass sich die beiden Motoren mit der gleichen Geschwindigkeit drehen, obwohl wir die gleiche Spannung an die beiden Motoren anlegen. Mit entsprechenden Modifikationen könnte die Drehzahl gemessen und nachgeregelt werden.

Sie können den Code auch selbst noch optimieren oder anpassen. Wir wünschen Ihnen viel Spaß mit dieser Funktion des AZ Smart Robot Car.

 

Für arduinoProjekte für anfänger

4 Kommentare

Andreas Wolter

Andreas Wolter

@Frank Neary: the article is not translated at this moment. We hope that we can do that soon. During this time you could try the translator in your webbrowser.

Best regards,
Andreas Wolter
AZ-Delivery Blog

Frank Neary

Frank Neary

Is this article not translated to English?

Andreas Wolter

Andreas Wolter

@wil schreuders: We do not have a PDF available for this article. If you want to print the page, you can do so directly from the browser. There you can usually also redirect the print to a PDF. This is also the reason why we now refrain from using PDFs, as most browsers are able to do this themselves.

wil schreuders

wil schreuders

Is het mogelijk om dit artikel in PDF te kunnen downloaden ?
Het is voor mij handiger om van papier te lezen dan via het beeldscherm.
Prima artikel en interessant om na te bouwen.

Kommentar hinterlassen

Alle Kommentare werden von einem Moderator vor der Veröffentlichung überprüft

Empfohlene Blogbeiträge

  1. ESP32 jetzt über den Boardverwalter installieren - AZ-Delivery
  2. Internet-Radio mit dem ESP32 - UPDATE - AZ-Delivery
  3. Arduino IDE - Programmieren für Einsteiger - Teil 1 - AZ-Delivery
  4. ESP32 - das Multitalent - AZ-Delivery