Mindstorms EV3 Color Sensor 顏色感應器教學

課程目標


一、感應功能介紹

EV3 顏色感應器是一個多功能的光學感應器,主要有兩種工作模式:

1.1 顏色感應與分辨 (Color Mode)

工作原理:
- 感應器內建 RGB 三色 LED 光源,可發出紅、綠、藍三色光線
- 通過偵測反射光的顏色組成,辨識物體的顏色
- 可辨識的顏色包括:黑色、藍色、綠色、黃色、紅色、白色、棕色

技術規格:
- 辨識距離:約 1-2 公分
- 反應時間:約 1 毫秒
- 輸出格式:顏色代碼(0-7 的整數值)

顏色代碼對照表:

0 = 無顏色(No Color)
1 = 黑色(Black)
2 = 藍色(Blue)
3 = 綠色(Green)
4 = 黃色(Yellow)
5 = 紅色(Red)
6 = 白色(White)
7 = 棕色(Brown)

應用場景:
- 顏色分類機器人(依顏色分揀物品)
- 顏色識別遊戲(找到特定顏色的物體)
- 顏色編碼路徑追蹤(不同顏色代表不同動作)

優點:
- ✓ 直覺易懂,不需要設定臨界值
- ✓ 可辨識多種顏色,應用範圍廣
- ✓ 對環境光線適應性較好

缺點:
- ✗ 辨識速度較慢(需要完整的顏色掃描週期)
- ✗ 對於相近顏色的區分能力有限
- ✗ 在高速移動時容易誤判


1.2 光線反射強度感應 (Reflected Light Intensity Mode)

工作原理:
- 感應器發出紅色 LED 光線照射物體表面
- 偵測反射回來的光線強度
- 輸出 0-100 的數值(0 = 最暗/全黑,100 = 最亮/全白)

技術規格:
- 測量範圍:0-100%
- 解析度:1%
- 取樣頻率:約 1000 Hz
- 最佳感應距離:0.5-1.5 公分

物體表面與反射強度關係:

黑色表面:  0-15   (幾乎不反射光線)
深灰色:   16-35
灰色:     36-55
淺灰色:   56-75
白色表面:  76-100 (強烈反射光線)

應用場景:
- 黑線循跡(最常見應用)
- 邊緣偵測(桌面邊緣、競賽場地邊界)
- 距離粗估(反射強度與距離有關)

優點:
- ✓ 反應速度快(適合高速循跡)
- ✓ 靈敏度高(可偵測細微的明暗變化)
- ✓ 數值連續,可設定精確的臨界值
- ✓ 取樣頻率高,適合即時控制

缺點:
- ✗ 需要手動測試並設定黑白臨界值
- ✗ 受環境光線影響較大
- ✗ 只能偵測明暗,無法區分顏色


二、黑色線條軌跡偵測:使用顏色模式 vs 光線反射強度模式

在設計循跡機器人時,我們需要選擇合適的感應模式。以下是兩種模式的比較:

2.1 使用顏色感應模式

程式邏輯:

如果 顏色 == 黑色(代碼 1)
    → 在黑線上
否則
    → 不在黑線上

優點:
- 程式邏輯簡單,不需要設定臨界值
- 對環境光線變化較不敏感

缺點:
- ⚠️ 速度慢:顏色辨識需要較長的處理時間
- ⚠️ 反應遲鈍:高速移動時容易偏離軌跡
- ⚠️ 誤判率高:相近的深色可能被誤認為黑色

適用情境:
- 低速巡線(速度 < 30%)
- 顏色分類任務
- 教學示範(概念理解優先)


2.2 使用光線反射強度模式 ⭐ 推薦

程式邏輯:

讀取光線反射強度 → 數值(0-100)

如果 數值 < 臨界值(例如 40)
    → 在黑線上(反射弱)
否則
    → 在白色區域(反射強)

優點:
- ✅ 反應速度極快(適合高速循跡)
- ✅ 靈敏度高(可偵測黑線邊緣)
- ✅ 控制精準(可根據數值微調動作)

缺點:
- 需要事先測試黑白區域的反射值
- 環境光線變化會影響數值

適用情境:
- 高速循跡競賽
- 精確路徑追蹤
- 需要即時反應的應用


三、EV3 馬達控制方式:Move Steering vs Move Tank

在 LEGO EV3 軟體中,有兩種主要的馬達控制積木:Move Steering(轉向控制)Move Tank(坦克控制)。理解這兩種控制方式的差異對於設計循跡程式非常重要。

3.1 馬達連接規範

標準連接方式:
- 馬達 B (Port B):連接左輪
- 馬達 C (Port C):連接右輪
- 顏色感應器 (Port 3):安裝在機器人前方中央

💡 為什麼要固定連接位置?
統一的馬達連接方式可以讓程式更容易分享和理解,也能減少除錯時間。


3.2 Move Steering(轉向控制)

概念說明

Move Steering 採用汽車式轉向的控制邏輯,類似開車時的方向盤操作。

