神攝手舊版已停止支援:2026-10 以前出貨的神攝手(學校版/WRO 版)已停止支援,說明與範例保留供參考。需要升級成目前的神攝手:請聯繫原購買的經銷商寄回,韌體更新免費,來回運費由買家負擔。

神攝手 ESP32CAM × SPIKE × Pybricks

互動教學SPIKE

第一次用?先跟著互動教學在網頁上做一遍,再照下面的步驟接主機。

這一頁只講 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)。還沒升級的主機,舊檔放在下載專區的「舊版(不再更新)」。

安裝軟體

  1. 用 Chrome 打開 code.pybricks.com。
  2. 主機換成 Pybricks 韌體:最簡單的方法是到 MBC SPIKE 積木網站 上方選單「SPIKE 主機 → 安裝/更新 Pybricks 韌體」,約 3 分鐘。
  3. 之後想回到樂高官方 App,用 SPIKE App 就能換回樂高原廠韌體。

讓軟體認得感應器

Pybricks 有兩種讀法,挑一種就好:

  1. 內建指令(不用函式庫):直接用 Pybricks 內建的感應器指令讀,不用載入額外檔案,最快上手。
  2. 匯入函式庫:下載 MBC_cam_school_Lib.py,拿到高解析位置、全部通道等更多資料。

匯入函式庫的步驟:

  1. 在 code.pybricks.com 左邊檔案區按「Import a file(匯入檔案)」。
  2. 範例檔和 MBC_cam_school_Lib.py 兩個都要匯入,放在同一個專案列表裡。
  3. 點開範例,按 ▶ 執行。

重要

新專案用 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,可以同時做很多件事。

接線

  1. 用連接線把感應器插在主機的 C 孔(A~F 任一孔都可以)。
  2. 程式裡的孔要選同一個:內建指令用 Port.A~Port.F;函式庫的 port 參數多半是 1~6,對應 A~F。
  3. 接頭卡榫朝上,輕輕推進去。

先在感應器上設定顏色

神攝手的設定都在感應器背面的彩色螢幕與按鍵上完成,不用電腦:

  1. 感應器要接上已經開機的主機才會啟動(螢幕先顯示「LEGO Sync...」),出現鏡頭畫面就可以使用。
  2. 短按側鍵進入設定選單,用左/右鍵選擇、確認鍵進入;在選單中長按側鍵 1 秒清除該組顏色。
  3. 設定好的顏色與鏡頭參數(亮度、對比、飽和度、曝光、白平衡、翻轉、鏡像)會自動保存,下次開機直接使用。

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 位小數,要先取整數。神攝手舊版不再改韌體。

第一次測試

  1. 主機開機,在 code.pybricks.com 連上主機。
  2. 匯入並打開本頁的範例 1,按 ▶。
  3. 主控台印出的數字跟著感應器前方的東西變化,就是接好了。

常見問題

  • 出現 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 取樣點色相 0100(色相環 0240 等比縮放);−1 = 黑白灰(飽和度 < 10);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

色塊 X
範圍 意思
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

色塊 Y
範圍 意思
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

色點 1~12 顏色碼
範圍 意思
0~255 101B = S1S12 顏色碼:0239 彩色(色相 0255 等比縮成 0239)、240245 白(飽和度 < 30,越低越大)、246~250 黑(明度 < 30,越暗越大)、255 = 色點沒開
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

色點 1~12 鮮豔度
範圍 意思
0~255 202B = S1S12 鮮豔度(飽和度)0~255:黑 = 1、白/彩色 = 實際飽和度;色點沒開 = 0
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 秒再讀下一次

一步一步看懂程式

  1. 一直重複:下面的積木會一直做,直到你按停止。
  2. 讀色相:官方 App 用「color(顏色)」積木,把它放進變數「色相」(變數=有名字的盒子,可以放一個數字);MBC 積木網站用「神攝手學校版 C 色相」;Pybricks 用 cam.hue()。
  3. 顯示在螢幕上:數字會一個字一個字跑出來。MBC 積木網站和 Pybricks 也會印在電腦畫面上,看得比較快。
  4. 等 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)

一步一步看懂程式

  1. 讀色相,放進變數。
  2. 如果 色相在 0~5 之間,或 色相 ≥ 95(官方 App 寫成「> 94」,意思一樣)→ 亮紅燈、嗶一聲。紅色剛好在色相的頭和尾,所以兩邊都要檢查。
  3. 否則(其他顏色,或 -1 沒有顏色)→ 關燈。
  4. 等 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)

