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

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

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

1

貼上讀值小幫手

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

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

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

官方 App 讀到的裝的是小幫手的功能
color_sensor.color()(顏色)第 1 路(正左邊)ch(1)
color_sensor.reflection()(反射光)第 2 路(左前 60°)ch(2)
color_sensor.rgbi() 第 1 個(原始紅)第 3 路 + 第 4 路 × 256ch(3)、ch(4)(÷ 256 的餘數、取整數)
rgbi() 第 2 個(原始綠)第 5 路 + 第 6 路 × 256ch(5)、ch(6)
rgbi() 第 3 個(原始藍)第 7 路 + 第 8 路 × 256ch(7)、ch(8)
2

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

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

測距者接在哪個孔?
3

每圈 update(),再使用功能

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

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

模擬畫面是示意:方向和距離用畫面上的位置簡單換算,實際感應器可能差一兩格。紅色扇形 = 那一路量到東西;灰色扇形 = 讀到 120(那個方向沒有東西)。第 4、5 路都朝正前方。

每個功能的範例

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

完整範例

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

簡單避障(左輪 E、右輪 F)

        

!只改 SPEED、STOP_CM 就好。撞上去才停:把 STOP_CM 調大或 SPEED 調小;轉太多或太少:改 sleep_ms(400) 的數字。

官方 App 讀不到的值

官方 App 只讀測距者的「組合資料」(8 路的公分距離),下面這些功能讀不到。要用它們請改用 Pybricks MicroPython、Pybricks 積木(主機要換 Pybricks 韌體)或 MBC 積木網站。

功能(Pybricks 函式庫)為什麼讀不到/改用什麼
min_direction()感應器自己算的「最近方向」(兩路一起看到時取平均)讀不到;這頁用 nearest() + direction(k) 從 8 路自己比,結果可能差一格。
max_direction()、max_distance()最空曠的方向和距離讀不到,要自己比 8 路(例如完整範例比左右三路)。
nearest_mm()、front_mm()、nearest_dir()毫米距離讀不到,官方 App 只有公分。
is_ok()、init_status()、fault_status()每一路正常/故障讀不到;故障的那一路一直讀 120,看起來跟「沒東西」一樣(勾模擬器的「第 3 路故障」試試看)。
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 的 Python 讀法還沒驗證,這頁是教育版的。
  3. 官方 App 的讀法還沒有用實機逐一確認。特別是第 1 路(color())和第 2 路(reflection()):App 可能只認得 0~10、0~100 的數字。如果 ch(1)、ch(2) 不管手放哪裡都怪怪的,請改用 MBC 積木網站或 Pybricks。
  4. 讀到 120 = 那個方向沒東西(或超過 120 公分、剛開機 2~4 秒還沒準備好、那一路故障)。黑色、亮面、透明的東西比較難量,判斷距離建議設在 60 公分以內。
  5. 方向:站在車後面往前看,左邊是負數、右邊是正數;第 1 路朝正左邊、第 4、5 路朝正前方、第 8 路朝正右邊。direction(k) = 第幾路 × 2 − 9(第 1 路 −7、第 4 路 −1、第 5 路 +1、第 8 路 +7)。