控制參數:
1. Power(動力):整體前進速度(-100 到 100)
2. Steering(轉向):轉向方向與力道(-100 到 100)
- 0 = 直行
- 負值(-1 到 -100) = 向左轉
- 正值(1 到 100) = 向右轉

Steering 數值與轉向關係

Steering 值    左輪速度     右輪速度     動作
─────────────────────────────────────────
    0           50%         50%       直行
   +25          50%         38%       微右轉
   +50          50%         25%       中度右轉
   +75          50%         12%       大幅右轉
  +100          50%          0%       原地右轉(右輪停止)
   -25          38%         50%       微左轉
   -50          25%         50%       中度左轉
   -75          12%         50%       大幅左轉
  -100           0%         50%       原地左轉(左輪停止)

(以 Power = 50% 為例)

Move Steering 循跡程式範例

LEGO EV3 軟體積木配置:

[起始]
  ↓
[Loop 循環積木] (無限循環)
  ↓
  [Switch 開關積木]
    條件:Color Sensor (Port 3)
    模式:Reflected Light Intensity < 45

    ├─ TRUE (在黑線上,反射強度低)
    │   └─ [Move Steering 積木]
    │       - 馬達:B+C
    │       - Power(動力):50
    │       - Steering(轉向):+30  ← 向右轉
    │       - 模式:On (持續運轉)
    │
    └─ FALSE (在白色區域,反射強度高)
        └─ [Move Steering 積木]
            - 馬達:B+C
            - Power(動力):50
            - Steering(轉向):-30  ← 向左轉
            - 模式:On (持續運轉)

程式邏輯說明

情況 1:感應器偵測到黑線(反射強度 < 45)

動作:Steering = +30(向右轉)
原因:感應器在黑線上,需要向右轉讓感應器移到黑線邊緣

實際馬達運作:
- 左輪(馬達 B):50% × (100%) = 50%
- 右輪(馬達 C):50% × (100% - 30%) = 35%
- 結果:機器人向右轉

情況 2:感應器偵測到白色區域(反射強度 ≥ 45)

動作:Steering = -30(向左轉)
原因:感應器離開黑線,需要向左轉尋找黑線

實際馬達運作:
- 左輪(馬達 B):50% × (100% - 30%) = 35%
- 右輪(馬達 C):50% × (100%) = 50%
- 結果:機器人向左轉

Move Steering 的優缺點

優點:
- ✅ 直覺易懂:Steering 數值直接對應轉向方向
- ✅ 參數調整簡單:只需調整一個 Steering 值
- ✅ 適合初學者:概念清晰,容易理解
- ✅ 速度一致:整體動力由 Power 統一控制

缺點:
- ⚠️ 彈性較低:無法精確控制兩輪的個別速度
- ⚠️ 進階控制受限:實作 PID 控制時較不便

適用情境:
- 初學者學習循跡概念
- 簡單的循跡任務
- 不需要極致性能的應用


3.3 Move Tank(坦克控制)

概念說明

Move Tank 採用坦克式控制,分別控制左右履帶(輪子)的速度,提供更精確的控制能力。

控制參數:
1. Left Power(左輪動力):左輪速度(-100 到 100)
2. Right Power(右輪動力):右輪速度(-100 到 100)

左右輪速度與動作關係

左輪速度   右輪速度    動作說明
───────────────────────────────
  50%       50%      直線前進
  70%       30%      向右轉(左快右慢)
  30%       70%      向左轉(右快左慢)
  50%        0%      原地右轉(右輪停止)
   0%       50%      原地左轉(左輪停止)
  50%      -50%      原地快速右轉(反向驅動)
 -50%       50%      原地快速左轉(反向驅動)
  80%       80%      高速直行
 -50%      -50%      後退

Move Tank 循跡程式範例

LEGO EV3 軟體積木配置:

[起始]
  ↓
[馬達設定積木](如果馬達方向相反需要反轉)
  - 馬達 B:可能需要設定為 Reverse
  ↓
[Loop 循環積木] (無限循環)
  ↓
  [Switch 開關積木]
    條件:Color Sensor (Port 3)
    模式:Reflected Light Intensity < 45

    ├─ TRUE (在黑線上)
    │   └─ [Move Tank 積木]
    │       - 馬達:B+C
    │       - B Power(左輪):50
    │       - C Power(右輪):20
    │       - 模式:On (持續運轉)
    │
    └─ FALSE (在白色區域)
        └─ [Move Tank 積木]
            - 馬達:B+C
            - B Power(左輪):20
            - C Power(右輪):50
            - 模式:On (持續運轉)

程式邏輯說明

情況 1:感應器偵測到黑線(反射強度 < 45)

動作:左輪 50%,右輪 20%
原因:感應器在黑線上,需要向右轉

實際馬達運作:
- 左輪(馬達 B):50%(快速)
- 右輪(馬達 C):20%(慢速)
- 結果:機器人向右轉,感應器移向黑線邊緣

情況 2:感應器偵測到白色區域(反射強度 ≥ 45)

動作:左輪 20%,右輪 50%
原因:感應器離開黑線,需要向左轉尋找黑線

