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

三個步驟用官方 SPIKE App 的 Python 讀神攝手

樂高官方 SPIKE App(教育版)也能寫 Python,不用換主機韌體。神攝手在 App 裡是一顆顏色感應器,App 不能匯入自己的檔案,所以照這個順序寫:先把讀值小幫手貼在最上面,再建立物件、幫相機取名字,最後每圈 update() 一次、用名字呼叫功能。左邊一步一步做,右邊的程式會跟著長出來;在模擬的相機畫面裡拖動色塊、改顏色和大小,就能看到程式會印出什麼。

1

貼上讀值小幫手

官方 App 的 Python 專案只有一個檔案,不能匯入自己的 .py,所以把「讀值小幫手」整段貼在程式最上面(小幫手開頭也寫了:照抄就好、不用改)。沒有它,後面寫的 CamSchoolApp 主機看不懂,會出現 NameError。

  1. 打開樂高官方 SPIKE App(教育版,SPIKE Prime 黃色主機),新增專案,選「Python」。
  2. 把右邊標 ① 的程式貼到最上面(小幫手只露第一行,按「顯示小幫手」看全部;「複製程式」一定是完整的)。小幫手也可以單獨下載:MBC_cam_school_App_helper.py(用記事本打開、全選複製)。
  3. 相機插主機 A~F 任一孔,由主機供電;孔要跟第 2 步選的一樣。顏色要先在相機上設定:「設定 1:COLOR」選取色點、「設定 2:TRACK」選要追的顏色(程式改不了)。

小幫手幫你把官方 App 讀到的數字拆好(跟官方 App 積木頁同一套換算):

官方 App 讀到的裝的是小幫手的功能
color_sensor.color()(顏色)色相(取色點的顏色):−1、0 ~ 100hue()
color_sensor.reflection()(反射光)動態值(畫面變了多少)0 ~ 100motion()
color_sensor.rgbi() 第 1 個(原始紅)色塊 X:左 0 ~ 右 98;沒找到 0blob_x()
rgbi() 第 2 個(原始綠)色塊 Y:下 1 ~ 上 75;沒找到 0blob_y()
rgbi() 第 3 個(原始藍)色塊面積 0 ~ 100,0 = 沒找到area()、found()
2

建立物件:幫感應器取名字

一台車可能接好幾個感應器,所以要「建立一個物件」:告訴小幫手相機接在哪個孔(port.C 來自 from hub import port),並幫它取個名字。之後每次讀值都叫這個名字。

相機接在哪個孔?
3

每圈 update(),再使用功能

官方 App 的程式放在 async def main(): 裡,最後 runloop.run(main()) 讓它開始跑;等待用 await runloop.sleep_ms(100)(不是 Pybricks 的 wait())。每圈先 .update() 讀一次,再用「名字+小數點+功能」。點一個功能,程式和輸出會換成它的範例。

模擬感應器(相機看到的畫面):拖動色塊,看右邊的輸出怎麼變

模擬畫面是示意:數值換算簡化過,實際感應器會因為光線差幾格。十字 = 取色點(感應器上「設定 1:COLOR」選的位置),色相、飽和度、明度讀的是十字那一點;綠框 = 感應器追到的色塊(「設定 2:TRACK」選的顏色)。X 左 0、右 98;Y 下 1、上 75。

每個功能的範例

每個功能都有一段可以直接放進 main() 的範例(孔 C)。按「試試看」會切到第 3 步,右邊的程式和輸出會換成這個範例。

完整範例

按「複製」拿到完整程式(小幫手已經接好)。

跟著色塊轉(左輪 E、右輪 F)

        

!先在相機上做「設定 2:TRACK」選顏色。看不到就原地轉著找;看到了就照 X 偏左偏右修正。左右搖擺太大就把 GAIN 調小。

官方 App 讀不到的值

官方 App 只讀相機的「組合資料」(色相、動態、色塊 X/Y/面積),下面這些功能讀不到。飽和度、明度、色塊寬高可以改用 MBC 積木網站;全部的功能用 Pybricks MicroPython 或 Pybricks 積木 都讀得到(兩種都要把主機換成 Pybricks 韌體)。

功能(Pybricks 函式庫)為什麼讀不到/改用什麼
saturation()、brightness()取色點的飽和度、明度讀不到,App 只拿到色相。
blob_w()、blob_h()色塊寬、高讀不到;要知道遠近用 area()(0 ~ 100)。
area()(Pybricks)Pybricks 的面積是寬 × 高(0 ~ 7500);官方 App 拿到的是另一種 0 ~ 100 的面積,數字不能直接比。
blob_xya()、read_all()一次讀好幾個值的功能沒有;用 blob_x()、blob_y()、area() 分開讀(都是同一次 update() 的值)。
device_id()、firmware_version()、sensor_ok()感應器身分、韌體版本、有沒有接好都讀不到;拔線時官方 App 會怎樣還沒上機確認,所以模擬器沒有拔線選項。

使用注意

  1. 每圈先 update()。小幫手的功能都是拆「最近一次 update() 讀到的 8 個數字」;沒 update() 就一直是舊的(一開始全是 0,跟「沒找到」一樣)。
  2. 這是官方 App 3 的寫法,跟 Pybricks 不一樣。孔位是 from hub import port 的 port.C(不是 Port.C)、等待是 await runloop.sleep_ms()(不是 wait()),Pybricks 的程式不能直接貼過來。家用版(Robot Inventor)App 的顏色只有 0 ~ 10,這頁是教育版的。
  3. 不要跟 App 的顏色常數比。color_sensor.color() 在這裡回傳的是神攝手的色相數字,不是樂高自己的色號;一律用 hue() 的數字比大小。顏色要在相機上設定:沒做「設定 1:COLOR」時色相一直是 0,跟紅色一樣。
  4. 先判斷有沒有找到色塊。found() 是 False(面積 0)時 X、Y 也都是 0,看起來像在左下角。這裡的面積是 0 ~ 100,跟 Pybricks 的 area()(寬 × 高)單位不一樣。
  5. 座標方向:站在車後面往前看,X 左 0、右 98、中間約 50(X − 50 左負右正);Y 是下面小、上面大(下 1、上 75)。動態值要機器人停住才準。App Python 的讀法照韌體和官方 App 積木頁整理,還沒上機逐一確認。