PID-Steuerungslinien-Follower-Roboter
Komponenten und Verbrauchsmaterialien
| × | 1 | ||||
![]() |
| × | 1 | |||
| × | 1 | ||||
| × | 1 | ||||
| × | 1 | ||||
| × | 1 | ||||
![]() |
| × | 1 | |||
![]() |
| × | 1 |
Apps und Onlinedienste
![]() |
|
Über dieses Projekt
Übersicht
Eine Funktion, die die meisten autonomen Rover-Roboter benötigen, ist die Linienverfolgung. Der Zweck dieses Projekts ist es, einen Linienfolger-Roboter zu bauen und auf spielerische Weise mit dem Erlernen des PID-Reglers zu beginnen.
Teile
Der Roboter funktioniert ordnungsgemäß mit zwei Motoren, dem Rosbot Baseboard und einem 5-Kanal-Sensor. Im Gegensatz zu anderen müssen Sie keinen zusätzlichen H-Brücken-Motortreiber oder verschiedene Komponenten kaufen, da das Rosbot-Baseboard über eingebaute 2x H-Brücken-Dual-Treiber verfügt. Verbindet einfach Motoren mit dem Rosbot-Baseboard und es liefert mehr Leistung als Arduino Uno.


- Roboterrahmen: KittenBot eloxiertes Aluminiumgehäuse
Cooles und solides Chassis mit vielen Befestigungslöchern (4,8 mm LEGO Technic). Sie können dieses Chassis definitiv für andere lustige Projekte wiederverwenden.
- Gehirn des Roboters :RosBot Baseboard
Ein Arduino UNO-basiertes Mainboard mit zwei integrierten Dual-H-Brücken-Motortreibern.
- Roboteraugen :5-Kanal IR linienfolgender Tracker Sensor
5-Kanal-Infrarotdetektor, genauer und stabiler.
Schritt 1:Montage
Dieser Roboter ist ziemlich einfach zu montieren, befolgen Sie die Anweisungen und es dauert ungefähr 15 Minuten.

Befestigen Sie zuerst Ihre Motoren an den Seiten des Chassis, stecken Sie einfach das Gummirad ein.

Montieren Sie den 5-Kanal-IR-Sensor an der Vorderseite des Chassis.

Befestigen Sie Ihr Rosbot-Baseboard am Chassis, dann ist der Roboter bereit für die Verkabelung.
Schritt 2:Auswringen
Im Folgenden sind die Anschlüsse für den 5-Kanal-IR-Sensor aufgeführt:
- VCC bis 5V
- GND zu RosBots GND
- T1-T4 an Pin A0-A3
- T5 an SDA anheften
Gleichstrommotoren gehen einfach auf Pin A+A- und Pin B+B-.