實際馬達運作:
- 左輪(馬達 B):20%(慢速)
- 右輪(馬達 C):50%(快速)
- 結果:機器人向左轉,感應器回到黑線

Move Tank 的優缺點

優點:
- ✅ 精確控制:可獨立調整左右輪速度
- ✅ 彈性高:適合實作進階演算法(如 PID)
- ✅ 反應快:可設定極端速度差以快速轉向
- ✅ 專業應用:競賽級程式多使用此模式

缺點:
- ⚠️ 較複雜:需要理解兩輪獨立控制的邏輯
- ⚠️ 參數調整繁瑣:需要分別調整兩個數值
- ⚠️ 容易出錯:左右輪速度設定錯誤會導致異常動作

適用情境:
- 需要精確控制的循跡任務
- 實作 PID 或比例控制
- 競賽應用
- 複雜的路徑規劃


3.4 Move Steering vs Move Tank 比較表

比較項目 Move Steering Move Tank
控制方式 汽車式轉向(方向盤) 坦克式(左右履帶)
參數數量 2 個(Power + Steering) 2 個(Left Power + Right Power)
直覺性 ⭐⭐⭐⭐⭐ 非常直覺 ⭐⭐⭐ 需要理解
控制精度 ⭐⭐⭐ 中等 ⭐⭐⭐⭐⭐ 非常精確
適合初學者 ✅ 是 ⚠️ 需要練習
進階應用 ⚠️ 受限 ✅ 優秀
PID 控制 ⚠️ 不便 ✅ 便利
參數調整 ✅ 簡單(只調 Steering) ⚠️ 較繁瑣(兩個數值)
競賽應用 ⚠️ 較少 ✅ 常見
學習曲線 平緩 稍陡

3.5 Move Steering 與 Move Tank 轉換對照

以下是相同轉向效果下,兩種控制方式的參數對照:

基礎速度 50% 的情況

動作 Move Steering Move Tank
直行 Power=50, Steering=0 Left=50, Right=50
微右轉 Power=50, Steering=+20 Left=50, Right=40
中度右轉 Power=50, Steering=+40 Left=50, Right=30
大幅右轉 Power=50, Steering=+60 Left=50, Right=20
微左轉 Power=50, Steering=-20 Left=40, Right=50
中度左轉 Power=50, Steering=-40 Left=30, Right=50
大幅左轉 Power=50, Steering=-60 Left=20, Right=50

Move Steering 轉換為 Move Tank 的計算公式

假設:
- Power = P(動力)
- Steering = S(轉向,-100 到 +100)

計算 Move Tank 的左右輪速度:

如果 S ≥ 0(向右轉):
    Left Power  = P
    Right Power = P × (1 - S/100)

如果 S < 0(向左轉):
    Left Power  = P × (1 + S/100)
    Right Power = P

範例計算:

Move Steering: Power=60, Steering=+30

計算:
Left Power  = 60
Right Power = 60 × (1 - 30/100) = 60 × 0.7 = 42

結果 Move Tank: Left=60, Right=42

四、循跡偵測原理與實作

4.1 光線反射強度偵測數值測試

在開始寫程式之前,我們需要先測試實際環境的反射強度數值

測試步驟:

步驟 1:建立測試程式

在 EV3 軟體中建立新專案
拖曳以下積木:
1. [Loop 循環] 積木(無限循環)
2. 在循環內放入 [Color Sensor 顏色感應器] 積木
   - 模式選擇:Measure → Reflected Light Intensity
   - 輸出連接到 [Display 顯示] 積木
3. [Display 顯示] 積木
   - 顯示在螢幕上(Text - Pixels)
   - 位置:X=0, Y=50

步驟 2:執行測試
1. 將程式下載到 EV3 主機
2. 將顏色感應器對準黑色線條,讀取數值(例如:15)
3. 將顏色感應器對準白色區域,讀取數值(例如:75)
4. 記錄這兩個數值

步驟 3:計算臨界值

臨界值 = (黑色數值 + 白色數值) ÷ 2

範例:
黑色數值 = 15
白色數值 = 75
臨界值 = (15 + 75) ÷ 2 = 45

💡 為什麼要取中間值?
臨界值設在黑白之間,可以明確區分「在線上」和「不在線上」兩種狀態,減少誤判。


4.2 黑色線條與白色區域的臨界值設定

判斷邏輯:

graph TD A[讀取光線反射強度] --> B{數值 < 臨界值?} B -->|是| C[在黑線上
反射強度低] B -->|否| D[在白色區域
反射強度高] C --> E[動作:向右轉
離開黑線中心] D --> F[動作:向左轉
尋找黑線]

實際數值範例:

表面類型 反射強度 判斷結果
黑色線條 10-20 < 45,在線上
灰色邊界 35-45 接近臨界值(需注意)
白色區域 70-85 > 45,不在線上

臨界值調整建議:
- 如果機器人容易偏離黑線 → 降低臨界值(例如從 45 調到 40)
- 如果機器人太常誤判 → 提高臨界值(例如從 45 調到 50)
- 建議測試多次,找到最穩定的臨界值


