PS5 Access Controller with RPi Zero2 W(USB)

最終更新日

前回の続き。

PS5 Access Controller with RPi Zero2 W(BLE)

2024.08.12

今度は、BlueToothじゃなくて、USBにする。
とっても簡単。

pyusb を使ってUSBのデータを直接解析するやり方もあるけど、大変。evdevがよい。

evdev のinstall

前回やってれSKIP

sudo apt-get install -y python3-evdev

device の確認

AccessController とRPi Zero2 W をUSB接続する

$ lsusb
Bus 001 Device 003: ID 054c:0e5f Sony Corp. Access Controller
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub

ここで Access Controller がでなくれば、USB接続の問題。
配線を見直す

/dev/input/eventX

まず、 /dev/input/ を確認

$ ls -l /dev/input/event*
crw-rw----+ 1 root input 13, 64 Aug 12 15:34 /dev/input/event0
crw-rw----  1 root input 13, 65 Aug 12 15:28 /dev/input/event1
crw-rw----  1 root input 13, 66 Aug 12 15:28 /dev/input/event2

みつけたdeviceがAccessController か、一個ずつチェック

import evdev

# コントローラーのデバイスファイルを指定
device = evdev.InputDevice('/dev/input/event0')  # XをevtestでN見つけた番号に置き換えてください

print(device)

for event in device.read_loop():
    if event.type == evdev.ecodes.EV_KEY:
        keyevent = evdev.categorize(event)
        if keyevent.keystate == keyevent.key_down:
            print(keyevent.keycode)
    elif event.type == evdev.ecodes.EV_ABS:
        absevent = evdev.categorize(event)
        print(absevent.event.code, absevent.event.value)

実行

$ python check_usb.py
device /dev/input/event0, name "Sony Interactive Entertainment Access Controller", phys "usb-3f980000.usb-1/input0"

sample プログラム


# コントローラーの正確なデバイスファイルを指定
device = evdev.InputDevice('/dev/input/event0')

print(f"Device: {device.name}")
import evdev

# コントローラーの正確なデバイスファイルを指定
device = evdev.InputDevice('/dev/input/event0')

print(f"Device: {device.name}")

for event in device.read_loop():
    if event.type == evdev.ecodes.EV_KEY:
        keyevent = evdev.categorize(event)
        if keyevent.keystate == keyevent.key_down:
            print(f"Button pressed: {keyevent.keycode}")
    elif event.type == evdev.ecodes.EV_ABS:
        absevent = evdev.categorize(event)
        print(f"Analog input: {evdev.ecodes.ABS[absevent.event.code]} - Value: {absevent.event.value}")

実行結果

Device: Sony Interactive Entertainment Access Controller
Button pressed: ['BTN_WEST', 'BTN_Y']
Button pressed: BTN_Z
Analog input: ABS_X - Value: 127
Analog input: ABS_X - Value: 128
Analog input: ABS_X - Value: 130
Analog input: ABS_X - Value: 132
Analog input: ABS_X - Value: 135

シェアする