Skip to main content
< All Topics
Print

【感測】近紅外線感測 – 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)

核心功能說明

  1. 動態更新與邏輯判斷 update(): 開發者可依據環境光線與場地材質調整三個關鍵參數:
    • 門檻值 (Threshold):設定區分黑與白的類比臨界點(範例預設為 2000)。
    • 目標極性:可自由切換 BLACK_LINE(黑軌白底)或 WHITE_LINE(白軌黑底)。
    • 偵錯模式 (Debug):開啟後可直接在序列埠查看原始數值,方便調整門檻值。
  2. 狀態機器機制 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;  
  }

}
Table of Contents