How can we help you today?
【感測】近紅外線感測 – line | IR3CH
簡介
紅外線感測陣列就像是機器人的「地圖領航員」,能感知地面的顏色差異來判斷自身位置。在現實生活中,這類技術廣泛應用於工廠的無人搬運車(AGV),讓機器人能沿著鋪設好的軌道精準運送貨物。透過判斷深淺顏色的反射率,感測器能告訴機器人何時該左轉、何時該修正路徑或停車。這不僅是自動導航的入門基礎,更是讓機器人具備「場地意識」的重要感官。
IR3CH 類別專為處理三路紅外線反射感測器設計,主要用於循線(Line Following)與邊界偵測(Boundary Sensing)。它能將讀取到的類比訊號自動轉換為邏輯狀態,簡化了原本繁瑣的數值判斷流程。本範例展示了如何利用三角形排列的感測器矩陣,精確獲取車體相對於軌道的偏移狀態。
硬體配置與原理
- 感測器組成:三路紅外線發射與接收對管(左、中、右)。
- 配置方式:採三角形(Triangle Pattern)排列,能更細緻地分辨「稍微偏向」與「嚴重偏移」的差異。
- 連接腳位:使用 ESP32 具備類比數位轉換(ADC)功能的腳位:
- 左側 (L):GPIO 34 (
DUAL2S_HW::IR_L) - 中間 (M):GPIO 35 (
DUAL2S_HW::IR_M) - 右側 (R):GPIO 39 (
DUAL2S_HW::IR_R)
- 左側 (L):GPIO 34 (
核心功能說明
- 動態更新與邏輯判斷
update(): 開發者可依據環境光線與場地材質調整三個關鍵參數:- 門檻值 (Threshold):設定區分黑與白的類比臨界點(範例預設為 2000)。
- 目標極性:可自由切換
BLACK_LINE(黑軌白底)或WHITE_LINE(白軌黑底)。 - 偵錯模式 (Debug):開啟後可直接在序列埠查看原始數值,方便調整門檻值。
- 狀態機器機制
getState(): 感測器會回傳一個byte數值,代表目前感測器的接觸組合:- 中間 (State 2):代表精準對齊,可高速行進。
- 偏側 (State 1, 4):代表車體已大幅偏移,需立即修正轉向。
- 複合狀態 (State 3, 6):代表兩顆感測器同時壓線,提供更平滑的轉向修正依據。
- 全線 (State 7):通常用於偵測橫向的交叉口或終點線。
使用建議
- 環境調適:紅外線易受環境強光(如陽光)干擾。在正式比賽或運作前,務必使用
update中的 Debug 功能確認場地的「黑/白讀值差」,並找出最穩定的IR_THRESHOLD。 - 安裝高度:建議感測器距離地面約 5mm 至 8mm 以獲得最佳感度。
dual2s控制器與環境
AI學伴
互動(1):基於函數庫 – dual2s
互動(2):基於範例程式
👉 你也可以在dual2s函數庫(./example/basic)中找到此範例程式。
/*=====================================================================================
yesio.net / 2026.03.12 / by nick
# Filename:04_IR3CH.ino
# Function:紅外線循線邊界感測 (IR3CH 類別) 使用範例
Test Code of dual2S's IR3CH CLASS.
# Toolchain & Libs:ESP32 Arduino Core v3.3.5 (ESP-IDF v5.1), dual2s
======================================================================================*/
#include <dual2s.h>
const uint16_t IR_THRESHOLD = 2000;
// 宣告 IR3CH 物件,使用 dual2s.h 預設的類比輸入腳位 (34, 35, 39)
IR3CH ir(DUAL2S_HW::IR_L, DUAL2S_HW::IR_M, DUAL2S_HW::IR_R);
void setup() {
Serial.begin(115200);
Serial.println("=== IR3CH 紅外線感測器陣列測試開始 ===");
Serial.println("準備讀取數值...");
}
void loop() {
//---------------------------------------
//參數(1):判斷門檻值
//參數(2):判斷目標線:BLACK_LINE(黑線) / WHITE_LINE(白線)
//參數(3):是否開啟DEBUG以輸出IR讀值
//---------------------------------------
ir.update(IR_THRESHOLD, IR3CH::BLACK_LINE, false);
byte state = ir.getState();
//IR are deployed in TRIANGLE pattern.
//循線感測器
switch(state) {
case 0:
Serial.println("未在線上 / 搜尋");
break;
case 1:
Serial.println("車體偏左");
break;
case 3:
Serial.println("車體稍微偏左");
break;
case 2:
Serial.println("車體中線");
break;
case 4:
Serial.println("車體偏右");
break;
case 6:
Serial.println("車體稍微偏右");
break;
case 5:
Serial.println("未知");
break;
case 7:
Serial.println("車體全線 / 終點");
break;
}
}
