掌控者 PS2 (PS2) × EV3 × clev3r

互動教學EV3

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

這一頁只講 clev3r(EV3 BASIC):在 MINDSTORMS EV3 上用它讀掌控者 PS2 (PS2)的安裝步驟、每個值怎麼讀、能用的命令與範例。要換產品、主機或軟體,用上方的切換列。

安裝與設定

你需要

  • 感應器:掌控者 PS2 (PS2)(EV3 版,RJ12 接頭)。
  • 主機:LEGO MINDSTORMS EV3。
  • 軟體:clev3r(EV3 的 BASIC 語言開發環境,也叫 EV3 Basic)。本站測試的版本是 v1.7.1.0。已經在用 clev3r 的人選這個。

安裝軟體

  1. 安裝 clev3r(建議 v1.7.1.0)。
  2. 打開範例:在 clev3r 開啟 .bp 檔 → 按「編譯並下載」→ 在 EV3 的檔案選單找到 MBC_ 開頭的資料夾執行。

讓軟體認得感應器

不用裝擴充。感應器在 EV3 上會模擬成樂高原廠感應器(多數產品是「紅外線感應器」),讀取模式跟 EV3 官方軟體完全一樣:Proximity/Beacon/Remote 三種,數值範圍也相同。

  • 用 BASIC 的 IR_PROXIMITY/IR_BEACON/IR_REMOTE 等指令讀取,看下面的讀值。
  • clev3r 也讀得到 EV3-G、Classroom 讀不到的模式,標「僅 Pybricks/EV3 MicroPython/clev3r」的範例也能跑。
  • 有些產品附 MBC 專屬副程式(Subroutines),已經放在範例檔裡。

重要

不要在程式中途切換模式。 EV3 主機每次切換感應器模式都會卡住一下(約 1 秒)。程式一開始選定一種模式,整趟任務都用它。

接線

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

讓手把連上接收器

PS2 的 2.4G 手把和它的接收頭是原廠成對的,不用按任何配對鍵。

  1. 接收器接好、主機開機。
  2. 打開手把電源,手把會自己連上。
  3. 看接收器板子上的綠燈:亮著=還沒接到手把;熄掉=已經接到手把。
  4. 手把上的 ANALOG(或 MODE)燈要亮,搖桿才有數值。接收器一接上手把會自動切到這個模式;燈沒亮就按一下手把中間的 ANALOG 鍵。

危險

2.4GHz 是公共頻段,跟 Wi-Fi、微波爐共用。同一場地有 12 套以上同時使用時可能互相干擾,這種場合建議改用藍牙版(PS4/PS5)。

提示

掌控者 PS2 的 EV3/SPIKE App/Pybricks 積木用法也整理在 指令說明(PDF)。

第一次測試

  1. 開啟本頁範例 1 的 .bp,按「編譯並下載」。
  2. 在 EV3 檔案選單找到 MBC_ 開頭的資料夾執行。
  3. EV3 螢幕上的數字跟著感應器前方的東西變化,就是接好了。

常見問題

  • 在 EV3 上找不到程式? 到 EV3 的檔案選單,找 MBC_ 開頭的資料夾。
  • 數字一直不變? 拔掉感應器重插一次(EV3 要先開機再插)。
  • 程式跑一跑會頓一下? 程式裡切換了感應器模式,改成只用一種模式。

讀值

程式假設感應器插 1 號孔:Sensor.SetMode 選模式、Sensor.ReadRawValue 讀第幾個值。

方向鍵 dpad

方向鍵
範圍 意思
0~15 bit 上 1、右 2、下 4、左 8(同時按相加),0~15;未連線 = 0
' clev3r (BASIC)
Sensor.SetMode(1, 0)
dpad = Sensor.ReadRawValue(1, 0)
Sensor.SetMode(1, 1)
dpad = Sensor.ReadRawValue(1, 0)
Sensor.SetMode(1, 3)
w = Sensor.ReadRawValue(1, 0)
dpad = Math.Remainder(w, 16)   ' bit 0~3
Sensor.SetMode(1, 4)
dpad = Sensor.ReadRawValue(1, 0)

