掌控者 PS4/PS5 × EV3 × Pybricks

互動教學EV3

第一次用?先跟著互動教學在網頁上做一遍,再照下面的步驟接主機。

這一頁只講 Pybricks v4/EV3 MicroPython v2:在 MINDSTORMS EV3 上用它讀掌控者 PS4/PS5的安裝步驟、每個值怎麼讀、能用的命令與範例。要換產品、主機或軟體,用上方的切換列。

安裝與設定

你需要

  • 感應器:掌控者 PS4/PS5(EV3 版,RJ12 接頭)。
  • 主機:LEGO MINDSTORMS EV3。
  • 軟體(二選一):
    • Pybricks v4:用 Chrome 打開 code.pybricks.com,EV3 要先裝 Pybricks 韌體(正式版已內建 EV3 韌體,2026-10 是 v4.1.1)。
    • EV3 MicroPython v2.0:樂高官方「EV3 MicroPython」microSD 開機卡+VS Code 的「LEGO MINDSTORMS EV3 MicroPython」擴充套件。已經在用的人選這個。

安裝軟體

Pybricks v4

  1. 用 Chrome 打開 code.pybricks.com。
  2. 照網站說明把 EV3 換成 Pybricks 韌體。code.pybricks.com 正式版已內建 EV3 韌體(2026-10 是 v4.1.1)。本站範例最早在 v4.0.0b10 上機測過,v4.1.1 寫法相同。
  3. 打開範例:把 .py 檔拖進編輯區,按執行。

EV3 MicroPython v2.0

  1. 用樂高官方 EV3 MicroPython 的 microSD 開機卡開機。
  2. 在 VS Code 裝好「LEGO MINDSTORMS EV3 MicroPython」擴充套件。
  3. 打開範例:把程式內容貼到 main.py,按 F5 下載執行。

讓軟體認得感應器

新手範例不用裝函式庫,直接讀感應器的資料:

  • Pybricks v4 用 LUMPDevice(Port.S1),sensor.read(模式) 拿到該模式的數值。
  • EV3 MicroPython v2.0 一律用 Ev3devSensor 讀。EV3 顯示成紅外線感應器的產品不要用 InfraredSensor:換模式固定等約 1.1 秒,buttons()/beacon()/keypad() 會丟錯或改掉數值。
  • 可以直接讀 EV3-G、Classroom 讀不到的模式,所以標「僅 Pybricks/EV3 MicroPython/clev3r」的範例也能跑。

重要

不要在主迴圈裡頻繁切換模式。 EV3 硬體每次切換感應器模式都會有通訊等待延遲。依任務選定一種模式,整趟都用它。

接線

  1. 用連接線把感應器插在 EV3 的 1 號孔(1~4 任一孔都可以;程式裡 Port.S1~Port.S4 選同一個孔)。
  2. EV3 先開機,再插感應器。
  3. 接頭卡榫朝上,輕輕推進去。

配對手把(第一次用或要換手把)

  1. 接收器接好、主機開機。插上去的時候不要按住接收器上的按鍵(會進入燒錄模式,接收器就不會動作;放開按鍵、拔掉重插就好)。
  2. 第一次使用:接收器還沒記住任何手把時,一開機就會自動開放 30 秒配對(綠燈快速閃)。要換手把、或 30 秒已經過了:按一下接收器上的按鍵(Reset),會清掉舊的手把、重新開放 30 秒。
  3. 在這 30 秒內讓手把進入配對模式,直到手把的燈條快速閃爍:PS4 手把同時長按 SHARE+PS;PS5 手把同時長按 建立(Create)+PS。
  4. 連上之後接收器會記住這支手把,也不會再連別人的手把。之後開機,只要按手把的 PS 鍵就會自動連上。
接收器的綠燈 意思
快速閃 正在等手把配對
一直亮 沒有連上手把(按手把 PS 鍵重新連線)
熄掉 已經連上手把

提示

比賽現場請在自己的位置完成配對,避免 30 秒內有別隊手把也在配對模式。綁錯手把就再按一次 Reset 重新配對。

第一次測試

  1. 打開本頁範例 1,按執行(MicroPython 版按 F5)。
  2. EV3 螢幕上的數字跟著感應器前方的東西變化,就是接好了。

常見問題

  • 找不到 EV3 的 Pybricks 韌體? 確認用的是 code.pybricks.com 正式版(2026-10 起內建 EV3 v4.1.1);舊的 ev3dev 版 Pybricks(microSD 卡)是另一套,本頁不適用。
  • 數字一直不變? 拔掉感應器重插一次(EV3 要先開機再插)。
  • 程式反應忽快忽慢? 主迴圈裡交叉讀了不同模式,每次切換都要等,改成只用一種模式。
  • 匯入函式庫時出錯? 函式庫檔要匯入到同一個 Pybricks 專案,檔名必須跟 import 的名字完全一致。

讀值

程式假設感應器插 1 號孔,用 LUMPDevice 讀原始模式;EV3 MicroPython v2 寫法相同。

方向鍵 dpad

方向鍵
範圍 意思
0~15 bit 上 1、右 2、下 4、左 8,同時按相加(0~15)
from pybricks.iodevices import LUMPDevice
from pybricks.parameters import Port

sensor = LUMPDevice(Port.S1)   # 感應器插 1 號孔

dpad = sensor.read(0)[0]   # 方向鍵:0~15 bit
dpad = sensor.read(1)[0]   # 方向鍵:0~15 bit
w = sensor.read(3)[0]
dpad = w & 0x0F   # 方向鍵(bit 0~3)
dpad = sensor.read(4)[0]   # 方向鍵:0~15 bit

