Tentang proyek ini
Ikhtisar
Salah satu fitur yang dibutuhkan sebagian besar robot otonom rover adalah mengikuti garis. Tujuan dari proyek ini adalah untuk membangun robot pengikut garis dan memulai belajar pengontrol PID dengan cara yang menyenangkan.
Bagian
Robot berfungsi dengan baik dengan dua motor, Rosbot Baseboard, dan sensor 5-Saluran. Tidak seperti yang lain, Anda tidak perlu membeli driver motor H-bridge tambahan atau berbagai komponen karena Rosbot Baseboard memiliki driver ganda H-bridge 2x bawaan. Cukup hubungkan motor ke alas tiang Rosbot dan itu akan memasok lebih banyak daya daripada Arduino Uno.
- Bingkai robot: Sasis Aluminium Anodized KittenBot
Sasis keren dan kokoh yang memiliki banyak lubang pemasangan (Teknik LEGO 4.8mm), Anda pasti dapat menggunakan kembali sasis ini untuk proyek menyenangkan lainnya.
- Otak robot :Papan Dasar RosBot
Mainboard berbasis Arduino UNO dengan 2x driver motor H-bridge ganda terpasang.
- Mata robot :Sensor Pelacak Mengikuti Jalur IR 5-Saluran
Detektor Inframerah 5-Saluran, lebih akurat dan stabil.
Langkah 1:Perakitan
Robot ini cukup mudah untuk dirakit, ikuti instruksinya dan Anda membutuhkan waktu sekitar 15 menit.
Pertama, pasang motor Anda ke sisi sasis, cukup colokkan roda karet.
Pasang sensor IR 5-Saluran ke bagian depan sasis.
Pasang alas tiang Rosbot Anda ke sasis, lalu robot siap dipasangkan kabel.
Langkah 2:Peras
Berikut ini adalah koneksi untuk sensor IR 5-Channel:
- T1-T4 untuk menyematkan A0-A3
Motor DC cukup masuk ke pin A+A- dan pin B+B-.
Pengkodean
Dalam kode, kami memiliki mesin status yang menunjukkan setiap kemungkinan keluaran array sensor. Robot bergerak ke arah tertentu sesuai dengan keluaran sensor array.
void stateMachine(int a) { switch (a) { case B00000:outlineCnt++; merusak; kasus B11111:outlineCnt++; merusak; kasus B00010:kasus B00110:outlineCnt =0; piksel.setPixelColor(2, piksel.Warna (0, 50, 0)); bias =1; merusak; kasus B00001:kasus B00011:outlineCnt =0; piksel.setPixelColor(2, piksel.Warna (0, 200, 0)); bias =2; merusak; kasus B00100:outlineCnt =0; piksel.setPixelColor(2, piksel.Warna (0, 0, 20)); bias =0; merusak; kasus B01000:kasus B01100:outlineCnt =0; piksel.setPixelColor(2, piksel.Warna(50, 0, 0)); bias =-1; merusak; kasus B10000:kasus B11000:outlineCnt =0; piksel.setPixelColor(2, piksel.Warna(200, 0, 0)); bias =-2; merusak; default:Serial.println(a,BIN); outlineCnt++; merusak; }
Kita sudah menyiapkan nilai Error, suku proporsi, suku integral, dan suku turunan.
float Kp =25;float Ki =0.15;float Kd =1200;float error, errorLast, erroInte;float calcPid(float input) { float errorDiff; keluaran mengambang; kesalahan =kesalahan * 0,7 + masukan * 0,3; //filter //kesalahan =masukan; errorDiff =kesalahan - errorLast; erroInte =kendala(erroInte + kesalahan, -50, 50); keluaran =Kp * error + Ki * erroInte + Kd * errorDiff; Serial.print(kesalahan); Serial.print(' '); Serial.print(erroInte); Serial.print(' '); Serial.print(errorDiff); Serial.print(' '); Serial.println(keluaran); errorLast =kesalahan; kembalikan keluaran;
Manipulasi nilai untuk menemukan yang paling cocok untuk robot Anda.
Kode
Robot pengikut garisArduino
Dalam kode, kami menyertakan NeoPixel dari Adafruit, tapi itu opsional.#include #define S_NULL 0#define S_ONTRACE 1Adafruit_NeoPixel pixels =Adafruit_NeoPixel(4, 4, NEO_GRB + NEO_KHZ800);void doDcSpeed spdL, int spdR) { spdR =-spdR; if (spdL <0) { analogWrite(5, 0); analogWrite(6, -spdL); } else { analogWrite(5, spdL); analogWrite(6, 0); } if (spdR <0) { analogWrite(9, 0); analogWrite(10, -spdR); } else { analogWrite(9, spdR); analogWrite(10, 0); }}int bias =0;int outlineCnt =0;void stateMachine(int a) { switch (a) { case B00000:outlineCnt++; merusak; kasus B11111:outlineCnt++; merusak; kasus B00010:kasus B00110:outlineCnt =0; piksel.setPixelColor(2, piksel.Warna (0, 50, 0)); bias =1; merusak; kasus B00001:kasus B00011:outlineCnt =0; piksel.setPixelColor(2, piksel.Warna (0, 200, 0)); bias =2; merusak; kasus B00100:outlineCnt =0; piksel.setPixelColor(2, piksel.Warna (0, 0, 20)); bias =0; merusak; kasus B01000:kasus B01100:outlineCnt =0; piksel.setPixelColor(2, piksel.Warna(50, 0, 0)); bias =-1; merusak; kasus B10000:kasus B11000:outlineCnt =0; piksel.setPixelColor(2, piksel.Warna(200, 0, 0)); bias =-2; merusak; default:Serial.println(a,BIN); outlineCnt++; merusak; } piksel.setPixelColor(0, piksel.Warna(garisCnt * 10, 0, 0)); if (outlineCnt> 10) { doDcSpeed(0,0); } else { float dst =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; keluaran mengambang; kesalahan =kesalahan * 0,7 + masukan * 0,3; //filter //kesalahan =masukan; errorDiff =kesalahan - errorLast; erroInte =kendala(erroInte + kesalahan, -50, 50); keluaran =Kp * error + Ki * erroInte + Kd * errorDiff; Serial.print(kesalahan); Serial.print(' '); Serial.print(erroInte); Serial.print(' '); Serial.print(errorDiff); Serial.print(' '); Serial.println(keluaran); errorLast =kesalahan; hasil keluaran;}int echoTrace() { int ret =0; int[5]; for (int i =0; i <5; i++) { a[i] =constrain((1025 - analogRead(A0 + i)) / 10 - 4, 0, 20); if (a[i]> 2) ret +=(0x1 < LinefollowRobot
https://github.com/KittenBot/LinefollowRobot
Skema