模式 0 · int8 · IR-PROX = 方向鍵(.ino:130-132);模式 1 · int8 · IR-SEEK [方向, LX, 形狀, LY, 肩, RX, 功能, RY](按鍵與搖桿交錯);模式 3 · int16 · #67 改:IR-REM-A 1×int16 = 方向 | 形狀<<4 | 已連線<<8(bit0-3 = 方向);模式 4 · int8 · IR-S-ALT [方向, LX, 形狀, LY](已鎖住的模式,韌體與主機端都不再改)

形狀鍵 shape

形狀鍵
範圍 意思
0~15 bit ▲ 1、● 2、✕ 4、■ 8(同時按相加),0~15;未連線 = 0;0x22 的 R 高 4 bit
' clev3r (BASIC)
Sensor.SetMode(1, 1)
shape = Sensor.ReadRawValue(1, 2)
Sensor.SetMode(1, 3)
w = Sensor.ReadRawValue(1, 0)
shape = Math.Remainder(Math.Floor(w / 16), 16)   ' bit 4~7
Sensor.SetMode(1, 4)
shape = Sensor.ReadRawValue(1, 2)

模式 1 · int8;模式 3 · int16 · #67 改:bit4-7 = 形狀(同一個 int16);模式 4 · int8(已鎖住的模式,韌體與主機端都不再改)

肩鍵 shoulder

肩鍵
範圍 意思
0~15 bit L2 1、R2 2、L1 4、R1 8(同時按相加),0~15;未連線 = 0
' clev3r (BASIC)
Sensor.SetMode(1, 1)
shoulder = Sensor.ReadRawValue(1, 4)

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

功能鍵 func

功能鍵
範圍 意思
0~15 bit SELECT 1、L3 2、R3 4、START 8(同時按相加),0~15;未連線 = 0;0x22 的 G 高 4 bit
' clev3r (BASIC)
Sensor.SetMode(1, 1)
func = Sensor.ReadRawValue(1, 6)

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

已連線 connected

範圍 意思
0~1 1 = 手把已連線(psx.read() 成功),0 = 沒有;未連線時所有按鍵 0、搖桿回中
' clev3r (BASIC)
Sensor.SetMode(1, 3)
w = Sensor.ReadRawValue(1, 0)
connected = Math.Remainder(Math.Floor(w / 256), 2)   ' bit 8

模式 3 · int16 · #67 改:bit8 = 已連線(+256)

搖桿 LX/LY/RX/RY stick

搖桿 LX/LY/RX/RY
範圍 意思
-100~+100(EV3 模式 1、模式 2、模式 4 讀到的是換算值:0~99(50 = 中間)) 10 LX、11 LY、12 RX、13 RY:−100 ~ +100,0 = 中間,右/上為正(原始 0255 死區 ±7 吸成中心);未連線 = 0。EV3/SPIKE/MATRIX 送的是 099(50 = 中間)或 1~9(5 = 中間),見各平台欄
' clev3r (BASIC)
Sensor.SetMode(1, 1)
stick1 = Sensor.ReadRawValue(1, 1)   ' 第 1 筆;第 N 筆的 index = 1 + 2×(N − 1)(1、3、5、7)
Sensor.SetMode(1, 2)
stick1 = Sensor.ReadRawValue(1, 0)   ' 第 1 筆;第 N 筆改成 0 + N - 1
Sensor.SetMode(1, 4)
stick1 = Sensor.ReadRawValue(1, 1)   ' 第 1 筆;第 N 筆的 index = 1 + 2×(N − 1)(1、3)

模式 1 · int8 · 交錯:index 1 = LX、3 = LY、5 = RX、7 = RY(偶數 index 是按鍵);模式 2 · int8 · IR-REMOTE [LX, LY, RX, RY](描述表宣告 0~10,實送 0~99);模式 4 · int8 · index 1 = LX、3 = LY(只到左搖桿)(已鎖住的模式,韌體與主機端都不再改)

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

命令

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

範例

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

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

要準備什麼:

  • 掌控者 PS22.4G 接收器(EV3 版)+手把
  • EV3 主機

怎麼接: 2.4G 接收器插 1 號孔。打開 PS2 手把電源,接收器的燈恆亮就是配對好了。

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

⬇ clev3r

