MBC 測距者 2 路 × 樂高官方 SPIKE App(Python)

三個步驟用官方 SPIKE App 的 Python 讀測距者

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

1

貼上讀值小幫手

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

  1. 打開樂高官方 SPIKE App(教育版,SPIKE Prime 黃色主機),新增專案,選「Python」。
  2. 把右邊標 ① 的程式貼到最上面(小幫手只露第一行,按「顯示小幫手」看全部;「複製程式」一定是完整的)。小幫手也可以單獨下載:MBC_laser2_App_helper.py(用記事本打開、全選複製)。
  3. 測距者插主機 A~F 任一孔,由主機供電;App 會把它當成顏色感應器,不用另外裝東西。

小幫手讀的是 App 的三個顏色感應器讀值,換算跟官方 App 積木頁一樣:

App 的讀值放的是小幫手的功能
原始紅 rgbi()[0]左距離 × 256left():÷ 256 取整數 → 0~120 公分
原始綠 rgbi()[1]右距離 × 256right():÷ 256 取整數 → 0~120 公分
原始藍 rgbi()[2]平均距離 × 256average():÷ 256 取整數 → 0~120 公分
2

建立物件:幫測距者取名字

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

測距者接在哪個孔?

官方 App 的孔位寫 port.A~port.F,不是 Pybricks 的 Port.C,也不是數字。

3

每圈 update(),再使用功能

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

模擬感應器(從上面往下看,車頭朝上):拖動左、右障礙物的距離,看右邊的輸出怎麼變

模擬畫面是示意:距離直接用畫面上障礙物的位置換算,實際雷射會有 1~2 公分的誤差,大約每 0.1 秒才更新一次。120 = 前面沒東西(或超過 120 公分)。

每個功能的範例

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

小幫手讀不到的:官方 App 只讀感應器的「組合資料」(模式 0)。毫米距離、雷射正常/開機狀態/故障位元、感應器身分、韌體版本、有沒有接好 都不在裡面。要用這些功能,請改用 Pybricks MicroPython(主機要換 Pybricks 韌體)或 Pybricks 積木。

完整範例

按「複製」拿到完整程式(小幫手已經接好),貼進 App 的 Python 專案就能跑。也可以下載:ex01_avoid.py、ex02_stop_at_wall.py。

避開障礙物(左輪 E、右輪 F)

        

!比較近的距離小於 NEAR 就往比較空的那邊原地轉,否則直走;燈陣顯示比較近的距離。

停在牆前 20 公分

        

!用平均距離做 P 控制:太遠就往前、太近就後退,越接近 TARGET 開越慢。車頭要正對牆面。

使用注意

  1. 已上機驗證(2026-11-03,SPIKE Prime 教育版 SPIKE App 3):原始紅、綠、藍 ÷ 256=左、右、平均距離,color()=左、reflection()=右,都不會被截在 10/100。
  2. 每圈先 update()。小幫手的功能都是拆「最近一次 update() 讀到的值」;沒 update() 就一直是舊的(一開始全是 0)。
  3. 這是官方 App 3 的寫法,跟 Pybricks 不一樣。孔位是 from hub import port 的 port.C(不是 Port.C 或數字)、等待是 await runloop.sleep_ms()(不是 wait()),Pybricks 的程式不能直接貼過來。這頁是教育版的。家用版(Robot Inventor)App 的 Python 寫法不同(hub.port.C.device),讀值實測跟教育版一樣:get_rgb_intensity()=(左, 右, 平均) × 256,÷ 256 就是公分。
  4. 讀到 120 有 4 種可能:前面真的沒東西、東西超過 120 公分、剛開機雷射還沒準備好(約 1~2 秒)、那顆雷射壞了。黑色、亮面、透明的東西比較難量,黑色物體大概 30~50 公分外就量不到。
  5. 方向:左右以感應器朝前、從背後看為準(左=J5、右=J3),left() 是左邊那顆、right() 是右邊那顆;diff() 負數=左邊比較近。小幫手只用原始紅、綠、藍。