MBC 測距者 2 路 × EV3 Pybricks

三個步驟在 EV3 上用 MicroPython 讀測距者

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

你用的軟體:
1

匯入函式庫

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

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

  1. 下載函式庫(存成檔案,檔名不要改):MBC_laser2.py(只接測距者 2 路)或 MBC_sensors.py(統一函式庫);你選的是 MBC_laser2.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

使用功能

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

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

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

每個功能的範例

完整範例


        

!


        

!


        

!

使用注意

  1. 拔線時兩種軟體不一樣。Pybricks v4 的 MBC 函式庫:讀不到時回傳上一次讀到的值(從來沒讀到過就回傳 None),電腦畫面印一行提醒,程式不會停;插回去自動恢復,要知道有沒有接好就用 sensor_ok()。避障時拔線,車子會照最後的距離繼續開。EV3 MicroPython v2 的 Ev3devSensor:讀不到會出現 OSError,程式停下來,要插回去再重新執行。在右邊勾「拔掉感應器」可以看到這兩種情形。
  2. 讀到 120 公分(1200 毫米、100 格)有 4 種可能:前面真的沒東西、東西超過 120 公分、剛開機雷射還沒準備好(約 1~2 秒)、那顆雷射壞了。EV3 分不出是不是壞了(is_ok() 只有 SPIKE)。黑色、亮面、透明的東西比較難量。
  3. 單位要看清楚。MBC 函式庫在 EV3 上全部讀模式 5:公分 = 毫米 ÷ 10(去掉小數),公分和毫米一起讀不會變慢。EV3 MicroPython v2 直接讀模式時,模式 0、1 是「1 格 = 1.2 公分」(0 ~ 100),模式 3、5 是毫米。EV3 每換一個模式要約 1.1 秒,同一個迴圈只用一種模式。
  4. 方向:站在車後面往前看(左右以感應器朝前、從背後看為準:左=J5、右=J3),第 1 顆(ch(1))在左邊、第 2 顆在右邊。diff() = 左減右,負數 = 左邊比較近;min_side() 回傳 −1 = 左邊比較近、+1 = 右邊比較近、0 = 一樣近。
  5. EV3 讀不到的:is_ok()、init_status()、fault_status()、read_all()、device_id()、firmware_version() 只有 SPIKE 有。函式庫在 EV3 上用的模式 5(還有模式 3)要感應器韌體 v4.0 以後;舊韌體只能用 EV3 MicroPython v2 讀模式 0、1。