神攝手 ESP32CAM × SPIKE × Pybricks
這一頁只講 Pybricks(Python):在 SPIKE Prime/Robot Inventor 上用它讀神攝手 ESP32CAM的安裝步驟、每個值怎麼讀、能用的命令與範例。要換產品、主機或軟體,用上方的切換列。
安裝與設定
你需要
- 感應器:神攝手 ESP32CAM(SPIKE 版)。
- 主機:SPIKE Prime 或 Robot Inventor。
- 電腦:Chrome 瀏覽器,打開 code.pybricks.com 就能寫,不用安裝。
- 主機韌體:要先換成 Pybricks 韌體 v4.1(code.pybricks.com 正式版是 v4.1.1;MBC SPIKE 積木網站燒的 v4.1.0 也可以)。本站範例都照 v4.1 寫。
- 函式庫:
MBC_cam_school_Lib.py(要用「匯入函式庫」的寫法才需要)。自己寫新程式只要匯入MBC_sensors.py,一個檔適用全部 MBC 感應器。
注意
Pybricks 3.6.1 版的函式庫與範例已不再更新(2026 年新款 SPIKE Prime 也不能用 3.6.1)。還沒升級的主機,舊檔放在下載專區的「舊版(不再更新)」。
安裝軟體
- 用 Chrome 打開 code.pybricks.com。
- 主機換成 Pybricks 韌體:最簡單的方法是到 MBC SPIKE 積木網站 上方選單「SPIKE 主機 → 安裝/更新 Pybricks 韌體」,約 3 分鐘。
- 之後想回到樂高官方 App,用 SPIKE App 就能換回樂高原廠韌體。
讓軟體認得感應器
Pybricks 有兩種讀法,挑一種就好:
- 內建指令(不用函式庫):直接用 Pybricks 內建的感應器指令讀,不用載入額外檔案,最快上手。
- 匯入函式庫:下載 MBC_cam_school_Lib.py,拿到高解析位置、全部通道等更多資料。
匯入函式庫的步驟:
- 在 code.pybricks.com 左邊檔案區按「Import a file(匯入檔案)」。
- 範例檔和
MBC_cam_school_Lib.py兩個都要匯入,放在同一個專案列表裡。 - 點開範例,按 ▶ 執行。
重要
新專案用
MBC_sensors.py;舊專案只換掉原本那一個檔。MBC_sensors.py一個檔適用全部 MBC 感應器(EXP6、Servo6 擴充器的函式庫另外下載),寫法是from MBC_sensors import MBC_LINE8,類別名稱跟舊檔名裡的一樣。舊檔名(例如本頁範例用的MBC_cam_school_Lib.py)保留給舊程式:用新版的同名檔換掉原本那個檔就好,程式不用改。但每個舊檔名都是整份共用檔,一個程式匯入 3 個以上舊檔名,會超過 SPIKE 程式槽約 51 KB 的上限;要混用多款感應器,就只匯入MBC_sensors.py。
提示
檔名要跟程式裡
import的名字完全一樣,函式庫才載得進來,否則會出現ImportError。本站下載的函式庫檔名都沒有版本字尾,不用改名。
提示
函式庫建立物件時大多有
multitask參數:填False是一般模式,一行一行執行;填True是多工模式,每個呼叫前要加await,可以同時做很多件事。
接線
- 用連接線把感應器插在主機的 C 孔(A~F 任一孔都可以)。
- 程式裡的孔要選同一個:內建指令用
Port.A~Port.F;函式庫的port參數多半是1~6,對應 A~F。 - 接頭卡榫朝上,輕輕推進去。
先在感應器上設定顏色
神攝手的設定都在感應器背面的彩色螢幕與按鍵上完成,不用電腦:
- 感應器要接上已經開機的主機才會啟動(螢幕先顯示「LEGO Sync...」),出現鏡頭畫面就可以使用。
- 短按側鍵進入設定選單,用左/右鍵選擇、確認鍵進入;在選單中長按側鍵 1 秒清除該組顏色。
- 設定好的顏色與鏡頭參數(亮度、對比、飽和度、曝光、白平衡、翻轉、鏡像)會自動保存,下次開機直接使用。
WRO 版(HUE12)
主機要換成 Pybricks 韌體 v4.1(code.pybricks.com 正式版是 v4.1.1;MBC 積木網站上方選單「SPIKE 主機 → 安裝/更新 Pybricks 韌體」燒的 v4.1.0 也可以直接用)。 Pybricks 寫法要匯入 MBC_hue12_Lib.py(學校版是 MBC_cam_school_Lib.py);自己寫新程式只要匯入 MBC_sensors.py(類別 MBC_HUE12/MBC_CAM_SCHOOL)。
重要
Pybricks 4.1 以上請裝 MBC 函式庫(
MBC_sensors.py或上面的個別函式庫,讀模式 9)。不裝函式庫、只用內建 ColorSensor 時,4.1 的ambient()只剩 1 位小數,學校版的色塊座標 Y 個位數會讀不到;reflection()也會帶 1 位小數,要先取整數。神攝手舊版不再改韌體。
第一次測試
- 主機開機,在 code.pybricks.com 連上主機。
- 匯入並打開本頁的範例 1,按 ▶。
- 主控台印出的數字跟著感應器前方的東西變化,就是接好了。
常見問題
- 出現
ImportError? 函式庫沒有匯入到同一個專案,或檔名跟import的名字不同。把檔名改成MBC_cam_school_Lib.py再匯入一次。 - 範例跑不起來、指令不認得? 主機韌體太舊:本站範例照 Pybricks v4.1 寫,先把主機更新到 v4.1。3.6.1 已不再更新,舊版檔案在下載專區。
- 感應器拔線(或線鬆了)怎麼辦? 程式不會停下來:函式庫會回傳上一次讀到的值,並在主控台印一次提醒(中英並列:
MBC: Port C 讀不到感應器,先回傳上一次的值 / no sensor, using the last value);開機時就沒接上的話回傳None。要在程式裡檢查,用物件的sensor_ok():最近一次有讀到是True,讀不到是False(多工模式要寫await)。插回去後函式庫會繼續讀;如果是開機時就沒接上、又用多工模式,要重新執行程式。 - 標「只有 Pybricks 版」的範例讀到怪數字? 那個範例用的是感應器 2026-10 以後韌體的新模式,舊韌體讀到的會是別的數字。
- 換回官方 App 後連不上? 主機現在是 Pybricks 韌體:用 SPIKE App 換回樂高原廠韌體。
讀值(學校版)
程式假設感應器插 A 孔。「MBC 函式庫」寫法要先把函式庫 .py 一起匯入 Pybricks。
色相 hue
| 範圍 | 意思 |
|---|---|
-1~100 |
S1 取樣點色相 0 |
from pybricks.iodevices import PUPDevice
from pybricks.parameters import Port
dev = PUPDevice(Port.A) # 感應器插 A 孔
w = dev.read(9)[0]
hue = (w & 0xFF) # 色相(低 byte)MBC 函式庫
from pybricks.parameters import Port
from MBC_cam_school_Lib import MBC_CAM_SCHOOL
cam = MBC_CAM_SCHOOL(Port.A)
hue = cam.hue()模式 0 (edu) byte 0 🔒;模式 0 (toy) byte 1 🔒;模式 5 v[0] 🔒;模式 9 v[0] lo 🔒。備註:−1 = 0xFF; 0~10(÷10); raw = (色相×256 ± 128)/25 ≈ 色相×10.24,v[0]=v[1]=v[2];Pybricks reflection() ÷10.24 還原
飽和度 saturation
| 範圍 | 意思 |
|---|---|
0~100 |
S1 取樣點飽和度 0~100 |
from pybricks.iodevices import PUPDevice
from pybricks.parameters import Port
dev = PUPDevice(Port.A) # 感應器插 A 孔
w = dev.read(9)[0]
saturation = ((w >> 8) & 0xFF) # 飽和度(高 byte)MBC 函式庫
from pybricks.parameters import Port
from MBC_cam_school_Lib import MBC_CAM_SCHOOL
cam = MBC_CAM_SCHOOL(Port.A)
saturation = cam.saturation()模式 9 v[0] hi 🔒
明度 value
| 範圍 | 意思 |
|---|---|
0~100 |
S1 取樣點明度 0~100 |
from pybricks.iodevices import PUPDevice
from pybricks.parameters import Port
dev = PUPDevice(Port.A) # 感應器插 A 孔
w = dev.read(9)[1]
value = (w & 0xFF) # 明度(低 byte)MBC 函式庫
from pybricks.parameters import Port
from MBC_cam_school_Lib import MBC_CAM_SCHOOL
cam = MBC_CAM_SCHOOL(Port.A)
value = cam.brightness()模式 9 v[1] lo 🔒
動態 motion
| 範圍 | 意思 |
|---|---|
0~100 |
全畫面動態量 0~100(畫面變化越多越大) |
from pybricks.iodevices import PUPDevice
from pybricks.parameters import Port
dev = PUPDevice(Port.A) # 感應器插 A 孔
w = dev.read(9)[1]
motion = ((w >> 8) & 0xFF) # 動態(高 byte)MBC 函式庫
from pybricks.parameters import Port
from MBC_cam_school_Lib import MBC_CAM_SCHOOL
cam = MBC_CAM_SCHOOL(Port.A)
motion = cam.motion()模式 0 (edu) byte 1 🔒;模式 0 (toy) byte 0 🔒;模式 9 v[1] hi 🔒
色塊 X blobX
| 範圍 | 意思 |
|---|---|
0~100 |
色塊中心 X 0~100,左 = 0;沒找到 = 0 |
from pybricks.iodevices import PUPDevice
from pybricks.parameters import Port
dev = PUPDevice(Port.A) # 感應器插 A 孔
w = dev.read(9)[2]
blobX = (w & 0xFF) # 色塊 X(低 byte)MBC 函式庫
from pybricks.parameters import Port
from MBC_cam_school_Lib import MBC_CAM_SCHOOL
cam = MBC_CAM_SCHOOL(Port.A)
blobX = cam.blob_x()模式 0 (edu) byte 2 🔒;模式 0 (toy) byte 2 🔒;模式 6 v[0];模式 7 v[2] 🔒;模式 9 v[2] lo 🔒。備註:byte 3 = 0; ×4 查表編碼(10-bit); #67 改:模式 6 = [X, Y, 面積](3×int16); X×100+Y → Pybricks ambient() 顯示 X.Y。Pybricks 4.1 起 ambient() 只剩 1 位小數,這個值的個位數讀不到:請改裝 MBC 函式庫(讀模式 9)
色塊 Y blobY
| 範圍 | 意思 |
|---|---|
0~75 |
色塊中心 Y 0~75,下 = 0、上 = 75;沒找到 = 0 |
from pybricks.iodevices import PUPDevice
from pybricks.parameters import Port
dev = PUPDevice(Port.A) # 感應器插 A 孔
w = dev.read(9)[2]
blobY = ((w >> 8) & 0xFF) # 色塊 Y(高 byte)MBC 函式庫
from pybricks.parameters import Port
from MBC_cam_school_Lib import MBC_CAM_SCHOOL
cam = MBC_CAM_SCHOOL(Port.A)
blobY = cam.blob_y()模式 0 (edu) byte 4 🔒;模式 0 (toy) byte 4 🔒;模式 6 v[1];模式 7 v[2] 🔒;模式 9 v[2] hi 🔒。備註:byte 5 = 0; ×4 查表編碼; X×100+Y 的個位/十位。Pybricks 4.1 起 ambient() 只剩 1 位小數,這個值的個位數讀不到:請改裝 MBC 函式庫(讀模式 9)
色塊寬 blobW
| 範圍 | 意思 |
|---|---|
0~100 |
色塊寬 W 0~100;0 = 沒找到 |
from pybricks.iodevices import PUPDevice
from pybricks.parameters import Port
dev = PUPDevice(Port.A) # 感應器插 A 孔
w = dev.read(9)[3]
blobW = (w & 0xFF) # 色塊寬(低 byte)MBC 函式庫
from pybricks.parameters import Port
from MBC_cam_school_Lib import MBC_CAM_SCHOOL
cam = MBC_CAM_SCHOOL(Port.A)
blobW = cam.blob_w()模式 9 v[3] lo 🔒
色塊高 blobH
| 範圍 | 意思 |
|---|---|
0~75 |
色塊高 H 0~75;沒找到 = 0 |
from pybricks.iodevices import PUPDevice
from pybricks.parameters import Port
dev = PUPDevice(Port.A) # 感應器插 A 孔
w = dev.read(9)[3]
blobH = ((w >> 8) & 0xFF) # 色塊高(高 byte)MBC 函式庫
from pybricks.parameters import Port
from MBC_cam_school_Lib import MBC_CAM_SCHOOL
cam = MBC_CAM_SCHOOL(Port.A)
blobH = cam.blob_h()模式 9 v[3] hi 🔒
色塊面積 blobArea
| 範圍 | 意思 |
|---|---|
0~7500 |
W×H(0~7500);沒找到 = 0 |
from pybricks.iodevices import PUPDevice
from pybricks.parameters import Port
dev = PUPDevice(Port.A) # 感應器插 A 孔
blobArea = dev.read(9)[4] # 色塊面積MBC 函式庫
from pybricks.parameters import Port
from MBC_cam_school_Lib import MBC_CAM_SCHOOL
cam = MBC_CAM_SCHOOL(Port.A)
blobArea = cam.area()模式 0 (edu) byte 6 🔒;模式 0 (toy) byte 6 🔒;模式 6 v[2];模式 9 v[4] 🔒。備註:鎖住:這裡是 map(像素面積, 0~5000, 0~100),不是 W×H;byte 7 = 0; 同上 0~100 再 ×4 查表編碼; W×H; #67 新增:byte 8~9 = W×H(原本 0);其餘 byte 不動
這個軟體讀不到:有找到色塊。要用這些值請改用 Arduino/mBlock/micro:bit。
讀值(WRO 版)
程式假設感應器插 A 孔。「MBC 函式庫」寫法要先把函式庫 .py 一起匯入 Pybricks。
色點 1~12 顏色碼 spotColor
| 範圍 | 意思 |
|---|---|
0~255 |
10 |
from pybricks.iodevices import PUPDevice
from pybricks.parameters import Port
dev = PUPDevice(Port.A) # 感應器插 A 孔
spotColor = dev.read(0)[0] # 色點 1~12 顏色碼MBC 函式庫
from pybricks.parameters import Port
from MBC_hue12_Lib import HUE12Sensor
cam = HUE12Sensor(Port.A)
cam.update() # 每圈先更新一次
spotColor = cam.get_slot(1)[1] # list,第 1 路 = [0]模式 0 (edu) byte 0 🔒。備註:同 EV3:Pybricks read(0) 得 8 個 int32,每個拆 3 byte(積木網站 MBC_HUE12 設定檔);玩具版不送;鎖住
色點 1~12 鮮豔度 spotVivid
| 範圍 | 意思 |
|---|---|
0~255 |
20 |
from pybricks.iodevices import PUPDevice
from pybricks.parameters import Port
dev = PUPDevice(Port.A) # 感應器插 A 孔
spotVivid = dev.read(0)[1] # 色點 1~12 鮮豔度MBC 函式庫
from pybricks.parameters import Port
from MBC_hue12_Lib import HUE12Sensor
cam = HUE12Sensor(Port.A)
cam.update() # 每圈先更新一次
spotVivid = cam.get_slot(1)[2] # list,第 1 路 = [0]模式 0 (edu) byte 1 🔒。備註:同 EV3;鎖住
範例(學校版)
範例 1:看到什麼顏色
這個範例會做什麼:主機螢幕一直顯示神攝手看到的「色相」數字。把不同顏色的積木放到「設定 1」的那個位置,數字就會變。
要準備什麼
- SPIKE 主機 1 台
- 神攝手 1 個(已做「設定 1:COLOR」)
- 紅、綠、藍、白色的積木各一塊
怎麼接:神攝手插 C 孔。
下載程式
| Pybricks |
|---|
| ex01_show_hue.py+函式庫 |
Pybricks 程式碼
# 神攝手(學校版)範例 1:看到什麼顏色(主機螢幕顯示色相)
# 接線:神攝手 → C 埠
from pybricks.hubs import PrimeHub
from pybricks.parameters import Port
from pybricks.tools import wait
from MBC_cam_school_Lib import MBC_CAM_SCHOOL
hub = PrimeHub()
cam = MBC_CAM_SCHOOL(Port.C) # 神攝手插在 C 孔
while True:
hue = cam.hue() # 色相:0~100(紅 0/100、綠約 33、藍約 67);-1 = 黑白灰
print(hue) # 電腦畫面印出來(比較快看到)
hub.display.text(str(hue)) # 主機螢幕一個字一個字顯示
wait(500) # 等 0.5 秒再讀下一次一步一步看懂程式
- 一直重複:下面的積木會一直做,直到你按停止。
- 讀色相:官方 App 用「color(顏色)」積木,把它放進變數「色相」(變數=有名字的盒子,可以放一個數字);MBC 積木網站用「神攝手學校版 C 色相」;Pybricks 用
cam.hue()。 - 顯示在螢幕上:數字會一個字一個字跑出來。MBC 積木網站和 Pybricks 也會印在電腦畫面上,看得比較快。
- 等 0.5 秒再讀下一次。
跑起來應該看到什麼
- 紅色積木:0~5 或 95~100 左右。
- 綠色積木:30 左右;藍色積木:65 左右(每個場地的光線不同,數字會差一點)。
- 白紙、黑色積木:**-1**(沒有顏色)。
常見問題
- 不管放什麼都是 0? → 還沒做「設定 1:COLOR」。
- 數字一直跳來跳去? → 教室的燈會閃爍,顏色淡的東西特別容易跳;換顏色鮮豔的積木,或靠近一點。
- 換了教室,數字變了? → 光線不同,重新做一次「設定 1」。
範例 2:看到紅色就嗶
這個範例會做什麼:神攝手看到紅色,主機中間的燈亮紅色並嗶一聲;看到其他顏色,燈就關掉。
要準備什麼:同範例 1。
怎麼接:神攝手插 C 孔。
下載程式
| Pybricks |
|---|
| ex02_red_beep.py+函式庫 |
Pybricks 程式碼
# 神攝手(學校版)範例 2:看到紅色就亮紅燈、嗶一聲
# 接線:神攝手 → C 埠
from pybricks.hubs import PrimeHub
from pybricks.parameters import Color, Port
from pybricks.tools import wait
from MBC_cam_school_Lib import MBC_CAM_SCHOOL
hub = PrimeHub()
cam = MBC_CAM_SCHOOL(Port.C)
while True:
hue = cam.hue()
if 0 <= hue <= 5 or hue >= 95: # 紅色在色相的兩端:0 附近和 100 附近都是紅
hub.light.on(Color.RED)
hub.speaker.beep(880, 100) # 頻率 880 Hz,響 0.1 秒
else: # 其他顏色,或 -1(黑白灰)
hub.light.off()
wait(100)一步一步看懂程式
- 讀色相,放進變數。
- 如果 色相在 0~5 之間,或 色相 ≥ 95(官方 App 寫成「> 94」,意思一樣)→ 亮紅燈、嗶一聲。紅色剛好在色相的頭和尾,所以兩邊都要檢查。
- 否則(其他顏色,或 -1 沒有顏色)→ 關燈。
- 等 0.1 秒再檢查一次。
跑起來應該看到什麼:紅色積木放到設定的位置 → 紅燈+一直嗶;換成綠色或白紙 → 燈熄掉、不叫。
常見問題
- 什麼都沒放也一直嗶? → 色相是 0,代表還沒做「設定 1:COLOR」(沒設定時色相是 0,跟紅色一樣)。
- 橘色也會嗶? → 橘色的色相跟紅色很近(約 4~10),把「5」改小一點,例如 3。
- 我的紅色積木是 7,沒有嗶? → 先用範例 1 看你的紅色是多少,再把「5」改成那個數字加一點。
- 官方 App 的燈號顏色怎麼選? → 點「set Power Button light to」積木上的顏色圓點就能換。
範例 3:色塊在哪一邊
這個範例會做什麼:主機螢幕用箭頭告訴你色塊在畫面的哪裡:在左 → ⬅,在右 → ➡,在中間 → ⬆,找不到 → ✕。
要準備什麼:同範例 1,感應器要先做「設定 2:TRACK」。
怎麼接:神攝手插 C 孔。
下載程式
| Pybricks |
|---|
| ex03_blob_arrow.py+函式庫 |
Pybricks 程式碼
# 神攝手(學校版)範例 3:色塊在哪一邊(主機螢幕顯示箭頭)
# 接線:神攝手 → C 埠
from pybricks.hubs import PrimeHub
from pybricks.parameters import Icon, Port
from pybricks.tools import wait
from MBC_cam_school_Lib import MBC_CAM_SCHOOL
hub = PrimeHub()
cam = MBC_CAM_SCHOOL(Port.C)
while True:
x = cam.blob_x() # 色塊 X:左 0 ~ 右 98,中間約 50
if not cam.found(): # 沒找到色塊(這時 X 是 0,不能拿來判斷)
hub.display.icon(Icon.FALSE) # 顯示 ✕
elif x < 35:
hub.display.icon(Icon.ARROW_LEFT)
elif x > 65:
hub.display.icon(Icon.ARROW_RIGHT)
else: # 35 ~ 65 都算中間
hub.display.icon(Icon.ARROW_UP)
wait(100)一步一步看懂程式
- 讀色塊 X,再讀「有沒有找到」:官方 App 看「raw blue(面積)是不是 0」;MBC 積木網站看「色塊寬 = 0」;Pybricks 用
cam.found()。 - 如果 沒找到 → 顯示 ✕(這時 X 是 0,不能拿來判斷,所以要最先檢查)。
- 否則,如果 X < 35 → 左箭頭。
- 否則,如果 X > 65 → 右箭頭。
- 都不是(35~65)→ 上箭頭,代表在中間。
跑起來應該看到什麼:拿著色塊在鏡頭前從左慢慢移到右,箭頭依序變成 ⬅ → ⬆ → ➡;把色塊拿走,變成 ✕。
常見問題
- 箭頭左右相反? → 鏡頭裝的方向跟畫面相反。到鏡頭選單把
H-Mirror切換一次(改完記得檢查V-Flip,見上面的警告)。 - 色塊不在也顯示箭頭? → 背景有同色的東西被追到了:回「設定 2」把
TOL_HUE調小、MIN AREA調大。 - 為什麼中間是 35~65,不是只有 50? → 留一段「算中間」的範圍,箭頭才不會一直跳。
範例 4:轉頭追色塊
這個範例會做什麼:機器人原地轉頭,讓色塊保持在鏡頭正中間。色塊在左就往左轉、在右就往右轉、對準了(或看不到)就停。
要準備什麼
- 範例 3 的東西,再加上
- 兩輪小車(兩顆馬達當輪子),神攝手裝在車頭、鏡頭朝前
- 一塊做過「設定 2:TRACK」的色塊
怎麼接
- 神攝手插 C 孔
- 左輪接 E、右輪接 F
下載程式
| Pybricks |
|---|
| ex04_turn_to_blob.py+函式庫 |
Pybricks 程式碼
# 神攝手(學校版)範例 4:轉頭追色塊(色塊在左就往左轉、在右就往右轉、在中間就停)
# 接線:神攝手 → C 埠;左輪馬達 → E 埠;右輪馬達 → F 埠
from pybricks.parameters import Direction, Port
from pybricks.pupdevices import Motor
from pybricks.robotics import DriveBase
from pybricks.tools import wait
from MBC_cam_school_Lib import MBC_CAM_SCHOOL
cam = MBC_CAM_SCHOOL(Port.C)
left = Motor(Port.E, Direction.COUNTERCLOCKWISE) # 左輪:反過來裝,所以設成逆時針才是往前
right = Motor(Port.F) # 右輪
robot = DriveBase(left, right, wheel_diameter=56, axle_track=112) # 輪子直徑 56 mm、兩輪距離 112 mm
while True:
x = cam.blob_x()
if not cam.found(): # 沒看到色塊 → 停下來
robot.stop()
elif x < 40: # 色塊在左邊 → 原地左轉(速度 0,每秒轉 60 度)
robot.drive(0, -60)
elif x > 60: # 色塊在右邊 → 原地右轉
robot.drive(0, 60)
else: # 色塊在中間 → 已經對準,停
robot.stop()
wait(50)一步一步看懂程式
- 告訴主機輪子接在哪裡:官方 App 是「set movement motors to E+F」;MBC 積木網站和 Pybricks 是「移動底盤 左輪 E、右輪 F」。
- 設定速度:官方 App 速度 20%;另外兩種是「每秒轉 60 度」。轉太快鏡頭會糊掉,所以慢慢轉。
- 如果 沒找到色塊 → 停。
- 否則如果 X < 40(色塊在左)→ 原地左轉(官方 App:steer -100)。
- 否則如果 X > 60(色塊在右)→ 原地右轉(官方 App:steer 100)。
- 否則(40~60,已經對準)→ 停。
跑起來應該看到什麼:拿著色塊在車子前面慢慢往左走,車子會跟著轉頭;停下來,車子也停在正對色塊的方向。
常見問題
- 色塊在左,車子卻往右轉、越轉越遠? → 左右轉反了:把兩個轉彎的數字正負對調(官方 App:-100 和 100;另外兩種:-60 和 60),或照範例 3 的方法切換
H-Mirror。 - 一直左右來回抖? → 轉太快。官方 App 把速度調低(例如 15%);另外兩種把 60 改成 40。也可以把「中間」的範圍放寬(40/60 改成 35/65)。
- 小車原地轉的方向怪怪的? → 馬達裝法跟樂高標準小車相反。官方 App:請照樂高「標準驅動底盤」的方向裝馬達;MBC 積木網站:「移動底盤」積木裡左右輪的「正轉」方向都換成另一個;Pybricks:左輪改成
Direction.CLOCKWISE、右輪改成Motor(Port.F, Direction.COUNTERCLOCKWISE)。
範例 5:動態偵測警報
這個範例會做什麼:把主機當成「警衛」放著不動。鏡頭前有東西在動(例如有人走過、揮手),就亮紅燈、嗶一聲,並在螢幕上顯示這是第幾次;沒動靜時亮綠燈。
要準備什麼:SPIKE 主機、神攝手(這個範例不用做顏色設定)。
怎麼接:神攝手插 C 孔,鏡頭對著門口或桌面,整台放穩不要動。
下載程式
| Pybricks |
|---|
| ex05_motion_alarm.py+函式庫 |
Pybricks 程式碼
# 神攝手(學校版)範例 5:動態偵測警報(有東西在鏡頭前動,就亮紅燈、嗶一聲、記一次)
# 接線:神攝手 → C 埠。機器人要放著不動!
from pybricks.hubs import PrimeHub
from pybricks.parameters import Color, Port
from pybricks.tools import wait
from MBC_cam_school_Lib import MBC_CAM_SCHOOL
hub = PrimeHub()
cam = MBC_CAM_SCHOOL(Port.C)
count = 0 # 警報響了幾次
while True:
if cam.motion() > 20: # 動態值:畫面變化越大數字越大(0~100)
hub.light.on(Color.RED)
hub.speaker.beep(880, 200)
count = count + 1
hub.display.number(count) # 螢幕顯示第幾次
print(count)
wait(1000) # 等 1 秒,同一個動作不要重複算
else:
hub.light.on(Color.GREEN) # 沒動靜:綠燈
wait(100)一步一步看懂程式
- 一開始把「次數」設成 0(用變數記住警報響了幾次)。
- 讀動態值:官方 App 是「reflected light(反射光)」;MBC 積木網站是「神攝手學校版 C 動態值」;Pybricks 是
cam.motion()。 - 如果 動態值 > 20 → 紅燈、嗶一聲、次數加 1、螢幕顯示次數,然後等 1 秒(同一個動作才不會被算好幾次)。
- 否則 → 綠燈。
- 等 0.1 秒再檢查一次。
跑起來應該看到什麼:手在鏡頭前揮一下 → 紅燈+嗶+螢幕顯示 1;再揮一次 → 2……手不動就是綠燈。
常見問題
- 沒人動也一直響? → 「20」太小了。先用 Pybricks 印出
cam.motion()或看感應器螢幕上的M數字,看平常靜止時是多少,再把門檻設比它大一些。教室燈光閃爍、窗外有樹在動都會讓數字變大。 - 揮手都沒反應? → 門檻太大,改小一點(例如 10),或手離鏡頭近一點。
- 可以裝在會跑的車上嗎? → 不行。車子自己在動,整個畫面一直變,動態值會一直很大。動態值只有機器人停住時才準。
範例 6(進階):色塊面積:靠近就停
注意
這個範例只有 Pybricks 版。 它用的「色塊面積」是感應器 2026-10 以後韌體才有的數字(模式 9 多出來的兩個位元組),樂高官方 App 的積木和 MBC 積木網站目前的積木讀不到。 程式碼就是範例,不需要截圖。
這個範例會做什麼:機器人往你設定的顏色色塊開過去,色塊在畫面裡越近越大;面積到 1500 以上就停車、亮綠燈。沒看到色塊停車、紅燈;還在開的時候黃燈,色塊偏左偏右會順便修正方向。
要準備什麼:同範例 4(小車+一個有顏色的積木或盒子)。
怎麼接:神攝手插 C 孔、裝在車頭;左輪接 E、右輪接 F。先照「開始之前」在感應器上設定 2:TRACK 的顏色。
下載程式
| Pybricks |
|---|
| ex06_area_stop.py+函式庫 |
Pybricks 程式碼
# 神攝手(學校版)範例 6(進階):色塊面積:往色塊開過去,色塊在畫面裡變得夠大(夠近)就停
# 接線:神攝手 → C 埠(裝在車頭);左輪馬達 → E 埠;右輪馬達 → F 埠。先在感應器上設定 2:TRACK 的顏色
# 只有 Pybricks 版:面積是感應器韌體 2026-10 以後才有的數字,官方 App 和積木網站的積木讀不到
from pybricks.hubs import PrimeHub
from pybricks.parameters import Color, Direction, Port
from pybricks.tools import wait
from MBC_cam_school_Lib import MBC_CAM_SCHOOL
from pybricks.pupdevices import Motor
from pybricks.robotics import DriveBase
hub = PrimeHub()
cam = MBC_CAM_SCHOOL(Port.C)
left = Motor(Port.E, Direction.COUNTERCLOCKWISE)
right = Motor(Port.F)
robot = DriveBase(left, right, wheel_diameter=56, axle_track=112)
while True:
area = cam.area() # 色塊面積 = 寬 × 高(0~7500);沒找到是 0。越近越大
x = cam.blob_x() # 色塊左右位置 0~98,50 = 中間
if area == 0: # 沒看到色塊 → 停
robot.stop()
hub.light.on(Color.RED)
elif area >= 1500: # 夠大了 = 夠近了 → 停、綠燈
robot.stop()
hub.light.on(Color.GREEN)
else: # 還小 = 還遠 → 往色塊開過去,偏左偏右順便修正
robot.drive(80, (x - 50) * 2)
hub.light.on(Color.YELLOW)
print('面積', area, ' X', x)
wait(50)一步一步看懂程式
cam.area():色塊面積=寬 × 高(0~7500),沒找到是 0。它跟範例 3、4 的 X、Y 一樣讀模式 9,不用換模式。- 如果 面積 = 0 → 沒看到 → 停、紅燈。
- 否則,如果 面積 ≥ 1500 → 夠近了 → 停、綠燈。
- 都不是 → 往前開(每秒 80 mm),轉向=(X − 50)× 2,色塊偏哪邊就往哪邊修(跟範例 4 一樣的想法)。
- 函式庫還有
cam.blob_xya()(一次拿 [X, Y, 面積],讀模式 6)和cam.device_id()、cam.firmware_version()。
跑起來應該看到什麼:把紅色積木放在 50 公分外:黃燈、小車往積木開;越近面積越大,大概在 15 公分左右停下來、綠燈。把積木拿走:紅燈。
常見問題
- 還很遠就停了/撞上才停? → 「1500」要依你的積木大小調:先用 Pybricks 印出
cam.area(),看想停的距離面積是多少,填那個數字。 - 面積一直是 0 但範例 3 看得到 X? → 感應器韌體太舊(2026-10 以前)沒有面積,請更新韌體;舊韌體可以暫時用「寬 × 高」自己算:
cam.blob_w() * cam.blob_h()。 - 左右修正反了? → 馬達裝反了,照範例 4 常見問題的做法對調。
範例(WRO 版)
範例 1:讀第 1 格的色相
這個範例會做什麼:主機螢幕一直顯示第 1 格看到的色相;電腦畫面也會印出色相和飽和度。
要準備什麼
- SPIKE 主機 1 台
- HUE12 1 個(已設定第 1 格)
- 紅、綠、藍、白、黑色的積木各一塊
怎麼接:HUE12 插 C 孔。
下載程式
| Pybricks |
|---|
| ex01_show_slot1.py+函式庫 |
Pybricks 程式碼
# 神攝手 WRO 版(HUE12)範例 1:讀第 1 格的色相(顯示在主機螢幕)
# 接線:HUE12 → C 埠
from pybricks.hubs import PrimeHub
from pybricks.parameters import Port
from pybricks.tools import wait
from MBC_hue12_Lib import HUE12Sensor
hub = PrimeHub()
cam = HUE12Sensor(Port.C) # HUE12 插在 C 孔
while True:
cam.update() # 讀一次最新資料
name, hue, sat = cam.get_slot(1) # 第 1 格:顏色名稱、色相、飽和度
print(name, hue, sat) # 電腦畫面印出,例如 Red 5 200
hub.display.text(str(hue)) # 主機螢幕一個字一個字顯示色相
wait(500)一步一步看懂程式
- 讀資料:官方 App 和 Pybricks 先
cam.update()(讀一次最新的 12 格),再拿第 1 格;MBC 積木網站直接用「神攝手HUE12 C 第 1 格色相」積木。 - 顯示:主機螢幕一個字一個字顯示色相,電腦畫面也印出來。
- 等 0.5 秒再讀下一次。
- 官方 App 程式最上面那一大段是「讀 HUE12 的小工具」(官方 App 不能匯入別的檔案,所以每支程式都要帶著它),照抄就好,不用改。
跑起來應該看到什麼:紅色積木 0~9 或 230~239;綠色 80 左右;白紙 240~245;黑色 246~250;這一格沒設定是 255。
常見問題
- 一直是 255? → 第 1 格沒設定,或感應器還在選單裡(回到
RUN MODE)。 - Pybricks 一直顯示 255、印出
Connected to ID:後面不是 95? → 主機的 Pybricks 韌體太舊,請更新到 v4.0.0b5 以上。
範例 2:第 1 格是不是紅色
這個範例會做什麼:第 1 格看到紅色 → 主機中間的燈亮紅色並嗶一聲;其他顏色 → 關燈。
要準備什麼:同範例 1。 怎麼接:HUE12 插 C 孔。
下載程式
| Pybricks |
|---|
| ex02_is_red.py+函式庫 |
Pybricks 程式碼
# 神攝手 WRO 版(HUE12)範例 2:第 1 格是紅色就亮紅燈、嗶一聲
# 接線:HUE12 → C 埠
from pybricks.hubs import PrimeHub
from pybricks.parameters import Color, Port
from pybricks.tools import wait
from MBC_hue12_Lib import HUE12Sensor
hub = PrimeHub()
cam = HUE12Sensor(Port.C)
while True:
cam.update()
name, hue, sat = cam.get_slot(1)
if hue < 10 or 230 <= hue < 240: # 紅色在色相的兩端:0~9 和 230~239(240 以上是白、黑、沒設定)
hub.light.on(Color.RED)
hub.speaker.beep(880, 100)
else:
hub.light.off()
wait(200)一步一步看懂程式
- 讀第 1 格的色相。
- 如果 色相 < 10,或 色相在 230~239 之間 → 紅色:亮紅燈、嗶一聲。
- 否則 → 關燈。
- 等 0.2 秒再檢查。
跑起來應該看到什麼:紅色積木放到第 1 格的位置 → 紅燈+嗶;換成其他顏色 → 燈熄掉。
常見問題
- 橘色也會嗶? → 橘色約 10~30,把「10」改小一點(例如 6)。
- Pybricks 有沒有更簡單的寫法? → 有:
if name == "Red":,函式庫會幫你判斷(範圍跟上面一樣)。
範例 3:12 格裡有幾格看到顏色
這個範例會做什麼:一格一格檢查 12 格,數出有幾格看到彩色(不算白、黑、沒設定),把數字顯示在主機螢幕上。
要準備什麼:同範例 1,多設定幾格(例如第 1~4 格排成一排),再放幾塊彩色積木。
怎麼接:HUE12 插 C 孔。
下載程式
| Pybricks |
|---|
| ex03_count_colors.py+函式庫 |
Pybricks 程式碼
# 神攝手 WRO 版(HUE12)範例 3:12 格裡有幾格看到顏色(彩色)
# 接線:HUE12 → C 埠
from pybricks.hubs import PrimeHub
from pybricks.parameters import Port
from pybricks.tools import wait
from MBC_hue12_Lib import HUE12Sensor
hub = PrimeHub()
cam = HUE12Sensor(Port.C)
while True:
cam.update()
count = 0 # 先歸零
for slot in range(1, 13): # 第 1 格到第 12 格,一格一格檢查
name, hue, sat = cam.get_slot(slot)
if hue < 240: # 小於 240 = 彩色(240 以上是白、黑、沒設定)
count = count + 1
print(count)
hub.display.number(count) # 主機螢幕顯示有幾格是彩色(0~12)
wait(500)一步一步看懂程式
- 「彩色格數」先歸零。
- 重複 12 次,每次檢查一格:官方 App 和 Pybricks 用
for slot in range(1, 13)(slot 會依序是 1、2、……12);MBC 積木網站用變數「第幾格」從 1 開始,每做完一次加 1。 - 如果 這一格的色相 < 240(彩色)→ 彩色格數加 1。
- 12 格都看完 → 把彩色格數顯示在螢幕上。
跑起來應該看到什麼:4 格裡放 2 塊彩色積木 → 顯示 2;再放一塊 → 3。白紙、黑色積木不算。
常見問題
- 數字比我放的積木還多? → 有些格子看到的是彩色的背景(例如場地的彩色線);把那幾格清掉(選單裡側鍵長按 1 秒)。
- 為什麼用 240 當分界? → 240 以上是白(240~245)、黑(246~250)和沒設定(255),都不是彩色。
範例 4:依顏色轉向
這個範例會做什麼:第 1 格看到紅色 → 原地右轉;看到綠色 → 原地左轉;其他 → 停。
要準備什麼
- 範例 1 的東西,再加上兩輪小車(兩顆馬達當輪子),HUE12 裝在車頭、鏡頭朝前
- 紅色、綠色的物塊
怎麼接:HUE12 插 C 孔;左輪接 E、右輪接 F。
下載程式
| Pybricks |
|---|
| ex04_turn_by_color.py+函式庫 |
Pybricks 程式碼
# 神攝手 WRO 版(HUE12)範例 4:依顏色轉向(紅色右轉、綠色左轉、其他停)
# 接線:HUE12 → C 埠;左輪馬達 → E 埠;右輪馬達 → F 埠
from pybricks.parameters import Direction, Port
from pybricks.pupdevices import Motor
from pybricks.robotics import DriveBase
from pybricks.tools import wait
from MBC_hue12_Lib import HUE12Sensor
cam = HUE12Sensor(Port.C)
left = Motor(Port.E, Direction.COUNTERCLOCKWISE) # 左輪:反過來裝,所以設成逆時針才是往前
right = Motor(Port.F)
robot = DriveBase(left, right, wheel_diameter=56, axle_track=112)
while True:
cam.update()
name, hue, sat = cam.get_slot(1)
if hue < 10 or 230 <= hue < 240: # 紅色 → 原地右轉(每秒 60 度)
robot.drive(0, 60)
elif 60 <= hue <= 110: # 綠色 → 原地左轉
robot.drive(0, -60)
else: # 其他顏色、白、黑、沒設定 → 停
robot.stop()
wait(50)一步一步看懂程式
- 告訴主機輪子接在哪裡:官方 App 是
motor_pair.pair(…, port.E, port.F);MBC 積木網站和 Pybricks 是「移動底盤 左輪 E、右輪 F」。 - 讀第 1 格的色相。
- 如果 紅色 → 原地右轉(官方 App:steering 100、輪子每秒 200 度;另外兩種:車身每秒轉 60 度)。
- 否則如果 綠色(色相 60~110)→ 原地左轉。
- 否則 → 停。
跑起來應該看到什麼:紅色物塊放到車頭前 → 車子往右轉,轉到看不到紅色就停;綠色物塊 → 往左轉。
常見問題
- 綠色沒反應? → 先用範例 1 看你的綠色是多少,把「60~110」改成包含它的範圍。
- 轉的方向反了? → 馬達裝法跟樂高標準小車相反。官方 App:把 100 和 -100 對調;MBC 積木網站:「移動底盤」積木裡左右輪的「正轉」方向都換成另一個;Pybricks:左輪改成
Direction.CLOCKWISE、右輪改成Motor(Port.F, Direction.COUNTERCLOCKWISE)。
範例 5:看物塊顏色,決定從哪邊繞過(WRO 常見用法)
這個範例會做什麼:車子慢慢往前走。前面出現紅色物塊 → 從右邊繞過;綠色物塊 → 從左邊繞過;繞完繼續往前。WRO 很多題目都會用「看顏色決定走哪一邊」(例如未來工程師組的紅綠交通號誌柱),這是最基本的寫法。
要準備什麼:同範例 4,場地上放幾個紅色、綠色的物塊(間隔 40 公分以上)。
怎麼接:HUE12 插 C 孔(第 1 格設在車頭正前方、約 15 公分遠的地面高度);左輪接 E、右輪接 F。
下載程式
| Pybricks |
|---|
| ex05_wro_bypass.py+函式庫 |
Pybricks 程式碼
# 神攝手 WRO 版(HUE12)範例 5:看前面物塊的顏色,決定從哪一邊繞過
# 紅色 → 從右邊繞、綠色 → 從左邊繞、沒看到 → 直走
# 接線:HUE12 → C 埠(第 1 格對準車子正前方);左輪馬達 → E 埠;右輪馬達 → F 埠
from pybricks.hubs import PrimeHub
from pybricks.parameters import Direction, Port
from pybricks.pupdevices import Motor
from pybricks.robotics import DriveBase
from pybricks.tools import wait
from MBC_hue12_Lib import HUE12Sensor
hub = PrimeHub()
cam = HUE12Sensor(Port.C)
left = Motor(Port.E, Direction.COUNTERCLOCKWISE)
right = Motor(Port.F)
robot = DriveBase(left, right, wheel_diameter=56, axle_track=112)
while True:
cam.update()
name, hue, sat = cam.get_slot(1)
if hue < 10 or 230 <= hue < 240: # 紅色物塊 → 從右邊繞過
hub.display.char("R")
robot.turn(45) # 右轉 45 度(正數右轉)
robot.straight(150) # 直走 150 mm
robot.turn(-45) # 左轉 45 度,車頭轉回原來的方向
elif 60 <= hue <= 110: # 綠色物塊 → 從左邊繞過
hub.display.char("G")
robot.turn(-45)
robot.straight(150)
robot.turn(45)
else: # 沒看到物塊 → 每秒 100 mm 往前
robot.drive(100, 0)
wait(20)一步一步看懂程式
- 讀第 1 格的色相。
- 如果 紅色 → 螢幕顯示 R → 右轉 45 度 → 直走 15 公分 → 左轉 45 度(車頭轉回原來的方向)。
- 否則如果 綠色 → 螢幕顯示 G → 左右反過來做一次。
- 否則(沒看到物塊)→ 慢慢直走。
- MBC 積木網站和 Pybricks 用「轉幾度」「走幾 mm」,會自己算好;官方 App 這裡用「走幾毫秒」(
go(100, 450)=右轉 0.45 秒),所以角度要自己試著調。
跑起來應該看到什麼:車子往前走,遇到紅色物塊往右閃開、遇到綠色物塊往左閃開,繞過去後繼續走。
常見問題
- 還沒繞過去就轉回來、撞到物塊? → 把直走的距離調長(150 → 200;官方 App 1500 → 2000)。
- 官方 App 轉的角度不對? → 改
go(100, 450)和go(-100, 450)的 450:數字越大轉越多。電池電量不同也會差一點,所以比賽建議用 Pybricks 或 MBC 積木網站。 - 一直繞同一個物塊? → 繞完後鏡頭又看到同一塊。把第 1 格的位置設低一點(靠近車頭),或把轉的角度加大。
其他問題
- 主機認不到感應器? 拔掉重插一次,等 2 秒;換一個孔試試。官方 App 會把它顯示成「顏色感應器」,這是正常的。
- 可以同時用官方 App 和 Pybricks 嗎? 一次只能裝一種韌體:Pybricks 與 MBC 積木網站用 Pybricks 韌體,官方 App 用樂高原廠韌體;隨時可以用 SPIKE App 換回原廠韌體。
還有問題?到 聯絡我們 附上你用的軟體和程式截圖。
下載
- Pybricks 函式庫 MBC_cam_school_Lib.py
- Pybricks 函式庫 MBC_hue12_Lib.py
- 共用函式庫(新專案用,一個檔適用全部 MBC 感應器) MBC_sensors.py
- 下載中心(全部產品的函式庫、韌體、型錄)
本頁依據
- 主機與軟體清單:
_build/guides.json - 值與命令:
_build/protocol/cam_school.json、_build/protocol/cam_wro.json(單一真相來源) - 安裝與設定:
_build/guides/software/spike-pybricks.zh.md、_build/guides/product/esp32cam/spike-pybricks.zh.md - 範例:
sensors/esp32cam/spike-examples(-wro).md