MBC 循行者 8 路 × 樂高官方 SPIKE App(Python)

三個步驟用官方 SPIKE App 的 Python 讀循行者

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

1

貼上讀值小幫手

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

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

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

App 的讀值放的是小幫手的功能
反射光 reflection()線位置(粗)+8pos8():減 8 → −8~+8
原始紅 rgbi()[0]線位置(細)+100pos100():減 100 → −100~+100
顏色 color()線寬(幾路踩在線上)width():直接用 → 0~8,0=看不到線
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())。每圈先 line8.update() 讀一次,再用「名字+小數點+功能」。點一個功能,程式和輸出會換成它的範例。

模擬感應器(從車子後面往前看):拖動黑線,看右邊的輸出怎麼變

模擬畫面是示意:數值算法簡化過,實際感應器可能差一兩格。光值 0 = 黑、100 = 白;紅框 = 那一路判斷在線上(光值低於 50)。

每個功能的範例

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

小幫手讀不到的:官方 App 只讀感應器的「組合資料」(模式 0)。線段數、踩到哪幾路、位元圖、感應器身分、韌體版本、有沒有接好 都不在裡面;每一路的光值雖然壓成 4 bit 放在原始綠、藍,但每一路的排列順序還沒上機確認,小幫手不拆。要用這些功能,請改用 Pybricks MicroPython(主機要換 Pybricks 韌體)或 Pybricks 積木。

完整範例

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

循線+十字路口停車(左輪 E、右輪 F)

        

!只改「👉 可以改」那幾行。車子左右甩:把 KP 調小;轉不過彎:調大。看不到線時細位置停在 ±100,車子會自己轉回去找線。

燈陣顯示線在左還是右

        

!主機燈陣顯示 L/R/|,看不到線顯示 ? 並嗶一聲。不用馬達,拿著車子在線上左右移動就能試。

使用注意

  1. 每圈先 update()。小幫手的功能都是拆「最近一次 update() 讀到的值」;沒 update() 就一直是舊的(一開始全是 0,pos8() 會是 −8)。
  2. 這是官方 App 3 的寫法,跟 Pybricks 不一樣。孔位是 from hub import port 的 port.C(不是 Port.C 或數字)、等待是 await runloop.sleep_ms()(不是 wait()),Pybricks 的程式不能直接貼過來。這頁是教育版的;家用版(Robot Inventor)App 的 Python 讀法不一樣(已實機量過:細位置=get_rgb_intensity()[0] − 100、線寬=get_reflected_light()),請用官方 App 說明頁的玩具版小幫手。LEGO 已在 2026-10-01 停止支援 Robot Inventor App。
  3. 丟線時會記住最後一側:線完全離開感應器時,pos8() 是 −8 或 +8、pos100() 是 −100 或 +100,循線程式不用另外寫找線。要判斷「真的看不到線」用 width() == 0。
  4. 十字路口:線寬 6 以上(整排都踩到)。
  5. 方向:站在車後面往前看,線在左邊是負數、右邊是正數;第 1 路在最左邊。這頁的讀法已在教育版 SPIKE App 3 上機確認(2026-10-29,Python 與積木都通過);數字怪怪的請先改用 Pybricks,並跟我們回報。
  6. 貼上程式:把 Python 貼進 SPIKE App 3 編輯器時,編輯器會把行尾 # 註解前面的空格縮短,這是自動排版,不影響程式。