MBC 循行者 16 路 × Pybricks

三個步驟用 MicroPython 讀循行者 16 路

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

你的主機:
1

匯入函式庫

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

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

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

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

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

感應器接在哪個孔?

要不要開啟多工?

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

3

使用功能

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

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

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

每個功能的範例

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

完整範例

簡單循線+十字路口停車(SPIKE,左馬達 A、右馬達 B)

        

!只改最上面「要改的地方」就好。車子左右甩:把 KP 調小;轉不過彎:調大。到了十字路口沒停:把 CROSS 改小一點(例如 10);在 T 字岔路就停了:改大一點(最大 16)。車子往後退:把 Direction.COUNTERCLOCKWISE 移到另一顆馬達。

多工寫法(進階)

        

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

跟其他 MBC 感應器一起用

        

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

使用注意

  1. 拔線不會讓程式停。讀不到時回傳上一次讀到的值,從來沒讀到過就回傳 None,電腦畫面印一行提醒;插回去自動恢復。要知道有沒有接好就用 sensor_ok()。在右邊勾「拔掉感應器」可以看到這個情形。循線時拔線,車子會照最後的位置繼續開。
  2. 10 ms 內重複讀不會變慢。同一組資料 10 ms 內只向感應器讀一次(感應器本來就每 10 ms 更新),一次呼叫好幾個功能沒關係。
  3. 光值的範圍要看主機。SPIKE 上每一路的光值是 0 ~ 15(16 路的光值要一次傳完,每路只用 4 個位元);EV3 上 ir_ch()、ir_calibration() 是 1 ~ 9,edge_l()、edge_r() 是 0 ~ 100。判斷黑白的門檻要跟著改(SPIKE 低於 8、EV3 的 edge 低於 50 算黑)。
  4. EV3 換一組資料要約 0.5 秒。同一個迴圈裡盡量用同一組:pos100()、width()、edge_l()、edge_r() 一組(循線最常用);bin_raw()、bitmap()、on_sensors()、junction()、junction_name() 一組;pos16() 單獨一組;ir_ch()、ir_calibration() 一組;device_id()、firmware_version() 放在迴圈外面。SPIKE 沒有這個問題。
  5. 方向:站在車後面往前看,線在左邊是負數、右邊是正數;第 1 路在最左邊、第 16 路在最右邊。
  6. 丟線與十字路口:線完全離開感應器時,pos16() 回傳 −16 或 +16、pos100() 回傳 −100 或 +100(看線最後從左邊還是右邊離開),車子會自己往那一側轉回去;要判斷「真的看不到線」用 width() == 0。十字路口整排都黑,是一整段線,junction() 還是 1,要用 width() >= 11 判斷。