模式 0 · int8 · IR-PROX 1×int8;模式 1 · int8 · IR-SEEK [方向鍵, LX, 形狀鍵, LY, 肩鍵, RX, 功能鍵, RY];模式 3 · int16 · 低 nibble;高 nibble = 形狀鍵;bit8 = 已連線(+256,#67 新增);模式 4 · int8 · IR-S-ALT [方向鍵, LX, 形狀鍵, LY](已鎖住的模式,韌體與主機端都不再改)

形狀鍵 shapeKeys

形狀鍵
範圍 意思
0~15 bit ▲ 1、● 2、✕ 4、■ 8,同時按相加(0~15)
from pybricks.iodevices import LUMPDevice
from pybricks.parameters import Port

sensor = LUMPDevice(Port.S1)   # 感應器插 1 號孔

shapeKeys = sensor.read(1)[2]   # 形狀鍵:0~15 bit
w = sensor.read(3)[0]
shapeKeys = (w >> 4) & 0x0F   # 形狀鍵(bit 4~7)
shapeKeys = sensor.read(4)[2]   # 形狀鍵:0~15 bit

模式 1 · int8;模式 3 · int16 · 高 nibble(÷16 取整數再 mod 16);模式 4 · int8(已鎖住的模式,韌體與主機端都不再改)

肩鍵 shoulderKeys

肩鍵
範圍 意思
0~15 bit L2 1、R2 2、L1 4、R1 8,同時按相加(0~15)
from pybricks.iodevices import LUMPDevice
from pybricks.parameters import Port

sensor = LUMPDevice(Port.S1)   # 感應器插 1 號孔

shoulderKeys = sensor.read(1)[4]   # 肩鍵:0~15 bit

模式 1 · int8(已鎖住的模式,韌體與主機端都不再改)

功能鍵 funcKeys

功能鍵
範圍 意思
0~15 bit SELECT(SHARE) 1、L3 2、R3 4、START(OPTIONS) 8,同時按相加(0~15)
from pybricks.iodevices import LUMPDevice
from pybricks.parameters import Port

sensor = LUMPDevice(Port.S1)   # 感應器插 1 號孔

funcKeys = sensor.read(1)[6]   # 功能鍵:0~15 bit

模式 1 · int8(已鎖住的模式,韌體與主機端都不再改)

已連線 connected

範圍 意思
0~1 1 = 手把已連線且 300 ms 內有資料,0 = 未連線(斷線時按鍵 0、搖桿中間)
from pybricks.iodevices import LUMPDevice
from pybricks.parameters import Port

sensor = LUMPDevice(Port.S1)   # 感應器插 1 號孔

w = sensor.read(3)[0]
connected = (w >> 8) & 1   # 已連線(bit 8)

模式 3 · int16 · bit8(值 ≥ 256 = 已連線,#67 新增)

搖桿 1~4 軸 stick

搖桿 1~4 軸
範圍 意思
-100~+100(EV3 模式 1、模式 2、模式 4 讀到的是換算值:0~99(50 = 中間)) 10 LX、11 LY、12 RX、13 RY:−100 ~ +100,0 = 中間,右/上為正;未連線 0
from pybricks.iodevices import LUMPDevice
from pybricks.parameters import Port

sensor = LUMPDevice(Port.S1)   # 感應器插 1 號孔

stick = sensor.read(1)[1::2]   # 搖桿 1~4 軸(index 1、3、5、7):0~99(50 = 中間)
stick = sensor.read(2)[0:4]   # 搖桿 1~4 軸
stick = sensor.read(4)[1::2]   # 搖桿 1~4 軸(index 1、3):0~99(50 = 中間)

模式 1 · int8 · LX;LY 在 index 3、RX 5、RY 7(與按鍵交錯);0~99,50 = 中間(未連線 50);模式 2 · int8 · IR-REMOTE [LX, LY, RX, RY] 0~99,50 = 中間;模式 4 · int8 · LX;LY 在 index 3(RX、RY 不在模式 4)(已鎖住的模式,韌體與主機端都不再改)

這個軟體讀不到:十六鍵、電量、L2 類比、R2 類比、系統鍵、手把類型。要用這些值請改用 Arduino/mBlock/micro:bit。

命令

EV3 接頭是唯讀的,這個軟體不能送命令:校準用感應器上的按鈕,切黑白線、門檻等設定改用 Arduino I2C、mBlock 或 micro:bit。

範例

範例 1:按鍵測試器:看看每個按鍵的數字

這個範例會做什麼: 模式 1 一次送出 8 個數字:4 組按鍵和 4 個搖桿值。這個範例把它們全部顯示在螢幕上,按按看、推推看,就知道每個按鍵是多少。

要準備什麼:

  • 掌控者 PS4藍牙接收器(EV3 版)+手把
  • EV3 主機

怎麼接: 藍牙接收器插 1 號孔。第一次使用先照產品頁說明配對 PS4/PS5 手把;之後開機按 PS 鍵會自動連線。

下載程式(選你用的軟體):

⬇ Pybricks v4 | ⬇ EV3 MicroPython v2.0

Pybricks v4 程式碼
# ============================================================
# 掌控者 PS4/PS5 藍牙遙控接收器 EV3 新手範例 01:按鍵測試器:看看每個按鍵的數字
# 軟體:Pybricks v4(用 Chrome 打開 https://code.pybricks.com ,EV3 版目前是 Beta)
# 接法:掌控者 PS4插 1 號孔
# 這個範例會做什麼:模式 1 一次送出 8 個數字:4 組按鍵和 4 個搖桿值。這個範例把它們全部顯示在螢幕上,按按看、推推看,就知道每個按鍵是多少。
# ============================================================

from pybricks.hubs import EV3Brick
from pybricks.iodevices import LUMPDevice
from pybricks.parameters import Port, Color
from pybricks.tools import wait

ev3 = EV3Brick()
sensor = LUMPDevice(Port.S1)       # 掌控者 PS4插 1 號孔


def read_dpad1():
    # 方向鍵(上 1、右 2、下 4、左 8):0 ~ 15
    return sensor.read(1)[0]


def read_shape():
    # 形狀鍵(▲1、●2、✕4、■8):0 ~ 15
    return sensor.read(1)[2]


def read_shoulder():
    # 肩鍵(L2 1、R2 2、L1 4、R1 8):0 ~ 15
    return sensor.read(1)[4]


def read_func():
    # 功能鍵(SELECT 1、L3 2、R3 4、START 8):0 ~ 15
    return sensor.read(1)[6]


def read_lx():
    # 左搖桿左右:0 ~ 99,50=中間,往右變大
    return sensor.read(1)[1]


def read_ly():
    # 左搖桿上下:0 ~ 99,50=中間,往上變大
    return sensor.read(1)[3]


def read_rx():
    # 右搖桿左右:0 ~ 99,50=中間,往右變大
    return sensor.read(1)[5]


def read_ry():
    # 右搖桿上下:0 ~ 99,50=中間,往上變大
    return sensor.read(1)[7]


# ---------- 程式從這裡開始 ----------
# 清除螢幕
ev3.screen.clear()
# 一直重複
while True:
    # 方向鍵:上 1、右 2、下 4、左 8
    ev3.screen.draw_text(0, 0, "DPAD " + str(read_dpad1()) + "      ", Color.BLACK, Color.WHITE)
    # 形狀鍵:▲1、●2、✕4、■8
    ev3.screen.draw_text(0, 16, "SHAPE " + str(read_shape()) + "      ", Color.BLACK, Color.WHITE)
    # 肩鍵:L2 1、R2 2、L1 4、R1 8
    ev3.screen.draw_text(0, 32, "SHLD " + str(read_shoulder()) + "      ", Color.BLACK, Color.WHITE)
    # 功能鍵:SELECT 1、L3 2、R3 4、START 8
    ev3.screen.draw_text(0, 48, "FUNC " + str(read_func()) + "      ", Color.BLACK, Color.WHITE)
    # 左搖桿左右(50=中間)
    ev3.screen.draw_text(0, 64, "LX " + str(read_lx()) + "      ", Color.BLACK, Color.WHITE)
    # 左搖桿上下(50=中間)
    ev3.screen.draw_text(0, 80, "LY " + str(read_ly()) + "      ", Color.BLACK, Color.WHITE)
    # 右搖桿左右
    ev3.screen.draw_text(0, 96, "RX " + str(read_rx()) + "      ", Color.BLACK, Color.WHITE)
    # 右搖桿上下
    ev3.screen.draw_text(0, 112, "RY " + str(read_ry()) + "      ", Color.BLACK, Color.WHITE)
    # 等 0.1 秒
    wait(100)
EV3 MicroPython v2.0 程式碼
#!/usr/bin/env pybricks-micropython
# ============================================================
# 掌控者 PS4/PS5 藍牙遙控接收器 EV3 新手範例 01:按鍵測試器:看看每個按鍵的數字
# 軟體:樂高官方 EV3 MicroPython v2.0(microSD 開機卡+VS Code「LEGO MINDSTORMS EV3 MicroPython」擴充套件)
# 接法:掌控者 PS4插 1 號孔
# 這個範例會做什麼:模式 1 一次送出 8 個數字:4 組按鍵和 4 個搖桿值。這個範例把它們全部顯示在螢幕上,按按看、推推看,就知道每個按鍵是多少。
# ============================================================

from pybricks.hubs import EV3Brick
from pybricks.iodevices import Ev3devSensor
from pybricks.parameters import Port, Color
from pybricks.tools import wait

ev3 = EV3Brick()
sensor = Ev3devSensor(Port.S1)     # 掌控者 PS4插 1 號孔


def read_dpad1():
    # 方向鍵(上 1、右 2、下 4、左 8):0 ~ 15
    return sensor.read('IR-SEEK')[0]


def read_shape():
    # 形狀鍵(▲1、●2、✕4、■8):0 ~ 15
    return sensor.read('IR-SEEK')[2]


def read_shoulder():
    # 肩鍵(L2 1、R2 2、L1 4、R1 8):0 ~ 15
    return sensor.read('IR-SEEK')[4]


def read_func():
    # 功能鍵(SELECT 1、L3 2、R3 4、START 8):0 ~ 15
    return sensor.read('IR-SEEK')[6]


def read_lx():
    # 左搖桿左右:0 ~ 99,50=中間,往右變大
    return sensor.read('IR-SEEK')[1]


def read_ly():
    # 左搖桿上下:0 ~ 99,50=中間,往上變大
    return sensor.read('IR-SEEK')[3]


def read_rx():
    # 右搖桿左右:0 ~ 99,50=中間,往右變大
    return sensor.read('IR-SEEK')[5]


def read_ry():
    # 右搖桿上下:0 ~ 99,50=中間,往上變大
    return sensor.read('IR-SEEK')[7]


# ---------- 程式從這裡開始 ----------
# 清除螢幕
ev3.screen.clear()
# 一直重複
while True:
    # 方向鍵:上 1、右 2、下 4、左 8
    ev3.screen.draw_text(0, 0, "DPAD " + str(read_dpad1()) + "      ", Color.BLACK, Color.WHITE)
    # 形狀鍵:▲1、●2、✕4、■8
    ev3.screen.draw_text(0, 16, "SHAPE " + str(read_shape()) + "      ", Color.BLACK, Color.WHITE)
    # 肩鍵:L2 1、R2 2、L1 4、R1 8
    ev3.screen.draw_text(0, 32, "SHLD " + str(read_shoulder()) + "      ", Color.BLACK, Color.WHITE)
    # 功能鍵:SELECT 1、L3 2、R3 4、START 8
    ev3.screen.draw_text(0, 48, "FUNC " + str(read_func()) + "      ", Color.BLACK, Color.WHITE)
    # 左搖桿左右(50=中間)
    ev3.screen.draw_text(0, 64, "LX " + str(read_lx()) + "      ", Color.BLACK, Color.WHITE)
    # 左搖桿上下(50=中間)
    ev3.screen.draw_text(0, 80, "LY " + str(read_ly()) + "      ", Color.BLACK, Color.WHITE)
    # 右搖桿左右
    ev3.screen.draw_text(0, 96, "RX " + str(read_rx()) + "      ", Color.BLACK, Color.WHITE)
    # 右搖桿上下
    ev3.screen.draw_text(0, 112, "RY " + str(read_ry()) + "      ", Color.BLACK, Color.WHITE)
    # 等 0.1 秒
    wait(100)

一步一步看懂程式:

  1. 清除螢幕
  2. 一直重複
    • 方向鍵:上 1、右 2、下 4、左 8
    • 形狀鍵:▲1、●2、✕4、■8
    • 肩鍵:L2 1、R2 2、L1 4、R1 8
    • 功能鍵:SELECT 1、L3 2、R3 4、START 8
    • 左搖桿左右(50=中間)
    • 左搖桿上下(50=中間)
    • 右搖桿左右
    • 右搖桿上下
    • 等 0.1 秒

跑起來應該看到: 沒按任何鍵時,按鍵都是 0、搖桿都是 50。同時按兩個鍵數字會相加,例如同時按上和右=3。

常見問題:

  • 按鍵沒反應? 先跑範例 1 看數字有沒有變。不會變就是手把沒連上:重新開手把電源,或 EV3 先開機再接接收器。
  • 搖桿放開了車子還在慢慢動? 搖桿中間不一定剛好 50,把程式裡的 × 2 改小,或加一段「數字在 45~55 之間就當成 50」。

範例 2:方向鍵開車

這個範例會做什麼: 用模式 0 只讀方向鍵,上前進、下後退、左右原地轉,放開就停。

要準備什麼:

  • EV3 主機+教育版基本車(左輪接 B、右輪接 C)
  • 掌控者 PS4藍牙接收器(EV3 版)+手把

怎麼接: 藍牙接收器插 1 號孔。第一次使用先照產品頁說明配對 PS4/PS5 手把;之後開機按 PS 鍵會自動連線。

下載程式(選你用的軟體):

⬇ Pybricks v4 | ⬇ EV3 MicroPython v2.0

Pybricks v4 程式碼
# ============================================================
# 掌控者 PS4/PS5 藍牙遙控接收器 EV3 新手範例 02:方向鍵開車
# 軟體:Pybricks v4(用 Chrome 打開 https://code.pybricks.com ,EV3 版目前是 Beta)
# 接法:掌控者 PS4插 1 號孔;左輪馬達接 B、右輪馬達接 C
# 這個範例會做什麼:用模式 0 只讀方向鍵,上前進、下後退、左右原地轉,放開就停。
# ============================================================

from pybricks.hubs import EV3Brick
from pybricks.ev3devices import Motor
from pybricks.iodevices import LUMPDevice
from pybricks.parameters import Port
from pybricks.tools import wait

ev3 = EV3Brick()
sensor = LUMPDevice(Port.S1)       # 掌控者 PS4插 1 號孔
left_motor = Motor(Port.B)        # 左輪
right_motor = Motor(Port.C)       # 右輪


def read_dpad():
    # 方向鍵(上 1、右 2、下 4、左 8,同時按會相加):0 ~ 15
    return sensor.read(0)[0]


# ---------- 程式從這裡開始 ----------
# 一直重複
while True:
    # 如果方向鍵=1(上)
    if read_dpad() == 1:
        # 按上:前進
        left_motor.dc(50)
        right_motor.dc(50)
    # 否則,如果方向鍵=4(下)
    elif read_dpad() == 4:
        # 按下:後退
        left_motor.dc(-50)
        right_motor.dc(-50)
    # 否則,如果方向鍵=8(左)
    elif read_dpad() == 8:
        # 按左:原地左轉
        left_motor.dc(-30)
        right_motor.dc(30)
    # 否則,如果方向鍵=2(右)
    elif read_dpad() == 2:
        # 按右:原地右轉
        left_motor.dc(30)
        right_motor.dc(-30)
    else:
        # 都沒按:停車
        left_motor.brake()
        right_motor.brake()
EV3 MicroPython v2.0 程式碼
#!/usr/bin/env pybricks-micropython
# ============================================================
# 掌控者 PS4/PS5 藍牙遙控接收器 EV3 新手範例 02:方向鍵開車
# 軟體:樂高官方 EV3 MicroPython v2.0(microSD 開機卡+VS Code「LEGO MINDSTORMS EV3 MicroPython」擴充套件)
# 接法:掌控者 PS4插 1 號孔;左輪馬達接 B、右輪馬達接 C
# 這個範例會做什麼:用模式 0 只讀方向鍵,上前進、下後退、左右原地轉,放開就停。
# ============================================================

from pybricks.hubs import EV3Brick
from pybricks.ev3devices import Motor
from pybricks.iodevices import Ev3devSensor
from pybricks.parameters import Port
from pybricks.tools import wait

ev3 = EV3Brick()
sensor = Ev3devSensor(Port.S1)     # 掌控者 PS4插 1 號孔
left_motor = Motor(Port.B)        # 左輪
right_motor = Motor(Port.C)       # 右輪


def read_dpad():
    # 方向鍵(上 1、右 2、下 4、左 8,同時按會相加):0 ~ 15
    return sensor.read('IR-PROX')[0]


# ---------- 程式從這裡開始 ----------
# 一直重複
while True:
    # 如果方向鍵=1(上)
    if read_dpad() == 1:
        # 按上:前進
        left_motor.dc(50)
        right_motor.dc(50)
    # 否則,如果方向鍵=4(下)
    elif read_dpad() == 4:
        # 按下:後退
        left_motor.dc(-50)
        right_motor.dc(-50)
    # 否則,如果方向鍵=8(左)
    elif read_dpad() == 8:
        # 按左:原地左轉
        left_motor.dc(-30)
        right_motor.dc(30)
    # 否則,如果方向鍵=2(右)
    elif read_dpad() == 2:
        # 按右:原地右轉
        left_motor.dc(30)
        right_motor.dc(-30)
    else:
        # 都沒按:停車
        left_motor.brake()
        right_motor.brake()

一步一步看懂程式:

  1. 一直重複
    • 如果方向鍵=1(上)
      • 按上:前進
      • 否則:
        • 否則,如果方向鍵=4(下)
          • 按下:後退
          • 否則:
            • 否則,如果方向鍵=8(左)
              • 按左:原地左轉
              • 否則:
                • 否則,如果方向鍵=2(右)
                  • 按右:原地右轉
                  • 否則:
                    • 都沒按:停車

跑起來應該看到: 按住方向鍵車子就動,放開就停。

常見問題:

  • 按鍵沒反應? 先跑範例 1 看數字有沒有變。不會變就是手把沒連上:重新開手把電源,或 EV3 先開機再接接收器。
  • 搖桿放開了車子還在慢慢動? 搖桿中間不一定剛好 50,把程式裡的 × 2 改小,或加一段「數字在 45~55 之間就當成 50」。

範例 3:左搖桿控制一顆馬達的快慢

這個範例會做什麼: 搖桿的數字是 099、中間 50。把它減 50 再乘 2,就變成馬達要的 -100+100:推越多轉越快,往下推就倒轉。

要準備什麼:

  • EV3 主機
  • 一顆大馬達接 B
  • 掌控者 PS4藍牙接收器(EV3 版)+手把

怎麼接: 藍牙接收器插 1 號孔。第一次使用先照產品頁說明配對 PS4/PS5 手把;之後開機按 PS 鍵會自動連線。

下載程式(選你用的軟體):

⬇ Pybricks v4 | ⬇ EV3 MicroPython v2.0

Pybricks v4 程式碼
# ============================================================
# 掌控者 PS4/PS5 藍牙遙控接收器 EV3 新手範例 03:左搖桿控制一顆馬達的快慢
# 軟體:Pybricks v4(用 Chrome 打開 https://code.pybricks.com ,EV3 版目前是 Beta)
# 接法:掌控者 PS4插 1 號孔;馬達接 B
# 這個範例會做什麼:搖桿的數字是 0~99、中間 50。把它減 50 再乘 2,就變成馬達要的 -100~+100:推越多轉越快,往下推就倒轉。
# ============================================================

from pybricks.hubs import EV3Brick
from pybricks.ev3devices import Motor
from pybricks.iodevices import LUMPDevice
from pybricks.parameters import Port, Color
from pybricks.tools import wait

ev3 = EV3Brick()
sensor = LUMPDevice(Port.S1)       # 掌控者 PS4插 1 號孔
motor_b = Motor(Port.B)             # B 埠馬達


def read_ly():
    # 左搖桿上下:0 ~ 99,50=中間,往上變大
    return sensor.read(1)[3]


# ---------- 程式從這裡開始 ----------
# 一直重複
while True:
    # 力量 power =(左搖桿上下 − 50)× 2
    power = (read_ly() - 50) * 2
    # B 馬達用 power 的力量轉
    motor_b.dc(power)
    # 螢幕顯示現在的力量
    ev3.screen.draw_text(0, 0, "POWER " + str(power) + "      ", Color.BLACK, Color.WHITE)
EV3 MicroPython v2.0 程式碼
#!/usr/bin/env pybricks-micropython
# ============================================================
# 掌控者 PS4/PS5 藍牙遙控接收器 EV3 新手範例 03:左搖桿控制一顆馬達的快慢
# 軟體:樂高官方 EV3 MicroPython v2.0(microSD 開機卡+VS Code「LEGO MINDSTORMS EV3 MicroPython」擴充套件)
# 接法:掌控者 PS4插 1 號孔;馬達接 B
# 這個範例會做什麼:搖桿的數字是 0~99、中間 50。把它減 50 再乘 2,就變成馬達要的 -100~+100:推越多轉越快,往下推就倒轉。
# ============================================================

from pybricks.hubs import EV3Brick
from pybricks.ev3devices import Motor
from pybricks.iodevices import Ev3devSensor
from pybricks.parameters import Port, Color
from pybricks.tools import wait

ev3 = EV3Brick()
sensor = Ev3devSensor(Port.S1)     # 掌控者 PS4插 1 號孔
motor_b = Motor(Port.B)             # B 埠馬達


def read_ly():
    # 左搖桿上下:0 ~ 99,50=中間,往上變大
    return sensor.read('IR-SEEK')[3]


# ---------- 程式從這裡開始 ----------
# 一直重複
while True:
    # 力量 power =(左搖桿上下 − 50)× 2
    power = (read_ly() - 50) * 2
    # B 馬達用 power 的力量轉
    motor_b.dc(power)
    # 螢幕顯示現在的力量
    ev3.screen.draw_text(0, 0, "POWER " + str(power) + "      ", Color.BLACK, Color.WHITE)

一步一步看懂程式:

  1. 一直重複
    • 力量 power =(左搖桿上下 − 50)× 2
    • B 馬達用 power 的力量轉
    • 螢幕顯示現在的力量

跑起來應該看到: 左搖桿往上推,B 馬達正轉,越推越快;往下推倒轉;放開停止,螢幕顯示 0 左右。

常見問題:

  • 按鍵沒反應? 先跑範例 1 看數字有沒有變。不會變就是手把沒連上:重新開手把電源,或 EV3 先開機再接接收器。
  • 搖桿放開了車子還在慢慢動? 搖桿中間不一定剛好 50,把程式裡的 × 2 改小,或加一段「數字在 45~55 之間就當成 50」。

範例 4:雙搖桿坦克車

這個範例會做什麼: 左搖桿管左輪、右搖桿管右輪,跟開坦克一樣:兩個都往前推就前進,一前一後就原地轉。

要準備什麼:

  • EV3 主機+教育版基本車(左輪接 B、右輪接 C)
  • 掌控者 PS4藍牙接收器(EV3 版)+手把

怎麼接: 藍牙接收器插 1 號孔。第一次使用先照產品頁說明配對 PS4/PS5 手把;之後開機按 PS 鍵會自動連線。

下載程式(選你用的軟體):

⬇ Pybricks v4 | ⬇ EV3 MicroPython v2.0

Pybricks v4 程式碼
# ============================================================
# 掌控者 PS4/PS5 藍牙遙控接收器 EV3 新手範例 04:雙搖桿坦克車
# 軟體:Pybricks v4(用 Chrome 打開 https://code.pybricks.com ,EV3 版目前是 Beta)
# 接法:掌控者 PS4插 1 號孔;左輪馬達接 B、右輪馬達接 C
# 這個範例會做什麼:左搖桿管左輪、右搖桿管右輪,跟開坦克一樣:兩個都往前推就前進,一前一後就原地轉。
# ============================================================

from pybricks.hubs import EV3Brick
from pybricks.ev3devices import Motor
from pybricks.iodevices import LUMPDevice
from pybricks.parameters import Port
from pybricks.tools import wait

ev3 = EV3Brick()
sensor = LUMPDevice(Port.S1)       # 掌控者 PS4插 1 號孔
left_motor = Motor(Port.B)        # 左輪
right_motor = Motor(Port.C)       # 右輪


def read_ly():
    # 左搖桿上下:0 ~ 99,50=中間,往上變大
    return sensor.read(1)[3]


def read_ry():
    # 右搖桿上下:0 ~ 99,50=中間,往上變大
    return sensor.read(1)[7]


# ---------- 程式從這裡開始 ----------
# 一直重複
while True:
    # 左輪力量 =(左搖桿上下 − 50)× 2
    left = (read_ly() - 50) * 2
    # 右輪力量 =(右搖桿上下 − 50)× 2
    right = (read_ry() - 50) * 2
    # 兩輪各自用自己的力量轉
    left_motor.dc(left)
    right_motor.dc(right)
EV3 MicroPython v2.0 程式碼
#!/usr/bin/env pybricks-micropython
# ============================================================
# 掌控者 PS4/PS5 藍牙遙控接收器 EV3 新手範例 04:雙搖桿坦克車
# 軟體:樂高官方 EV3 MicroPython v2.0(microSD 開機卡+VS Code「LEGO MINDSTORMS EV3 MicroPython」擴充套件)
# 接法:掌控者 PS4插 1 號孔;左輪馬達接 B、右輪馬達接 C
# 這個範例會做什麼:左搖桿管左輪、右搖桿管右輪,跟開坦克一樣:兩個都往前推就前進,一前一後就原地轉。
# ============================================================

from pybricks.hubs import EV3Brick
from pybricks.ev3devices import Motor
from pybricks.iodevices import Ev3devSensor
from pybricks.parameters import Port
from pybricks.tools import wait

ev3 = EV3Brick()
sensor = Ev3devSensor(Port.S1)     # 掌控者 PS4插 1 號孔
left_motor = Motor(Port.B)        # 左輪
right_motor = Motor(Port.C)       # 右輪


def read_ly():
    # 左搖桿上下:0 ~ 99,50=中間,往上變大
    return sensor.read('IR-SEEK')[3]


def read_ry():
    # 右搖桿上下:0 ~ 99,50=中間,往上變大
    return sensor.read('IR-SEEK')[7]


# ---------- 程式從這裡開始 ----------
# 一直重複
while True:
    # 左輪力量 =(左搖桿上下 − 50)× 2
    left = (read_ly() - 50) * 2
    # 右輪力量 =(右搖桿上下 − 50)× 2
    right = (read_ry() - 50) * 2
    # 兩輪各自用自己的力量轉
    left_motor.dc(left)
    right_motor.dc(right)

一步一步看懂程式:

  1. 一直重複
    • 左輪力量 =(左搖桿上下 − 50)× 2
    • 右輪力量 =(右搖桿上下 − 50)× 2
    • 兩輪各自用自己的力量轉

跑起來應該看到: 兩支搖桿一起往前推,車子前進;左推前、右推後,車子原地右轉。

常見問題:

  • 按鍵沒反應? 先跑範例 1 看數字有沒有變。不會變就是手把沒連上:重新開手把電源,或 EV3 先開機再接接收器。
  • 搖桿放開了車子還在慢慢動? 搖桿中間不一定剛好 50,把程式裡的 × 2 改小,或加一段「數字在 45~55 之間就當成 50」。

範例 5:✕ 夾、● 放:控制夾爪

這個範例會做什麼: 用形狀鍵控制接在 A 埠的中馬達(夾爪):按 ✕ 夾緊、按 ● 放開,都不按就停。

要準備什麼:

  • EV3 主機
  • 中馬達接 A(做成夾爪)
  • 掌控者 PS4藍牙接收器(EV3 版)+手把

怎麼接: 藍牙接收器插 1 號孔。第一次使用先照產品頁說明配對 PS4/PS5 手把;之後開機按 PS 鍵會自動連線。

下載程式(選你用的軟體):

⬇ Pybricks v4 | ⬇ EV3 MicroPython v2.0

Pybricks v4 程式碼
# ============================================================
# 掌控者 PS4/PS5 藍牙遙控接收器 EV3 新手範例 05:✕ 夾、● 放:控制夾爪
# 軟體:Pybricks v4(用 Chrome 打開 https://code.pybricks.com ,EV3 版目前是 Beta)
# 接法:掌控者 PS4插 1 號孔;馬達接 A
# 這個範例會做什麼:用形狀鍵控制接在 A 埠的中馬達(夾爪):按 ✕ 夾緊、按 ● 放開,都不按就停。
# ============================================================

from pybricks.hubs import EV3Brick
from pybricks.ev3devices import Motor
from pybricks.iodevices import LUMPDevice
from pybricks.parameters import Port
from pybricks.tools import wait

ev3 = EV3Brick()
sensor = LUMPDevice(Port.S1)       # 掌控者 PS4插 1 號孔
motor_a = Motor(Port.A)             # A 埠馬達


def read_shape():
    # 形狀鍵(▲1、●2、✕4、■8):0 ~ 15
    return sensor.read(1)[2]


# ---------- 程式從這裡開始 ----------
# 一直重複
while True:
    # 如果形狀鍵=4(✕)
    if read_shape() == 4:
        # 按 ✕:夾爪往夾緊的方向轉
        motor_a.dc(40)
    # 否則,如果形狀鍵=2(●)
    elif read_shape() == 2:
        # 按 ●:夾爪往放開的方向轉
        motor_a.dc(-40)
    else:
        # 都沒按:夾爪停住
        motor_a.brake()
EV3 MicroPython v2.0 程式碼
#!/usr/bin/env pybricks-micropython
# ============================================================
# 掌控者 PS4/PS5 藍牙遙控接收器 EV3 新手範例 05:✕ 夾、● 放:控制夾爪
# 軟體:樂高官方 EV3 MicroPython v2.0(microSD 開機卡+VS Code「LEGO MINDSTORMS EV3 MicroPython」擴充套件)
# 接法:掌控者 PS4插 1 號孔;馬達接 A
# 這個範例會做什麼:用形狀鍵控制接在 A 埠的中馬達(夾爪):按 ✕ 夾緊、按 ● 放開,都不按就停。
# ============================================================

from pybricks.hubs import EV3Brick
from pybricks.ev3devices import Motor
from pybricks.iodevices import Ev3devSensor
from pybricks.parameters import Port
from pybricks.tools import wait

ev3 = EV3Brick()
sensor = Ev3devSensor(Port.S1)     # 掌控者 PS4插 1 號孔
motor_a = Motor(Port.A)             # A 埠馬達


def read_shape():
    # 形狀鍵(▲1、●2、✕4、■8):0 ~ 15
    return sensor.read('IR-SEEK')[2]


# ---------- 程式從這裡開始 ----------
# 一直重複
while True:
    # 如果形狀鍵=4(✕)
    if read_shape() == 4:
        # 按 ✕:夾爪往夾緊的方向轉
        motor_a.dc(40)
    # 否則,如果形狀鍵=2(●)
    elif read_shape() == 2:
        # 按 ●:夾爪往放開的方向轉
        motor_a.dc(-40)
    else:
        # 都沒按:夾爪停住
        motor_a.brake()

一步一步看懂程式:

  1. 一直重複
    • 如果形狀鍵=4(✕)
      • 按 ✕:夾爪往夾緊的方向轉
      • 否則:
        • 否則,如果形狀鍵=2(●)
          • 按 ●:夾爪往放開的方向轉
          • 否則:
            • 都沒按:夾爪停住

跑起來應該看到: 按住 ✕ 夾爪夾起來、按住 ● 打開,放開按鍵就停。

常見問題:

  • 夾緊和放開顛倒? 把 40 和 -40 對調。
  • 按鍵沒反應? 先跑範例 1 看數字有沒有變。不會變就是手把沒連上:重新開手把電源,或 EV3 先開機再接接收器。
  • 搖桿放開了車子還在慢慢動? 搖桿中間不一定剛好 50,把程式裡的 × 2 改小,或加一段「數字在 45~55 之間就當成 50」。

範例 6:手把連上才出發

僅 Pybricks v4/EV3 MicroPython v2.0/clev3r(EV3-G、Classroom 的積木讀不到這個模式)

這個範例會做什麼: 手把還沒連上時搖桿是中間、按鍵是 0,程式分不出「沒按」和「沒連上」。模式 3 的數字加了「已連線」:大於等於 256 就是手把連上了。這個範例等手把連上才嗶一聲出發,之後用方向鍵上(256+1)前進、下(256+4)後退,手把斷線就馬上停車。

要準備什麼:

  • EV3 主機+教育版基本車(左輪接 B、右輪接 C)
  • 掌控者 PS4藍牙接收器(EV3 版,韌體 v4.0 以上)+手把

怎麼接: 藍牙接收器插 1 號孔。先不要開手把,程式跑起來再開,就能看到「等待 → 連上」的過程。

下載程式(選你用的軟體):

⬇ Pybricks v4 | ⬇ EV3 MicroPython v2.0

(程式碼即範例,不需截圖。)

Pybricks v4 程式碼
# ============================================================
# 掌控者 PS4/PS5 藍牙遙控接收器 EV3 新手範例 06:手把連上才出發
# 軟體:Pybricks v4(用 Chrome 打開 https://code.pybricks.com ,EV3 版目前是 Beta)
# 接法:掌控者 PS4插 1 號孔;左輪馬達接 B、右輪馬達接 C
# 這個範例會做什麼:手把還沒連上時搖桿是中間、按鍵是 0,程式分不出「沒按」和「沒連上」。模式 3 的數字加了「已連線」:大於等於 256 就是手把連上了。這個範例等手把連上才嗶一聲出發,之後用方向鍵上(256+1)前進、下(256+4)後退,手把斷線就馬上停車。
# ============================================================

from pybricks.hubs import EV3Brick
from pybricks.ev3devices import Motor
from pybricks.iodevices import LUMPDevice
from pybricks.parameters import Port, Color
from pybricks.tools import wait

ev3 = EV3Brick()
sensor = LUMPDevice(Port.S1)       # 掌控者 PS4插 1 號孔
left_motor = Motor(Port.B)        # 左輪
right_motor = Motor(Port.C)       # 右輪


def read_status3():
    # 方向鍵+形狀鍵+連線狀態:0 ~ 511:方向鍵(0~15)+ 形狀鍵 × 16 + 已連線 × 256,大於等於 256=手把已連上
    return sensor.read(3)[0]


# ---------- 程式從這裡開始 ----------
# 清除螢幕
ev3.screen.clear()
# 螢幕顯示 WAIT PAD:等手把
ev3.screen.draw_text(0, 0, "WAIT PAD      ", Color.BLACK, Color.WHITE)
# 等到狀態值大於等於 256(手把已連上)
while not (read_status3() >= 256):
    wait(10)
# 連上了:嗶一聲
ev3.speaker.beep()
# 一直重複
while True:
    # 第 2 行顯示狀態值
    ev3.screen.draw_text(0, 16, "STATUS " + str(read_status3()) + "      ", Color.BLACK, Color.WHITE)
    # 如果狀態值小於 256(手把斷線了)
    if read_status3() < 256:
        # 手把斷線:馬上停車
        left_motor.brake()
        right_motor.brake()
        # 螢幕顯示 PAD LOST
        ev3.screen.draw_text(0, 0, "PAD LOST      ", Color.BLACK, Color.WHITE)
    else:
        # 螢幕顯示 PAD OK
        ev3.screen.draw_text(0, 0, "PAD OK      ", Color.BLACK, Color.WHITE)
        # 如果狀態值=257(已連上+方向鍵上)
        if read_status3() == 257:
            # 已連上+方向鍵上(256+1):前進
            left_motor.dc(40)
            right_motor.dc(40)
        # 否則,如果狀態值=260(已連上+方向鍵下)
        elif read_status3() == 260:
            # 已連上+方向鍵下(256+4):後退
            left_motor.dc(-40)
            right_motor.dc(-40)
        else:
            # 連上但沒按:停車
            left_motor.brake()
            right_motor.brake()
EV3 MicroPython v2.0 程式碼
#!/usr/bin/env pybricks-micropython
# ============================================================
# 掌控者 PS4/PS5 藍牙遙控接收器 EV3 新手範例 06:手把連上才出發
# 軟體:樂高官方 EV3 MicroPython v2.0(microSD 開機卡+VS Code「LEGO MINDSTORMS EV3 MicroPython」擴充套件)
# 接法:掌控者 PS4插 1 號孔;左輪馬達接 B、右輪馬達接 C
# 這個範例會做什麼:手把還沒連上時搖桿是中間、按鍵是 0,程式分不出「沒按」和「沒連上」。模式 3 的數字加了「已連線」:大於等於 256 就是手把連上了。這個範例等手把連上才嗶一聲出發,之後用方向鍵上(256+1)前進、下(256+4)後退,手把斷線就馬上停車。
# ============================================================

from pybricks.hubs import EV3Brick
from pybricks.ev3devices import Motor
from pybricks.iodevices import Ev3devSensor
from pybricks.parameters import Port, Color
from pybricks.tools import wait

ev3 = EV3Brick()
sensor = Ev3devSensor(Port.S1)     # 掌控者 PS4插 1 號孔
left_motor = Motor(Port.B)        # 左輪
right_motor = Motor(Port.C)       # 右輪


def read_status3():
    # 方向鍵+形狀鍵+連線狀態:0 ~ 511:方向鍵(0~15)+ 形狀鍵 × 16 + 已連線 × 256,大於等於 256=手把已連上
    return sensor.read('IR-REM-A')[0]


# ---------- 程式從這裡開始 ----------
# 清除螢幕
ev3.screen.clear()
# 螢幕顯示 WAIT PAD:等手把
ev3.screen.draw_text(0, 0, "WAIT PAD      ", Color.BLACK, Color.WHITE)
# 等到狀態值大於等於 256(手把已連上)
while not (read_status3() >= 256):
    wait(10)
# 連上了:嗶一聲
ev3.speaker.beep()
# 一直重複
while True:
    # 第 2 行顯示狀態值
    ev3.screen.draw_text(0, 16, "STATUS " + str(read_status3()) + "      ", Color.BLACK, Color.WHITE)
    # 如果狀態值小於 256(手把斷線了)
    if read_status3() < 256:
        # 手把斷線:馬上停車
        left_motor.brake()
        right_motor.brake()
        # 螢幕顯示 PAD LOST
        ev3.screen.draw_text(0, 0, "PAD LOST      ", Color.BLACK, Color.WHITE)
    else:
        # 螢幕顯示 PAD OK
        ev3.screen.draw_text(0, 0, "PAD OK      ", Color.BLACK, Color.WHITE)
        # 如果狀態值=257(已連上+方向鍵上)
        if read_status3() == 257:
            # 已連上+方向鍵上(256+1):前進
            left_motor.dc(40)
            right_motor.dc(40)
        # 否則,如果狀態值=260(已連上+方向鍵下)
        elif read_status3() == 260:
            # 已連上+方向鍵下(256+4):後退
            left_motor.dc(-40)
            right_motor.dc(-40)
        else:
            # 連上但沒按:停車
            left_motor.brake()
            right_motor.brake()

一步一步看懂程式:

  1. 清除螢幕
  2. 螢幕顯示 WAIT PAD:等手把
  3. 等到狀態值大於等於 256(手把已連上)
  4. 連上了:嗶一聲
  5. 一直重複
    • 第 2 行顯示狀態值
    • 如果狀態值小於 256(手把斷線了)
      • 手把斷線:馬上停車
      • 螢幕顯示 PAD LOST
      • 否則:
        • 螢幕顯示 PAD OK
        • 如果狀態值=257(已連上+方向鍵上)
          • 已連上+方向鍵上(256+1):前進
          • 否則:
            • 否則,如果狀態值=260(已連上+方向鍵下)
              • 已連上+方向鍵下(256+4):後退
              • 否則:
                • 連上但沒按:停車

跑起來應該看到: 程式跑起來先顯示 WAIT PAD,數字小於 256;打開手把,EV3 嗶一聲、顯示 PAD OK、數字變成 256。按住方向鍵上車子前進(數字 257)、按下後退(260);關掉手把,車子馬上停並顯示 PAD LOST。

常見問題:

  • 按上的時候數字不是 257? 同時按到形狀鍵會再加(形狀鍵 × 16),例如上+✕=256+1+64=321。先放開其他鍵。
  • 按鍵沒反應? 先跑範例 1 看數字有沒有變。不會變就是手把沒連上:重新開手把電源,或 EV3 先開機再接接收器。
  • 搖桿放開了車子還在慢慢動? 搖桿中間不一定剛好 50,把程式裡的 × 2 改小,或加一段「數字在 45~55 之間就當成 50」。
  • 數字一直是 0 或不會動? 感應器韌體要 v4.0(2026-10)以上才有這個模式,舊韌體請先更新。
  • EV3-G/Classroom 怎麼沒有這個範例? 這個範例用的是新模式(2026-10 韌體 v4 起),EV3-G 和 Classroom 的紅外線積木讀不到,只有 Pybricks、EV3 MicroPython、clev3r 能用。

還有問題?歡迎到 聯絡我們 留言,附上你用的軟體和程式截圖,我們會幫你看。

其他問題

  • EV3 顯示成紅外線感應器? 正常:感應器模擬成樂高原廠感應器,用原廠積木就能讀。
  • 切換模式時卡一下? EV3 每次換模式要等約 1 秒。整趟任務盡量只用同一個模式的積木。

還有問題?到 聯絡我們 附上你用的軟體和程式截圖。

下載

本頁依據

  • 主機與軟體清單:_build/guides.json
  • 值與命令:_build/protocol/ps4.json(單一真相來源)
  • 安裝與設定:_build/guides/software/ev3-pybricks.zh.md、_build/guides/product/ps4/ev3-pybricks.zh.md
  • 範例:sensors/ps4/ev3-examples.md
LINE 詢價選購指南