EV3 讀值教學
警告
EV3 已上機驗證(2026-11-03,出貨版 v1.0-261101):原廠 EV3 韌體(EV3-G/EV3 Classroom/clev3r)13 個相機模式逐格讀過、EV3-G 紅外線積木讀得到;Pybricks v4 範例 1~4 實機通過;ev3dev/EV3 MicroPython v2 支援(模式表跟原廠紅外線感應器逐項相同)。
EV3 版不能從主機下命令給相機:格式跟原廠紅外線感應器完全相同,EV3(原廠韌體、Pybricks、ev3dev)送不了 MBC 命令;相機模式在相機的 MENU 切。要用程式下命令請用 SPIKE/Arduino 等。
神攝手(EV3 版)在 EV3 上會顯示成樂高原廠紅外線感應器,EV3-G、EV3 Classroom、EV3 MicroPython(Pybricks)都用紅外線感應器的積木或模式讀,不用裝擴充。每一格的完整對照在 讀值參考:EV3,整支範例在 EV3 範例。
接線
- 相機用 EV3 線插主機 1~4 號孔,由主機供電。
- 相機螢幕左上角顯示主機名稱:綠色=連線中、紅色=斷線。
- 在相機的 MODE 選單選相機模式和子選項(見 產品首頁 的「相機上的操作」)。
三個紅外線模式
| 紅外線模式 | 幾個值 | 內容 |
|---|---|---|
| 模式 0 近距(Proximity) | 1 | 相機模式編號(相機模式 × 10 + 子選項,例 13=顏色追蹤 ③ 標準):程式可以先讀它,確認相機設對了 |
| 模式 1 信標(Beacon) | 8 | 通道 1~4 的「方向」「距離」共 8 個值,放主要資料 |
| 模式 2 遙控(Remote) | 4 | 通道 1~4 各 1 個值;只有子選項 ①、照順序給色號、循線、物體偵測 ① 用得到 |
- 每個值是 −127~100 的整數。換模式約 1.1 秒(原廠紅外線感應器也一樣):同一個迴圈裡不要一直在模式 1、2 之間切換,先想好要用哪一個。
- 模式 5 是裝置 ID(不用管)。
怎麼解讀
- 位置用 8×6 格:讀到的數=X×10+Y,X=讀到的數 ÷ 10(取整數,1~8)、Y=除以 10 的餘數(1~6)。EV3 的 Y 是下=小(畫面最下面一列是 1)。0=沒看到。
- 面積:0~100 %,0=沒看到。
- 色相(座標取色、照順序給色號):正數 0~100=色相碼 × 100 ÷ 240(紅 0、黃約 17、綠約 33、青 50、藍約 67、紫約 83);負數=黑白灰:−1~−8 白→灰、−9~−15 黑。
- 循線:偏移、角度、左右緣照原值送,可以是負數(負=線在左)。
以顏色追蹤 ③ 標準(4 色 XY+面積)為例,全部在模式 1:
| 要的值 | 積木(模式 1 信標) |
|---|---|
| 色 1 位置(X×10+Y) | 通道 1 方向 |
| 色 1 面積 % | 通道 1 距離 |
| 色 2 位置、面積 | 通道 2 方向、距離 |
| 色 3、色 4 | 通道 3、通道 4 |
EV3-G/EV3 Classroom
- EV3-G:紅外線感應器積木 →「測量」→「近接」讀模式 0;「信標」選頻道 1~4,輸出的「方向」「近接」就是上表的方向、距離;「遙控」選頻道讀模式 2。
- EV3 Classroom:用 Infrared Sensor 的 proximity、beacon heading/beacon distance(選 channel)、remote 積木,對應同上。
- 讀到的數照上面「怎麼解讀」換算:EV3-G 用「數學」積木的除法和「取餘數」(Modulo)。
EV3 MicroPython(Pybricks)
用 LUMPDevice 讀原始模式(EV3 MicroPython v2 寫法相同)。相機設成顏色追蹤 ③ 標準:
#!/usr/bin/env pybricks-micropython
from pybricks.iodevices import LUMPDevice
from pybricks.parameters import Port
from pybricks.tools import wait
cam = LUMPDevice(Port.S1) # 相機插 1 號孔
print("相機模式", cam.read(0)[0]) # 模式 0:例 13 = 顏色追蹤 ③ 標準
while True:
v = cam.read(1) # 模式 1:信標 8 個值
pos, area = v[0], v[1] # 色 1:X×10+Y、面積 %
if pos:
print("色 1:X", pos // 10, "Y", pos % 10, "面積", area, "%")
else:
print("色 1:沒看到")
wait(100)子選項 ① 的第 9 色起在模式 2:cam.read(2)(4 個值)。
相機模式 5 物體偵測
相機把畫面裡的物體由大到小排好(物體 1 最大),每個物體給物體代碼=色號 × 10 + 形狀(例 13=目標 1 的三角形,0=沒有)。形狀:0 其他、1 圓、2 橢圓、3 三角、4 正方、5 長方、6 五邊、7 六邊、8 星、9 梯形。X、Y 是物體的質心;只看目標色 1~8。模式編號 51=① 物體清單、52=② 物體詳細。代碼再拆:色號=代碼 ÷ 10(取整數)、形狀=代碼除以 10 的餘數。
| 紅外線模式・通道 | 51 物體清單(5 個) | 52 物體詳細(2 個) |
|---|---|---|
| 模式 1 通道 1 方向/距離 | 物體 1 代碼/位置 | 物體 1 代碼/位置 |
| 模式 1 通道 2 | 物體 2 代碼/位置 | 物體 1 面積 %/角度 ÷ 2 |
| 模式 1 通道 3 | 物體 3 代碼/位置 | 物體 2 代碼/位置 |
| 模式 1 通道 4 | 物體 4 代碼/位置 | 物體 2 面積 %/角度 ÷ 2 |
| 模式 2 遙控 | 通道 1、2=物體 5 代碼、位置;通道 4=物體數 | 不用 |
- 位置同樣是 8×6 格 X×10+Y(Y 下=小)。
- 角度:相機送「(角度+1) ÷ 2」,讀到的數 × 2 就是 0~179 度(差 1 度以內;長邊往右=0,往畫面下方轉為正)。
- 52 全部在模式 1,迴圈裡不用換模式;51 的物體 5 和物體數在模式 2(多約 1.1 秒)。
#!/usr/bin/env pybricks-micropython
from pybricks.iodevices import LUMPDevice
from pybricks.parameters import Port
from pybricks.tools import wait
cam = LUMPDevice(Port.S1) # 相機切在 物體偵測 ② 物體詳細(模式編號 52)
while True:
v = cam.read(1) # 模式 1 信標:物體 1 代碼、位置、面積、角度÷2,物體 2 同樣 4 個
code, pos, area, half = v[0], v[1], v[2], v[3]
if code: # 代碼 0 = 沒有物體
print("物體 1 代碼", code, "色號", code // 10, "形狀", code % 10,
"X 格", pos // 10, "Y 格", pos % 10, "面積", area, "% 角度約", min(179, half * 2))
else:
print("沒有物體")
wait(100)用 MBC 函式庫 MBC_UniCam_EV3.py 更簡單:object(i)、object_xy(i)、object_area(i)、object_angle(i)(已經 ×2)、object_count(),看 EV3 範例 4。EV3-G/EV3 Classroom 照上表讀「方向」「近接」,再用除法、取餘數拆。
逐格對照與範例
常見問題
- EV3 顯示成紅外線感應器? 正常:相機模擬成樂高原廠感應器,用原廠積木就能讀。
- 模式 0 讀到的不是我要的模式? 到相機的 MODE 選單改;程式只能讀,不能切換相機模式。
- 數值偶爾卡住一秒多? 換紅外線模式要約 1.1 秒,盡量固定讀同一個模式。