Skip to main content
< All Topics
Print

【感測】近紅外線感測 – 相撲 | IR3CH

簡介


紅外線感測陣列就像是機器人的「地面導航儀」,能敏銳地察覺地板顏色的變化,在現實生活中,這正是自動掃地機器人防止從樓梯摔落、或是工廠無人搬運車(AGV)辨識作業區域的核心技術。透過特殊的「三角佈署」方式,感測器能全方位監控車體前後左右的邊界情況。當機器人快要「出界」時,它能立即像人類踩剎車或轉向一樣做出反應,確保機器人在指定的場地內安全且高效地活動。

IR3CH 類別在 dual2s 體系中不僅用於循線,更能透過特定的硬體配置實現強大的場地邊界防護。本範例採用「三角佈署」邏輯,將三路感測器配置於車體的關鍵位置(如:前一後二),使機器人具備空間方位感。透過將類比數值轉換為具體的「運動建議狀態」,開發者可以快速撰寫出具備避障與自動修正能力的控制邏輯。

硬體配置與原理

  • 感測器佈署:採用 TRIANGLE pattern(三角佈署)。這種配置與傳統並排循線不同,它能區分「車頭接觸邊界」與「側後方接觸邊界」,提供更精確的逃脫路徑判斷。
  • 連接腳位:預設連接至 ESP32 的 ADC 腳位,實作高解析度的反射率偵測:
    • 左路 (IR_L):GPIO 34
    • 中路 (IR_M):GPIO 35
    • 右路 (IR_R):GPIO 39

核心功能說明

  1. 智慧偵測更新 update(): 此函式是感測器的運算核心,包含三個重要參數:
    • 門檻值 (Threshold):設定觸發判斷的臨界點(預設 2000),可用於適應不同材質的場地。
    • 極性設定:支援 BLACK_LINEWHITE_LINE,讓機器人能靈活應用在黑底白線或白底黑線的場地。
    • Debug 模式:開發階段可開啟數值輸出,幫助開發者精準掌握環境光線的變化。
  2. 狀態機器與運動邏輯 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;  
  }

}
Table of Contents