PID-regellijnvolgerrobot
Componenten en benodigdheden
| × | 1 | ||||
![]() |
| × | 1 | |||
| × | 1 | ||||
| × | 1 | ||||
| × | 1 | ||||
| × | 1 | ||||
![]() |
| × | 1 | |||
![]() |
| × | 1 |
Apps en online services
![]() |
|
Over dit project
Overzicht
Een functie die de meeste autonome robots van rover nodig hebben, is lijnvolging. Het doel van dit project is om een lijnvolgerrobot te bouwen en op een leuke manier aan de slag te gaan met het leren van PID-controller.
Onderdelen
De robot functioneert naar behoren met twee motoren, de Rosbot Baseboard, en een 5-kanaals sensor. In tegenstelling tot anderen hoeft u geen extra H-bridge motordriver of verschillende componenten te kopen, aangezien de Rosbot Baseboard een ingebouwde 2x H-bridge dual driver heeft. Sluit eenvoudig motoren aan op de Rosbot-plint en deze levert meer stroom dan Arduino Uno.


- Het frame van de robot: KittenBot geanodiseerd aluminium chassis
Cool en solide chassis met tonnen montagegaten (4,8 mm LEGO Technic), je kunt dit chassis zeker hergebruiken voor andere leuke projecten.
- Het brein van een robot :RosBot-plint
Een op Arduino UNO gebaseerd moederbord met 2 ingebouwde dubbele H-bridge motordrivers.
- Robots ogen :5-kanaals IR-lijnvolgende trackersensor
5-kanaals infrarooddetector, nauwkeuriger en stabieler.
Stap 1:Montage
Deze robot is vrij eenvoudig in elkaar te zetten, volg de instructie en het duurt ongeveer 15 minuten.

Bevestig eerst uw motoren aan de zijkanten van het chassis, sluit gewoon het rubberen wiel aan.

Monteer de 5-kanaals IR-sensor aan de voorkant van het chassis.

Bevestig je Rosbot-plint aan het chassis, dan is de robot klaar om bedraad te worden.
Stap 2:Wringen
Hieronder volgen de aansluitingen voor de 5-kanaals IR-sensor:
- VCC naar 5V
- GND naar RosBot's GND
- T1-T4 naar pin A0-A3
- T5 om SDA vast te pinnen
DC-motoren gaan gewoon naar pin A+A- en pin B+B-.