4.3 Switch 積木邏輯判斷

在 EV3 圖形化程式中,我們使用 Switch(開關)積木 來根據感應器數值做出決策。

循跡原理說明

循跡的核心概念是讓感應器持續在黑線邊緣來回擺動

     白色區域
        ↓
    ┌───────┐
    │       │
────┤黑線   ├──── ← 感應器理想位置:黑白交界處
    │       │
    └───────┘
        ↑
     白色區域

循跡過程:
1. 感應器偵測到黑色 → 向右轉 → 移向白色
2. 感應器偵測到白色 → 向左轉 → 移向黑色
3. 重複 1-2,形成「之」字形前進路徑

4.4 完整循跡程式設計

方法 A:使用 Move Steering(推薦初學者)

flowchart TD Start([開始]) --> Init[初始化設定] Init --> Loop{無限循環} Loop --> Read[讀取光線反射強度] Read --> Check{反射強度 < 45?} Check -->|是
在黑線上| Steer1[Move Steering
Power=50, Steering=+30
向右轉] Check -->|否
在白色區域| Steer2[Move Steering
Power=50, Steering=-30
向左轉] Steer1 --> Loop Steer2 --> Loop

完整程式(LEGO EV3 軟體積木配置):

程式名稱:LineFollower_Steering

[起始]
  ↓
[註解積木]「使用 Move Steering 進行循跡」
  ↓
[Loop 循環積木] (無限循環)
  ↓
  [Switch 開關積木]
    ┌─ 條件:Color Sensor (Port 3)
    │  模式:Measure - Reflected Light Intensity
    │  比較:< (小於)
    │  臨界值:45
    │
    ├─ TRUE (在黑線上,需要向右轉)
    │   └─ [Move Steering 積木]
    │       - 馬達:B+C
    │       - Power(動力):50
    │       - Steering(轉向):+35
    │       - 模式:On (持續運轉)
    │
    └─ FALSE (在白色區域,需要向左轉)
        └─ [Move Steering 積木]
            - 馬達:B+C
            - Power(動力):50
            - Steering(轉向):-35
            - 模式:On (持續運轉)
  ↓
  [返回 Loop 開頭]

參數調整建議:
- Power(動力):建議從 40-60 開始測試
- Steering(轉向):建議從 ±30 到 ±40 之間調整
- 數值太小(如 ±10):轉向不足,容易衝出軌道
- 數值太大(如 ±70):過度轉向,路徑震盪嚴重


方法 B:使用 Move Tank(推薦進階學習)

flowchart TD Start([開始]) --> Init[初始化
設定馬達反向
重置馬達編碼器] Init --> Loop{無限循環} Loop --> Read[讀取光線反射強度] Read --> Check{反射強度 < 45?} Check -->|是
在黑線上| Tank1[Move Tank
Left=50, Right=20
向右轉] Check -->|否
在白色區域| Tank2[Move Tank
Left=20, Right=50
向左轉] Tank1 --> Loop Tank2 --> Loop

完整程式(LEGO EV3 軟體積木配置):

程式名稱:LineFollower_Tank

[起始]
  ↓
[註解積木]「設定馬達方向」
  ↓
[馬達設定積木](視馬達安裝方向而定)
  - 馬達 B:可能需要設定為 Reverse(反向)
  ↓
[註解積木]「使用 Move Tank 進行循跡」
  ↓
[Loop 循環積木] (無限循環)
  ↓
  [Switch 開關積木]
    ┌─ 條件:Color Sensor (Port 3)
    │  模式:Measure - Reflected Light Intensity
    │  比較:< (小於)
    │  臨界值:45
    │
    ├─ TRUE (在黑線上,需要向右轉)
    │   └─ [Move Tank 積木]
    │       - 馬達:B+C
    │       - B Power(左輪):50
    │       - C Power(右輪):20
    │       - 模式:On (持續運轉)
    │
    └─ FALSE (在白色區域,需要向左轉)
        └─ [Move Tank 積木]
            - 馬達:B+C
            - B Power(左輪):20
            - C Power(右輪):50
            - 模式:On (持續運轉)
  ↓
  [返回 Loop 開頭]

參數調整建議:
- 基礎速度:建議 40-60
- 轉向時速度差:建議保持 2:1 到 3:1 的比例
- 例如:50:25、60:30、50:20
- 速度差越大:轉向越急,但路徑越不平穩


4.5 兩種方法的實際測試比較

測試環境:

測試結果:

測試項目 Move Steering (Power=50, Steering=±35) Move Tank (Left/Right=50/20 互換)
平均速度 中等 中等
路徑平穩度 ⭐⭐⭐⭐ ⭐⭐⭐⭐
急彎表現 ⭐⭐⭐ ⭐⭐⭐⭐
參數調整難度 ⭐⭐(簡單) ⭐⭐⭐(中等)
程式可讀性 ⭐⭐⭐⭐⭐ ⭐⭐⭐⭐
初學者友善度 ⭐⭐⭐⭐⭐ ⭐⭐⭐
進階擴展性 ⭐⭐⭐ ⭐⭐⭐⭐⭐

