循行者 8 路 (Line8) × EV3 × Pybricks
這一頁只講 Pybricks v4/EV3 MicroPython v2:在 MINDSTORMS EV3 上用它讀循行者 8 路 (Line8)的安裝步驟、每個值怎麼讀、能用的命令與範例。要換產品、主機或軟體,用上方的切換列。
安裝與設定
你需要
- 感應器:循行者 8 路 (Line8)(EV3 版,RJ12 接頭)。
- 主機:LEGO MINDSTORMS EV3。
- 軟體(二選一):
- Pybricks v4:用 Chrome 打開 code.pybricks.com,EV3 要先裝 Pybricks 韌體(正式版已內建 EV3 韌體,2026-10 是 v4.1.1)。
- EV3 MicroPython v2.0:樂高官方「EV3 MicroPython」microSD 開機卡+VS Code 的「LEGO MINDSTORMS EV3 MicroPython」擴充套件。已經在用的人選這個。
安裝軟體
Pybricks v4
- 用 Chrome 打開 code.pybricks.com。
- 照網站說明把 EV3 換成 Pybricks 韌體。code.pybricks.com 正式版已內建 EV3 韌體(2026-10 是 v4.1.1)。本站範例最早在 v4.0.0b10 上機測過,v4.1.1 寫法相同。
- 打開範例:把
.py檔拖進編輯區,按執行。
EV3 MicroPython v2.0
- 用樂高官方 EV3 MicroPython 的 microSD 開機卡開機。
- 在 VS Code 裝好「LEGO MINDSTORMS EV3 MicroPython」擴充套件。
- 打開範例:把程式內容貼到
main.py,按 F5 下載執行。
讓軟體認得感應器
新手範例不用裝函式庫,直接讀感應器的資料:
- Pybricks v4 用
LUMPDevice(Port.S1),sensor.read(模式)拿到該模式的數值。 - EV3 MicroPython v2.0 一律用
Ev3devSensor讀。EV3 顯示成紅外線感應器的產品不要用InfraredSensor:換模式固定等約 1.1 秒,buttons()/beacon()/keypad()會丟錯或改掉數值。 - 可以直接讀 EV3-G、Classroom 讀不到的模式,所以標「僅 Pybricks/EV3 MicroPython/clev3r」的範例也能跑。
重要
不要在主迴圈裡頻繁切換模式。 EV3 硬體每次切換感應器模式都會有通訊等待延遲。依任務選定一種模式,整趟都用它。
接線
- 用連接線把感應器插在 EV3 的 1 號孔(1~4 任一孔都可以;程式裡
Port.S1~Port.S4選同一個孔)。 - EV3 先開機,再插感應器。
- 接頭卡榫朝上,輕輕推進去。
EV3 上機結果與注意事項
原廠 EV3 韌體、Pybricks v4 實測通過(2026-11-03);ev3dev/EV3 MicroPython v2 支援。
- **用原廠類別
InfraredSensor時不要用buttons()**:模式 2 放的是線位置等資料,不是遙控按鈕代碼,Pybricks 會出現OSError(錯誤 5,EIO)。請用distance()(=線位置,會是負數),或用LUMPDevice/MBC 函式庫讀。 - EV3 切換模式約要 1.1 秒:循線迴圈固定讀一個模式。
- EV3 版不能從主機下命令(E0~E9 都送不了);白線模式、校準用板子上的按鍵。
先校準(只要做一次)
循行者要先「認識」你場地上的黑色和白色,數值才會準。校準完會記在感應器裡,重新開機也還在(除非換場地)。
- 感應器插好、主機開機(感應器的燈亮起來)。
- 按住感應器上的校準按鈕約 0.5 秒再放開(不要一直按著,按著不放會一直重新校準)。
- 綠色校準指示燈(靠近校準按鈕)亮起後,5 秒內把感應器在黑線和白色地面之間來回掃幾次,8 個感應點都要掃過最黑的黑線和最白的白色區域。
- 掃的時候感應器離地 3~12 mm,太高會讀不準。
- 綠燈熄滅=校準完成,數值自動存進感應器。
怎麼知道校準好了? 放在白色地面時「線寬」是 0,壓在一般黑線上是 2~3。
函式庫與範例下載
- 打包下載(範例+函式庫)
- 函式庫:MBC_line8_EV3_Lib.py。要直接匯入你的 Pybricks 專案,檔名必須完全一致,
import才載得進來。

方式一:原生指令讀取
用 Pybricks 底層的 device.mode(mode) 直接拿陣列資料:
| 指令 | 回傳 | 內容 |
|---|---|---|
device.mode(0) |
Tuple(1 byte) | 新手模式:位置 -8 ~ 8,0 為中央 |
device.mode(1) |
Tuple(8 bytes) | 全覽除錯模式:8 路校準後的反射值,每路 0 ~ 100(0=最暗、100=最亮),第 1 路在最左邊 |
device.mode(2) |
Tuple(4 bytes) | 競技模式:高精度位置 -100 ~ 100、線寬 0 ~ 8、左邊界光值、右邊界光值 |
注意
Pybricks 官方還沒把對應的圖形與底層指令更新好,原生範例程式之後補齊;目前建議直接用方式二。
方式二:匯入專屬函式庫
line_init_port_multitask(port, multitask) 初始化:port 傳 EV3 埠物件(例如 hub.port.S1)。非多工:multitask 填 False,呼叫時前面選 call;多工:填 True,呼叫時前面選 await。


