EV3 顏色感應器是一個多功能的光學感應器,主要有兩種工作模式:
工作原理:
- 感應器內建 RGB 三色 LED 光源,可發出紅、綠、藍三色光線
- 通過偵測反射光的顏色組成,辨識物體的顏色
- 可辨識的顏色包括:黑色、藍色、綠色、黃色、紅色、白色、棕色
技術規格:
- 辨識距離:約 1-2 公分
- 反應時間:約 1 毫秒
- 輸出格式:顏色代碼(0-7 的整數值)
顏色代碼對照表:
0 = 無顏色(No Color)
1 = 黑色(Black)
2 = 藍色(Blue)
3 = 綠色(Green)
4 = 黃色(Yellow)
5 = 紅色(Red)
6 = 白色(White)
7 = 棕色(Brown)
應用場景:
- 顏色分類機器人(依顏色分揀物品)
- 顏色識別遊戲(找到特定顏色的物體)
- 顏色編碼路徑追蹤(不同顏色代表不同動作)
優點:
- ✓ 直覺易懂,不需要設定臨界值
- ✓ 可辨識多種顏色,應用範圍廣
- ✓ 對環境光線適應性較好
缺點:
- ✗ 辨識速度較慢(需要完整的顏色掃描週期)
- ✗ 對於相近顏色的區分能力有限
- ✗ 在高速移動時容易誤判
工作原理:
- 感應器發出紅色 LED 光線照射物體表面
- 偵測反射回來的光線強度
- 輸出 0-100 的數值(0 = 最暗/全黑,100 = 最亮/全白)
技術規格:
- 測量範圍:0-100%
- 解析度:1%
- 取樣頻率:約 1000 Hz
- 最佳感應距離:0.5-1.5 公分
物體表面與反射強度關係:
黑色表面: 0-15 (幾乎不反射光線)
深灰色: 16-35
灰色: 36-55
淺灰色: 56-75
白色表面: 76-100 (強烈反射光線)
應用場景:
- 黑線循跡(最常見應用)
- 邊緣偵測(桌面邊緣、競賽場地邊界)
- 距離粗估(反射強度與距離有關)
優點:
- ✓ 反應速度快(適合高速循跡)
- ✓ 靈敏度高(可偵測細微的明暗變化)
- ✓ 數值連續,可設定精確的臨界值
- ✓ 取樣頻率高,適合即時控制
缺點:
- ✗ 需要手動測試並設定黑白臨界值
- ✗ 受環境光線影響較大
- ✗ 只能偵測明暗,無法區分顏色
在設計循跡機器人時,我們需要選擇合適的感應模式。以下是兩種模式的比較:
程式邏輯:
如果 顏色 == 黑色(代碼 1)
→ 在黑線上
否則
→ 不在黑線上
優點:
- 程式邏輯簡單,不需要設定臨界值
- 對環境光線變化較不敏感
缺點:
- ⚠️ 速度慢:顏色辨識需要較長的處理時間
- ⚠️ 反應遲鈍:高速移動時容易偏離軌跡
- ⚠️ 誤判率高:相近的深色可能被誤認為黑色
適用情境:
- 低速巡線(速度 < 30%)
- 顏色分類任務
- 教學示範(概念理解優先)
程式邏輯:
讀取光線反射強度 → 數值(0-100)
如果 數值 < 臨界值(例如 40)
→ 在黑線上(反射弱)
否則
→ 在白色區域(反射強)
優點:
- ✅ 反應速度極快(適合高速循跡)
- ✅ 靈敏度高(可偵測黑線邊緣)
- ✅ 控制精準(可根據數值微調動作)
缺點:
- 需要事先測試黑白區域的反射值
- 環境光線變化會影響數值
適用情境:
- 高速循跡競賽 ⭐
- 精確路徑追蹤
- 需要即時反應的應用
在 LEGO EV3 軟體中,有兩種主要的馬達控制積木:Move Steering(轉向控制) 和 Move Tank(坦克控制)。理解這兩種控制方式的差異對於設計循跡程式非常重要。
標準連接方式:
- 馬達 B (Port B):連接左輪
- 馬達 C (Port C):連接右輪
- 顏色感應器 (Port 3):安裝在機器人前方中央
💡 為什麼要固定連接位置?
統一的馬達連接方式可以讓程式更容易分享和理解,也能減少除錯時間。
Move Steering 採用汽車式轉向的控制邏輯,類似開車時的方向盤操作。
控制參數:
1. Power(動力):整體前進速度(-100 到 100)
2. Steering(轉向):轉向方向與力道(-100 到 100)
- 0 = 直行
- 負值(-1 到 -100) = 向左轉
- 正值(1 到 100) = 向右轉
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% 為例)
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%
- 結果:機器人向左轉
優點:
- ✅ 直覺易懂:Steering 數值直接對應轉向方向
- ✅ 參數調整簡單:只需調整一個 Steering 值
- ✅ 適合初學者:概念清晰,容易理解
- ✅ 速度一致:整體動力由 Power 統一控制
缺點:
- ⚠️ 彈性較低:無法精確控制兩輪的個別速度
- ⚠️ 進階控制受限:實作 PID 控制時較不便
適用情境:
- 初學者學習循跡概念
- 簡單的循跡任務
- 不需要極致性能的應用
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% 後退
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%(快速)
- 結果:機器人向左轉,感應器回到黑線
優點:
- ✅ 精確控制:可獨立調整左右輪速度
- ✅ 彈性高:適合實作進階演算法(如 PID)
- ✅ 反應快:可設定極端速度差以快速轉向
- ✅ 專業應用:競賽級程式多使用此模式
缺點:
- ⚠️ 較複雜:需要理解兩輪獨立控制的邏輯
- ⚠️ 參數調整繁瑣:需要分別調整兩個數值
- ⚠️ 容易出錯:左右輪速度設定錯誤會導致異常動作
適用情境:
- 需要精確控制的循跡任務
- 實作 PID 或比例控制
- 競賽應用
- 複雜的路徑規劃
| 比較項目 | Move Steering | Move Tank |
|---|---|---|
| 控制方式 | 汽車式轉向(方向盤) | 坦克式(左右履帶) |
| 參數數量 | 2 個(Power + Steering) | 2 個(Left Power + Right Power) |
| 直覺性 | ⭐⭐⭐⭐⭐ 非常直覺 | ⭐⭐⭐ 需要理解 |
| 控制精度 | ⭐⭐⭐ 中等 | ⭐⭐⭐⭐⭐ 非常精確 |
| 適合初學者 | ✅ 是 | ⚠️ 需要練習 |
| 進階應用 | ⚠️ 受限 | ✅ 優秀 |
| PID 控制 | ⚠️ 不便 | ✅ 便利 |
| 參數調整 | ✅ 簡單(只調 Steering) | ⚠️ 較繁瑣(兩個數值) |
| 競賽應用 | ⚠️ 較少 | ✅ 常見 |
| 學習曲線 | 平緩 | 稍陡 |
以下是相同轉向效果下,兩種控制方式的參數對照:
| 動作 | 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 |
假設:
- 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
在開始寫程式之前,我們需要先測試實際環境的反射強度數值。
步驟 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
💡 為什麼要取中間值?
臨界值設在黑白之間,可以明確區分「在線上」和「不在線上」兩種狀態,減少誤判。
判斷邏輯:
實際數值範例:
| 表面類型 | 反射強度 | 判斷結果 |
|---|---|---|
| 黑色線條 | 10-20 | < 45,在線上 |
| 灰色邊界 | 35-45 | 接近臨界值(需注意) |
| 白色區域 | 70-85 | > 45,不在線上 |
臨界值調整建議:
- 如果機器人容易偏離黑線 → 降低臨界值(例如從 45 調到 40)
- 如果機器人太常誤判 → 提高臨界值(例如從 45 調到 50)
- 建議測試多次,找到最穩定的臨界值
在 EV3 圖形化程式中,我們使用 Switch(開關)積木 來根據感應器數值做出決策。
循跡的核心概念是讓感應器持續在黑線邊緣來回擺動:
白色區域
↓
┌───────┐
│ │
────┤黑線 ├──── ← 感應器理想位置:黑白交界處
│ │
└───────┘
↑
白色區域
循跡過程:
1. 感應器偵測到黑色 → 向右轉 → 移向白色
2. 感應器偵測到白色 → 向左轉 → 移向黑色
3. 重複 1-2,形成「之」字形前進路徑
完整程式(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):過度轉向,路徑震盪嚴重
完整程式(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
- 速度差越大:轉向越急,但路徑越不平穩
| 測試項目 | Move Steering (Power=50, Steering=±35) | Move Tank (Left/Right=50/20 互換) |
|---|---|---|
| 平均速度 | 中等 | 中等 |
| 路徑平穩度 | ⭐⭐⭐⭐ | ⭐⭐⭐⭐ |
| 急彎表現 | ⭐⭐⭐ | ⭐⭐⭐⭐ |
| 參數調整難度 | ⭐⭐(簡單) | ⭐⭐⭐(中等) |
| 程式可讀性 | ⭐⭐⭐⭐⭐ | ⭐⭐⭐⭐ |
| 初學者友善度 | ⭐⭐⭐⭐⭐ | ⭐⭐⭐ |
| 進階擴展性 | ⭐⭐⭐ | ⭐⭐⭐⭐⭐ |
步驟 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. 觀察機器人是否能穩定循跡
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
注意事項:
- ⚠️ 速度提高後,轉向反應時間會縮短
- ⚠️ 可能需要調整轉向參數
- ⚠️ 測試時逐步提升速度,避免衝出軌道
原理:
根據偏離黑線的程度,動態調整轉向力道。
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 ← 右輪加速
結果:向左轉(尋找黑線)
優點:
- 偏離越多,修正越大(反應靈敏)
- 接近黑線時,修正變小(行駛平穩)
- 可支援更高的巡線速度
PID (Proportional-Integral-Derivative) 是工業級的控制演算法,可實現最穩定的高速循跡。
PID 公式:
修正值 = Kp × 偏差 + Ki × 累積偏差 + Kd × 偏差變化率
Kp = 比例係數(影響即時反應)
Ki = 積分係數(消除穩態誤差)
Kd = 微分係數(減少震盪)
EV3 實作挑戰:
- 需要使用變數儲存歷史偏差值
- 需要精確的時間控制
- 建議使用 EV3-Python 或 RobotC 實現
- Move Tank 比 Move Steering 更適合實作 PID
✅ 程式簡單
- 只需要 Switch 積木和馬達控制積木
- 適合初學者快速上手
✅ 硬體需求低
- 只需要一個顏色感應器
- 不需要複雜的機械結構
✅ 穩定性可接受
- 在低速情況下表現良好
- 適合教學展示
❌ 速度受限
- 高速時容易衝出軌道
- 反應時間不足
❌ 路徑震盪
- 機器人會不斷左右擺動
- 行駛路徑呈現鋸齒狀
❌ 急彎表現差
- 轉彎半徑太小時容易失去黑線
- 需要放慢速度通過彎道
❌ 環境敏感
- 光線變化會影響臨界值
- 地面材質不同會影響反射強度
方法:
使用兩個顏色感應器,分別安裝在黑線兩側。
邏輯:
左感應器 右感應器 → 動作
─────── ─────── ────────
白 白 → 直行(在線上)
黑 白 → 右轉(偏左)
白 黑 → 左轉(偏右)
黑 黑 → 停止或後退(偏離軌道)
優點:
- 不需要設定臨界值
- 速度可以更快
- 路徑更平穩(減少震盪)
優點:
- 支援高速巡線(可達 80-100% 速度)
- 路徑非常平穩
- 可自動適應不同彎道
實作建議:
- 使用 Move Tank 而非 Move Steering
- 使用 MakeCode for EV3 或 Python 撰寫
- 調整參數:從 Kp 開始,逐步加入 Kd,最後微調 Ki
方法:
在程式執行期間,自動校正黑白臨界值。
邏輯:
啟動時:
1. 掃描黑色區域 10 次,取平均值 → black_avg
2. 掃描白色區域 10 次,取平均值 → white_avg
3. 計算臨界值 = (black_avg + white_avg) / 2
執行時:
每 5 秒更新一次臨界值(適應環境光線變化)
優點:
- 適應不同環境光線
- 不需要手動調整參數
方法:
使用 EV3 陀螺儀偵測機器人的轉向角度,配合顏色感應器進行路徑修正。
應用:
- 直線路段:使用陀螺儀保持直行
- 彎道路段:使用顏色感應器循跡
- 結合兩者優點
使用 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 開頭]
使用 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 開頭]
#!/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 次)
#!/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)
#!/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)
目標:
使用 Move Steering 積木,完成橢圓形軌道的循跡。
要求:
- 機器人能穩定循跡至少 3 圈
- 不能偏離軌道超過 3 秒
- 使用 Move Steering 積木
提示:
- Power 設定為 50
- Steering 從 ±30 開始調整
目標:
使用 Move Tank 積木,完成相同的橢圓形軌道循跡。
要求:
- 完成與練習 1 相同的軌道
- 使用 Move Tank 積木
- 比較兩種方法的差異
提示:
- 嘗試將練習 1 的 Move Steering 參數轉換為 Move Tank 參數
目標:
在保持穩定的前提下,盡可能提高巡線速度。
要求:
- 完成一圈的時間少於 20 秒
- 不能衝出軌道
- 可選擇 Move Steering 或 Move Tank
提示:
- 調整基礎速度和轉向參數
- Move Tank 可能在高速時表現更好
目標:
設計包含直線、急彎、S彎的複雜軌道,測試循跡能力。
要求:
- 能穩定通過半徑 20cm 的急彎
- 能順利通過連續 S 彎
- 分別使用 Move Steering 和 Move Tank 測試
目標:
使用 Math 積木實作比例控制。
要求:
- 使用 Move Tank 積木
- 根據反射強度動態計算左右輪速度
- 速度應能達到 Power=60 以上
目標:
使用 Python 實作 PID 控制,並找到最佳參數組合。
步驟:
1. 只使用 Kp,觀察震盪現象
2. 加入 Kd,減少震盪
3. 加入 Ki,消除穩態誤差
4. 記錄最佳參數組合
原因:
- Move Steering:Steering 數值太大
- Move Tank:左右輪速度差太大
- 臨界值設定不當
解決方法:
- Move Steering:減小 Steering(例如從 ±40 改為 ±25)
- Move Tank:減小速度差(例如從 50/20 改為 50/35)
- 重新測試並調整臨界值
- 嘗試實作比例控制
原因:
- 參數轉換不正確
- 馬達方向設定不同
解決方法:
- 使用本文件第 3.5 節的轉換公式
- 檢查馬達方向設定(Reverse)
- 確認 Port 連接正確(B=左,C=右)
原因:
- 速度太快,反應不及
- 感應器與地面距離過大
- 轉向力道不足
解決方法:
- 降低基礎速度(Power 或 B/C Power)
- 調整感應器高度至 0.5-1.0 公分
- Move Steering:增加 Steering 絕對值
- Move Tank:加大速度差
- 檢查馬達是否正常運作
原因:
- 環境光線影響反射強度
- 地面材質不同
解決方法:
- 每次更換場地時重新測試臨界值
- 實作自動校正功能
- 使用遮光罩減少環境光干擾
原因:
- 轉向反應太慢
- 速度過快
解決方法:
- Move Steering:增加 Steering 數值(例如從 ±30 到 ±50)
- Move Tank:加大速度差(例如從 50/30 改為 50/20)
- 降低基礎速度
- 使用雙感應器或 PID 控制
原因:
- Steering 參數無法直接用變數動態調整(LEGO EV3 軟體限制)
解決方法:
- 改用 Move Tank 積木
- 或使用 Python 程式(Pybricks)
本教學涵蓋了 EV3 顏色感應器的兩種主要模式,並詳細說明了如何使用光線反射強度模式配合 Move Steering 或 Move 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 軟體" 或相關清晰表述