MBC 循行者 16 路 × EV3 Pybricks

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

在 EV3 上寫 MicroPython 一定照這個順序:先匯入,再建立物件、幫感應器取名字,最後才用這個名字去讀值。上面先選你用的是 Pybricks v4 還是 EV3 MicroPython v2,左邊一步一步做,右邊的程式會跟著長出來;拖動模擬感應器下面的黑線,就能看到程式會印出什麼。

你用的軟體:
1

匯入函式庫

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

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

  1. 下載函式庫(存成檔案,檔名不要改):MBC_line16.py(只接循行者 16 路)或 MBC_sensors.py(統一函式庫);你選的是 MBC_line16.py。
  2. 用 Chrome 打開 code.pybricks.com,照網站說明把 EV3 換成 Pybricks 韌體(正式版已內建 EV3 韌體)。
  3. 在左邊檔案區按「Import a file」,把函式庫匯入同一個專案。
  4. 檔名不要改,也不要放進子資料夾。
  5. 回到主程式,在最上面寫下面這幾行(右邊程式標 ① 的地方)。
2

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

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

感應器接在哪個孔?

要不要開啟多工?

程式裡的 1 就是孔位編號:EV3 1~4 = S1~S4。也可以寫成 Port.S1,但要多匯入 from pybricks.parameters import Port。

3

使用功能

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

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

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

每個功能的範例

完整範例


        

!


        

!


        

!

使用注意

  1. EV3 版不能從主機下命令(E0~E9 都送不了,原廠韌體、Pybricks、ev3dev 都一樣)。插上電時按住板子按鍵=白線模式(沒按=黑線);運作中按校準按鈕=5 秒動態校準。左右反向、門檻 EV3 版沒有,要用請改 SPIKE 版或 I2C 版。Pybricks 的 InfraredSensor.buttons() 不能用(模式 2 是線位置,會出 OSError 5),請用 MBC 函式庫或 LUMPDevice。
  2. 拔線時兩種軟體不一樣。Pybricks v4 的 MBC 函式庫:讀不到時回傳上一次讀到的值(從來沒讀到過就回傳 None),電腦畫面印一行提醒,程式不會停;插回去自動恢復,要知道有沒有接好就用 sensor_ok()。EV3 MicroPython v2 的 Ev3devSensor:讀不到會出現 OSError,程式停下來,要插回去再重新執行。在右邊勾「拔掉感應器」可以看到這兩種情形。
  3. EV3 換一個模式要約 1.1 秒。同一個迴圈裡盡量只用同一個模式(卡片上標的「模式 N」):pos100()、width()、edge_l()、edge_r() 是模式 2(循線最常用);bin_raw()、bitmap()、on_sensors()、junction()、junction_name() 是模式 3;pos16() 是模式 0;ir_ch()、ir_calibration() 是模式 1;device_id()、firmware_version()(模式 5)放在迴圈外面。
  4. 方向:站在車後面往前看,線在左邊是負數、右邊是正數;第 1 路在最左邊。
  5. 丟線與十字路口:線完全離開感應器時,線位置回傳 −16 或 +16、細位置回傳 −100 或 +100(看線最後從哪一側離開),車子會自己往那一側轉回去。要判斷「真的看不到線」就用線寬 = 0;線寬 10 以上通常是十字路口。
  6. EV3 跟 SPIKE 不一樣的地方:read_all() 只有 SPIKE 有。EV3 上每路光值只有 1 ~ 9(兩路擠一格送來);最左、最右那一路是 0 ~ 100。EV3 沒有送「線段數」,函式庫的 junction() 是用位元圖自己算的。位元圖、身分、韌體版本(模式 3、5)要感應器韌體 v4.0 以後。