如果你想要制作一個(gè)遵循黑線行動(dòng)的酷機(jī)器人。大概只需要在 2 小時(shí)內(nèi)學(xué)習(xí)并制作就能夠完成帶有 PID 控制器的線跟隨器機(jī)器人。
大多數(shù)漫游車自主機(jī)器人需要的一項(xiàng)功能是線路跟蹤。該項(xiàng)目的目的是構(gòu)建一個(gè)線跟隨機(jī)器人,并以一種有趣的方式開始學(xué)習(xí) PID 控制器。
構(gòu)建
機(jī)器人與兩個(gè)電機(jī)、Rosbot 底板和一個(gè) 5 通道傳感器一起正常工作。與其他產(chǎn)品不同,您無需購買額外的 H 橋電機(jī)驅(qū)動(dòng)器或各種組件,因?yàn)?Rosbot 基板具有內(nèi)置的 2x H 橋雙驅(qū)動(dòng)器。只需將電機(jī)連接到 Rosbot 基板,它將提供比 Arduino Uno 更多的電力。


機(jī)器人框架: KittenBot 陽極氧化鋁底盤
酷酷且堅(jiān)固的底盤,帶有大量安裝孔(4.8 毫米樂高機(jī)械組),您絕對可以將此底盤重復(fù)用于其他有趣的項(xiàng)目。
機(jī)器人的大腦:RosBot 底板
一個(gè)基于 Arduino UNO 的主板,帶有 2 個(gè)板載雙 H 橋電機(jī)驅(qū)動(dòng)器。
機(jī)器人的眼睛: 5 通道 IR 線跟隨跟蹤器傳感器
第 1 步:組裝
這個(gè)機(jī)器人很容易組裝,按照說明操作,大約需要 15 分鐘。

首先,將電機(jī)連接到底盤的側(cè)面,只需插入橡膠輪即可。

將 5 通道紅外傳感器安裝到機(jī)箱前部。

將您的 Rosbot 底板連接到底盤上,然后機(jī)器人就可以開始接線了。
第2步:連接
以下是 5 通道紅外傳感器的連接:
VCC 至 5V
GND 到 RosBot 的 GND
T1-T4 到引腳 A0-A3
T5 到 SDA 引腳
直流電機(jī)只需連接到引腳 A+A- 和引腳 B+B-。

編碼
在代碼中,我們有一個(gè)狀態(tài)機(jī)來指示每個(gè)可能的傳感器陣列輸出。機(jī)器人根據(jù)傳感器陣列輸出向某個(gè)方向移動(dòng)。
void stateMachine(int a) {
switch (a) {
? ?case B00000:
? ? ?outlineCnt++;
? ? ?break;
? ?case B11111:
? ? ?outlineCnt++;
? ? ?break;
? ?case B00010:
? ?case B00110:
? ? ?outlineCnt = 0;
? ? ?pixels.setPixelColor(2, pixels.Color(0, 50, 0));
? ? ?bias = 1;
? ? ?break;
? ?case B00001:
? ?case B00011:
? ? ?outlineCnt = 0;
? ? ?pixels.setPixelColor(2, pixels.Color(0, 200, 0));
? ? ?bias = 2;
? ? ?break;
? ?case B00100:
? ? ?outlineCnt = 0;
? ? ?pixels.setPixelColor(2, pixels.Color(0, 0, 20));
? ? ?bias = 0;
? ? ?break;
? ?case B01000:
? ?case B01100:
? ? ?outlineCnt = 0;
? ? ?pixels.setPixelColor(2, pixels.Color(50, 0, 0));
? ? ?bias = -1;
? ? ?break;
? ?case B10000:
? ?case B11000:
? ? ?outlineCnt = 0;
? ? ?pixels.setPixelColor(2, pixels.Color(200, 0, 0));
? ? ?bias = -2;
? ? ?break;
? ?default:
? ? ?Serial.println(a,BIN);
? ? ?outlineCnt++;
? ? ?break;
?}
到此我們已經(jīng)設(shè)置了誤差、比例項(xiàng)、積分項(xiàng)和導(dǎo)數(shù)項(xiàng)的值。

float Kp = 25;
float Ki = 0.15;
float Kd = 1200;
float error, errorLast, erroInte;
float calcPid(float input) {
?float errorDiff;
?float output;
?error = error * 0.7 + input * 0.3; // filter
?//error = input;
?errorDiff = error - errorLast;
?erroInte = constrain(erroInte + error, -50, 50);
?output = Kp * error + Ki * erroInte + Kd * errorDiff;
?Serial.print(error); Serial.print(' ');
?Serial.print(erroInte); Serial.print(' ');
?Serial.print(errorDiff); Serial.print(' ');
?Serial.println(output);
?errorLast = error;
?return output;
電子發(fā)燒友App
















評(píng)論