神攝手 ESP32CAM × SPIKE × 樂高官方 App
這一頁只講 樂高官方 App(SPIKE 3、Robot Inventor):在 SPIKE Prime/Robot Inventor 上用它讀神攝手 ESP32CAM的安裝步驟、每個值怎麼讀、能用的命令與範例。要換產品、主機或軟體,用上方的切換列。
安裝與設定
你需要
- 感應器:神攝手 ESP32CAM(SPIKE 版)。每個平台是不同的出廠版本,EV3 版插在 SPIKE 上不會被認出來。
- 主機:SPIKE Prime(教育版,黃色主機)或 Robot Inventor(家用版,藍綠色主機)。
- 連接線:產品內附的標準連接線,或樂高原廠線。
- 軟體:教育版用 LEGO Education SPIKE App(本站範例是 SPIKE 3);家用版用 LEGO MINDSTORMS Robot Inventor App。
- 主機韌體:樂高原廠韌體就好,不用換 Pybricks。
安裝軟體
- 教育版:到 LEGO Education 下載頁 安裝 SPIKE App。
- 家用版:安裝 LEGO MINDSTORMS Robot Inventor App。
- 主機如果刷過 Pybricks,先用 SPIKE App 換回樂高原廠韌體,官方 App 才連得上。
注意
教育版和家用版的讀法不一樣:家用版 App 有些積木的數值被限制在
0 ~ 126,「顏色」最大只到 10。下面的讀值以你用的那一版為準。
讓軟體認得感應器
不用裝擴充、不用裝驅動程式。感應器插上主機,官方 App 會把它當成樂高原廠感應器(多數產品是 SPIKE 顏色感應器),直接拉那個感應器的積木就能讀。
- 官方積木一次只拿一個數,產品的資料被編碼塞在「顏色」「反射光」「原始紅/綠/藍」這幾格裡,每一格代表什麼看下面的讀值。
- 打開範例檔:下載
.llsp3(家用版是.lms)→ 打開 App → 左上「檔案」→「開啟」→ 選檔案。
接線
- 用連接線把感應器插在主機的 C 孔(A~F 任一孔都可以,程式裡選同一個孔)。
- 接頭有方向性,卡榫朝上,輕輕推進去就好,不要用力硬插。
- 主機開機後,感應器上的燈會亮起來。
先在感應器上設定顏色
神攝手的設定都在感應器背面的彩色螢幕與按鍵上完成,不用電腦:
- 感應器要接上已經開機的主機才會啟動(螢幕先顯示「LEGO Sync...」),出現鏡頭畫面就可以使用。
- 短按側鍵進入設定選單,用左/右鍵選擇、確認鍵進入;在選單中長按側鍵 1 秒清除該組顏色。
- 設定好的顏色與鏡頭參數(亮度、對比、飽和度、曝光、白平衡、翻轉、鏡像)會自動保存,下次開機直接使用。
注意
- 教育版官方 App 的積木對應:「顏色」= 色相、「反射光」= 動態偵測值、「原始紅/綠/藍」= 色塊 X/Y/面積。
- 家用版(Robot Inventor)的「顏色」只有 0~10(是教育版的十分之一),範例 2 的數字要自己改。
- 本頁的數字是目前出貨的韌體(色相 0~100)。怎麼確認:開機後看感應器螢幕上方
X的數字,最大只到 98 左右就是新版;如果會跑到 100 以上(最多 159),是舊版韌體,請先聯絡我們更新。
WRO 版(HUE12)
樂高官方 App 沒有 HUE12 可以用的積木(HUE12 不是樂高的感應器),官方 App 的範例是教育版 SPIKE 3 App 的 Python 程式。想用積木的話,請用 MBC 積木網站。
第一次測試
- 主機用 USB 或藍牙連上 App。
- 打開本頁的範例 1,按執行。
- 用手或場地移動感應器前方的東西,數字跟著變就是接好了。
常見問題
- 插上去沒反應? 依序檢查:連接線兩端插緊 → 換主機的另一個孔 → 換一條線 → 換另一台主機測試。
- 不同 App 讀到的數值不一樣? 教育版(黃色主機)和家用版(藍綠色主機)的回傳格式不同,請確認你用的是哪一版,再看對應的讀值。
- 需要轉接板或驅動程式嗎? 不需要。接頭和通訊協議跟樂高主機孔位相同,插上就會自動辨識。
- 範例 6 在官方 App 打不開? 標「只有 Pybricks 版」的範例,用的是 2026-10 以後韌體的新模式,官方 App 的積木讀不到。
讀值(學校版)
官方 App 會把感應器顯示成「顏色感應器」。用「更多感應器」分類裡的顏色、反射光、原始紅/綠/藍積木讀,再照表換算。
色相 hue
| 範圍 | 意思 |
|---|---|
-1~100 |
S1 取樣點色相 0 |
| 主機 | 值 | 積木(更多感應器 → 顏色感應器) | 換算 |
|---|---|---|---|
| SPIKE Prime(教育版) | 色相 | 「顏色」 | 讀到的數 |
| Robot Inventor(玩具版) | 色相 | 「顏色」 | 讀到的數 |
韌體備註:−1 = 0xFF;0~10(÷10)
動態 motion
| 範圍 | 意思 |
|---|---|
0~100 |
全畫面動態量 0~100(畫面變化越多越大) |
| 主機 | 值 | 積木(更多感應器 → 顏色感應器) | 換算 |
|---|---|---|---|
| SPIKE Prime(教育版) | 動態 | 「反射光」 | 讀到的數 |
| Robot Inventor(玩具版) | 動態 | 「反射光」 | 讀到的數 |
色塊 X blobX
| 範圍 | 意思 |
|---|---|
0~100 |
色塊中心 X 0~100,左 = 0;沒找到 = 0 |
| 主機 | 值 | 積木(更多感應器 → 顏色感應器) | 換算 |
|---|---|---|---|
| SPIKE Prime(教育版) | 色塊 X | 「原始紅」 | 讀到的數 ÷ 256 取餘數 |
| Robot Inventor(玩具版) | 色塊 X | 「原始紅」 | 讀到的數 |
韌體備註:byte 3 = 0;×4 查表編碼(10-bit)
色塊 Y blobY
| 範圍 | 意思 |
|---|---|
0~75 |
色塊中心 Y 0~75,下 = 0、上 = 75;沒找到 = 0 |
| 主機 | 值 | 積木(更多感應器 → 顏色感應器) | 換算 |
|---|---|---|---|
| SPIKE Prime(教育版) | 色塊 Y | 「原始綠」 | 讀到的數 ÷ 256 取餘數 |
| Robot Inventor(玩具版) | 色塊 Y | 「原始綠」 | 讀到的數 |
韌體備註:byte 5 = 0;×4 查表編碼
色塊面積 blobArea
| 範圍 | 意思 |
|---|---|
0~7500 |
W×H(0~7500);沒找到 = 0 |
| 主機 | 值 | 積木(更多感應器 → 顏色感應器) | 換算 |
|---|---|---|---|
| SPIKE Prime(教育版) | 色塊面積 | 「原始藍」 | 讀到的數 ÷ 256 取餘數 |
| Robot Inventor(玩具版) | 色塊面積 | 「原始藍」 | 讀到的數 |
韌體備註:鎖住:這裡是 map(像素面積, 0~5000, 0~100),不是 W×H;byte 7 = 0;同上 0~100 再 ×4 查表編碼
這個軟體讀不到:飽和度、明度、色塊寬、色塊高、有找到色塊。要用這些值請改用 MBC 積木網站/Pybricks。
讀值(WRO 版)
官方 App 會把感應器顯示成「顏色感應器」。用「更多感應器」分類裡的顏色、反射光、原始紅/綠/藍積木讀,再照表換算。
這個軟體讀不到:色點 1~12 顏色碼、色點 1~12 鮮豔度。要用這些值請改用 Pybricks。
範例(學校版)
範例 1:看到什麼顏色
這個範例會做什麼:主機螢幕一直顯示神攝手看到的「色相」數字。把不同顏色的積木放到「設定 1」的那個位置,數字就會變。
要準備什麼
- SPIKE 主機 1 台
- 神攝手 1 個(已做「設定 1:COLOR」)
- 紅、綠、藍、白色的積木各一塊
怎麼接:神攝手插 C 孔。
下載程式
| 樂高官方 App |
|---|
| ex01_show_hue.llsp3 |
🟨 樂高官方 App 的積木