4.6 機器人結構設定

步驟 1:安裝顏色感應器
- 位置:機器人前方中央
- 方向:感應器面向地面
- 高度:距離地面 0.5-1.5 公分(約一個手指寬)

步驟 2:馬達連接
- Port B:左輪馬達
- Port C:右輪馬達
- Port 3:顏色感應器

步驟 3:測試馬達方向

測試程式:
1. [Move Tank] 積木
   - B Power: 50
   - C Power: 50
   - 持續 1 秒

預期結果:機器人應該直線前進

如果機器人:
- 原地打轉 → 需要反轉其中一個馬達
- 向左/右偏 → 檢查輪子是否安裝穩固

步驟 4:下載並測試
1. 連接 EV3 主機(USB 或藍牙)
2. 點擊 Download(下載)按鈕
3. 在測試軌道上執行程式
4. 觀察機器人是否能穩定循跡

測試軌道建議:


4.7 如何加速?速度優化策略

方法 1:提高基礎速度

Move Steering 方式:

原始程式:
Power = 50, Steering = ±35

加速版本:
Power = 70, Steering = ±35

Move Tank 方式:

原始程式:
TRUE:  B=50, C=20
FALSE: B=20, C=50

加速版本:
TRUE:  B=70, C=40
FALSE: B=40, C=70

注意事項:
- ⚠️ 速度提高後,轉向反應時間會縮短
- ⚠️ 可能需要調整轉向參數
- ⚠️ 測試時逐步提升速度,避免衝出軌道


方法 2:使用比例控制(Proportional Control)

原理:
根據偏離黑線的程度,動態調整轉向力道。

Move Tank 實作方式(使用 LEGO EV3 軟體的 Math 積木):

[Loop 循環]
  ↓
  [Color Sensor 積木] → 讀取反射強度 → 儲存到變數 "Light"
  ↓
  [Math 積木] → 計算偏差值
    公式:Light - 45 → 儲存到變數 "Error"
  ↓
  [Math 積木] → 計算轉向修正
    公式:Error × 1.5 → 儲存到變數 "Correction"
  ↓
  [Math 積木] → 計算左輪速度
    公式:50 - Correction → 儲存到變數 "LeftSpeed"
  ↓
  [Math 積木] → 計算右輪速度
    公式:50 + Correction → 儲存到變數 "RightSpeed"
  ↓
  [Move Tank 積木]
    - B Power: LeftSpeed
    - C Power: RightSpeed
    - 模式:On

範例計算:

情境 1:感應器在黑線上
Light = 20
Error = 20 - 45 = -25
Correction = -25 × 1.5 = -37.5

LeftSpeed  = 50 - (-37.5) = 87.5  ← 左輪加速
RightSpeed = 50 + (-37.5) = 12.5  ← 右輪減速
結果:向右轉(回到黑線邊緣)

情境 2:感應器在白色區域
Light = 70
Error = 70 - 45 = 25
Correction = 25 × 1.5 = 37.5

LeftSpeed  = 50 - 37.5 = 12.5  ← 左輪減速
RightSpeed = 50 + 37.5 = 87.5  ← 右輪加速
結果:向左轉(尋找黑線)

優點:
- 偏離越多,修正越大(反應靈敏)
- 接近黑線時,修正變小(行駛平穩)
- 可支援更高的巡線速度


方法 3:PID 控制(進階)

PID (Proportional-Integral-Derivative) 是工業級的控制演算法,可實現最穩定的高速循跡。

PID 公式:

修正值 = Kp × 偏差 + Ki × 累積偏差 + Kd × 偏差變化率

Kp = 比例係數(影響即時反應)
Ki = 積分係數(消除穩態誤差)
Kd = 微分係數(減少震盪)

EV3 實作挑戰:
- 需要使用變數儲存歷史偏差值
- 需要精確的時間控制
- 建議使用 EV3-Python 或 RobotC 實現
- Move Tank 比 Move Steering 更適合實作 PID


4.8 基礎循跡方式的優缺點

優點:

程式簡單
- 只需要 Switch 積木和馬達控制積木
- 適合初學者快速上手

硬體需求低
- 只需要一個顏色感應器
- 不需要複雜的機械結構

穩定性可接受
- 在低速情況下表現良好
- 適合教學展示

缺點:

速度受限
- 高速時容易衝出軌道
- 反應時間不足

路徑震盪
- 機器人會不斷左右擺動
- 行駛路徑呈現鋸齒狀

急彎表現差
- 轉彎半徑太小時容易失去黑線
- 需要放慢速度通過彎道

環境敏感
- 光線變化會影響臨界值
- 地面材質不同會影響反射強度


4.9 如何改善?進階優化方向

改善 1:雙感應器循跡 ⭐⭐

方法:
使用兩個顏色感應器,分別安裝在黑線兩側。

邏輯:

左感應器  右感應器  → 動作
───────  ───────  ────────
  白        白     → 直行(在線上)
  黑        白     → 右轉(偏左)
  白        黑     → 左轉(偏右)
  黑        黑     → 停止或後退(偏離軌道)

優點:
- 不需要設定臨界值
- 速度可以更快
- 路徑更平穩(減少震盪)


改善 2:實作 PID 控制 ⭐⭐⭐

優點:
- 支援高速巡線(可達 80-100% 速度)
- 路徑非常平穩
- 可自動適應不同彎道

實作建議:
- 使用 Move Tank 而非 Move Steering
- 使用 MakeCode for EV3Python 撰寫
- 調整參數:從 Kp 開始,逐步加入 Kd,最後微調 Ki


改善 3:動態臨界值調整

方法:
在程式執行期間,自動校正黑白臨界值。

邏輯:

啟動時:
1. 掃描黑色區域 10 次,取平均值 → black_avg
2. 掃描白色區域 10 次,取平均值 → white_avg
3. 計算臨界值 = (black_avg + white_avg) / 2

執行時:
每 5 秒更新一次臨界值(適應環境光線變化)

優點:
- 適應不同環境光線
- 不需要手動調整參數


改善 4:加入陀螺儀感應器

方法:
使用 EV3 陀螺儀偵測機器人的轉向角度,配合顏色感應器進行路徑修正。

應用:
- 直線路段:使用陀螺儀保持直行
- 彎道路段:使用顏色感應器循跡
- 結合兩者優點


五、完整程式碼範例

5.1 基礎循跡程式(Move Steering 版本)

使用 LEGO EV3 軟體的積木配置:

程式名稱:LineFollower_Steering_Basic

[起始]
  ↓
[註解積木]「Move Steering 循跡程式」
  ↓
[Loop 循環積木] (無限循環)
  ↓
  [Switch 開關積木]
    ┌─ 條件:Color Sensor (Port 3)
    │  模式:Measure - Reflected Light Intensity
    │  比較:< (小於)
    │  臨界值:45
    │
    ├─ TRUE (在黑線上)
    │   └─ [Move Steering 積木]
    │       - 馬達:B+C
    │       - Power:50
    │       - Steering:+35  ← 向右轉
    │       - 模式:On
    │
    └─ FALSE (在白色區域)
        └─ [Move Steering 積木]
            - 馬達:B+C
            - Power:50
            - Steering:-35  ← 向左轉
            - 模式:On
  ↓
  [返回 Loop 開頭]

5.2 基礎循跡程式(Move Tank 版本)

使用 LEGO EV3 軟體的積木配置:

程式名稱:LineFollower_Tank_Basic

[起始]
  ↓
[註解積木]「設定馬達方向」
  ↓
[馬達設定積木]
  - 馬達 B:Reverse(如果需要)
  ↓
[註解積木]「Move Tank 循跡程式」
  ↓
[Loop 循環積木] (無限循環)
  ↓
  [Switch 開關積木]
    ┌─ 條件:Color Sensor (Port 3)
    │  模式:Measure - Reflected Light Intensity
    │  比較:< (小於)
    │  臨界值:45
    │
    ├─ TRUE (在黑線上)
    │   └─ [Move Tank 積木]
    │       - 馬達:B+C
    │       - B Power:50  ← 左輪
    │       - C Power:20  ← 右輪
    │       - 模式:On
    │
    └─ FALSE (在白色區域)
        └─ [Move Tank 積木]
            - 馬達:B+C
            - B Power:20  ← 左輪
            - C Power:50  ← 右輪
            - 模式:On
  ↓
  [返回 Loop 開頭]

5.3 進階循跡程式(EV3 Python - Move Tank + PID)

#!/usr/bin/env pybricks-micropython

"""
程式名稱:LineFollower_PID_Tank
功能:使用 Move Tank 與 PID 控制實現高速循跡
作者:Engineering Education
版本:v1.0
馬達配置:Port B = 左輪,Port C = 右輪
"""

from pybricks.hubs import EV3Brick
from pybricks.ev3devices import Motor, ColorSensor
from pybricks.parameters import Port
from pybricks.tools import wait

# ===== 初始化硬體 =====
ev3 = EV3Brick()
left_motor = Motor(Port.B)   # 左輪
right_motor = Motor(Port.C)  # 右輪
color_sensor = ColorSensor(Port.S3)

# ===== PID 參數設定 =====
TARGET = 45          # 目標反射強度(黑白臨界值)
BASE_SPEED = 200     # 基礎速度(deg/s)
Kp = 1.5             # 比例係數
Ki = 0.01            # 積分係數
Kd = 0.5             # 微分係數

# ===== 變數初始化 =====
integral = 0
last_error = 0

# ===== 主程式循環 =====
ev3.speaker.beep()   # 啟動提示音

