測距者 2 路 (TOF2) × EV3 × Pybricks
這一頁只講 Pybricks v4/EV3 MicroPython v2:在 MINDSTORMS EV3 上用它讀測距者 2 路 (TOF2)的安裝步驟、每個值怎麼讀、能用的命令與範例。要換產品、主機或軟體,用上方的切換列。
安裝與設定
你需要
- 感應器:測距者 2 路 (TOF2)(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 先開機,再插感應器。
- 接頭卡榫朝上,輕輕推進去。
左右怎麼分
左右以感應器朝前、從背後看為準(左=J5、右=J3)。 面對感應器看會剛好相反,所以用手測試時,請站到感應器後面、跟它同方向看。範例裡的「左邊比較近」「往左轉」都照這個方向。
EV3 上機結果與注意事項
原廠 EV3 韌體、Pybricks v4 實測通過(2026-11-02):EV3 把測距者 2 路認成 EV3 紅外線感應器(type 33),6 個模式的結構跟原廠紅外線一樣,開機前就插著、開機後再插都認得。Pybricks v4 和 EV3 MicroPython v2 都能用。
- 插頭要一次插到底。
- 用原廠類別
InfraredSensor時只用distance()**(左右平均,0~100,100=前面沒東西)。不要用buttons()**:模式 2 放的是左右距離,Pybricks 會把它當成遙控按鈕代碼,出現OSError(錯誤 5,EIO)。beacon()讀得到數字,但模式 1 放的也是左右距離,沒有信標的意思。左右距離請用 MBC 函式庫,或用LUMPDevice讀模式 5。 - EV3 切換紅外線模式約要 1.1 秒(原廠 LEGO 紅外線也一樣)。程式盡量停在同一個模式讀:左右 mm 用模式 5(要平均就自己算(左+右)÷ 2),平均距離用模式 0。
- 同一個孔不要同時用
InfraredSensor和LUMPDevice;兩個都要用時,先建立InfraredSensor再建立LUMPDevice,不然可能出現 ENODEV。
第一次測試
- 打開本頁範例 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 寫法相同。
左距離 cm leftCm
| 範圍 | 意思 |
|---|---|
0~120 cm(EV3 模式 1、模式 2、模式 4 讀到的是換算值:cm×100/120(0~100)) |
左邊那顆的距離 0~120 cm(站在車後往前看,左 = 第 0 顆),120 = 前面沒東西/那顆失效 |
from pybricks.iodevices import LUMPDevice
from pybricks.parameters import Port
sensor = LUMPDevice(Port.S1) # 感應器插 1 號孔
leftCm = sensor.read(1)[0] # 左距離 cm:cm×100/120(0~100)
leftCm = sensor.read(2)[0] # 左距離 cm:cm×100/120(0~100)
leftCm = sensor.read(4)[0] # 左距離 cm:cm×100/120(0~100)模式 1 · int8 · #67 新:IR-SEEK 8×int8 = [左, 右, 左, 右, 左, 右, 左, 右](index 0/2/4/6 = 左;原本 index 2~7 = 0);模式 2 · int8 · IR-REMOTE [左, 右, 0, 0](INO:137-139);模式 4 · int8 · IR-S-ALT 同模式 2(已鎖住的模式,韌體與主機端都不再改)
右距離 cm rightCm
| 範圍 | 意思 |
|---|---|
0~120 cm(EV3 模式 1、模式 2、模式 4 讀到的是換算值:cm×100/120(0~100)) |
右邊那顆的距離 0~120 cm(右 = 第 1 顆),120 = 前面沒東西/那顆失效 |
from pybricks.iodevices import LUMPDevice
from pybricks.parameters import Port
sensor = LUMPDevice(Port.S1) # 感應器插 1 號孔
rightCm = sensor.read(1)[1] # 右距離 cm:cm×100/120(0~100)
rightCm = sensor.read(2)[1] # 右距離 cm:cm×100/120(0~100)
rightCm = sensor.read(4)[1] # 右距離 cm:cm×100/120(0~100)模式 1 · int8 · #67 新:index 1/3/5/7 = 右;模式 2 · int8;模式 4 · int8(已鎖住的模式,韌體與主機端都不再改)
左距離 mm leftMm
| 範圍 | 意思 |
|---|---|
0~1200 mm |
左邊那顆的距離 0~1200 mm,1200 = 前面沒東西/那顆失效 |
from pybricks.iodevices import LUMPDevice
from pybricks.parameters import Port
sensor = LUMPDevice(Port.S1) # 感應器插 1 號孔
leftMm = sensor.read(5)[0] # 左距離 mm:0~1200 mm模式 5 · int16 · #67 新:IR-CAL 2×int16 = [左 mm, 右 mm](原本 word0 = 左'+256×右')
右距離 mm rightMm
| 範圍 | 意思 |
|---|---|
0~1200 mm |
右邊那顆的距離 0~1200 mm,1200 = 前面沒東西/那顆失效 |
from pybricks.iodevices import LUMPDevice
from pybricks.parameters import Port
sensor = LUMPDevice(Port.S1) # 感應器插 1 號孔
rightMm = sensor.read(5)[1] # 右距離 mm:0~1200 mm模式 5 · int16 · #67 新
左右平均 mm avgMm
| 範圍 | 意思 |
|---|---|
0~1200 mm(EV3 模式 0 讀到的是換算值:cm 平均 ×100/120(0~100)) |
(左 mm + 右 mm) / 2,0~1200;跟 EV3 模式 3、SPIKE 模式 6 第 3 個值一致(共識 #8 補上) |
from pybricks.iodevices import LUMPDevice
from pybricks.parameters import Port
sensor = LUMPDevice(Port.S1) # 感應器插 1 號孔
avgMm = sensor.read(0)[0] # 左右平均 mm:cm 平均 ×100/120(0~100)
avgMm = sensor.read(3)[0] # 左右平均 mm:0~1200 mm模式 0 · int8 · IR-PROX = (左'+右')>>1,cm 縮放後平均(鎖住,INO:131-133);模式 3 · int16 · #67 新:IR-REM-A 1×int16 = 左右平均 mm(原本 = 左 0~100)(已鎖住的模式,韌體與主機端都不再改)
這個軟體讀不到:較近距離 cm、初始化位元圖、故障位元圖。要用這些值請改用 Arduino/mBlock/micro:bit。
範例
範例 1:量量看前面有多遠
這個範例會做什麼: 用手在感應器前面前後移動,EV3 螢幕會顯示距離。這個範例同時顯示「感應器原始數字」和「換算成公分」。
要準備什麼:
- TOF2 雙眼雷射(EV3 版)
- 一個盒子或牆壁當障礙物
- EV3 主機
怎麼接: TOF2 雙眼雷射插 1 號孔,雷射朝前。
下載程式(選你用的軟體):
⬇ Pybricks v4 | ⬇ EV3 MicroPython v2.0
Pybricks v4 程式碼
# ============================================================
# TOF2 雙眼雷射測距感應器 EV3 新手範例 01:量量看前面有多遠
# 軟體:Pybricks v4(用 Chrome 打開 https://code.pybricks.com ,EV3 版目前是 Beta)
# 接法:TOF2 雙眼雷射插 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) # TOF2 雙眼雷射插 1 號孔
def read_dist():
# 左右兩眼的平均距離:0 ~ 100(1 格=1.2 公分,100=前面沒東西)
return sensor.read(0)[0]
# ---------- 程式從這裡開始 ----------
# 先清除螢幕
ev3.screen.clear()
# 一直重複
while True:
# 第 1 行顯示感應器讀到的原始數字(0~100)
ev3.screen.draw_text(0, 0, "RAW " + str(read_dist()) + " ", Color.BLACK, Color.WHITE)
# 第 2 行顯示換算後的公分:數字 × 1.2
ev3.screen.draw_text(0, 16, "CM " + str(read_dist() * 1.2) + " ", Color.BLACK, Color.WHITE)
# 等 0.1 秒
wait(100)EV3 MicroPython v2.0 程式碼
#!/usr/bin/env pybricks-micropython
# ============================================================
# TOF2 雙眼雷射測距感應器 EV3 新手範例 01:量量看前面有多遠
# 軟體:樂高官方 EV3 MicroPython v2.0(microSD 開機卡+VS Code「LEGO MINDSTORMS EV3 MicroPython」擴充套件)
# 接法:TOF2 雙眼雷射插 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) # TOF2 雙眼雷射插 1 號孔
def read_dist():
# 左右兩眼的平均距離:0 ~ 100(1 格=1.2 公分,100=前面沒東西)
return sensor.read('IR-PROX')[0]
# ---------- 程式從這裡開始 ----------
# 先清除螢幕
ev3.screen.clear()
# 一直重複
while True:
# 第 1 行顯示感應器讀到的原始數字(0~100)
ev3.screen.draw_text(0, 0, "RAW " + str(read_dist()) + " ", Color.BLACK, Color.WHITE)
# 第 2 行顯示換算後的公分:數字 × 1.2
ev3.screen.draw_text(0, 16, "CM " + str(read_dist() * 1.2) + " ", Color.BLACK, Color.WHITE)
# 等 0.1 秒
wait(100)一步一步看懂程式:
- 先清除螢幕
- 一直重複
- 第 1 行顯示感應器讀到的原始數字(0~100)
- 第 2 行顯示換算後的公分:數字 × 1.2
- 等 0.1 秒
跑起來應該看到: 手越靠近,數字越小;拿開手(前面 120 公分內沒東西)時 RAW 會是 100。
常見問題:
- 數字跟尺量的不一樣? EV3 上 1 格=1.2 公分(例如讀到 25=30 公分),100 代表前面 120 公分內沒有東西。
- 數字一直是 0 或不變? EV3 主機先開機再接感應器,或拔掉重插一次;確認雷射前面沒有貼保護膜。
範例 2:前方 30 公分停車
這個範例會做什麼: 車子往前開,看到前面 30 公分(感應器數字 25)以內有東西就停下來。
要準備什麼:
- EV3 主機+教育版基本車(左輪接 B、右輪接 C)
- TOF2 雙眼雷射(EV3 版)
- 一個盒子或牆壁當障礙物
怎麼接: TOF2 雙眼雷射插 1 號孔,裝在車頭、雷射朝正前方,離地約 5 公分。
下載程式(選你用的軟體):
⬇ Pybricks v4 | ⬇ EV3 MicroPython v2.0
Pybricks v4 程式碼
# ============================================================
# TOF2 雙眼雷射測距感應器 EV3 新手範例 02:前方 30 公分停車
# 軟體:Pybricks v4(用 Chrome 打開 https://code.pybricks.com ,EV3 版目前是 Beta)
# 接法:TOF2 雙眼雷射插 1 號孔;左輪馬達接 B、右輪馬達接 C
# 這個範例會做什麼:車子往前開,看到前面 30 公分(感應器數字 25)以內有東西就停下來。
# ============================================================
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) # TOF2 雙眼雷射插 1 號孔
left_motor = Motor(Port.B) # 左輪
right_motor = Motor(Port.C) # 右輪
def read_dist():
# 左右兩眼的平均距離:0 ~ 100(1 格=1.2 公分,100=前面沒東西)
return sensor.read(0)[0]
# ---------- 程式從這裡開始 ----------
# 兩輪用 30 的力量往前開
left_motor.dc(30)
right_motor.dc(30)
# 等到距離小於 25(約 30 公分)
while not (read_dist() < 25):
wait(10)
# 停車
left_motor.brake()
right_motor.brake()
# 嗶一聲
ev3.speaker.beep()EV3 MicroPython v2.0 程式碼
#!/usr/bin/env pybricks-micropython
# ============================================================
# TOF2 雙眼雷射測距感應器 EV3 新手範例 02:前方 30 公分停車
# 軟體:樂高官方 EV3 MicroPython v2.0(microSD 開機卡+VS Code「LEGO MINDSTORMS EV3 MicroPython」擴充套件)
# 接法:TOF2 雙眼雷射插 1 號孔;左輪馬達接 B、右輪馬達接 C
# 這個範例會做什麼:車子往前開,看到前面 30 公分(感應器數字 25)以內有東西就停下來。
# ============================================================
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) # TOF2 雙眼雷射插 1 號孔
left_motor = Motor(Port.B) # 左輪
right_motor = Motor(Port.C) # 右輪
def read_dist():
# 左右兩眼的平均距離:0 ~ 100(1 格=1.2 公分,100=前面沒東西)
return sensor.read('IR-PROX')[0]
# ---------- 程式從這裡開始 ----------
# 兩輪用 30 的力量往前開
left_motor.dc(30)
right_motor.dc(30)
# 等到距離小於 25(約 30 公分)
while not (read_dist() < 25):
wait(10)
# 停車
left_motor.brake()
right_motor.brake()
# 嗶一聲
ev3.speaker.beep()一步一步看懂程式:
- 兩輪用 30 的力量往前開
- 等到距離小於 25(約 30 公分)
- 停車
- 嗶一聲
跑起來應該看到: 車子往前開,在障礙物前約 30 公分停下來並嗶一聲。
常見問題:
- 停得太晚、撞上去? 車速越快煞車距離越長,把 30 改小,或把 25 改大。
- 數字跟尺量的不一樣? EV3 上 1 格=1.2 公分(例如讀到 25=30 公分),100 代表前面 120 公分內沒有東西。
範例 3:避障車:看到東西就後退轉彎
這個範例會做什麼: 車子一直往前開,前面太近就後退一點、原地轉一下,再繼續往前。放在有箱子的地上,它會自己繞開。
要準備什麼:
- EV3 主機+教育版基本車(左輪接 B、右輪接 C)
- TOF2 雙眼雷射(EV3 版)
- 一個盒子或牆壁當障礙物
怎麼接: TOF2 雙眼雷射插 1 號孔,裝在車頭、雷射朝正前方,離地約 5 公分。
下載程式(選你用的軟體):
⬇ Pybricks v4 | ⬇ EV3 MicroPython v2.0
Pybricks v4 程式碼
# ============================================================
# TOF2 雙眼雷射測距感應器 EV3 新手範例 03:避障車:看到東西就後退轉彎
# 軟體:Pybricks v4(用 Chrome 打開 https://code.pybricks.com ,EV3 版目前是 Beta)
# 接法:TOF2 雙眼雷射插 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) # TOF2 雙眼雷射插 1 號孔
left_motor = Motor(Port.B) # 左輪
right_motor = Motor(Port.C) # 右輪
def read_dist():
# 左右兩眼的平均距離:0 ~ 100(1 格=1.2 公分,100=前面沒東西)
return sensor.read(0)[0]
# ---------- 程式從這裡開始 ----------
# 一直重複
while True:
# 如果前面距離小於 25(約 30 公分)
if read_dist() < 25:
# 先後退
left_motor.dc(-30)
right_motor.dc(-30)
# 退 0.5 秒
wait(500)
# 左輪往前、右輪往後:原地向右轉
left_motor.dc(30)
right_motor.dc(-30)
# 轉 0.5 秒
wait(500)
else:
# 前面沒東西:往前開
left_motor.dc(30)
right_motor.dc(30)EV3 MicroPython v2.0 程式碼
#!/usr/bin/env pybricks-micropython
# ============================================================
# TOF2 雙眼雷射測距感應器 EV3 新手範例 03:避障車:看到東西就後退轉彎
# 軟體:樂高官方 EV3 MicroPython v2.0(microSD 開機卡+VS Code「LEGO MINDSTORMS EV3 MicroPython」擴充套件)
# 接法:TOF2 雙眼雷射插 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) # TOF2 雙眼雷射插 1 號孔
left_motor = Motor(Port.B) # 左輪
right_motor = Motor(Port.C) # 右輪
def read_dist():
# 左右兩眼的平均距離:0 ~ 100(1 格=1.2 公分,100=前面沒東西)
return sensor.read('IR-PROX')[0]
# ---------- 程式從這裡開始 ----------
# 一直重複
while True:
# 如果前面距離小於 25(約 30 公分)
if read_dist() < 25:
# 先後退
left_motor.dc(-30)
right_motor.dc(-30)
# 退 0.5 秒
wait(500)
# 左輪往前、右輪往後:原地向右轉
left_motor.dc(30)
right_motor.dc(-30)
# 轉 0.5 秒
wait(500)
else:
# 前面沒東西:往前開
left_motor.dc(30)
right_motor.dc(30)一步一步看懂程式:
- 一直重複
- 如果前面距離小於 25(約 30 公分)
- 先後退
- 退 0.5 秒
- 左輪往前、右輪往後:原地向右轉
- 轉 0.5 秒
- 否則:
- 前面沒東西:往前開
- 如果前面距離小於 25(約 30 公分)
跑起來應該看到: 車子遇到障礙物會後退、右轉,然後繼續前進。
常見問題:
- 轉的角度不夠,一直撞同一個箱子? 把轉彎的 0.5 秒改長一點(例如 0.8)。
- 數字跟尺量的不一樣? EV3 上 1 格=1.2 公分(例如讀到 25=30 公分),100 代表前面 120 公分內沒有東西。
範例 4:跟車:保持固定距離
這個範例會做什麼: 拿一本書放在車子前面,往前移車子就跟上、往後推車子就退後,一直保持約 30 公分。用的是「差多少就補多少」的比例控制。
要準備什麼:
- EV3 主機+教育版基本車(左輪接 B、右輪接 C)
- TOF2 雙眼雷射(EV3 版)
- 一本書或一塊板子
怎麼接: TOF2 雙眼雷射插 1 號孔,裝在車頭、雷射朝正前方,離地約 5 公分。
下載程式(選你用的軟體):
⬇ Pybricks v4 | ⬇ EV3 MicroPython v2.0
Pybricks v4 程式碼
# ============================================================
# TOF2 雙眼雷射測距感應器 EV3 新手範例 04:跟車:保持固定距離
# 軟體:Pybricks v4(用 Chrome 打開 https://code.pybricks.com ,EV3 版目前是 Beta)
# 接法:TOF2 雙眼雷射插 1 號孔;左輪馬達接 B、右輪馬達接 C
# 這個範例會做什麼:拿一本書放在車子前面,往前移車子就跟上、往後推車子就退後,一直保持約 30 公分。用的是「差多少就補多少」的比例控制。
# ============================================================
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) # TOF2 雙眼雷射插 1 號孔
left_motor = Motor(Port.B) # 左輪
right_motor = Motor(Port.C) # 右輪
def read_dist():
# 左右兩眼的平均距離:0 ~ 100(1 格=1.2 公分,100=前面沒東西)
return sensor.read(0)[0]
# ---------- 程式從這裡開始 ----------
# 一直重複
while True:
# 馬達力量 power =(距離 − 25)× 2:太遠是正數往前、太近是負數往後
power = (read_dist() - 25) * 2
# 如果 power 大於 50
if power > 50:
# 最快只用 50,比較安全
power = 50
# 兩輪用 power 一起前進或後退
left_motor.dc(power)
right_motor.dc(power)EV3 MicroPython v2.0 程式碼
#!/usr/bin/env pybricks-micropython
# ============================================================
# TOF2 雙眼雷射測距感應器 EV3 新手範例 04:跟車:保持固定距離
# 軟體:樂高官方 EV3 MicroPython v2.0(microSD 開機卡+VS Code「LEGO MINDSTORMS EV3 MicroPython」擴充套件)
# 接法:TOF2 雙眼雷射插 1 號孔;左輪馬達接 B、右輪馬達接 C
# 這個範例會做什麼:拿一本書放在車子前面,往前移車子就跟上、往後推車子就退後,一直保持約 30 公分。用的是「差多少就補多少」的比例控制。
# ============================================================
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) # TOF2 雙眼雷射插 1 號孔
left_motor = Motor(Port.B) # 左輪
right_motor = Motor(Port.C) # 右輪
def read_dist():
# 左右兩眼的平均距離:0 ~ 100(1 格=1.2 公分,100=前面沒東西)
return sensor.read('IR-PROX')[0]
# ---------- 程式從這裡開始 ----------
# 一直重複
while True:
# 馬達力量 power =(距離 − 25)× 2:太遠是正數往前、太近是負數往後
power = (read_dist() - 25) * 2
# 如果 power 大於 50
if power > 50:
# 最快只用 50,比較安全
power = 50
# 兩輪用 power 一起前進或後退
left_motor.dc(power)
right_motor.dc(power)一步一步看懂程式:
- 一直重複
- 馬達力量 power =(距離 − 25)× 2:太遠是正數往前、太近是負數往後
- 如果 power 大於 50
- 最快只用 50,比較安全
- 兩輪用 power 一起前進或後退
跑起來應該看到: 書往前,車子跟上;書往後,車子後退;書不動時車子在約 30 公分處停住。前面完全沒東西時車子會用 50 的力量往前開。
常見問題:
- 車子在目標前後來回抖? 把 × 2 改小(例如 × 1)。
- 數字跟尺量的不一樣? EV3 上 1 格=1.2 公分(例如讀到 25=30 公分),100 代表前面 120 公分內沒有東西。
範例 5:左眼右眼:閃開兩邊的障礙物
這個範例會做什麼: 雙眼雷射可以分別讀左眼和右眼。左邊太近就往右閃,右邊太近就往左閃,都沒東西就直走。
要準備什麼:
- EV3 主機+教育版基本車(左輪接 B、右輪接 C)
- TOF2 雙眼雷射(EV3 版)
- 一個盒子或牆壁當障礙物
怎麼接: TOF2 雙眼雷射插 1 號孔,裝在車頭、雷射朝正前方,離地約 5 公分。左右以感應器朝前、從背後看為準(左=J5、右=J3)。
下載程式(選你用的軟體):
⬇ Pybricks v4 | ⬇ EV3 MicroPython v2.0
Pybricks v4 程式碼
# ============================================================
# TOF2 雙眼雷射測距感應器 EV3 新手範例 05:左眼右眼:閃開兩邊的障礙物
# 軟體:Pybricks v4(用 Chrome 打開 https://code.pybricks.com ,EV3 版目前是 Beta)
# 接法:TOF2 雙眼雷射插 1 號孔;左輪馬達接 B、右輪馬達接 C
# 這個範例會做什麼:雙眼雷射可以分別讀左眼和右眼。左邊太近就往右閃,右邊太近就往左閃,都沒東西就直走。
# ============================================================
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) # TOF2 雙眼雷射插 1 號孔
left_motor = Motor(Port.B) # 左輪
right_motor = Motor(Port.C) # 右輪
def read_left():
# 左眼距離:0 ~ 100(1 格=1.2 公分)
return sensor.read(1)[0]
def read_right():
# 右眼距離:0 ~ 100(1 格=1.2 公分)
return sensor.read(1)[1]
# ---------- 程式從這裡開始 ----------
# 一直重複
while True:
# 螢幕第 1 行顯示左眼距離
ev3.screen.draw_text(0, 0, "LEFT " + str(read_left()) + " ", Color.BLACK, Color.WHITE)
# 螢幕第 2 行顯示右眼距離
ev3.screen.draw_text(0, 16, "RIGHT " + str(read_right()) + " ", Color.BLACK, Color.WHITE)
# 如果左眼距離小於 25
if read_left() < 25:
# 左邊太近:左輪轉、右輪停,車子往右閃
left_motor.dc(30)
right_motor.dc(0)
# 否則,如果右眼距離小於 25
elif read_right() < 25:
# 右邊太近:往左閃
left_motor.dc(0)
right_motor.dc(30)
else:
# 兩邊都沒東西:直走
left_motor.dc(30)
right_motor.dc(30)EV3 MicroPython v2.0 程式碼
#!/usr/bin/env pybricks-micropython
# ============================================================
# TOF2 雙眼雷射測距感應器 EV3 新手範例 05:左眼右眼:閃開兩邊的障礙物
# 軟體:樂高官方 EV3 MicroPython v2.0(microSD 開機卡+VS Code「LEGO MINDSTORMS EV3 MicroPython」擴充套件)
# 接法:TOF2 雙眼雷射插 1 號孔;左輪馬達接 B、右輪馬達接 C
# 這個範例會做什麼:雙眼雷射可以分別讀左眼和右眼。左邊太近就往右閃,右邊太近就往左閃,都沒東西就直走。
# ============================================================
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) # TOF2 雙眼雷射插 1 號孔
left_motor = Motor(Port.B) # 左輪
right_motor = Motor(Port.C) # 右輪
def read_left():
# 左眼距離:0 ~ 100(1 格=1.2 公分)
return sensor.read('IR-SEEK')[0]
def read_right():
# 右眼距離:0 ~ 100(1 格=1.2 公分)
return sensor.read('IR-SEEK')[1]
# ---------- 程式從這裡開始 ----------
# 一直重複
while True:
# 螢幕第 1 行顯示左眼距離
ev3.screen.draw_text(0, 0, "LEFT " + str(read_left()) + " ", Color.BLACK, Color.WHITE)
# 螢幕第 2 行顯示右眼距離
ev3.screen.draw_text(0, 16, "RIGHT " + str(read_right()) + " ", Color.BLACK, Color.WHITE)
# 如果左眼距離小於 25
if read_left() < 25:
# 左邊太近:左輪轉、右輪停,車子往右閃
left_motor.dc(30)
right_motor.dc(0)
# 否則,如果右眼距離小於 25
elif read_right() < 25:
# 右邊太近:往左閃
left_motor.dc(0)
right_motor.dc(30)
else:
# 兩邊都沒東西:直走
left_motor.dc(30)
right_motor.dc(30)一步一步看懂程式:
- 一直重複
- 螢幕第 1 行顯示左眼距離
- 螢幕第 2 行顯示右眼距離
- 如果左眼距離小於 25
- 左邊太近:左輪轉、右輪停,車子往右閃
- 否則:
- 否則,如果右眼距離小於 25
- 右邊太近:往左閃
- 否則:
- 兩邊都沒東西:直走
- 否則,如果右眼距離小於 25
跑起來應該看到: 用手擋左眼,車子往右轉;擋右眼,往左轉;都不擋就直走。
常見問題:
- 左右顛倒? 左右是站在車子後面、跟感應器同方向往前看(左=J5、右=J3);面對感應器看會剛好相反。確認過還是顛倒,可能是感應器裝反了(雷射頭朝後或上下顛倒),或把程式裡兩個 tank 的數字對調。
- 數字跟尺量的不一樣? EV3 上 1 格=1.2 公分(例如讀到 25=30 公分),100 代表前面 120 公分內沒有東西。
範例 6:用公釐精準停車:20 公分前停
僅 Pybricks v4/EV3 MicroPython v2.0/clev3r(EV3-G、Classroom 的積木讀不到這個模式)
這個範例會做什麼: 模式 0 的距離 1 格=1.2 公分,比賽要停在「剛好 20 公分」不夠準。模式 5 直接給左右兩眼的公釐(1 格=1 公釐),這個範例把兩眼平均(跟模式 3 一樣),一邊往前開一邊顯示公釐,小於 200 公釐就停。用模式 5 是因為 EV3 原廠韌體切到模式 3 偶爾切不過去,模式 5 每次都切得過去。
要準備什麼:
- EV3 主機+教育版基本車(左輪接 B、右輪接 C)
- TOF2 雙眼雷射(EV3 版)
- 一個盒子或牆壁當障礙物
怎麼接: TOF2 雙眼雷射插 1 號孔,裝在車頭、雷射朝正前方,離地約 5 公分。
下載程式(選你用的軟體):
⬇ Pybricks v4 | ⬇ EV3 MicroPython v2.0
(程式碼即範例,不需截圖。)
Pybricks v4 程式碼
# ============================================================
# TOF2 雙眼雷射測距感應器 EV3 新手範例 06:用公釐精準停車:20 公分前停
# 軟體:Pybricks v4(用 Chrome 打開 https://code.pybricks.com ,EV3 版目前是 Beta)
# 接法:TOF2 雙眼雷射插 1 號孔;左輪馬達接 B、右輪馬達接 C
# 這個範例會做什麼:模式 0 的距離 1 格=1.2 公分,比賽要停在「剛好 20 公分」不夠準。模式 5 直接給左右兩眼的公釐(1 格=1 公釐),這個範例把兩眼平均(跟模式 3 一樣),一邊往前開一邊顯示公釐,小於 200 公釐就停。用模式 5 是因為 EV3 原廠韌體切到模式 3 偶爾切不過去,模式 5 每次都切得過去。
# ============================================================
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) # TOF2 雙眼雷射插 1 號孔
left_motor = Motor(Port.B) # 左輪
right_motor = Motor(Port.C) # 右輪
def read_leftMm():
# 左眼距離(公釐):0 ~ 1200 mm
return sensor.read(5)[0]
def read_rightMm():
# 右眼距離(公釐):0 ~ 1200 mm
return sensor.read(5)[1]
# ---------- 程式從這裡開始 ----------
# 清除螢幕
ev3.screen.clear()
# 兩輪用 30 的力量往前開
left_motor.dc(30)
right_motor.dc(30)
# mm = 左右兩眼公釐的平均(跟模式 3 一樣)
mm = (read_leftMm() + read_rightMm()) / 2
# 一直往前,直到距離小於 200 公釐(20 公分)
while not (mm < 200):
# 第 1 行顯示目前距離(公釐)
ev3.screen.draw_text(0, 0, "MM " + str(mm) + " ", Color.BLACK, Color.WHITE)
# 再讀一次左右兩眼,重新算平均
mm = (read_leftMm() + read_rightMm()) / 2
# 停車
left_motor.brake()
right_motor.brake()
# 嗶一聲
ev3.speaker.beep()
# 停下來後再讀一次
mm = (read_leftMm() + read_rightMm()) / 2
# 停下來後再顯示一次距離,看停得準不準
ev3.screen.draw_text(0, 0, "MM " + str(mm) + " ", Color.BLACK, Color.WHITE)EV3 MicroPython v2.0 程式碼
#!/usr/bin/env pybricks-micropython
# ============================================================
# TOF2 雙眼雷射測距感應器 EV3 新手範例 06:用公釐精準停車:20 公分前停
# 軟體:樂高官方 EV3 MicroPython v2.0(microSD 開機卡+VS Code「LEGO MINDSTORMS EV3 MicroPython」擴充套件)
# 接法:TOF2 雙眼雷射插 1 號孔;左輪馬達接 B、右輪馬達接 C
# 這個範例會做什麼:模式 0 的距離 1 格=1.2 公分,比賽要停在「剛好 20 公分」不夠準。模式 5 直接給左右兩眼的公釐(1 格=1 公釐),這個範例把兩眼平均(跟模式 3 一樣),一邊往前開一邊顯示公釐,小於 200 公釐就停。用模式 5 是因為 EV3 原廠韌體切到模式 3 偶爾切不過去,模式 5 每次都切得過去。
# ============================================================
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) # TOF2 雙眼雷射插 1 號孔
left_motor = Motor(Port.B) # 左輪
right_motor = Motor(Port.C) # 右輪
def read_leftMm():
# 左眼距離(公釐):0 ~ 1200 mm
return sensor.read('IR-CAL')[0]
def read_rightMm():
# 右眼距離(公釐):0 ~ 1200 mm
return sensor.read('IR-CAL')[1]
# ---------- 程式從這裡開始 ----------
# 清除螢幕
ev3.screen.clear()
# 兩輪用 30 的力量往前開
left_motor.dc(30)
right_motor.dc(30)
# mm = 左右兩眼公釐的平均(跟模式 3 一樣)
mm = (read_leftMm() + read_rightMm()) / 2
# 一直往前,直到距離小於 200 公釐(20 公分)
while not (mm < 200):
# 第 1 行顯示目前距離(公釐)
ev3.screen.draw_text(0, 0, "MM " + str(mm) + " ", Color.BLACK, Color.WHITE)
# 再讀一次左右兩眼,重新算平均
mm = (read_leftMm() + read_rightMm()) / 2
# 停車
left_motor.brake()
right_motor.brake()
# 嗶一聲
ev3.speaker.beep()
# 停下來後再讀一次
mm = (read_leftMm() + read_rightMm()) / 2
# 停下來後再顯示一次距離,看停得準不準
ev3.screen.draw_text(0, 0, "MM " + str(mm) + " ", Color.BLACK, Color.WHITE)一步一步看懂程式:
- 清除螢幕
- 兩輪用 30 的力量往前開
- mm = 左右兩眼公釐的平均(跟模式 3 一樣)
- 一直往前,直到距離小於 200 公釐(20 公分)
- 第 1 行顯示目前距離(公釐)
- 再讀一次左右兩眼,重新算平均
- 停車
- 嗶一聲
- 停下來後再讀一次
- 停下來後再顯示一次距離,看停得準不準
跑起來應該看到: 車子往前開,螢幕的公釐數一直變小,在障礙物前約 20 公分停下來並嗶一聲;停下來後螢幕顯示的數字應該在 200 附近。
常見問題:
- 停下來的數字比 200 小很多? 車速越快煞車距離越長,把 30 改小,或把 200 改大(例如 230)。
- 數字一直是 0 或不會動? 感應器韌體要 v4.0(2026-10)以上才有這個模式,舊韌體請先更新。
- EV3-G/Classroom 怎麼沒有這個範例? 這個範例用的是新模式(2026-10 韌體 v4 起),EV3-G 和 Classroom 的紅外線積木讀不到,只有 Pybricks、EV3 MicroPython、clev3r 能用。
還有問題?歡迎到 聯絡我們 留言,附上你用的軟體和程式截圖,我們會幫你看。
其他問題
- EV3 顯示成紅外線感應器? 正常:感應器模擬成樂高原廠感應器,用原廠積木就能讀。
- 切換模式時卡一下? EV3 每次換模式要等約 1 秒。整趟任務盡量只用同一個模式的積木。
還有問題?到 聯絡我們 附上你用的軟體和程式截圖。
下載
本頁依據
- 主機與軟體清單:
_build/guides.json - 值與命令:
_build/protocol/tof2.json(單一真相來源) - 安裝與設定:
_build/guides/software/ev3-pybricks.zh.md、_build/guides/product/tof2/ev3-pybricks.zh.md - 範例:
sensors/tof2/ev3-examples.md