clev3r 程式碼
' ============================================================
' 掌控者 PS2 2.4G 遙控接收器 EV3 新手範例 01:按鍵測試器:看看每個按鍵的數字
' 軟體:clev3r
' 接法:掌控者 PS2插 1 號孔;左輪馬達接 B、右輪馬達接 C
' 這個範例會做什麼:模式 1 一次送出 8 個數字:4 組按鍵和 4 個搖桿值。這個範例把它們全部顯示在螢幕上,按按看、推推看,就知道每個按鍵是多少。
' 讀值:dpad1=方向鍵(上 1、右 2、下 4、左 8)(0 ~ 15);shape=形狀鍵(▲1、●2、✕4、■8)(0 ~ 15);shoulder=肩鍵(L2 1、R2 2、L1 4、R1 8)(0 ~ 15);func=功能鍵(SELECT 1、L3 2、R3 4、START 8)(0 ~ 15);lx=左搖桿左右(0 ~ 99,50=中間,往右變大);ly=左搖桿上下(0 ~ 99,50=中間,往上變大);rx=右搖桿左右(0 ~ 99,50=中間,往右變大);ry=右搖桿上下(0 ~ 99,50=中間,往上變大)
' ============================================================
folder "prjs" "MBC_ps2_ex01"

' 掌控者 PS2插 1 號孔,使用模式 1
Sensor.SetMode(1, 1)
LCD.Clear()

' 清除螢幕
LCD.Clear()
' 一直重複
While "True"
  ' 方向鍵:上 1、右 2、下 4、左 8
  LCD.Text(1, 0, 0, 1, "DPAD " + Sensor.ReadRawValue(1, 0) + "      ")
  ' 形狀鍵:▲1、●2、✕4、■8
  LCD.Text(1, 0, 16, 1, "SHAPE " + Sensor.ReadRawValue(1, 2) + "      ")
  ' 肩鍵:L2 1、R2 2、L1 4、R1 8
  LCD.Text(1, 0, 32, 1, "SHLD " + Sensor.ReadRawValue(1, 4) + "      ")
  ' 功能鍵:SELECT 1、L3 2、R3 4、START 8
  LCD.Text(1, 0, 48, 1, "FUNC " + Sensor.ReadRawValue(1, 6) + "      ")
  ' 左搖桿左右(50=中間)
  LCD.Text(1, 0, 64, 1, "LX " + Sensor.ReadRawValue(1, 1) + "      ")
  ' 左搖桿上下(50=中間)
  LCD.Text(1, 0, 80, 1, "LY " + Sensor.ReadRawValue(1, 3) + "      ")
  ' 右搖桿左右
  LCD.Text(1, 0, 96, 1, "RX " + Sensor.ReadRawValue(1, 5) + "      ")
  ' 右搖桿上下
  LCD.Text(1, 0, 112, 1, "RY " + Sensor.ReadRawValue(1, 7) + "      ")
  ' 等 0.1 秒
  Program.Delay(100)
EndWhile

一步一步看懂程式:

  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)
  • 掌控者 PS22.4G 接收器(EV3 版)+手把

怎麼接: 2.4G 接收器插 1 號孔。打開 PS2 手把電源,接收器的燈恆亮就是配對好了。

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

⬇ clev3r

clev3r 程式碼
' ============================================================
' 掌控者 PS2 2.4G 遙控接收器 EV3 新手範例 02:方向鍵開車
' 軟體:clev3r
' 接法:掌控者 PS2插 1 號孔;左輪馬達接 B、右輪馬達接 C
' 這個範例會做什麼:用模式 0 只讀方向鍵,上前進、下後退、左右原地轉,放開就停。
' 讀值:dpad=方向鍵(上 1、右 2、下 4、左 8,同時按會相加)(0 ~ 15)
' ============================================================
folder "prjs" "MBC_ps2_ex02"

' 掌控者 PS2插 1 號孔,使用模式 0
Sensor.SetMode(1, 0)
LCD.Clear()

' 一直重複
While "True"
  ' 如果方向鍵=1(上)
  If Sensor.ReadRawValue(1, 0) = 1 Then
    ' 按上:前進
    Motor.StartPower("B", 50)
    Motor.StartPower("C", 50)
  ' 否則,如果方向鍵=4(下)
  ElseIf Sensor.ReadRawValue(1, 0) = 4 Then
    ' 按下:後退
    Motor.StartPower("B", -50)
    Motor.StartPower("C", -50)
  ' 否則,如果方向鍵=8(左)
  ElseIf Sensor.ReadRawValue(1, 0) = 8 Then
    ' 按左:原地左轉
    Motor.StartPower("B", -30)
    Motor.StartPower("C", 30)
  ' 否則,如果方向鍵=2(右)
  ElseIf Sensor.ReadRawValue(1, 0) = 2 Then
    ' 按右:原地右轉
    Motor.StartPower("B", 30)
    Motor.StartPower("C", -30)
  Else
    ' 都沒按:停車
    Motor.Stop("BC", "True")
  EndIf
