MBC 測距者 2 路 × Pybricks

三個步驟用 MicroPython 讀測距者

寫 Pybricks 程式一定照這個順序:先匯入函式庫,再建立物件、幫感應器取名字,最後才用這個名字去呼叫功能。左邊一步一步做,右邊的程式會跟著長出來;拖動模擬感應器下面左、右障礙物的距離,就能看到程式會印出什麼。

你的主機:
1

匯入函式庫

程式的第一件事是告訴 Pybricks「我要用測距者的函式庫」。沒有這行,後面寫的 MBC_LASER2 主機看不懂,會出現 NameError。

選一種函式庫(兩種寫法完全一樣,只差 import 那一行):

  1. 下載函式庫(存成檔案,檔名不要改):MBC_laser2.py(只接測距者 2 路)或 MBC_sensors.py(統一函式庫);你選的是 MBC_laser2.py。
  2. 在 Pybricks Code 左邊檔案區按「Import a file」,把它匯入同一個專案。
  3. 檔名不要改,也不要放進子資料夾。
  4. 回到主程式,在最上面寫下面這幾行(右邊程式標 ① 的地方)。
2

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

一台車可能接好幾個感應器,所以要「建立一個物件」:告訴程式感應器接在哪個孔,並幫它取個名字。之後每次要讀距離,都是叫這個名字。

感應器接在哪個孔?

要不要開啟多工?

程式裡的 3 就是孔位編號:SPIKE 1~6 = A~F。也可以寫成 Port.C,但要多匯入 from pybricks.parameters import Port。

3

使用功能

寫法都是「laser2.功能名稱()」:名字+小數點+功能。點一個功能,程式和輸出會換成它的範例。

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

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

每個功能的範例

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

完整範例

前面有東西就後退轉彎(SPIKE,左輪 E、右輪 F)

        

!只改最上面「要改的地方」就好。撞上去才停:把 NEAR 改大,或把 SPEED 調小。車子往後退:把 Direction.COUNTERCLOCKWISE 移到另一顆馬達。感應器要裝在車頭、朝正前方,離地至少 5 公分。

多工寫法(進階)

        

!建立物件時第 2 個參數寫 True,物件要放在 run_task() 外面;每個功能前面都要加 await。

跟其他 MBC 感應器一起用

        

!改用統一函式庫:只改 import 那一行,匯入 MBC_sensors.py。兩種函式庫不要同時匯入。

使用注意

  1. 拔線不會讓程式停。讀不到時回傳上一次讀到的值,從來沒讀到過就回傳 None,電腦畫面印一行提醒;插回去自動恢復。要知道有沒有接好就用 sensor_ok()。在右邊勾「拔掉感應器」可以看到這個情形。避障時拔線,車子會照最後的距離繼續開。
  2. 讀到 120 有 4 種可能:前面真的沒東西、東西超過 120 公分、剛開機雷射還沒準備好(約 1~2 秒)、那顆雷射壞了。要分清楚就用 is_ok()(只有 SPIKE)。黑色、亮面、透明的東西比較難量,黑色物體大概 30~50 公分外就量不到;貼得太近(幾公分內)也可能讀成 120。
  3. SPIKE:公分和毫米不要在同一個迴圈混著用。公分那組(left()、right()、ch()、average()、min_distance()、min_side()、diff()、is_ok()、init_status()、fault_status()、read_all())和毫米那組(left_mm()、right_mm()、average_mm())是感應器的兩組資料,每換一組要多等幾十毫秒;device_id()、firmware_version() 放在迴圈外面。毫米要感應器韌體 2026-10 以後的版本。EV3 公分和毫米是同一組,沒有這個問題。
  4. 不用讀太快。雷射大約每 0.1 秒才量好一次,迴圈 wait(20)~wait(50) 就夠;同一組資料 10 ms 內只向感應器讀一次,一次呼叫好幾個功能沒關係。
  5. 方向:站在車後面往前看(左右以感應器朝前、從背後看為準:左=J5、右=J3),第 1 顆(ch(1))在左邊、第 2 顆在右邊。diff() = 左減右,負數 = 左邊比較近;min_side() 回傳 −1 = 左邊比較近、+1 = 右邊比較近、0 = 一樣近。