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

神攝手 ESP32CAM × SPIKE × 樂高官方 App

互動教學SPIKE

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

這一頁只講 樂高官方 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。

安裝軟體

  1. 教育版:到 LEGO Education 下載頁 安裝 SPIKE App。
  2. 家用版:安裝 LEGO MINDSTORMS Robot Inventor App。
  3. 主機如果刷過 Pybricks,先用 SPIKE App 換回樂高原廠韌體,官方 App 才連得上。

注意

教育版和家用版的讀法不一樣:家用版 App 有些積木的數值被限制在 0 ~ 126,「顏色」最大只到 10。下面的讀值以你用的那一版為準。

讓軟體認得感應器

不用裝擴充、不用裝驅動程式。感應器插上主機,官方 App 會把它當成樂高原廠感應器(多數產品是 SPIKE 顏色感應器),直接拉那個感應器的積木就能讀。

  • 官方積木一次只拿一個數,產品的資料被編碼塞在「顏色」「反射光」「原始紅/綠/藍」這幾格裡,每一格代表什麼看下面的讀值。
  • 打開範例檔:下載 .llsp3(家用版是 .lms)→ 打開 App → 左上「檔案」→「開啟」→ 選檔案。

接線

  1. 用連接線把感應器插在主機的 C 孔(A~F 任一孔都可以,程式裡選同一個孔)。
  2. 接頭有方向性,卡榫朝上,輕輕推進去就好,不要用力硬插。
  3. 主機開機後,感應器上的燈會亮起來。

先在感應器上設定顏色

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

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

注意

  • 教育版官方 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 積木網站。

第一次測試

  1. 主機用 USB 或藍牙連上 App。
  2. 打開本頁的範例 1,按執行。
  3. 用手或場地移動感應器前方的東西,數字跟著變就是接好了。

常見問題

  • 插上去沒反應? 依序檢查:連接線兩端插緊 → 換主機的另一個孔 → 換一條線 → 換另一台主機測試。
  • 不同 App 讀到的數值不一樣? 教育版(黃色主機)和家用版(藍綠色主機)的回傳格式不同,請確認你用的是哪一版,再看對應的讀值。
  • 需要轉接板或驅動程式嗎? 不需要。接頭和通訊協議跟樂高主機孔位相同,插上就會自動辨識。
  • 範例 6 在官方 App 打不開? 標「只有 Pybricks 版」的範例,用的是 2026-10 以後韌體的新模式,官方 App 的積木讀不到。

讀值(學校版)

官方 App 會把感應器顯示成「顏色感應器」。用「更多感應器」分類裡的顏色、反射光、原始紅/綠/藍積木讀,再照表換算。

色相 hue

色相
範圍 意思
-1~100 S1 取樣點色相 0100(色相環 0240 等比縮放);−1 = 黑白灰(飽和度 < 10);S1 沒設定 = 0
主機 值 積木(更多感應器 → 顏色感應器) 換算
SPIKE Prime(教育版) 色相 「顏色」 讀到的數
Robot Inventor(玩具版) 色相 「顏色」 讀到的數

韌體備註:−1 = 0xFF;0~10(÷10)

動態 motion

動態
範圍 意思
0~100 全畫面動態量 0~100(畫面變化越多越大)
主機 值 積木(更多感應器 → 顏色感應器) 換算
SPIKE Prime(教育版) 動態 「反射光」 讀到的數
Robot Inventor(玩具版) 動態 「反射光」 讀到的數

色塊 X blobX

色塊 X
範圍 意思
0~100 色塊中心 X 0~100,左 = 0;沒找到 = 0
主機 值 積木(更多感應器 → 顏色感應器) 換算
SPIKE Prime(教育版) 色塊 X 「原始紅」 讀到的數 ÷ 256 取餘數
Robot Inventor(玩具版) 色塊 X 「原始紅」 讀到的數

韌體備註:byte 3 = 0;×4 查表編碼(10-bit)

色塊 Y blobY

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

範例 1 官方 App 積木

一步一步看懂程式

  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 孔。

下載程式

樂高官方 App
ex02_red_beep.llsp3
🟨 樂高官方 App 的積木

範例 2 官方 App 積木

一步一步看懂程式

  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 孔。

下載程式

樂高官方 App
ex03_blob_arrow.llsp3
🟨 樂高官方 App 的積木

範例 3 官方 App 積木

一步一步看懂程式

  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

下載程式

樂高官方 App
ex04_turn_to_blob.llsp3
🟨 樂高官方 App 的積木

範例 4 官方 App 積木

一步一步看懂程式

  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 孔,鏡頭對著門口或桌面,整台放穩不要動。

下載程式

樂高官方 App
ex05_motion_alarm.llsp3
🟨 樂高官方 App 的積木

範例 5 官方 App 積木

一步一步看懂程式

  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(進階):色塊面積:靠近就停

範例(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 秒

一步一步看懂程式

  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 孔。

下載程式

樂高官方 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. 讀第 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 孔。

下載程式

樂高官方 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)

一步一步看懂程式

  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。

下載程式

樂高官方 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)

一步一步看懂程式

  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。

下載程式

樂高官方 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. 讀第 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-official.zh.md、_build/guides/product/esp32cam/spike-official.zh.md
  • 範例:sensors/esp32cam/spike-examples(-wro).md
LINE 詢價選購指南