EndWhile

一步一步看懂程式:

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

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

常見問題:

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

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

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

要準備什麼:

  • EV3 主機
  • 一顆大馬達接 B
  • 掌控者 PS22.4G 接收器(EV3 版)+手把

怎麼接: 2.4G 接收器插 1 號孔。打開 PS2 手把電源,接收器的燈恆亮就是配對好了。

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

⬇ clev3r

clev3r 程式碼
' ============================================================
' 掌控者 PS2 2.4G 遙控接收器 EV3 新手範例 03:左搖桿控制一顆馬達的快慢
' 軟體:clev3r
' 接法:掌控者 PS2插 1 號孔;左輪馬達接 B、右輪馬達接 C
' 這個範例會做什麼:搖桿的數字是 0~99、中間 50。把它減 50 再乘 2,就變成馬達要的 -100~+100:推越多轉越快,往下推就倒轉。
' 讀值:ly=左搖桿上下(0 ~ 99,50=中間,往上變大)
' ============================================================
folder "prjs" "MBC_ps2_ex03"

' 掌控者 PS2插 1 號孔,使用模式 1
Sensor.SetMode(1, 1)
LCD.Clear()

' 一直重複
While "True"
  ' 力量 power =(左搖桿上下 − 50)× 2
  power = (Sensor.ReadRawValue(1, 3) - 50) * 2
  ' B 馬達用 power 的力量轉
  Motor.StartPower("B", power)
  ' 螢幕顯示現在的力量
  LCD.Text(1, 0, 0, 1, "POWER " + power + "      ")
EndWhile

一步一步看懂程式:

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

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

常見問題:

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

範例 4:雙搖桿坦克車

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

要準備什麼:

  • EV3 主機+教育版基本車(左輪接 B、右輪接 C)
  • 掌控者 PS22.4G 接收器(EV3 版)+手把

怎麼接: 2.4G 接收器插 1 號孔。打開 PS2 手把電源,接收器的燈恆亮就是配對好了。

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

⬇ clev3r

clev3r 程式碼
' ============================================================
' 掌控者 PS2 2.4G 遙控接收器 EV3 新手範例 04:雙搖桿坦克車
' 軟體:clev3r
' 接法:掌控者 PS2插 1 號孔;左輪馬達接 B、右輪馬達接 C
' 這個範例會做什麼:左搖桿管左輪、右搖桿管右輪,跟開坦克一樣:兩個都往前推就前進,一前一後就原地轉。
' 讀值:ly=左搖桿上下(0 ~ 99,50=中間,往上變大);ry=右搖桿上下(0 ~ 99,50=中間,往上變大)
' ============================================================
folder "prjs" "MBC_ps2_ex04"

' 掌控者 PS2插 1 號孔,使用模式 1
Sensor.SetMode(1, 1)
LCD.Clear()

' 一直重複
While "True"
  ' 左輪力量 =(左搖桿上下 − 50)× 2
  left = (Sensor.ReadRawValue(1, 3) - 50) * 2
  ' 右輪力量 =(右搖桿上下 − 50)× 2
  right = (Sensor.ReadRawValue(1, 7) - 50) * 2
  ' 兩輪各自用自己的力量轉
  Motor.StartPower("B", left)
  Motor.StartPower("C", right)
EndWhile

一步一步看懂程式:

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

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

常見問題:

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

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

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

要準備什麼:

  • EV3 主機
  • 中馬達接 A(做成夾爪)
  • 掌控者 PS22.4G 接收器(EV3 版)+手把

怎麼接: 2.4G 接收器插 1 號孔。打開 PS2 手把電源,接收器的燈恆亮就是配對好了。

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

⬇ clev3r

clev3r 程式碼
' ============================================================
' 掌控者 PS2 2.4G 遙控接收器 EV3 新手範例 05:✕ 夾、● 放:控制夾爪
' 軟體:clev3r
' 接法:掌控者 PS2插 1 號孔;左輪馬達接 B、右輪馬達接 C
' 這個範例會做什麼:用形狀鍵控制接在 A 埠的中馬達(夾爪):按 ✕ 夾緊、按 ● 放開,都不按就停。
' 讀值:shape=形狀鍵(▲1、●2、✕4、■8)(0 ~ 15)
' ============================================================
folder "prjs" "MBC_ps2_ex05"