| 模式 | 函數 | 範圍 | 說明 |
|---|---|---|---|
| 模式 0(基礎) | line_pos8() |
-8 ~ +8 |
整數循線位置,0 正中央 |
| 模式 1(解碼) | line_ir_ch(ch) |
1 ~ 9 |
單一通道量化光值,ch = 1~8,1 最暗、9 最亮 |
| 模式 2(競技) | line_pos100() |
-100 ~ +100 |
高解析插值位置,PID/PD 專用 |
| 模式 2(競技) | line_width() |
0 ~ 8 |
特徵線寬,偵測路口與寬線 |
| 模式 2(競技) | line_edge_l() |
0 ~ 100 |
左邊界光值(0 黑、100 白),防掉線 |
| 模式 2(競技) | line_edge_r() |
0 ~ 100 |
右邊界光值(0 黑、100 白),防掉線 |
重要
不同模式的函數交叉呼叫會有切換延遲。一般使用者與比賽選手全程用模式 2 的函數;只有要讀所有感測器原始值、自己寫特殊演算法時,才單獨用模式 1。
想學更厲害的循線方法?
可以找這幾位有豐富比賽與教學經驗的教練:LegoLauXiao 教練(示範影片)、legolaumo 教練(示範影片)。
第一次測試
- 打開本頁範例 1,按執行(MicroPython 版按 F5)。
- EV3 螢幕上的數字跟著感應器前方的東西變化,就是接好了。
常見問題
- 找不到 EV3 的 Pybricks 韌體? 確認用的是 code.pybricks.com 正式版(2026-10 起內建 EV3 v4.1.1);舊的 ev3dev 版 Pybricks(microSD 卡)是另一套,本頁不適用。
- 數字一直不變? 拔掉感應器重插一次(EV3 要先開機再插)。
- 程式反應忽快忽慢? 主迴圈裡交叉讀了不同模式,每次切換都要等,改成只用一種模式。
- 匯入函式庫時出錯? 函式庫檔要匯入到同一個 Pybricks 專案,檔名必須跟
import的名字完全一致。
讀值
程式假設感應器插 1 號孔,用 LUMPDevice 讀原始模式;EV3 MicroPython v2 寫法相同。
線位置 linePos
| 範圍 | 意思 |
|---|---|
-8~+8 |
線在哪一路:−8(最左)~+8(最右),0 = 正中間;站在車後往前看,負 = 線在左 |
from pybricks.iodevices import LUMPDevice
from pybricks.parameters import Port
sensor = LUMPDevice(Port.S1) # 感應器插 1 號孔
linePos = sensor.read(0)[0] # 線位置:-8~+8模式 0 · int8 · IR-PROX(已鎖住的模式,韌體與主機端都不再改)
細位置 linePosFine
| 範圍 | 意思 |
|---|---|
-100~+100 |
線位置的細分:−100 ~ +100,0 = 正中間,負 = 線在左(與線位置同號) |
from pybricks.iodevices import LUMPDevice
from pybricks.parameters import Port
sensor = LUMPDevice(Port.S1) # 感應器插 1 號孔
linePosFine = sensor.read(2)[0] # 細位置:-100~+100模式 2 · int8 · IR-REMOTE byte0 = highRes−100 存成 int8(F030 ev3Uart case 2),主機直接讀(已鎖住的模式,韌體與主機端都不再改)
線寬 lineWidth
| 範圍 | 意思 |
|---|---|
0~8 路 |
壓到線的路數 0~8,0 = 找不到線 |
from pybricks.iodevices import LUMPDevice
from pybricks.parameters import Port
sensor = LUMPDevice(Port.S1) # 感應器插 1 號孔
lineWidth = sensor.read(2)[1] # 線寬:0~8 路模式 2 · int8(已鎖住的模式,韌體與主機端都不再改)
壓線位元圖 bitmap
| 範圍 | 意思 |
|---|---|
0~255 bit |
bit0 = 第 1 路(最左)… bit7 = 第 8 路,1 = 那一路在線上 |
from pybricks.iodevices import LUMPDevice
from pybricks.parameters import Port
sensor = LUMPDevice(Port.S1) # 感應器插 1 號孔
bitmap = sensor.read(3)[0] # 壓線位元圖:0~255 bit模式 3 · int16 · #67 新:IR-REM-A 1×int16
第 1~8 路光值 light
| 範圍 | 意思 |
|---|---|
0~100 |
第 1 |
from pybricks.iodevices import LUMPDevice
from pybricks.parameters import Port
sensor = LUMPDevice(Port.S1) # 感應器插 1 號孔
light = sensor.read(1)[0:8] # 第 1~8 路光值模式 1 · int8 · IR-SEEK 8×int8(已鎖住的模式,韌體與主機端都不再改)
這個軟體讀不到:線段數、最後離線方向、二值化門檻、校準完成次數。要用這些值請改用 Arduino/mBlock/micro:bit。
命令
EV3 接頭是唯讀的,這個軟體不能送命令:校準用感應器上的按鈕,切黑白線、門檻等設定改用 Arduino I2C、mBlock 或 micro:bit。
範例
範例 1:看看線在哪裡
這個範例會做什麼: 把感應器放在黑線上,EV3 螢幕會顯示一個數字告訴你線在哪裡。這是所有循線程式的第一步:先學會「讀數字」。
要準備什麼:
- EV3 主機+教育版基本車(左輪接 B、右輪接 C)
- 循行者 8 路(EV3 版,RJ12 接頭)
- 白底黑線的場地(黑線寬約 2 公分)
怎麼接: 循行者 8 路插 1 號孔,裝在車頭下方、離地約 1 公分,感應器正對地面。
下載程式(選你用的軟體):
⬇ Pybricks v4 | ⬇ EV3 MicroPython v2.0
Pybricks v4 程式碼
# ============================================================
# 循行者 8 路循線感應器 EV3 新手範例 01:看看線在哪裡
# 軟體:Pybricks v4(用 Chrome 打開 https://code.pybricks.com ,EV3 版目前是 Beta)
# 接法:循行者 8 路插 1 號孔
# 這個範例會做什麼:把感應器放在黑線上,EV3 螢幕會顯示一個數字告訴你線在哪裡。這是所有循線程式的第一步:先學會「讀數字」。
# ============================================================
from pybricks.hubs import EV3Brick
from pybricks.iodevices import LUMPDevice
from pybricks.parameters import Port, Color
from pybricks.tools import wait
ev3 = EV3Brick()
sensor = LUMPDevice(Port.S1) # 循行者 8 路插 1 號孔
def read_pos():
# 線的位置:-8 ~ +8,0=線在正中間
return sensor.read(0)[0]
# ---------- 程式從這裡開始 ----------
# 先把螢幕清乾淨
ev3.screen.clear()
# 下面的動作一直重複
while True:
# 讀取線的位置,顯示在螢幕第 1 行
ev3.screen.draw_text(0, 0, "POS " + str(read_pos()) + " ", Color.BLACK, Color.WHITE)
# 等 0.1 秒再讀下一次,數字才不會閃太快
wait(100)EV3 MicroPython v2.0 程式碼
#!/usr/bin/env pybricks-micropython
# ============================================================
# 循行者 8 路循線感應器 EV3 新手範例 01:看看線在哪裡
# 軟體:樂高官方 EV3 MicroPython v2.0(microSD 開機卡+VS Code「LEGO MINDSTORMS EV3 MicroPython」擴充套件)
# 接法:循行者 8 路插 1 號孔
# 這個範例會做什麼:把感應器放在黑線上,EV3 螢幕會顯示一個數字告訴你線在哪裡。這是所有循線程式的第一步:先學會「讀數字」。
# ============================================================
from pybricks.hubs import EV3Brick
from pybricks.iodevices import Ev3devSensor
from pybricks.parameters import Port, Color
from pybricks.tools import wait
ev3 = EV3Brick()
sensor = Ev3devSensor(Port.S1) # 循行者 8 路插 1 號孔
def read_pos():
# 線的位置:-8 ~ +8,0=線在正中間
return sensor.read('IR-PROX')[0]
# ---------- 程式從這裡開始 ----------
# 先把螢幕清乾淨
ev3.screen.clear()
# 下面的動作一直重複
while True:
# 讀取線的位置,顯示在螢幕第 1 行
ev3.screen.draw_text(0, 0, "POS " + str(read_pos()) + " ", Color.BLACK, Color.WHITE)
# 等 0.1 秒再讀下一次,數字才不會閃太快
wait(100)一步一步看懂程式:
- 先把螢幕清乾淨
- 下面的動作一直重複
- 讀取線的位置,顯示在螢幕第 1 行
- 等 0.1 秒再讀下一次,數字才不會閃太快
跑起來應該看到: 把黑線放在感應器正中間,螢幕顯示 0;線往左移數字變成負數,往右移變成正數,最邊邊是 ±8(左右是指站在車子後面、面向車頭時的左右)。
常見問題:
- 線不見了,數字卻停在最後的值? 這是正常的:線跑出感應器範圍時,位置會停在最後看到的地方。要判斷「線不見了」請用範例 4 的線寬(線寬=0)。
- 數字一直不變? 先看感應器有沒有亮燈、線有沒有插緊。EV3 主機要先開機再接感應器,或拔掉重插一次。
- 車子往反方向修正、越修越歪? 把程式裡的「+」和「-」對調(左右輪的修正互換),或確認左輪是不是接在 B、右輪接在 C。
範例 2:三段式循線:偏左、偏右、直走
這個範例會做什麼: 用「如果…就…否則…」讓車子沿著黑線走:線偏左就往左轉,線偏右就往右轉,在中間就直走。
要準備什麼:
- EV3 主機+教育版基本車(左輪接 B、右輪接 C)
- 循行者 8 路(EV3 版,RJ12 接頭)
- 白底黑線的場地(黑線寬約 2 公分)
怎麼接: 循行者 8 路插 1 號孔,裝在車頭下方、離地約 1 公分,感應器正對地面。
下載程式(選你用的軟體):
⬇ Pybricks v4 | ⬇ EV3 MicroPython v2.0
Pybricks v4 程式碼
# ============================================================
# 循行者 8 路循線感應器 EV3 新手範例 02:三段式循線:偏左、偏右、直走
# 軟體:Pybricks v4(用 Chrome 打開 https://code.pybricks.com ,EV3 版目前是 Beta)
# 接法:循行者 8 路插 1 號孔;左輪馬達接 B、右輪馬達接 C
# 這個範例會做什麼:用「如果…就…否則…」讓車子沿著黑線走:線偏左就往左轉,線偏右就往右轉,在中間就直走。
# ============================================================
from pybricks.hubs import EV3Brick
from pybricks.ev3devices import Motor
from pybricks.iodevices import LUMPDevice
from pybricks.parameters import Port
from pybricks.tools import wait
ev3 = EV3Brick()
sensor = LUMPDevice(Port.S1) # 循行者 8 路插 1 號孔
left_motor = Motor(Port.B) # 左輪
right_motor = Motor(Port.C) # 右輪
def read_pos():
# 線的位置:-8 ~ +8,0=線在正中間
return sensor.read(0)[0]
# ---------- 程式從這裡開始 ----------
# 一直重複檢查線的位置
while True:
# 如果線的位置小於 -2(偏左)
if read_pos() < (-2):
# 線偏左:左輪慢、右輪快,車子往左修
left_motor.dc(10)
right_motor.dc(40)
# 否則,如果線的位置大於 2(偏右)
elif read_pos() > 2:
# 線偏右:左輪快、右輪慢,車子往右修
left_motor.dc(40)
right_motor.dc(10)
else:
# 線在中間:兩輪一樣快,直直走
left_motor.dc(30)
right_motor.dc(30)EV3 MicroPython v2.0 程式碼
#!/usr/bin/env pybricks-micropython
# ============================================================
# 循行者 8 路循線感應器 EV3 新手範例 02:三段式循線:偏左、偏右、直走
# 軟體:樂高官方 EV3 MicroPython v2.0(microSD 開機卡+VS Code「LEGO MINDSTORMS EV3 MicroPython」擴充套件)
# 接法:循行者 8 路插 1 號孔;左輪馬達接 B、右輪馬達接 C
# 這個範例會做什麼:用「如果…就…否則…」讓車子沿著黑線走:線偏左就往左轉,線偏右就往右轉,在中間就直走。
# ============================================================
from pybricks.hubs import EV3Brick
from pybricks.ev3devices import Motor
from pybricks.iodevices import Ev3devSensor
from pybricks.parameters import Port
from pybricks.tools import wait
ev3 = EV3Brick()
sensor = Ev3devSensor(Port.S1) # 循行者 8 路插 1 號孔
left_motor = Motor(Port.B) # 左輪
right_motor = Motor(Port.C) # 右輪
def read_pos():
# 線的位置:-8 ~ +8,0=線在正中間
return sensor.read('IR-PROX')[0]
# ---------- 程式從這裡開始 ----------
# 一直重複檢查線的位置
while True:
# 如果線的位置小於 -2(偏左)
if read_pos() < (-2):
# 線偏左:左輪慢、右輪快,車子往左修
left_motor.dc(10)
right_motor.dc(40)
# 否則,如果線的位置大於 2(偏右)
elif read_pos() > 2:
# 線偏右:左輪快、右輪慢,車子往右修
left_motor.dc(40)
right_motor.dc(10)
else:
# 線在中間:兩輪一樣快,直直走
left_motor.dc(30)
right_motor.dc(30)一步一步看懂程式:
- 一直重複檢查線的位置
- 如果線的位置小於 -2(偏左)
- 線偏左:左輪慢、右輪快,車子往左修
- 否則:
- 否則,如果線的位置大於 2(偏右)
- 線偏右:左輪快、右輪慢,車子往右修
- 否則:
- 線在中間:兩輪一樣快,直直走
- 否則,如果線的位置大於 2(偏右)
- 如果線的位置小於 -2(偏左)
跑起來應該看到: 車子會左右搖擺地沿著黑線前進。彎道太急時可能衝出去,把 40 改小、10 改成 0 試試看。
常見問題:
- 數字一直不變? 先看感應器有沒有亮燈、線有沒有插緊。EV3 主機要先開機再接感應器,或拔掉重插一次。
- 車子往反方向修正、越修越歪? 把程式裡的「+」和「-」對調(左右輪的修正互換),或確認左輪是不是接在 B、右輪接在 C。
範例 3:比例循線:偏越多、轉越多
這個範例會做什麼: 三段式循線會一直搖擺。這個範例把「線的位置 × 一個數字」當成轉彎的力量:偏一點就轉一點、偏很多就轉很多,車子會走得更順。
要準備什麼:
- EV3 主機+教育版基本車(左輪接 B、右輪接 C)
- 循行者 8 路(EV3 版,RJ12 接頭)
- 白底黑線的場地(黑線寬約 2 公分)
怎麼接: 循行者 8 路插 1 號孔,裝在車頭下方、離地約 1 公分,感應器正對地面。
下載程式(選你用的軟體):
⬇ Pybricks v4 | ⬇ EV3 MicroPython v2.0
Pybricks v4 程式碼
# ============================================================
# 循行者 8 路循線感應器 EV3 新手範例 03:比例循線:偏越多、轉越多
# 軟體:Pybricks v4(用 Chrome 打開 https://code.pybricks.com ,EV3 版目前是 Beta)
# 接法:循行者 8 路插 1 號孔;左輪馬達接 B、右輪馬達接 C
# 這個範例會做什麼:三段式循線會一直搖擺。這個範例把「線的位置 × 一個數字」當成轉彎的力量:偏一點就轉一點、偏很多就轉很多,車子會走得更順。
# ============================================================
from pybricks.hubs import EV3Brick
from pybricks.ev3devices import Motor
from pybricks.iodevices import LUMPDevice
from pybricks.parameters import Port
from pybricks.tools import wait
ev3 = EV3Brick()
sensor = LUMPDevice(Port.S1) # 循行者 8 路插 1 號孔
left_motor = Motor(Port.B) # 左輪
right_motor = Motor(Port.C) # 右輪
def read_pos():
# 線的位置:-8 ~ +8,0=線在正中間
return sensor.read(0)[0]
# ---------- 程式從這裡開始 ----------
# 一直重複
while True:
# 轉彎力量 turn = 線的位置 × 4
turn = read_pos() * 4
# 左輪=30+turn、右輪=30-turn:線偏哪邊,車子就往哪邊修
left_motor.dc(30 + turn)
right_motor.dc(30 - turn)EV3 MicroPython v2.0 程式碼
#!/usr/bin/env pybricks-micropython
# ============================================================
# 循行者 8 路循線感應器 EV3 新手範例 03:比例循線:偏越多、轉越多
# 軟體:樂高官方 EV3 MicroPython v2.0(microSD 開機卡+VS Code「LEGO MINDSTORMS EV3 MicroPython」擴充套件)
# 接法:循行者 8 路插 1 號孔;左輪馬達接 B、右輪馬達接 C
# 這個範例會做什麼:三段式循線會一直搖擺。這個範例把「線的位置 × 一個數字」當成轉彎的力量:偏一點就轉一點、偏很多就轉很多,車子會走得更順。
# ============================================================
from pybricks.hubs import EV3Brick
from pybricks.ev3devices import Motor
from pybricks.iodevices import Ev3devSensor
from pybricks.parameters import Port
from pybricks.tools import wait
ev3 = EV3Brick()
sensor = Ev3devSensor(Port.S1) # 循行者 8 路插 1 號孔
left_motor = Motor(Port.B) # 左輪
right_motor = Motor(Port.C) # 右輪
def read_pos():
# 線的位置:-8 ~ +8,0=線在正中間
return sensor.read('IR-PROX')[0]
# ---------- 程式從這裡開始 ----------
# 一直重複
while True:
# 轉彎力量 turn = 線的位置 × 4
turn = read_pos() * 4
# 左輪=30+turn、右輪=30-turn:線偏哪邊,車子就往哪邊修
left_motor.dc(30 + turn)
right_motor.dc(30 - turn)一步一步看懂程式:
- 一直重複
- 轉彎力量 turn = 線的位置 × 4
- 左輪=30+turn、右輪=30-turn:線偏哪邊,車子就往哪邊修
跑起來應該看到: 車子比範例 2 更平順地沿著黑線走。數字 4 叫做「比例係數」:太大會左右甩,太小會轉不過彎,可以自己調整。
常見問題:
- 直線上也一直左右甩? 把 4 改小一點(例如 2)。
- 數字一直不變? 先看感應器有沒有亮燈、線有沒有插緊。EV3 主機要先開機再接感應器,或拔掉重插一次。
- 車子往反方向修正、越修越歪? 把程式裡的「+」和「-」對調(左右輪的修正互換),或確認左輪是不是接在 B、右輪接在 C。
範例 4:碰到十字路口就停車
這個範例會做什麼: 感應器還會告訴你「壓到黑線的格數」(線寬)。平常只有 2~3 格,到十字路口會一下子變很多。這個範例邊循線邊看線寬,大於等於 6 就停車並嗶一聲。
要準備什麼:
- EV3 主機+教育版基本車(左輪接 B、右輪接 C)
- 循行者 8 路(EV3 版,RJ12 接頭)
- 有十字路口的黑線場地
怎麼接: 循行者 8 路插 1 號孔,裝在車頭下方、離地約 1 公分,感應器正對地面。
下載程式(選你用的軟體):
⬇ Pybricks v4 | ⬇ EV3 MicroPython v2.0
Pybricks v4 程式碼
# ============================================================
# 循行者 8 路循線感應器 EV3 新手範例 04:碰到十字路口就停車
# 軟體:Pybricks v4(用 Chrome 打開 https://code.pybricks.com ,EV3 版目前是 Beta)
# 接法:循行者 8 路插 1 號孔;左輪馬達接 B、右輪馬達接 C
# 這個範例會做什麼:感應器還會告訴你「壓到黑線的格數」(線寬)。平常只有 2~3 格,到十字路口會一下子變很多。這個範例邊循線邊看線寬,大於等於 6 就停車並嗶一聲。
# ============================================================
from pybricks.hubs import EV3Brick
from pybricks.ev3devices import Motor
from pybricks.iodevices import LUMPDevice
from pybricks.parameters import Port
from pybricks.tools import wait
ev3 = EV3Brick()
sensor = LUMPDevice(Port.S1) # 循行者 8 路插 1 號孔
left_motor = Motor(Port.B) # 左輪
right_motor = Motor(Port.C) # 右輪
def read_width():
# 線的寬度(壓到黑線的格數):0 ~ 8,0=看不到線
return sensor.read(2)[1]
def read_pos100():
# 線的位置(細):-100 ~ +100,0=線在正中間
return sensor.read(2)[0]
# ---------- 程式從這裡開始 ----------
# 一直循線,直到線寬大於等於 6(到路口了)
while not (read_width() >= 6):
# 轉彎力量 turn = 線的位置(-100~100)× 0.3
turn = read_pos100() * 0.3
# 一樣用比例循線往前走,速度放慢到 25
left_motor.dc(25 + turn)
right_motor.dc(25 - turn)
# 停車
left_motor.brake()
right_motor.brake()
# 嗶一聲告訴你到了
ev3.speaker.beep()EV3 MicroPython v2.0 程式碼
#!/usr/bin/env pybricks-micropython
# ============================================================
# 循行者 8 路循線感應器 EV3 新手範例 04:碰到十字路口就停車
# 軟體:樂高官方 EV3 MicroPython v2.0(microSD 開機卡+VS Code「LEGO MINDSTORMS EV3 MicroPython」擴充套件)
# 接法:循行者 8 路插 1 號孔;左輪馬達接 B、右輪馬達接 C
# 這個範例會做什麼:感應器還會告訴你「壓到黑線的格數」(線寬)。平常只有 2~3 格,到十字路口會一下子變很多。這個範例邊循線邊看線寬,大於等於 6 就停車並嗶一聲。
# ============================================================
from pybricks.hubs import EV3Brick
from pybricks.ev3devices import Motor
from pybricks.iodevices import Ev3devSensor
from pybricks.parameters import Port
from pybricks.tools import wait
ev3 = EV3Brick()
sensor = Ev3devSensor(Port.S1) # 循行者 8 路插 1 號孔
left_motor = Motor(Port.B) # 左輪
right_motor = Motor(Port.C) # 右輪
def read_width():
# 線的寬度(壓到黑線的格數):0 ~ 8,0=看不到線
return sensor.read('IR-REMOTE')[1]
def read_pos100():
# 線的位置(細):-100 ~ +100,0=線在正中間
return sensor.read('IR-REMOTE')[0]
# ---------- 程式從這裡開始 ----------
# 一直循線,直到線寬大於等於 6(到路口了)
while not (read_width() >= 6):
# 轉彎力量 turn = 線的位置(-100~100)× 0.3
turn = read_pos100() * 0.3
# 一樣用比例循線往前走,速度放慢到 25
left_motor.dc(25 + turn)
right_motor.dc(25 - turn)
# 停車
left_motor.brake()
right_motor.brake()
# 嗶一聲告訴你到了
ev3.speaker.beep()一步一步看懂程式:
- 一直循線,直到線寬大於等於 6(到路口了)
- 轉彎力量 turn = 線的位置(-100~100)× 0.3
- 一樣用比例循線往前走,速度放慢到 25
- 停車
- 嗶一聲告訴你到了
跑起來應該看到: 車子循線前進,壓到十字路口時停下來並嗶一聲。
常見問題:
- 還沒到路口就停了? 彎道也可能讓線寬變大,把 6 改大一點。
- 到路口不停? 用範例 1 的方法把線寬顯示出來,看路口時實際是多少,再改程式裡的 6。
- 數字一直不變? 先看感應器有沒有亮燈、線有沒有插緊。EV3 主機要先開機再接感應器,或拔掉重插一次。
- 車子往反方向修正、越修越歪? 把程式裡的「+」和「-」對調(左右輪的修正互換),或確認左輪是不是接在 B、右輪接在 C。
範例 5:數路口:第 3 個路口停車
這個範例會做什麼: 比賽常常要「走到第幾個路口」。這個範例用一個變數 count 數路口,用另一個變數 onCross 記住「現在是不是正壓在路口上」,避免同一個路口被數很多次。
要準備什麼:
- EV3 主機+教育版基本車(左輪接 B、右輪接 C)
- 循行者 8 路(EV3 版,RJ12 接頭)
- 有 3 個以上十字路口的黑線場地
怎麼接: 循行者 8 路插 1 號孔,裝在車頭下方、離地約 1 公分,感應器正對地面。
下載程式(選你用的軟體):
⬇ Pybricks v4 | ⬇ EV3 MicroPython v2.0
Pybricks v4 程式碼
# ============================================================
# 循行者 8 路循線感應器 EV3 新手範例 05:數路口:第 3 個路口停車
# 軟體:Pybricks v4(用 Chrome 打開 https://code.pybricks.com ,EV3 版目前是 Beta)
# 接法:循行者 8 路插 1 號孔;左輪馬達接 B、右輪馬達接 C
# 這個範例會做什麼:比賽常常要「走到第幾個路口」。這個範例用一個變數 count 數路口,用另一個變數 onCross 記住「現在是不是正壓在路口上」,避免同一個路口被數很多次。
# ============================================================
from pybricks.hubs import EV3Brick
from pybricks.ev3devices import Motor
from pybricks.iodevices import LUMPDevice
from pybricks.parameters import Port, Color
from pybricks.tools import wait
ev3 = EV3Brick()
sensor = LUMPDevice(Port.S1) # 循行者 8 路插 1 號孔
left_motor = Motor(Port.B) # 左輪
right_motor = Motor(Port.C) # 右輪
def read_pos100():
# 線的位置(細):-100 ~ +100,0=線在正中間
return sensor.read(2)[0]
def read_width():
# 線的寬度(壓到黑線的格數):0 ~ 8,0=看不到線
return sensor.read(2)[1]
# ---------- 程式從這裡開始 ----------
# 路口數 count 從 0 開始
count = 0
# onCross=0 代表「現在不在路口上」
onCross = 0
# 一直循線,直到數滿 3 個路口
while not (count >= 3):
# 比例循線:turn = 線的位置 × 0.3
turn = read_pos100() * 0.3
# 左輪=25+turn、右輪=25-turn
left_motor.dc(25 + turn)
right_motor.dc(25 - turn)
# 如果線寬大於等於 6(壓在路口上)
if read_width() >= 6:
# 而且剛剛還不在路口上
if onCross == 0:
# 剛壓到新路口:count 加 1
count = count + 1
# 記住「正在路口上」,同一個路口不要再數
onCross = 1
# 嗶一聲
ev3.speaker.beep()
else:
# 離開路口了:onCross 改回 0,準備數下一個
onCross = 0
# 螢幕顯示已經數到第幾個路口
ev3.screen.draw_text(0, 0, "COUNT " + str(count) + " ", Color.BLACK, Color.WHITE)
# 停車
left_motor.brake()
right_motor.brake()EV3 MicroPython v2.0 程式碼
#!/usr/bin/env pybricks-micropython
# ============================================================
# 循行者 8 路循線感應器 EV3 新手範例 05:數路口:第 3 個路口停車
# 軟體:樂高官方 EV3 MicroPython v2.0(microSD 開機卡+VS Code「LEGO MINDSTORMS EV3 MicroPython」擴充套件)
# 接法:循行者 8 路插 1 號孔;左輪馬達接 B、右輪馬達接 C
# 這個範例會做什麼:比賽常常要「走到第幾個路口」。這個範例用一個變數 count 數路口,用另一個變數 onCross 記住「現在是不是正壓在路口上」,避免同一個路口被數很多次。
# ============================================================
from pybricks.hubs import EV3Brick
from pybricks.ev3devices import Motor
from pybricks.iodevices import Ev3devSensor
from pybricks.parameters import Port, Color
from pybricks.tools import wait
ev3 = EV3Brick()
sensor = Ev3devSensor(Port.S1) # 循行者 8 路插 1 號孔
left_motor = Motor(Port.B) # 左輪
right_motor = Motor(Port.C) # 右輪
def read_pos100():
# 線的位置(細):-100 ~ +100,0=線在正中間
return sensor.read('IR-REMOTE')[0]
def read_width():
# 線的寬度(壓到黑線的格數):0 ~ 8,0=看不到線
return sensor.read('IR-REMOTE')[1]
# ---------- 程式從這裡開始 ----------
# 路口數 count 從 0 開始
count = 0
# onCross=0 代表「現在不在路口上」
onCross = 0
# 一直循線,直到數滿 3 個路口
while not (count >= 3):
# 比例循線:turn = 線的位置 × 0.3
turn = read_pos100() * 0.3
# 左輪=25+turn、右輪=25-turn
left_motor.dc(25 + turn)
right_motor.dc(25 - turn)
# 如果線寬大於等於 6(壓在路口上)
if read_width() >= 6:
# 而且剛剛還不在路口上
if onCross == 0:
# 剛壓到新路口:count 加 1
count = count + 1
# 記住「正在路口上」,同一個路口不要再數
onCross = 1
# 嗶一聲
ev3.speaker.beep()
else:
# 離開路口了:onCross 改回 0,準備數下一個
onCross = 0
# 螢幕顯示已經數到第幾個路口
ev3.screen.draw_text(0, 0, "COUNT " + str(count) + " ", Color.BLACK, Color.WHITE)
# 停車
left_motor.brake()
right_motor.brake()一步一步看懂程式:
- 路口數 count 從 0 開始
- onCross=0 代表「現在不在路口上」
- 一直循線,直到數滿 3 個路口
- 比例循線:turn = 線的位置 × 0.3
- 左輪=25+turn、右輪=25-turn
- 如果線寬大於等於 6(壓在路口上)
- 而且剛剛還不在路口上
- 剛壓到新路口:count 加 1
- 記住「正在路口上」,同一個路口不要再數
- 嗶一聲
- 否則:
- 離開路口了:onCross 改回 0,準備數下一個
- 而且剛剛還不在路口上
- 螢幕顯示已經數到第幾個路口
- 停車
跑起來應該看到: 每經過一個路口嗶一聲、螢幕數字加 1,到第 3 個路口停車。把 3 改成別的數字就能停在不同路口。
常見問題:
- 一個路口數成兩個? 路口的黑線有破損或反光時會發生。把車速 25 調慢,或把線寬門檻調大。
- 數字一直不變? 先看感應器有沒有亮燈、線有沒有插緊。EV3 主機要先開機再接感應器,或拔掉重插一次。
- 車子往反方向修正、越修越歪? 把程式裡的「+」和「-」對調(左右輪的修正互換),或確認左輪是不是接在 B、右輪接在 C。
範例 6:壓線位元圖:在螢幕上畫一把 LED 尺
僅 Pybricks v4/EV3 MicroPython v2.0/clev3r(EV3-G、Classroom 的積木讀不到這個模式)
這個範例會做什麼: 模式 3 送出「壓線位元圖」:8 個位元,每一路壓到線就是 1。這個範例把它畫成一把尺(# =壓到線、. =沒壓到),跟感應器上的 LED 一樣,一眼就看出線在哪幾路、有沒有分岔。
要準備什麼:
- 循行者 8 路(EV3 版,韌體 v4.0 以上)
- EV3 主機
- 白底黑線的場地
怎麼接: 循行者 8 路插 1 號孔,裝在車頭下方、離地約 1 公分,感應器正對地面。
下載程式(選你用的軟體):
⬇ Pybricks v4 | ⬇ EV3 MicroPython v2.0
(程式碼即範例,不需截圖。)
Pybricks v4 程式碼
# ============================================================
# 循行者 8 路循線感應器 EV3 新手範例 06:壓線位元圖:在螢幕上畫一把 LED 尺
# 軟體:Pybricks v4(用 Chrome 打開 https://code.pybricks.com ,EV3 版目前是 Beta)
# 接法:循行者 8 路插 1 號孔
# 這個範例會做什麼:模式 3 送出「壓線位元圖」:8 個位元,每一路壓到線就是 1。這個範例把它畫成一把尺(# =壓到線、. =沒壓到),跟感應器上的 LED 一樣,一眼就看出線在哪幾路、有沒有分岔。
# ============================================================
from pybricks.hubs import EV3Brick
from pybricks.iodevices import LUMPDevice
from pybricks.parameters import Port, Color
from pybricks.tools import wait
ev3 = EV3Brick()
sensor = LUMPDevice(Port.S1) # 循行者 8 路插 1 號孔
def read_bitmap():
# 壓線位元圖:0 ~ 255:bit0=第 1 路(最左)… bit7=第 8 路,1=那一路壓到線
return sensor.read(3)[0] & 0xFFFF
# ---------- 程式從這裡開始 ----------
# 清除螢幕
ev3.screen.clear()
# 一直重複
while True:
# 第 1 行畫尺:8 格,最左是第 1 路,# =壓到線、. =沒壓到
bits_value = read_bitmap()
bits_text = ""
for b in range(8):
if (bits_value // (2 ** b)) % 2 == 1: # 第 b 個位元是 1
bits_text = bits_text + "#"
else:
bits_text = bits_text + "."
ev3.screen.draw_text(0, 0, "LINE " + bits_text + " ", Color.BLACK, Color.WHITE)
# 第 2 行顯示位元圖的數字(第 1 路=1、第 2 路=2、第 3 路=4…相加)
ev3.screen.draw_text(0, 16, "BITS " + str(read_bitmap()) + " ", Color.BLACK, Color.WHITE)
# 等 0.1 秒
wait(100)EV3 MicroPython v2.0 程式碼
#!/usr/bin/env pybricks-micropython
# ============================================================
# 循行者 8 路循線感應器 EV3 新手範例 06:壓線位元圖:在螢幕上畫一把 LED 尺
# 軟體:樂高官方 EV3 MicroPython v2.0(microSD 開機卡+VS Code「LEGO MINDSTORMS EV3 MicroPython」擴充套件)
# 接法:循行者 8 路插 1 號孔
# 這個範例會做什麼:模式 3 送出「壓線位元圖」:8 個位元,每一路壓到線就是 1。這個範例把它畫成一把尺(# =壓到線、. =沒壓到),跟感應器上的 LED 一樣,一眼就看出線在哪幾路、有沒有分岔。
# ============================================================
from pybricks.hubs import EV3Brick
from pybricks.iodevices import Ev3devSensor
from pybricks.parameters import Port, Color
from pybricks.tools import wait
ev3 = EV3Brick()
sensor = Ev3devSensor(Port.S1) # 循行者 8 路插 1 號孔
def read_bitmap():
# 壓線位元圖:0 ~ 255:bit0=第 1 路(最左)… bit7=第 8 路,1=那一路壓到線
return sensor.read('IR-REM-A')[0] & 0xFFFF
# ---------- 程式從這裡開始 ----------
# 清除螢幕
ev3.screen.clear()
# 一直重複
while True:
# 第 1 行畫尺:8 格,最左是第 1 路,# =壓到線、. =沒壓到
bits_value = read_bitmap()
bits_text = ""
for b in range(8):
if (bits_value // (2 ** b)) % 2 == 1: # 第 b 個位元是 1
bits_text = bits_text + "#"
else:
bits_text = bits_text + "."
ev3.screen.draw_text(0, 0, "LINE " + bits_text + " ", Color.BLACK, Color.WHITE)
# 第 2 行顯示位元圖的數字(第 1 路=1、第 2 路=2、第 3 路=4…相加)
ev3.screen.draw_text(0, 16, "BITS " + str(read_bitmap()) + " ", Color.BLACK, Color.WHITE)
# 等 0.1 秒
wait(100)一步一步看懂程式:
- 清除螢幕
- 一直重複
- 第 1 行畫尺:8 格,最左是第 1 路,# =壓到線、. =沒壓到
- 第 2 行顯示位元圖的數字(第 1 路=1、第 2 路=2、第 3 路=4…相加)
- 等 0.1 秒
跑起來應該看到: 把感應器放在黑線上,尺上有 2~3 個 # 跟著線移動;壓到十字路口 # 變成一整排;線不見時全部是 .。數字=壓到線的那幾路的 1、2、4、8… 加起來,例如第 1、2 路壓線=3。
常見問題:
- 尺跟感應器的 LED 左右相反? 尺是站在車子後面看的(最左=第 1 路);感應器的 LED 從上面看可能相反。
- 數字一直是 0 或不會動? 感應器韌體要 v4.0(2026-10)以上才有這個模式,舊韌體請先更新。
- EV3-G/Classroom 怎麼沒有這個範例? 這個範例用的是新模式(2026-10 韌體 v4 起),EV3-G 和 Classroom 的紅外線積木讀不到,只有 Pybricks、EV3 MicroPython、clev3r 能用。
- 數字一直不變? 先看感應器有沒有亮燈、線有沒有插緊。EV3 主機要先開機再接感應器,或拔掉重插一次。
還有問題?歡迎到 聯絡我們 留言,附上你用的軟體和程式截圖,我們會幫你看。
其他問題
- EV3 顯示成紅外線感應器? 正常:感應器模擬成樂高原廠感應器,用原廠積木就能讀。
- 切換模式時卡一下? EV3 每次換模式要等約 1 秒。整趟任務盡量只用同一個模式的積木。
還有問題?到 聯絡我們 附上你用的軟體和程式截圖。
下載
- line8_pybricks_ev3.zip
- MBC_line8_EV3_Lib.py
- MBC_sensors.py
- line8_ev3_block_with_lib.py
- line8_ev3_python_with_lib.py
- 下載中心(全部產品的函式庫、韌體、型錄)
本頁依據
- 主機與軟體清單:
_build/guides.json - 值與命令:
_build/protocol/line8.json(單一真相來源) - 安裝與設定:
_build/guides/software/ev3-pybricks.zh.md、_build/guides/product/line8/ev3-pybricks.zh.md - 範例:
sensors/line8/ev3-examples.md