一步一步看懂程式

  1. 讀色塊 X,再讀「有沒有找到」:官方 App 看「raw blue(面積)是不是 0」;MBC 積木網站看「色塊寬 = 0」;Pybricks 用 cam.found()。
  2. 如果 沒找到 → 顯示 ✕(這時 X 是 0,不能拿來判斷,所以要最先檢查)。
  3. 否則,如果 X < 35 → 左箭頭。
  4. 否則,如果 X > 65 → 右箭頭。
  5. 都不是(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)

一步一步看懂程式

  1. 告訴主機輪子接在哪裡:官方 App 是「set movement motors to E+F」;MBC 積木網站和 Pybricks 是「移動底盤 左輪 E、右輪 F」。
  2. 設定速度:官方 App 速度 20%;另外兩種是「每秒轉 60 度」。轉太快鏡頭會糊掉,所以慢慢轉。
  3. 如果 沒找到色塊 → 停。
  4. 否則如果 X < 40(色塊在左)→ 原地左轉(官方 App:steer -100)。
  5. 否則如果 X > 60(色塊在右)→ 原地右轉(官方 App:steer 100)。
  6. 否則(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)

一步一步看懂程式

  1. 一開始把「次數」設成 0(用變數記住警報響了幾次)。
  2. 讀動態值:官方 App 是「reflected light(反射光)」;MBC 積木網站是「神攝手學校版 C 動態值」;Pybricks 是 cam.motion()。
  3. 如果 動態值 > 20 → 紅燈、嗶一聲、次數加 1、螢幕顯示次數,然後等 1 秒(同一個動作才不會被算好幾次)。
  4. 否則 → 綠燈。
  5. 等 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)

一步一步看懂程式

  1. cam.area():色塊面積=寬 × 高(0~7500),沒找到是 0。它跟範例 3、4 的 X、Y 一樣讀模式 9,不用換模式。
  2. 如果 面積 = 0 → 沒看到 → 停、紅燈。
  3. 否則,如果 面積 ≥ 1500 → 夠近了 → 停、綠燈。
  4. 都不是 → 往前開(每秒 80 mm),轉向=(X − 50)× 2,色塊偏哪邊就往哪邊修(跟範例 4 一樣的想法)。
  5. 函式庫還有 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)

一步一步看懂程式

  1. 讀資料:官方 App 和 Pybricks 先 cam.update()(讀一次最新的 12 格),再拿第 1 格;MBC 積木網站直接用「神攝手HUE12 C 第 1 格色相」積木。
  2. 顯示:主機螢幕一個字一個字顯示色相,電腦畫面也印出來。
  3. 等 0.5 秒再讀下一次。
  4. 官方 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. 讀第 1 格的色相。
  2. 如果 色相 < 10,或 色相在 230~239 之間 → 紅色:亮紅燈、嗶一聲。
  3. 否則 → 關燈。
  4. 等 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)

一步一步看懂程式

  1. 「彩色格數」先歸零。
  2. 重複 12 次,每次檢查一格:官方 App 和 Pybricks 用 for slot in range(1, 13)(slot 會依序是 1、2、……12);MBC 積木網站用變數「第幾格」從 1 開始,每做完一次加 1。
  3. 如果 這一格的色相 < 240(彩色)→ 彩色格數加 1。
  4. 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)

一步一步看懂程式

  1. 告訴主機輪子接在哪裡:官方 App 是 motor_pair.pair(…, port.E, port.F);MBC 積木網站和 Pybricks 是「移動底盤 左輪 E、右輪 F」。
  2. 讀第 1 格的色相。
  3. 如果 紅色 → 原地右轉(官方 App:steering 100、輪子每秒 200 度;另外兩種:車身每秒轉 60 度)。
  4. 否則如果 綠色(色相 60~110)→ 原地左轉。
  5. 否則 → 停。

跑起來應該看到什麼:紅色物塊放到車頭前 → 車子往右轉,轉到看不到紅色就停;綠色物塊 → 往左轉。

常見問題

  • 綠色沒反應? → 先用範例 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. 讀第 1 格的色相。
  2. 如果 紅色 → 螢幕顯示 R → 右轉 45 度 → 直走 15 公分 → 左轉 45 度(車頭轉回原來的方向)。
  3. 否則如果 綠色 → 螢幕顯示 G → 左右反過來做一次。
  4. 否則(沒看到物塊)→ 慢慢直走。
  5. 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 換回原廠韌體。

還有問題?到 聯絡我們 附上你用的軟體和程式截圖。

下載

本頁依據

  • 主機與軟體清單:_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
LINE 詢價選購指南