' 掌控者 PS2插 1 號孔,使用模式 1
Sensor.SetMode(1, 1)
LCD.Clear()

' 一直重複
While "True"
  ' 如果形狀鍵=4(✕)
  If Sensor.ReadRawValue(1, 2) = 4 Then
    ' 按 ✕:夾爪往夾緊的方向轉
    Motor.StartPower("A", 40)
  ' 否則,如果形狀鍵=2(●)
  ElseIf Sensor.ReadRawValue(1, 2) = 2 Then
    ' 按 ●:夾爪往放開的方向轉
    Motor.StartPower("A", -40)
  Else
    ' 都沒按:夾爪停住
    Motor.Stop("A", "True")
  EndIf
EndWhile

一步一步看懂程式:

  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)
  • 掌控者 PS22.4G 接收器(EV3 版,韌體 v4.0 以上)+手把

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

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

⬇ clev3r

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

clev3r 程式碼
' ============================================================
' 掌控者 PS2 2.4G 遙控接收器 EV3 新手範例 06:手把連上才出發
' 軟體:clev3r
' 接法:掌控者 PS2插 1 號孔;左輪馬達接 B、右輪馬達接 C
' 這個範例會做什麼:手把還沒連上時搖桿是中間、按鍵是 0,程式分不出「沒按」和「沒連上」。模式 3 的數字加了「已連線」:大於等於 256 就是手把連上了。這個範例等手把連上才嗶一聲出發,之後用方向鍵上(256+1)前進、下(256+4)後退,手把斷線就馬上停車。
' 讀值:status3=方向鍵+形狀鍵+連線狀態(0 ~ 511:方向鍵(0~15)+ 形狀鍵 × 16 + 已連線 × 256,大於等於 256=手把已連上)
' ============================================================
folder "prjs" "MBC_ps2_ex06"

' 掌控者 PS2插 1 號孔,使用模式 3
Sensor.SetMode(1, 3)
LCD.Clear()

' 清除螢幕
LCD.Clear()
' 螢幕顯示 WAIT PAD:等手把
LCD.Text(1, 0, 0, 1, "WAIT PAD      ")
' 等到狀態值大於等於 256(手把已連上)
While Sensor.ReadRawValue(1, 0) < 256
  Program.Delay(10)
EndWhile
' 連上了:嗶一聲
Speaker.Tone(50, 1000, 100)
Speaker.Wait()
' 一直重複
While "True"
  ' 第 2 行顯示狀態值
  LCD.Text(1, 0, 16, 1, "STATUS " + Sensor.ReadRawValue(1, 0) + "      ")
  ' 如果狀態值小於 256(手把斷線了)
  If Sensor.ReadRawValue(1, 0) < 256 Then
    ' 手把斷線:馬上停車
    Motor.Stop("BC", "True")
    ' 螢幕顯示 PAD LOST
    LCD.Text(1, 0, 0, 1, "PAD LOST      ")
  Else
    ' 螢幕顯示 PAD OK
    LCD.Text(1, 0, 0, 1, "PAD OK      ")
    ' 如果狀態值=257(已連上+方向鍵上)
    If Sensor.ReadRawValue(1, 0) = 257 Then
      ' 已連上+方向鍵上(256+1):前進
      Motor.StartPower("B", 40)
      Motor.StartPower("C", 40)
    ' 否則,如果狀態值=260(已連上+方向鍵下)
    ElseIf Sensor.ReadRawValue(1, 0) = 260 Then
      ' 已連上+方向鍵下(256+4):後退
      Motor.StartPower("B", -40)
      Motor.StartPower("C", -40)
    Else
      ' 連上但沒按:停車
      Motor.Stop("BC", "True")
    EndIf
  EndIf
EndWhile

一步一步看懂程式:

  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/ps2.json(單一真相來源)
  • 安裝與設定:_build/guides/software/ev3-clev3r.zh.md、_build/guides/product/ps2/ev3-clev3r.zh.md
  • 範例:sensors/ps2/ev3-examples.md
LINE 詢價選購指南