while True:
    # 讀取當前光線反射強度
    reflection = color_sensor.reflection()

    # 計算偏差值
    error = reflection - TARGET

    # PID 計算
    integral = integral + error
    derivative = error - last_error
    correction = (Kp * error) + (Ki * integral) + (Kd * derivative)

    # 計算左右馬達速度(Move Tank 方式)
    left_speed = BASE_SPEED - correction
    right_speed = BASE_SPEED + correction

    # 限制馬達速度範圍(-400 到 400)
    left_speed = max(-400, min(400, left_speed))
    right_speed = max(-400, min(400, right_speed))

    # 驅動馬達
    left_motor.run(left_speed)
    right_motor.run(right_speed)

    # 更新上一次偏差值
    last_error = error

    # 控制循環頻率(每 10ms 執行一次)
    wait(10)

程式說明:
1. 第 16-18 行:明確定義 Port B 為左輪,Port C 為右輪
2. 第 21-25 行:設定 PID 參數(可根據實際情況調整)
3. 第 40-42 行:讀取感應器並計算偏差
4. 第 44-47 行:執行 PID 運算
5. 第 50-51 行:使用 Move Tank 概念計算左右輪速度
6. 第 54-55 行:限制馬達速度,避免超出範圍
7. 第 62 行:控制循環頻率為 100Hz(每秒執行 100 次)


5.4 比例控制程式(EV3 Python - Move Tank)

#!/usr/bin/env pybricks-micropython

"""
程式名稱:LineFollower_Proportional_Tank
功能:使用 Move Tank 與比例控制實現循跡
馬達配置:Port B = 左輪,Port C = 右輪
"""

from pybricks.hubs import EV3Brick
from pybricks.ev3devices import Motor, ColorSensor
from pybricks.parameters import Port
from pybricks.tools import wait

# ===== 初始化 =====
ev3 = EV3Brick()
left_motor = Motor(Port.B)   # 左輪
right_motor = Motor(Port.C)  # 右輪
color_sensor = ColorSensor(Port.S3)

# ===== 參數設定 =====
TARGET = 45          # 目標反射強度
BASE_SPEED = 200     # 基礎速度(deg/s)
Kp = 1.5             # 比例係數

# ===== 主程式 =====
ev3.speaker.beep()

while True:
    # 讀取光線反射強度
    reflection = color_sensor.reflection()

    # 計算偏差值
    error = reflection - TARGET

    # 比例控制計算
    correction = Kp * error

    # 計算左右輪速度
    left_speed = BASE_SPEED - correction
    right_speed = BASE_SPEED + correction

    # 限制速度範圍
    left_speed = max(-400, min(400, left_speed))
    right_speed = max(-400, min(400, right_speed))

    # 驅動馬達(Move Tank 方式)
    left_motor.run(left_speed)
    right_motor.run(right_speed)

    wait(10)

5.5 雙感應器循跡程式(EV3 Python)

#!/usr/bin/env pybricks-micropython

"""
程式名稱:LineFollower_DualSensor
功能:使用雙顏色感應器實現穩定循跡
馬達配置:Port B = 左輪,Port C = 右輪
感應器:Port S2 = 左側,Port S3 = 右側
"""

from pybricks.hubs import EV3Brick
from pybricks.ev3devices import Motor, ColorSensor
from pybricks.parameters import Port
from pybricks.tools import wait

# ===== 初始化 =====
ev3 = EV3Brick()
left_motor = Motor(Port.B)
right_motor = Motor(Port.C)
left_sensor = ColorSensor(Port.S2)   # 左側感應器
right_sensor = ColorSensor(Port.S3)  # 右側感應器

# ===== 參數設定 =====
THRESHOLD = 45       # 黑白臨界值
SPEED_STRAIGHT = 300 # 直行速度
SPEED_TURN = 150     # 轉彎速度

# ===== 主程式 =====
ev3.speaker.beep()

while True:
    # 讀取兩個感應器數值
    left_light = left_sensor.reflection()
    right_light = right_sensor.reflection()

    # 判斷感應器狀態(True = 白色,False = 黑色)
    left_white = left_light > THRESHOLD
    right_white = right_light > THRESHOLD

    # 四種情況的決策邏輯
    if left_white and right_white:
        # 兩側都是白色 → 在黑線上,直行
        left_motor.run(SPEED_STRAIGHT)
        right_motor.run(SPEED_STRAIGHT)

    elif not left_white and right_white:
        # 左黑右白 → 偏向左側,需要右轉
        left_motor.run(SPEED_STRAIGHT)
        right_motor.run(SPEED_TURN)

    elif left_white and not right_white:
        # 左白右黑 → 偏向右側,需要左轉
        left_motor.run(SPEED_TURN)
        right_motor.run(SPEED_STRAIGHT)

    else:
        # 兩側都是黑色 → 偏離軌道,停止並後退
        left_motor.run(-200)
        right_motor.run(-200)
        wait(500)

    wait(10)

六、實作練習與挑戰

練習 1:基礎循跡(Move Steering) ⭐

目標:
使用 Move Steering 積木,完成橢圓形軌道的循跡。

要求:
- 機器人能穩定循跡至少 3 圈
- 不能偏離軌道超過 3 秒
- 使用 Move Steering 積木

提示:
- Power 設定為 50
- Steering 從 ±30 開始調整


