PID制御ライントレースロボットキット – Arduino UNO、5ch IRセンサー、アルミシャーシ
必要な部品と材料 (KittenBot RosBotキットベース)
| KittenBot アルマイトアルミシャーシ (LEGOテクニック穴 4.8mm ピッチ) × 1 |
| KittenBot RosBot ベースボード (Arduino UNO互換、オンボード 2×Hブリッジ) × 1 |
| KittenBot 金属ボールキャスター (ペア) × 1 |
| KittenBot ゴムホイール+モーターハブセット (ペア) × 1 |
| KittenBot 5ch IRライントレースセンサー × 1 |
| DCモーター (汎用、ベースボード搭載済みの場合あり) × 2 |
| 9V電池 (またはLi-ion 2Sパック) × 1 |
| Arduino UNO (RosBotベースボードに搭載、別途不要な場合あり) × 1 |
開発環境
- Arduino IDE
プロジェクト概要
自律ロボットの基本であるライントレースを、PID制御で安定・高速に走行させる学習用ロボットキットです。RosBotベースボードにはデュアルHブリッジが搭載されており、別途モータードライバーを購入する必要がありません。5チャネルIRセンサーでライン位置を高精度に検出し、PID演算で左右モーターの速度差を制御します。
ハードウェア構成
RosBotベースボードの特徴
- Arduino UNO (ATmega328P) 互換
- オンボード 2ch Hブリッジ (ST L298 または同等) – モーター直結可能
- 5V/3.3V レギュレーター、電源入力保護
- 豊富なピンヘッダー (サーボ、I2C、SPI、アナログ等)
5ch IRセンサー接続
| センサーピン | 接続先 |
|---|---|
| VCC | 5V |
| GND | GND |
| T1〜T4 | A0〜A3 (アナログ入力) |
| T5 | SDA (A4) ※デジタル入力としても使用可 |
モーター接続
- 左モーター → MOTOR A+ / A-
- 右モーター → MOTOR B+ / B-
組み立て手順 (約15分)
- モーターをシャーシ側面に固定、ゴムホイールを装着
- ボールキャスターを前部に取り付け
- 5ch IRセンサーを前面下部にマウント (地面から 5〜10mm 推奨)
- RosBotベースボードをシャーシ中央に固定
- 配線: センサー、モーター、電池を接続
ソフトウェア: 状態機械 + PID制御
センサー状態のビットマップ化
5つのセンサー値を閾値処理して 5ビットパターン (例: B00100 = 中央のみ検知) に変換し、stateMachine() で各パターンに対応する bias (偏差) を決定します。
PID演算
float Kp = 25.0;
float Ki = 0.15;
float Kd = 1200.0;
float error, errorLast, errorInte;
float calcPid(float input) {
// 簡易ローパスフィルターでノイズ低減
error = error * 0.7 + input * 0.3;
float errorDiff = error - errorLast;
errorInte = constrain(errorInte + error, -50, 50); // アンチワインドアップ
float output = Kp * error + Ki * errorInte + Kd * errorDiff;
errorLast = error;
return output;
}
モーター制御
void doDcSpeed(int spdL, int spdR) {
spdR = -spdR; // 右モーター極性反転 (配線による)
// 左モーター (PWMピン 5, 6)
if (spdL < 0) { analogWrite(5, 0); analogWrite(6, -spdL); }
else { analogWrite(5, spdL); analogWrite(6, 0); }
// 右モーター (PWMピン 9, 10)
if (spdR < 0) { analogWrite(9, 0); analogWrite(10, -spdR); }
else { analogWrite(9, spdR); analogWrite(10, 0); }
}
メインループ
void loop() {
delay(5);
int pos = echoTrace(); // 5chセンサー読取 → ビットパターン化
stateMachine(pos); // bias決定 + NeoPixel表示 (オプション)
if (outlineCnt > 10) { // ライン見失いカウント超過で停止
doDcSpeed(0, 0);
} else {
float baseSpeed = 150; // 基準速度 (0-255)
float ctrl = calcPid(bias); // PID出力
doDcSpeed(baseSpeed - ctrl, baseSpeed + ctrl);
}
}
PIDゲイン調整のコツ
- Kpのみから開始: 振動しない最大値を探す
- Kdを追加: オーバーシュート抑制、応答性向上
- Kiを微調整: 定常偏差 (カーブでの内輪差など) を補正
- 実走行で微調整: コース形状・床材質・バッテリー電圧で最適値が変わる
完全なスケッチ
#include <Adafruit_NeoPixel.h> // オプション: 状態表示用
#define S_NULL 0
#define S_ONTRACE 1
Adafruit_NeoPixel pixels = Adafruit_NeoPixel(4, 4, NEO_GRB + NEO_KHZ800);
int bias = 0;
int outlineCnt = 0;
void doDcSpeed(int spdL, int spdR) { /* 上記参照 */ }
void stateMachine(int a) {
switch (a) {
case B00000: 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;
}
pixels.setPixelColor(0, pixels.Color(outlineCnt * 10, 0, 0));
pixels.show();
}
float Kp = 25, Ki = 0.15, Kd = 1200;
float error, errorLast, errorInte;
float calcPid(float input) { /* 上記参照 */ }
int echoTrace() {
int ret = 0;
for (int i = 0; i < 5; i++) {
int val = constrain((1025 - analogRead(A0 + i)) / 10 - 4, 0, 20);
if (val > 2) ret |= (0x1 << i);
}
return ret;
}
void setup() {
Serial.begin(115200);
pixels.begin();
}
void loop() {
delay(5);
int pos = echoTrace();
stateMachine(pos);
}
リソース
- GitHub: KittenBot/LinefollowRobot
- 回路図・配線図: プロジェクトページの Schematics を参照
発展課題
- クロスライン検知 (全センサーON) での一時停止/分岐判断
- ギャップ (ライン途切れ) 通過ロジック追加
- 速度プロファイル制御 (直線加速、カーブ減速)
- 無線テレメトリー (Bluetooth/BLE) でPIDパラメータ遠隔調整
- カメラ+OpenCV でライン認識への拡張
製造プロセス
- バスケットボール:ネイスミスの1891年発明から現代製造技術まで
- ゴルフ:豊かな伝統と現代的魅力を持つグローバルスポーツ
- ライブビデオストリーミング付き Pi 搭載ロボットの構築と制御
- 産業用ラインフォロワーロボット - 物資輸送用自律走行ロボット
- V4スピードラインフォロワーロボット – Arduino Nanoベースの高度な自律走行
- MATLAB/Simulinkで3DロボットグリッパーのPID制御をマスター
- Wittmann Battenfeld、高クランプ力成形向け新ロボットラインWX153を発表
- ファナック、SCARAロボットライン拡充:6モデル、3-20kgペイロード、400-1100mmリーチ
- 高度な自動制御システムで包装品質保証を効率化
- 組立ラインロボット完全解説:効率・精度・品質を劇的に向上させる導入ガイド
- 21世紀のロボティクス:分散システム、テレプレゼンス、宇宙探査