NodeMCUと赤外線反射センサーTCRT5000を1個、そして2チャンネルのモータードライバー(右前進・左前進)を使用したライントレースロボットのサンプルプログラムと解説を以下に示します。
このプログラムは、黒い線の上をジグザグに動きながら追従する、センサー1個方式の基本的なライントレースを実現します。
概要
このロボットは、センサーが白い地面を検出したら片方のモーターを動かして線を探し(旋回)、黒い線を検出したらもう片方のモーターを動かして線の縁(エッジ)を探す、という動作を繰り返します。これにより、常に線の縁をジグザグにトレースしながら進んでいきます。
必要なもの
- NodeMCU (ESP8266)
- 赤外線反射センサー TCRT5000モジュール x 1
- モータードライバー (L9110S、TB6612など)
- DCモーター x 2 と車体
- 電源(モバイルバッテリーや電池ボックスなど)
配線例
| 接続元 | 接続先 | 備考 |
| NodeMCU | ||
| A0 | TCRT5000 アナログ出力(AO) | センサーの値を読み取ります |
| D1 (GPIO5) | 右モータードライバー入力 (例: IN1) | 右モーターを前進させます |
| D2 (GPIO4) | 左モータードライバー入力 (例: IN2) | 左モーターを前進させます |
| 3V3 (3.3V) | TCRT5000 VCC | センサーに電源を供給します |
| GND | TCRT5000 GND | センサーのGND |
| VIN | モータードライバー VCC | モータードライバーのロジック用電源 |
| GND | モータードライバー GND | モータードライバーのGND |
| (外部電源) | モータードライバー VM | モーター用の電源 (バッテリーなど) |
| (外部電源 GND) | モータードライバー GND | モーター電源のGND (NodeMCUのGNDと共通化) |
【重要】 モーターは多くの電流を消費するため、NodeMCUの電源ピンから直接取るのではなく、必ず外部のバッテリーなどからモータードライバー経由で供給してください。
Arduino IDE プログラム
このプログラムをArduino IDEにコピー&ペーストしてNodeMCUに書き込んでください。
// ===== ピン設定 =====
// TCRT5000 赤外線センサーのアナログ出力ピン
const int SENSOR_PIN = A0;
// モータードライバーの制御ピン
const int RIGHT_MOTOR_PIN = D1; // 右モーター前進用 (GPIO5)
const int LEFT_MOTOR_PIN = D2; // 左モーター前進用 (GPIO4)
// ===== 閾値(しきいち)設定 =====
// 白と黒を判断するための境界値。この値は必ず調整してください。
int threshold = 500;
void setup() {
// デバッグ用にシリアル通信を開始
Serial.begin(115200);
// モーター制御ピンを出力モードに設定
pinMode(RIGHT_MOTOR_PIN, OUTPUT);
pinMode(LEFT_MOTOR_PIN, OUTPUT);
// 起動時にモーターを停止させておく
digitalWrite(RIGHT_MOTOR_PIN, LOW);
digitalWrite(LEFT_MOTOR_PIN, LOW);
// 5秒待機。ロボットをコースに置く時間
Serial.println("5秒後にスタートします...");
delay(5000);
Serial.println("スタート!");
}
void loop() {
// センサーからアナログ値を読み取る (0〜1023の範囲)
int sensorValue = analogRead(SENSOR_PIN);
// センサーの値をシリアルモニタに表示(デバッグ用)
Serial.print("センサー値: ");
Serial.println(sensorValue);
// 読み取った値が閾値より大きいか小さいかで判断
if (sensorValue > threshold) {
// 【白い地面を検出】
// ラインから外れているので、右に曲がってラインを探す
// 左モーターON, 右モーターOFF
Serial.println("白を検出 -> 右へ");
digitalWrite(LEFT_MOTOR_PIN, HIGH);
digitalWrite(RIGHT_MOTOR_PIN, LOW);
} else {
// 【黒い線を検出】
// ラインの上に乗っているので、左に曲がってラインの縁を探す
// 右モーターON, 左モーターOFF
Serial.println("黒を検出 -> 左へ");
digitalWrite(LEFT_MOTOR_PIN, LOW);
digitalWrite(RIGHT_MOTOR_PIN, HIGH);
}
// 処理が速すぎると不安定になることがあるため、短い待機時間をいれる
delay(10);
}【最重要】閾値(threshold)の調整方法
このプログラムが正しく動作するためには、thresholdの値をあなたの環境に合わせて調整することが不可欠です。
- プログラムを書き込む: 上記のプログラムをNodeMCUに書き込みます。
- シリアルモニタを開く: Arduino IDEの右上の虫眼鏡アイコンをクリックしてシリアルモニタを開きます(通信速度を
115200 bpsに設定)。 - センサーの値を確認する:
- ロボットのセンサーを白い地面の上に置きます。シリアルモニタに表示される「センサー値」をメモします。(例: 750)
- 次に、センサーを黒い線の上に置きます。表示される「センサー値」をメモします。(例: 150)
- 閾値を決定する:
- メモした白い地面の値と黒い線の値の、ちょうど中間の値を求めます。
- 例: (750 + 150) / 2 = 450
- この計算で出た値を、プログラムの
int threshold = 500;の500の部分に書き換えます。(この例ではint threshold = 450;となります)
- 再書き込み: 閾値を変更したプログラムを再度NodeMCUに書き込んで完成です。
うまく動かない場合のヒント
- その場で回転してしまう場合:
if文の中の処理とelseの中の処理を入れ替えてみてください。センサーの特性や配線によって、白と黒で検出される値の大小が逆になることがあります。 - カーブでコースアウトする場合: モーターの速度が速すぎる可能性があります。PWM制御(
analogWrite)で速度を調整するか、電源電圧を少し下げてみてください。(今回のプログラムはON/OFFのみのシンプルな制御です) - センサーが反応しない: 配線(特にVCCとGND)が正しいか、もう一度確認してみてください。



コメント