MBC 掌控者 PS2/PS4 × EV3 Pybricks

三個步驟在 EV3 上用 MicroPython 讀掌控者遙控接收器

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

你用的軟體:
1

匯入函式庫

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

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

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

使用功能

寫法都是「pad.功能名稱()」:名字+小數點+功能。要讀按鍵或搖桿,每一圈迴圈先寫一行 pad.update() 讀一次手把,後面的功能才會拿到新的值。點一個功能,程式和輸出會換成它的範例。

模擬手把:點按鍵、拖動搖桿,看右邊的輸出怎麼變

模擬畫面是示意:點一下按鍵=按住,再點一下放開;拖動搖桿的圓點改變位置(放開滑鼠會停在那裡,按「全部放開」回到中間)。搖桿 1 ~ 9、5 = 中間,往右、往上數字變大。PS4 手把的電量固定示意為 80。

每個功能的範例

完整範例


        

!


        

!


        

!

使用注意

  1. 每一圈先讀一次手把。Pybricks v4:buttons()、pressed()、any_pressed()、stick()、stick_centered() 讀的都是上一次 update() 拍下的快照,忘了寫 update() 按什麼都不會變。EV3 MicroPython v2:每一圈用 data = 名字.read('IR-SEEK') 讀一次,再從 data 取。
  2. 拔線時兩種軟體不一樣。Pybricks v4 的 MBC 函式庫:讀不到時回傳上一次讀到的值(從來沒讀到過就回傳 None),電腦畫面印一行提醒,程式不會停;用搖桿開車時拔線,車子會照最後的搖桿位置繼續開。要知道有沒有接好就用 sensor_ok()。EV3 MicroPython v2 的 Ev3devSensor:讀不到會出現 OSError,程式停下來,要插回去再重新執行。在模擬手把下面勾「拔掉感應器」可以看到這兩種情形。
  3. EV3 換一個模式要約 1.1 秒。按鍵和搖桿都在模式 1(update() 那一組);connected() 是模式 3;kind()、device_id()、firmware_version() 是模式 5,放在迴圈外面讀一次就好。模式 3、5 要接收器韌體 v4.0 以後。
  4. 搖桿的數字:函式庫的 stick() 是 1 ~ 9(5 = 中間),直接讀模式 1 是 0 ~ 99(50 = 中間)。推一點點會跳動,把中間附近(4 ~ 6,或 40 ~ 60)當成「沒推」。方向:往右、往上數字變大。手把沒連上時按鍵全是 0、搖桿在中間。
  5. EV3 讀不到、做不到的:battery()、buttons_psx()、pressed_psx() 只有 SPIKE 有。PS4 手把的震動、燈條是「送給接收器的命令」,EV3 的感應器孔只能讀不能送,所以做不到。PS 鍵和觸控板讀不到。按鍵名稱用大寫字串,例如 pressed('CROSS');PS4/PS5 的 SHARE = 'SELECT'、OPTIONS = 'START'。