How can we help you today?
【感測】近紅外線感測 – 相撲 | IR3CH
簡介
紅外線感測陣列就像是機器人的「地面導航儀」,能敏銳地察覺地板顏色的變化,在現實生活中,這正是自動掃地機器人防止從樓梯摔落、或是工廠無人搬運車(AGV)辨識作業區域的核心技術。透過特殊的「三角佈署」方式,感測器能全方位監控車體前後左右的邊界情況。當機器人快要「出界」時,它能立即像人類踩剎車或轉向一樣做出反應,確保機器人在指定的場地內安全且高效地活動。
IR3CH 類別在 dual2s 體系中不僅用於循線,更能透過特定的硬體配置實現強大的場地邊界防護。本範例採用「三角佈署」邏輯,將三路感測器配置於車體的關鍵位置(如:前一後二),使機器人具備空間方位感。透過將類比數值轉換為具體的「運動建議狀態」,開發者可以快速撰寫出具備避障與自動修正能力的控制邏輯。
硬體配置與原理
- 感測器佈署:採用 TRIANGLE pattern(三角佈署)。這種配置與傳統並排循線不同,它能區分「車頭接觸邊界」與「側後方接觸邊界」,提供更精確的逃脫路徑判斷。
- 連接腳位:預設連接至 ESP32 的 ADC 腳位,實作高解析度的反射率偵測:
- 左路 (IR_L):GPIO 34
- 中路 (IR_M):GPIO 35
- 右路 (IR_R):GPIO 39
核心功能說明
- 智慧偵測更新
update(): 此函式是感測器的運算核心,包含三個重要參數:- 門檻值 (Threshold):設定觸發判斷的臨界點(預設 2000),可用於適應不同材質的場地。
- 極性設定:支援
BLACK_LINE或WHITE_LINE,讓機器人能靈活應用在黑底白線或白底黑線的場地。 - Debug 模式:開發階段可開啟數值輸出,幫助開發者精準掌握環境光線的變化。
- 狀態機器與運動邏輯
getState(): 與單純的數值讀取不同,IR3CH類別將感測結果封裝為具體的「狀態碼」,直接對應機器人的戰術反應:- 狀態 0 (自由運動):未觸及邊界,可執行巡邏或搜尋任務。
- 狀態 2 (車頭壓線):最危急狀態,必須立即快速後退。
- 狀態 5 (車尾壓線):防止後方出界,需全力前進。
- 狀態 1/3 與 4/6 (側向壓線):辨識出左側或右側大面積壓線,提供複合式運動(如旋轉加前進)來修正姿態。
使用建議
- 靈敏度調校:不同場地的反射率差異極大。建議先開啟
Debug模式讀取背景值與邊界值,將IR_THRESHOLD設定在兩者之間的中間值。 - 反應優先權:在程式邏輯中,建議將
IR3CH的判斷優先權設為最高,優先於超音波索敵,以確保機器人在任何戰鬥行為中都不會意外出界。
dual2s控制器與環境
AI學伴
互動(1):基於函數庫 – dual2s
互動(2):基於範例程式
👉 你也可以在dual2s函數庫(./example/basic)中找到此範例程式。
/*=====================================================================================
yesio.net / 2026.03.12 / by nick
# Filename:04_IR3CH_triangle.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 2:
Serial.println("車頭壓線:快速後退");
break;
case 5:
Serial.println("車尾壓線:全力前進");
break;
case 7:
Serial.println("全車壓線:停止運動");
break;
case 1:
case 3:
Serial.println("右後/右側大壓線:小左旋+小前進");
break;
case 4:
case 6:
Serial.println("左後/左側大壓線:小右旋+小前進");
break;
}
}