Coderen
In de codes hebben we een statusmachine die elke mogelijke sensorarray-uitvoer aangeeft. De robot beweegt in een bepaalde richting volgens de output van de sensorarray.
void stateMachine(int a) { switch (a) { case B00000:outlineCnt++; pauze; geval B11111:outlineCnt++; pauze; geval B00010:geval B00110:outlineCnt =0; pixels.setPixelColor(2, pixels.Color(0, 50, 0)); vooringenomenheid =1; pauze; geval B00001:geval B00011:outlineCnt =0; pixels.setPixelColor(2, pixels.Color(0, 200, 0)); vooringenomenheid =2; pauze; geval B00100:outlineCnt =0; pixels.setPixelColor(2, pixels.Color(0, 0, 20)); vooringenomenheid =0; pauze; geval B01000:geval B01100:outlineCnt =0; pixels.setPixelColor(2, pixels.Color(50, 0, 0)); vooringenomenheid =-1; pauze; geval B10000:geval B11000:outlineCnt =0; pixels.setPixelColor(2, pixels.Color(200, 0, 0)); vooringenomenheid =-2; pauze; standaard:Serial.println(a,BIN); schetsCnt++; pauze; }
We hebben al de waarde van Error, proportieterm, integrale term en afgeleide term ingesteld.

float Kp =25;float Ki =0.15;float Kd =1200;float error, errorLast, erroInte;float calcPid(float input) { float errorDiff; vlotter uitgang; fout =fout * 0,7 + invoer * 0,3; // filter // fout =invoer; errorDiff =fout - errorLast; erroInte =beperking (erroInte + fout, -50, 50); output =Kp * error + Ki * erroInte + Kd * errorDiff; Seriële.afdruk (fout); Serieel.print(' '); Serial.print(erroInte); Serieel.print(' '); Serial.print(errorDiff); Serieel.print(' '); Serial.println(uitvoer); errorLaatste =fout; output teruggeven;
Manipuleer de waarden om de beste pasvorm voor uw robot te vinden.
Code
- Lijnvolgrobot
LijnvolgerrobotArduino
In de codes nemen we een NeoPixel van Adafruit op, maar dat is optioneel.#include#define S_NULL 0#define S_ONTRACE 1Adafruit_NeoPixel pixels =Adafruit_NeoPixel(4, 4, NEO_GRB + NEO_KHDC800); spdL, int spdR) { spdR =-spdR; if (spdL <0) { analogWrite(5, 0); analogWrite(6, -spdL); } else { analogWrite(5, spdL); analoogWrite(6, 0); } if (spdR <0) { analogWrite(9, 0); analogWrite(10, -spdR); } else { analogWrite(9, spdR); analoogWrite(10, 0); }}int bias =0;int outlineCnt =0;void stateMachine(int a) { switch (a) { case B00000:outlineCnt++; pauze; geval B11111:outlineCnt++; pauze; geval B00010:geval B00110:outlineCnt =0; pixels.setPixelColor(2, pixels.Color(0, 50, 0)); vooringenomenheid =1; pauze; geval B00001:geval B00011:outlineCnt =0; pixels.setPixelColor(2, pixels.Color(0, 200, 0)); vooringenomenheid =2; pauze; geval B00100:outlineCnt =0; pixels.setPixelColor(2, pixels.Color(0, 0, 20)); vooringenomenheid =0; pauze; geval B01000:geval B01100:outlineCnt =0; pixels.setPixelColor(2, pixels.Color(50, 0, 0)); vooringenomenheid =-1; pauze; geval B10000:geval B11000:outlineCnt =0; pixels.setPixelColor(2, pixels.Color(200, 0, 0)); vooringenomenheid =-2; pauze; standaard:Serial.println(a,BIN); schetsCnt++; pauze; } pixels.setPixelColor(0, pixels.Color(outlineCnt * 10, 0, 0)); if (outlineCnt> 10) { doDcSpeed(0,0); } else { float ff =150; float ctrl =calcPid(bias); doDcSpeed(ff-ctrl,ff+ctrl); } pixels.show();}float Kp =25;float Ki =0.15;float Kd =1200;float error, errorLast, erroInte;float calcPid(float input) { float errorDiff; vlotter uitgang; fout =fout * 0,7 + invoer * 0,3; // filter // fout =invoer; errorDiff =fout - errorLast; erroInte =beperking (erroInte + fout, -50, 50); output =Kp * error + Ki * erroInte + Kd * errorDiff; Seriële.afdruk (fout); Serieel.print(' '); Serial.print(erroInte); Serieel.print(' '); Serial.print(errorDiff); Serieel.print(' '); Serial.println(uitvoer); errorLaatste =fout; retourneer output;}int echoTrace() {int ret =0; int a[5]; for (int i =0; i <5; i++) { a[i] =constrain((1025 - analogRead(A0 + i)) / 10 - 4, 0, 20); als (a[i]> 2) ret +=(0x1 < LinefollowRobot
https://github.com/KittenBot/LinefollowRobot
Schema's

Productieproces
- De toekomst van robotica
- Basketbal
- Golfbal
- Tutorial – sPiRobot:Bedien en zie wat uw robot overal ziet
- Automatisering:opnieuw ontworpen robotlijn
- SCARA Robotlijn uitgebreid
- Assembly Line Robots:A Definitive Guide
- Industriële lijnvolger voor het leveren van materialen
- Speed Line Follower Robot V4
- PID-regeling van robotgrijper in Matlab / Simulink
- Geautomatiseerde kwaliteitscontrole van verpakkingslijnen