Table of Contents
Idee
In diesem Artikel zeige ich euch, wie wir einen Line Follow Roboter mit Arduino bauen können.
Die Idee hinter diesem Roboter ist es, mit zwei IR-Sensoren eine schwarze Linie zu erkennen und den Roboter entsprechend zu bewegen.
Teile
Um den Linienverfolgungsroboter zu bauen, benötigen wir das yourDroid 2WD Smart Car Chassis für DIY Roboter.
Außerdem benötigen wir einen Arduino Uno
zwei IR-Sensormodule,
ein L298N Motortreiber-Modul mit doppelter H-Brücke,
4 Doppel-A Akkus und einige Jumper-Kabel.
Für den Parcours brauchen wir ein großes helles Brett und schwarzes Gaffertape für die Linie.
Werkzeug
Ein guter Lötkolben oder eine Lötstation, Lötzinn und eine Heißklebepistole sind sehr hilfreich.
Falls ihr keine Heißklebepistole habt, könnt ihr auch doppelseitiges Klebeband benutzen.
Ich benutze für dieses Projekt eine Abisolierzange, ihr könnt aber auch eine kleine Schere oder ein Messer zum abisolieren nehmen.
Zusammenbau
Zuerst löten wir Drähte an die Getriebemotoren. Dann montieren wir die zwei Motoren am Auto.
Wir befestigen jetzt das Motortreiber-Modul. Ich hatte hier noch ein paar passende Schrauben, aber kleben geht natürlich auch
Jetzt stecken wir die Räder auf die Achsen der Motoren. Nun befestigen den Arduino Uno mit der Heißklebepistole.
Auf der anderen Seite des Chassis können wir die Batteriebox ankleben. Wir zerschneiden den roten Draht von der Batteriebox und entfernen den Mantel mit der Abisolierzange.
Nun Löten wir die Batterieanschlussdrähte an den Schalter und stecken den Schalter in die Platte.
Wir verbinden die Anschlüsse der Motoren mit dem Motortreiber-Modul
Nun Befestigen wir die zwei IR-Sensoren vorne am Auto mit Winkeln. Die Winkel habe ich mit Tinkercad erstellt und mit meinem 3D-Drucker gedruckt. Du kannst natürlich auch hier wieder die Heißklebepistole benutzen.
Elektrische Verbindung
Jetzt machen wir eine Verbindung wie im Schaltplan.
- Wir verbinden das L298N-Motortreiber-Moduls mit den Arduino Uno-Pins.
- Schließe Drähte der Batteriebox an die Plus-5-Volt- und Masse-Pins des Motortreiber-Moduls an.
- Wir nehmen Plus-5-Volt und Masse vom Motortreiber-Modul und versorgen damit auch die zwei IR-Sensoren sowie den Arduino Uno.
- Verbinde die rechten und linken IR-Sensor-Ausgangs-Pins mit D11 und D12 am Arduino.
Software
Lasst uns jetzt einen kurzen Blick auf den Code werfen.
const byte MOTOR_SPEED = 210;
const byte DELTA = 45;
Die Motorgeschwindigkeit setzen wir auf 210 und das Delta auf 45. Damit bleiben wir im Bereich der PWM von 0 bis 255.
Nun definieren die Variablen für die Eingangs- und Ausgangspins.
const byte SPEED_RIGHT_MOTOR = 6;
const byte SPEED_LEFT_MOTOR = 5;
const byte RIGHT_MOTOR_PIN1 = 7;
const byte RIGHT_MOTOR_PIN2 = 8;
const byte LEFT_MOTOR_PIN1 = 9;
const byte LEFT_MOTOR_PIN2 = 10;
const byte IR_SENSOR_RIGHT = 11;
const byte IR_SENSOR_LEFT = 12;
Setup
void setup()
{
//This sets frequency to 7812.5 hz.
TCCR0B = TCCR0B & B11111000 | B00000010;
pinMode(SPEED_RIGHT_MOTOR, OUTPUT);
pinMode(RIGHT_MOTOR_PIN1, OUTPUT);
pinMode(RIGHT_MOTOR_PIN2, OUTPUT);
pinMode(SPEED_LEFT_MOTOR, OUTPUT);
pinMode(LEFT_MOTOR_PIN1, OUTPUT);
pinMode(LEFT_MOTOR_PIN2, OUTPUT);
pinMode(IR_SENSOR_RIGHT, INPUT);
pinMode(IR_SENSOR_LEFT, INPUT);
digitalWrite(LEFT_MOTOR_PIN1, HIGH);
digitalWrite(LEFT_MOTOR_PIN2,LOW);
digitalWrite(RIGHT_MOTOR_PIN1, HIGH);
digitalWrite(RIGHT_MOTOR_PIN2, LOW);
}
Innerhalb der Setup-Funktion müssen wir die PWM-Frequenz höher einstellen. Dies ist ein sehr wichtiger Schritt, da das Problem bei TT-Getriebemotoren darin besteht, dass sie sich bei einem sehr niedrigen PWM-Wert gar nicht drehen.
Dies ändert die Frequenz des PWM-Signals an den Pins D5 und D6 auf 7800 Hertz, wodurch der Motor bei niedriger Geschwindigkeit und hohem PWM-Wert kontrolliert läuft.
Innerhalb der Setup-Funktion setzen wir auch alle Motorpins als Ausgang, die Pins der IR-Sensoren als Eingang.
Loop
void loop()
{
int rightIRSensorValue = digitalRead(IR_SENSOR_RIGHT);
int leftIRSensorValue = digitalRead(IR_SENSOR_LEFT);
//If none of the sensors detects black line, then go straight
if (rightIRSensorValue == LOW && leftIRSensorValue == LOW)
{
driveStraight();
}
//If right sensor detects black line, then turn right
else if (rightIRSensorValue == HIGH && leftIRSensorValue == LOW )
{
turnRight();
}
//If left sensor detects black line, then turn left
else if (rightIRSensorValue == LOW && leftIRSensorValue == HIGH )
{
turnLeft();
}
//If both the sensors detect black line, then stop
else
{
stop();
}
}
In der Loop-Funktion lesen wir die Werte der rechten und linken IR-Sensoren mit der digitalRead-Funktion.
- Wenn beide Werte niedrig sind, bedeutet das, dass der Sensor die schwarze Linie nicht erkannt hat und wir vorwärtsfahren wollen.
- Wenn der rechte Sensor die schwarze Linie erkennt, sind wir zu weit links und wir lassen den linken Motor etwas schneller und den rechten etwas langsamer drehen.
- Wenn der linke Sensor die schwarze Linie erkennt, dann machen wir es genau umgekehrt: rechts schneller und links langsamer.
- Wenn beide Sensoren die schwarze Linie erkennen, dann beide Motoren stoppen.
Video
Links
Source Code / Diagramm
https://github.com/jboegeholz/arduino_projects/tree/master/arduino_uno/10_line_follow_robot
Winkel für IR-Sensoren
https://www.printables.com/de/model/695860-ir-sensor-holder
Teile
https://www.roboter-bausatz.de/p/yourdroid-2wd-smart-car-chassis-fuer-diy-roboter
https://www.roboter-bausatz.de/p/uno-r3-atmega328p-atmega16u2-board-arduino-kompatibel
https://www.roboter-bausatz.de/p/ir-infrarot-sensor-hinderniserkennung-abstandssensor
https://www.roboter-bausatz.de/p/l298n-motortreiber-mit-doppelter-h-bruecke
Wiederaufladbare Akkus: https://amzn.to/3OAO6M3 (Affiliate Link)