PID制御ラインフォロワーロボット
コンポーネントと消耗品
| × | 1 | ||||
| × | 1 | ||||
| × | 1 | ||||
| × | 1 | ||||
| × | 1 | ||||
| × | 1 | ||||
| × | 1 | ||||
| × | 1 |
アプリとオンラインサービス
> |
|
このプロジェクトについて
概要
ほとんどのローバー自律型ロボットに必要な機能の1つは、ラインフォローです。このプロジェクトの目的は、ラインフォロワーロボットを構築し、楽しい方法でPIDコントローラーの学習を開始することです。
パーツ
ロボットは、RosbotBaseboardと5チャンネルセンサーの2つのモーターで適切に機能します。他とは異なり、RosbotBaseboardには2xHブリッジデュアルドライバーが組み込まれているため、追加のHブリッジモータードライバーやさまざまなコンポーネントを購入する必要はありません。モーターをRosbotベースボードに接続するだけで、ArduinoUnoよりも多くの電力を供給できます。
<図><図>
- ロボットのフレーム: KittenBot陽極酸化アルミニウムシャーシ
たくさんの取り付け穴(4.8mm LEGO Technic)を備えたクールで頑丈なシャーシで、このシャーシを他の楽しいプロジェクトに確実に再利用できます。
- ロボットの脳 :RosBotベースボード
2xオンボードデュアルHブリッジモータードライバーを備えたArduinoUNOベースのメインボード。
- ロボットの目 :5チャンネルIRライン追跡トラッカーセンサー
5チャンネル赤外線検出器、より正確で安定しています。
ステップ1:組み立て
このロボットは組み立てがかなり簡単で、指示に従ってください。所要時間は約15分です。
<図>まず、モーターをシャーシの側面に取り付け、ゴム製のホイールを差し込むだけです。
<図>5チャンネルIRセンサーをシャーシの前面に取り付けます。
<図>Rosbotベースボードをシャーシに取り付けると、ロボットを配線する準備が整います。
ステップ2:絞る
以下は、5チャンネルIRセンサーの接続です。
- VCCから5V
- GNDからRosBotのGNDへ
- T1-T4からピンA0-A3
- SDAを固定するためのT5
DCモーターは、ピンA + A-とピンB + B-に接続するだけです。
<図>
コーディング
コードには、可能な各センサーアレイ出力を示すステートマシンがあります。ロボットはセンサーアレイの出力に応じて特定の方向に移動します。
void stateMachine(int a){switch(a){case B00000:outlineCnt ++;壊す;ケースB11111:outlineCnt ++;壊す;ケースB00010:ケースB00110:outlineCnt =0; pixel.setPixelColor(2、pixels.Color(0、50、0));バイアス=1;壊す;ケースB00001:ケースB00011:outlineCnt =0; pixel.setPixelColor(2、pixels.Color(0、200、0));バイアス=2;壊す;ケースB00100:outlineCnt =0; pixel.setPixelColor(2、pixels.Color(0、0、20));バイアス=0;壊す;ケースB01000:ケースB01100:outlineCnt =0; pixel.setPixelColor(2、pixels.Color(50、0、0));バイアス=-1;壊す;ケースB10000:ケースB11000:outlineCnt =0; pixel.setPixelColor(2、pixels.Color(200、0、0));バイアス=-2;壊す;デフォルト:Serial.println(a、BIN); outlineCnt ++;壊す; }
エラー、比例項、積分項、微分項の値はすでに設定されています。
<図> float Kp =25; float Ki =0.15; float Kd =1200; float error、errorLast、erroInte; float calcPid(float input){float errorDiff;フロート出力;エラー=エラー* 0.7 +入力* 0.3; //フィルター//エラー=入力; errorDiff =error-errorLast; erroInte =Constraint(erroInte +エラー、-50、50);出力=Kp *エラー+ Ki * erroInte + Kd * errorDiff; Serial.print(エラー); Serial.print( ''); Serial.print(erroInte); Serial.print( ''); Serial.print(errorDiff); Serial.print( ''); Serial.println(出力); errorLast =エラー;出力を返す;
値を操作して、ロボットに最適なものを見つけてください。
コード
- ラインフォロワーロボット
ラインフォロワーロボット Arduino
コードには、AdafruitのNeoPixelが含まれていますが、これはオプションです。 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); }} intbias =0; intoutlineCnt =0; void stateMachine(int a){switch(a){case B00000:outlineCnt ++;壊す;ケースB11111:outlineCnt ++;壊す;ケースB00010:ケースB00110:outlineCnt =0; pixel.setPixelColor(2、pixels.Color(0、50、0));バイアス=1;壊す;ケースB00001:ケースB00011:outlineCnt =0; pixel.setPixelColor(2、pixels.Color(0、200、0));バイアス=2;壊す;ケースB00100:outlineCnt =0; pixel.setPixelColor(2、pixels.Color(0、0、20));バイアス=0;壊す;ケースB01000:ケースB01100:outlineCnt =0; pixel.setPixelColor(2、pixels.Color(50、0、0));バイアス=-1;壊す;ケースB10000:ケースB11000:outlineCnt =0; pixel.setPixelColor(2、pixels.Color(200、0、0));バイアス=-2;壊す;デフォルト:Serial.println(a、BIN); outlineCnt ++;壊す; } pixel.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); } pixel.show();} float Kp =25; float Ki =0.15; float Kd =1200; float error、errorLast、erroInte; float calcPid(float input){float errorDiff;フロート出力;エラー=エラー* 0.7 +入力* 0.3; //フィルター//エラー=入力; errorDiff =error-errorLast; erroInte =Constraint(erroInte +エラー、-50、50);出力=Kp *エラー+ Ki * erroInte + Kd * errorDiff; Serial.print(エラー); Serial.print( ''); Serial.print(erroInte); Serial.print( ''); Serial.print(errorDiff); Serial.print( ''); Serial.println(出力); errorLast =エラー;出力を返す;} 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 回路図
製造プロセス