Codierung
In den Codes haben wir eine Zustandsmaschine, die jeden möglichen Sensor-Array-Ausgang anzeigt. Der Roboter bewegt sich entsprechend der Sensor-Array-Ausgabe in eine bestimmte Richtung.
void stateMachine(int a) { switch (a) { case B00000:outlineCnt++; brechen; Fall B11111:outlineCnt++; brechen; Fall B00010:Fall B00110:UmrissCnt =0; Pixel.setPixelColor(2, Pixel.Color(0, 50, 0)); Voreingenommenheit =1; brechen; Fall B00001:Fall B00011:UmrissCnt =0; Pixel.setPixelColor(2, Pixel.Color(0, 200, 0)); Voreingenommenheit =2; brechen; Fall B00100:UmrissCnt =0; Pixel.setPixelColor(2, Pixel.Color(0, 0, 20)); Voreingenommenheit =0; brechen; Fall B01000:Fall B01100:UmrissCnt =0; Pixel.setPixelColor(2, Pixel.Color(50, 0, 0)); Voreingenommenheit =-1; brechen; Fall B10000:Fall B11000:UmrissCnt =0; Pixel.setPixelColor(2, Pixel.Color(200, 0, 0)); Voreingenommenheit =-2; brechen; Standard:Serial.println (a, BIN); skizzeCnt++; brechen; }
Wir haben bereits den Wert von Fehler, Proportionalterm, Integralterm und Ableitungsterm festgelegt.

float Kp =25;float Ki =0.15;float Kd =1200;float error, errorLast, erroInte;float calcPid(float input) { float errorDiff; Float-Ausgang; Fehler =Fehler * 0,7 + Eingabe * 0,3; // filtern //Fehler =Eingabe; errorDiff =error - errorLast; FehlerInte =Einschränkung (FehlerInte + Fehler, -50, 50); Ausgabe =Kp * Fehler + Ki * FehlerInte + Kd * FehlerDiff; Serial.print (Fehler); Serial.print (' '); Serial.print (erroInte); Serial.print (' '); Serial.print (errorDiff); Serial.print (' '); Serial.println (Ausgabe); errorLast =Fehler; Ausgabe zurückgeben;
Bearbeiten Sie die Werte, um die beste Passform für Ihren Roboter zu finden.
Code
- Linienfolger-Roboter
Linienfolger-RoboterArduino
In den Codes fügen wir ein NeoPixel von Adafruit hinzu, aber das ist optional.#include#define S_NULL 0#define S_ONTRACE 1Adafruit_NeoPixel Pixel =Adafruit_NeoPixel(4, 4, NEO_GRB + NEO_KHZ800); spdL, int spdR) { spdR =-spdR; wenn (spdL <0) { analogWrite (5, 0); analogWrite(6, -spdL); aufrechtzuerhalten. Sonst { AnalogWrite (5, spdL); analogWrite(6, 0); aufrechtzuerhalten. Wenn (spdR <0) { analogWrite (9, 0); analogWrite(10, -spdR); aufrechtzuerhalten. Sonst { AnalogWrite (9, SPDR); analogWrite (10, 0); }}int bias =0;int outlineCnt =0;void stateMachine(int a) { switch (a) { case B00000:outlineCnt++; brechen; Fall B11111:outlineCnt++; brechen; Fall B00010:Fall B00110:UmrissCnt =0; Pixel.setPixelColor(2, Pixel.Color(0, 50, 0)); Voreingenommenheit =1; brechen; Fall B00001:Fall B00011:UmrissCnt =0; Pixel.setPixelColor(2, Pixel.Color(0, 200, 0)); Voreingenommenheit =2; brechen; Fall B00100:UmrissCnt =0; Pixel.setPixelColor(2, Pixel.Color(0, 0, 20)); Voreingenommenheit =0; brechen; Fall B01000:Fall B01100:UmrissCnt =0; Pixel.setPixelColor(2, Pixel.Color(50, 0, 0)); Voreingenommenheit =-1; brechen; Fall B10000:Fall B11000:UmrissCnt =0; Pixel.setPixelColor(2, Pixel.Color(200, 0, 0)); Voreingenommenheit =-2; brechen; Standard:Serial.println (a, BIN); skizzeCnt++; brechen; } Pixel.setPixelColor(0, Pixel.Color(outlineCnt * 10, 0, 0)); if (outlineCnt> 10) { doDcSpeed (0,0); aufrechtzuerhalten. Sonst { Float ff =150; float ctrl =calcPid(bias); doDcSpeed(ff-Strg,ff+Strg); } Pixel.show();}float Kp =25;float Ki =0.15;float Kd =1200;float error, errorLast, erroInte;float calcPid(float input) { float errorDiff; Float-Ausgang; Fehler =Fehler * 0,7 + Eingabe * 0,3; // filtern //Fehler =Eingabe; errorDiff =error - errorLast; FehlerInte =Einschränkung (FehlerInte + Fehler, -50, 50); Ausgabe =Kp * Fehler + Ki * FehlerInte + Kd * FehlerDiff; Serial.print (Fehler); Serial.print (' '); Serial.print (erroInte); Serial.print (' '); Serial.print (errorDiff); Serial.print (' '); Serial.println (Ausgabe); errorLast =Fehler; Ausgabe zurückgeben;}int echoTrace() {int ret =0; int a[5]; for (int i =0; i <5; i++) {a[i] =Constraint((1025 - analogRead(A0 + i)) / 10 - 4, 0, 20); if (a[i]> 2) ret +=(0x1 < LinefollowRobot
https://github.com/KittenBot/LinefollowRobot
Schaltpläne

Herstellungsprozess
- Die Zukunft der Robotik
- Basketball
- Golfball
- Tutorial – sPiRobot:Steuern und sehen Sie, was Ihr Roboter von überall sieht
- Automatisierung:Roboterlinie neu gestaltet
- SCARA-Roboterlinie erweitert
- Montagelinienroboter:Ein definitiver Leitfaden
- Industrial Line Follower für die Materialversorgung
- PID-Steuerung eines Robotergreifers in Matlab / Simulink
- Automatisierte Qualitätskontrolle der Verpackungslinie