一步一步看懂程式
- 一直重複:下面的積木會一直做,直到你按停止。
- 讀色相:官方 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 孔。
下載程式
| 樂高官方 App |
|---|
| ex02_red_beep.llsp3 |
🟨 樂高官方 App 的積木

一步一步看懂程式
- 讀色相,放進變數。
- 如果 色相在 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 孔。
下載程式
| 樂高官方 App |
|---|
| ex03_blob_arrow.llsp3 |
🟨 樂高官方 App 的積木

一步一步看懂程式
- 讀色塊 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
下載程式
| 樂高官方 App |
|---|
| ex04_turn_to_blob.llsp3 |
🟨 樂高官方 App 的積木

一步一步看懂程式
- 告訴主機輪子接在哪裡:官方 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 孔,鏡頭對著門口或桌面,整台放穩不要動。
下載程式
| 樂高官方 App |
|---|
| ex05_motion_alarm.llsp3 |
🟨 樂高官方 App 的積木

一步一步看懂程式
- 一開始把「次數」設成 0(用變數記住警報響了幾次)。
- 讀動態值:官方 App 是「reflected light(反射光)」;MBC 積木網站是「神攝手學校版 C 動態值」;Pybricks 是
cam.motion()。 - 如果 動態值 > 20 → 紅燈、嗶一聲、次數加 1、螢幕顯示次數,然後等 1 秒(同一個動作才不會被算好幾次)。
- 否則 → 綠燈。
- 等 0.1 秒再檢查一次。
跑起來應該看到什麼:手在鏡頭前揮一下 → 紅燈+嗶+螢幕顯示 1;再揮一次 → 2……手不動就是綠燈。
常見問題
- 沒人動也一直響? → 「20」太小了。先用 Pybricks 印出
cam.motion()或看感應器螢幕上的M數字,看平常靜止時是多少,再把門檻設比它大一些。教室燈光閃爍、窗外有樹在動都會讓數字變大。 - 揮手都沒反應? → 門檻太大,改小一點(例如 10),或手離鏡頭近一點。
- 可以裝在會跑的車上嗎? → 不行。車子自己在動,整個畫面一直變,動態值會一直很大。動態值只有機器人停住時才準。
注意
下面這些範例沒有這個軟體的版本:範例 6(進階):色塊面積:靠近就停
範例(WRO 版)
範例 1:讀第 1 格的色相
這個範例會做什麼:主機螢幕一直顯示第 1 格看到的色相;電腦畫面也會印出色相和飽和度。
要準備什麼
- SPIKE 主機 1 台
- HUE12 1 個(已設定第 1 格)
- 紅、綠、藍、白、黑色的積木各一塊
怎麼接:HUE12 插 C 孔。
下載程式
| 樂高官方 App(Python) |
|---|
| ex01_show_slot1.llsp3 |
🟨 樂高官方 App 的 Python 程式
# ===== 讀 HUE12 的小工具(跟官方範例 Hue12_demo_For_Spike_v3.4.3 的讀法一樣,照抄就好、不用改)=====
import device
import utime
from hub import port
class HUE12:
def __init__(self, port_number):
self.port = port_number
self.slots = [(255, 0)] * 12 # 12 格的(色相, 飽和度);255 = 這一格沒設定
def update(self):
"""讀一次最新資料;讀不到回傳 False"""
raw = device.data(self.port) # 感應器送來 8 個整數
if not raw or len(raw) < 8:
return False
b = []
for val in raw[:8]:
if val < 0:
val += 2 ** 32
b += [val & 0xFF, (val >> 8) & 0xFF, (val >> 16) & 0xFF] # 每個整數拆成 3 個數字
for i in range(12):
self.slots[i] = (b[i * 2], b[i * 2 + 1])
return True
def hue(self, slot):
"""第 slot 格(1~12)的色相:0~239 彩色、240~245 白、246~250 黑、255 沒設定"""
return self.slots[slot - 1][0]
def sat(self, slot):
"""第 slot 格的飽和度 0~255(越大顏色越鮮豔)"""
return self.slots[slot - 1][1]
# ===== 小工具到這裡結束,下面才是範例 =====
from hub import light_matrix
cam = HUE12(port.C) # HUE12 插在 C 孔
while True:
cam.update() # 讀一次最新資料
hue = cam.hue(1) # 第 1 格的色相
print(hue, cam.sat(1)) # 電腦畫面印出 色相、飽和度
light_matrix.write(str(hue)) # 主機螢幕顯示色相
utime.sleep_ms(500) # 等 0.5 秒一步一步看懂程式
- 讀資料:官方 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 孔。
下載程式
| 樂高官方 App(Python) |
|---|
| ex02_is_red.llsp3 |
🟨 樂高官方 App 的 Python 程式
# ===== 讀 HUE12 的小工具(跟官方範例 Hue12_demo_For_Spike_v3.4.3 的讀法一樣,照抄就好、不用改)=====
import device
import utime
from hub import port
class HUE12:
def __init__(self, port_number):
self.port = port_number
self.slots = [(255, 0)] * 12 # 12 格的(色相, 飽和度);255 = 這一格沒設定
def update(self):
"""讀一次最新資料;讀不到回傳 False"""
raw = device.data(self.port) # 感應器送來 8 個整數
if not raw or len(raw) < 8:
return False
b = []
for val in raw[:8]:
if val < 0:
val += 2 ** 32
b += [val & 0xFF, (val >> 8) & 0xFF, (val >> 16) & 0xFF] # 每個整數拆成 3 個數字
for i in range(12):
self.slots[i] = (b[i * 2], b[i * 2 + 1])
return True
def hue(self, slot):
"""第 slot 格(1~12)的色相:0~239 彩色、240~245 白、246~250 黑、255 沒設定"""
return self.slots[slot - 1][0]
def sat(self, slot):
"""第 slot 格的飽和度 0~255(越大顏色越鮮豔)"""
return self.slots[slot - 1][1]
# ===== 小工具到這裡結束,下面才是範例 =====
import color
from hub import light, sound
cam = HUE12(port.C)
while True:
cam.update()
hue = cam.hue(1)
if hue < 10 or (hue >= 230 and hue < 240): # 紅色在色相的兩端:0~9 和 230~239
light.color(light.POWER, color.RED) # 中間按鈕燈變紅
sound.beep(880, 100, 100) # 嗶一聲(880 Hz、0.1 秒、音量 100)
else:
light.color(light.POWER, color.BLACK) # 黑色 = 關燈
utime.sleep_ms(200)一步一步看懂程式
- 讀第 1 格的色相。
- 如果 色相 < 10,或 色相在 230~239 之間 → 紅色:亮紅燈、嗶一聲。
- 否則 → 關燈。
- 等 0.2 秒再檢查。
跑起來應該看到什麼:紅色積木放到第 1 格的位置 → 紅燈+嗶;換成其他顏色 → 燈熄掉。
常見問題
- 橘色也會嗶? → 橘色約 10~30,把「10」改小一點(例如 6)。
- Pybricks 有沒有更簡單的寫法? → 有:
if name == "Red":,函式庫會幫你判斷(範圍跟上面一樣)。
範例 3:12 格裡有幾格看到顏色
這個範例會做什麼:一格一格檢查 12 格,數出有幾格看到彩色(不算白、黑、沒設定),把數字顯示在主機螢幕上。
要準備什麼:同範例 1,多設定幾格(例如第 1~4 格排成一排),再放幾塊彩色積木。
怎麼接:HUE12 插 C 孔。
下載程式
| 樂高官方 App(Python) |
|---|
| ex03_count_colors.llsp3 |
🟨 樂高官方 App 的 Python 程式
# ===== 讀 HUE12 的小工具(跟官方範例 Hue12_demo_For_Spike_v3.4.3 的讀法一樣,照抄就好、不用改)=====
import device
import utime
from hub import port
class HUE12:
def __init__(self, port_number):
self.port = port_number
self.slots = [(255, 0)] * 12 # 12 格的(色相, 飽和度);255 = 這一格沒設定
def update(self):
"""讀一次最新資料;讀不到回傳 False"""
raw = device.data(self.port) # 感應器送來 8 個整數
if not raw or len(raw) < 8:
return False
b = []
for val in raw[:8]:
if val < 0:
val += 2 ** 32
b += [val & 0xFF, (val >> 8) & 0xFF, (val >> 16) & 0xFF] # 每個整數拆成 3 個數字
for i in range(12):
self.slots[i] = (b[i * 2], b[i * 2 + 1])
return True
def hue(self, slot):
"""第 slot 格(1~12)的色相:0~239 彩色、240~245 白、246~250 黑、255 沒設定"""
return self.slots[slot - 1][0]
def sat(self, slot):
"""第 slot 格的飽和度 0~255(越大顏色越鮮豔)"""
return self.slots[slot - 1][1]
# ===== 小工具到這裡結束,下面才是範例 =====
from hub import light_matrix
cam = HUE12(port.C)
while True:
cam.update()
count = 0 # 先歸零
for slot in range(1, 13): # 第 1 格到第 12 格,一格一格檢查
if cam.hue(slot) < 240: # 小於 240 = 彩色(240 以上是白、黑、沒設定)
count = count + 1
print(count)
light_matrix.write(str(count)) # 主機螢幕顯示有幾格是彩色
utime.sleep_ms(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。
下載程式
| 樂高官方 App(Python) |
|---|
| ex04_turn_by_color.llsp3 |
🟨 樂高官方 App 的 Python 程式
# ===== 讀 HUE12 的小工具(跟官方範例 Hue12_demo_For_Spike_v3.4.3 的讀法一樣,照抄就好、不用改)=====
import device
import utime
from hub import port
class HUE12:
def __init__(self, port_number):
self.port = port_number
self.slots = [(255, 0)] * 12 # 12 格的(色相, 飽和度);255 = 這一格沒設定
def update(self):
"""讀一次最新資料;讀不到回傳 False"""
raw = device.data(self.port) # 感應器送來 8 個整數
if not raw or len(raw) < 8:
return False
b = []
for val in raw[:8]:
if val < 0:
val += 2 ** 32
b += [val & 0xFF, (val >> 8) & 0xFF, (val >> 16) & 0xFF] # 每個整數拆成 3 個數字
for i in range(12):
self.slots[i] = (b[i * 2], b[i * 2 + 1])
return True
def hue(self, slot):
"""第 slot 格(1~12)的色相:0~239 彩色、240~245 白、246~250 黑、255 沒設定"""
return self.slots[slot - 1][0]
def sat(self, slot):
"""第 slot 格的飽和度 0~255(越大顏色越鮮豔)"""
return self.slots[slot - 1][1]
# ===== 小工具到這裡結束,下面才是範例 =====
import motor_pair
cam = HUE12(port.C)
motor_pair.pair(motor_pair.PAIR_1, port.E, port.F) # 左輪 E、右輪 F 配成一組
while True:
cam.update()
hue = cam.hue(1)
if hue < 10 or (hue >= 230 and hue < 240): # 紅色 → 原地右轉
motor_pair.move(motor_pair.PAIR_1, 100, velocity=200)
elif hue >= 60 and hue <= 110: # 綠色 → 原地左轉
motor_pair.move(motor_pair.PAIR_1, -100, velocity=200)
else: # 其他 → 停
motor_pair.stop(motor_pair.PAIR_1)
utime.sleep_ms(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。
下載程式
| 樂高官方 App(Python) |
|---|
| ex05_wro_bypass.llsp3 |
🟨 樂高官方 App 的 Python 程式
# ===== 讀 HUE12 的小工具(跟官方範例 Hue12_demo_For_Spike_v3.4.3 的讀法一樣,照抄就好、不用改)=====
import device
import utime
from hub import port
class HUE12:
def __init__(self, port_number):
self.port = port_number
self.slots = [(255, 0)] * 12 # 12 格的(色相, 飽和度);255 = 這一格沒設定
def update(self):
"""讀一次最新資料;讀不到回傳 False"""
raw = device.data(self.port) # 感應器送來 8 個整數
if not raw or len(raw) < 8:
return False
b = []
for val in raw[:8]:
if val < 0:
val += 2 ** 32
b += [val & 0xFF, (val >> 8) & 0xFF, (val >> 16) & 0xFF] # 每個整數拆成 3 個數字
for i in range(12):
self.slots[i] = (b[i * 2], b[i * 2 + 1])
return True
def hue(self, slot):
"""第 slot 格(1~12)的色相:0~239 彩色、240~245 白、246~250 黑、255 沒設定"""
return self.slots[slot - 1][0]
def sat(self, slot):
"""第 slot 格的飽和度 0~255(越大顏色越鮮豔)"""
return self.slots[slot - 1][1]
# ===== 小工具到這裡結束,下面才是範例 =====
import motor_pair
from hub import light_matrix
cam = HUE12(port.C)
motor_pair.pair(motor_pair.PAIR_1, port.E, port.F)
def go(steering, ms):
"""用 steering(-100 左轉 ~ 0 直走 ~ 100 右轉)走 ms 毫秒,然後停"""
motor_pair.move(motor_pair.PAIR_1, steering, velocity=200)
utime.sleep_ms(ms)
motor_pair.stop(motor_pair.PAIR_1)
while True:
cam.update()
hue = cam.hue(1)
if hue < 10 or (hue >= 230 and hue < 240): # 紅色物塊 → 從右邊繞過
light_matrix.write("R")
go(100, 450) # 右轉約 45 度
go(0, 1500) # 直走約 15 公分
go(-100, 450) # 左轉回來
elif hue >= 60 and hue <= 110: # 綠色物塊 → 從左邊繞過
light_matrix.write("G")
go(-100, 450)
go(0, 1500)
go(100, 450)
else: # 沒看到物塊 → 慢慢往前
motor_pair.move(motor_pair.PAIR_1, 0, velocity=150)
utime.sleep_ms(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 換回原廠韌體。
還有問題?到 聯絡我們 附上你用的軟體和程式截圖。
下載
本頁依據
- 主機與軟體清單:
_build/guides.json - 值與命令:
_build/protocol/cam_school.json、_build/protocol/cam_wro.json(單一真相來源) - 安裝與設定:
_build/guides/software/spike-official.zh.md、_build/guides/product/esp32cam/spike-official.zh.md - 範例:
sensors/esp32cam/spike-examples(-wro).md