練習 2:基礎循跡(Move Tank) ⭐⭐

目標:
使用 Move Tank 積木,完成相同的橢圓形軌道循跡。

要求:
- 完成與練習 1 相同的軌道
- 使用 Move Tank 積木
- 比較兩種方法的差異

提示:
- 嘗試將練習 1 的 Move Steering 參數轉換為 Move Tank 參數


練習 3:速度挑戰 ⭐⭐

目標:
在保持穩定的前提下,盡可能提高巡線速度。

要求:
- 完成一圈的時間少於 20 秒
- 不能衝出軌道
- 可選擇 Move Steering 或 Move Tank

提示:
- 調整基礎速度和轉向參數
- Move Tank 可能在高速時表現更好


練習 4:複雜軌道 ⭐⭐⭐

目標:
設計包含直線、急彎、S彎的複雜軌道,測試循跡能力。

要求:
- 能穩定通過半徑 20cm 的急彎
- 能順利通過連續 S 彎
- 分別使用 Move Steering 和 Move Tank 測試


練習 5:比例控制實作 ⭐⭐⭐⭐

目標:
使用 Math 積木實作比例控制。

要求:
- 使用 Move Tank 積木
- 根據反射強度動態計算左右輪速度
- 速度應能達到 Power=60 以上


練習 6:PID 參數調校 ⭐⭐⭐⭐⭐

目標:
使用 Python 實作 PID 控制,並找到最佳參數組合。

步驟:
1. 只使用 Kp,觀察震盪現象
2. 加入 Kd,減少震盪
3. 加入 Ki,消除穩態誤差
4. 記錄最佳參數組合


七、常見問題排除

Q1: 機器人在黑線上不斷震盪,無法直行

原因:
- Move Steering:Steering 數值太大
- Move Tank:左右輪速度差太大
- 臨界值設定不當

解決方法:
- Move Steering:減小 Steering(例如從 ±40 改為 ±25)
- Move Tank:減小速度差(例如從 50/20 改為 50/35)
- 重新測試並調整臨界值
- 嘗試實作比例控制


Q2: 使用 Move Steering 和 Move Tank 結果不同

原因:
- 參數轉換不正確
- 馬達方向設定不同

解決方法:
- 使用本文件第 3.5 節的轉換公式
- 檢查馬達方向設定(Reverse)
- 確認 Port 連接正確(B=左,C=右)


Q3: 機器人容易衝出軌道

原因:
- 速度太快,反應不及
- 感應器與地面距離過大
- 轉向力道不足

解決方法:
- 降低基礎速度(Power 或 B/C Power)
- 調整感應器高度至 0.5-1.0 公分
- Move Steering:增加 Steering 絕對值
- Move Tank:加大速度差
- 檢查馬達是否正常運作


Q4: 在不同環境下表現不一致

原因:
- 環境光線影響反射強度
- 地面材質不同

解決方法:
- 每次更換場地時重新測試臨界值
- 實作自動校正功能
- 使用遮光罩減少環境光干擾


Q5: 急彎處容易失去黑線

原因:
- 轉向反應太慢
- 速度過快

解決方法:
- Move Steering:增加 Steering 數值(例如從 ±30 到 ±50)
- Move Tank:加大速度差(例如從 50/30 改為 50/20)
- 降低基礎速度
- 使用雙感應器或 PID 控制


Q6: Move Steering 無法實作 PID 控制

原因:
- Steering 參數無法直接用變數動態調整(LEGO EV3 軟體限制)

解決方法:
- 改用 Move Tank 積木
- 或使用 Python 程式(Pybricks)


八、延伸學習資源

推薦閱讀

相關競賽

進階主題


九、總結

本教學涵蓋了 EV3 顏色感應器的兩種主要模式,並詳細說明了如何使用光線反射強度模式配合 Move SteeringMove Tank 實現高效的循跡機器人。

關鍵要點回顧:
1. ✅ 光線反射強度模式比顏色模式更適合循跡
2. ✅ 臨界值設定是成功循跡的關鍵
3. ✅ Move Steering 適合初學者,Move Tank 適合進階應用
4. ✅ 馬達 B = 左輪,馬達 C = 右輪 是標準連接方式
5. ✅ Switch 積木邏輯是基礎,PID 控制是進階目標
6. ✅ 雙感應器或 PID 控制可大幅提升性能

學習路徑建議:

Move Steering 基礎循跡
    ↓
Move Tank 基礎循跡
    ↓
速度優化
    ↓
比例控制(Move Tank + Math)
    ↓
PID 控制(Python + Move Tank)
    ↓
雙感應器
    ↓
競賽應用

選擇建議:
- 初學者:從 Move Steering 開始
- 進階學習:轉向 Move Tank
- 競賽應用:使用 Move Tank + PID

透過不斷實作與調整,你將能掌握機器人循跡的核心技術,並應用於各種自動導航任務!


作者: Engineering Education Team
最後更新: 2025-10-19
版本: b03
主要更新: 將所有 "EV3-G" 統一改為 "LEGO EV3 軟體" 或相關清晰表述