Raspberry Pi 5にUSBゲームパットコントローラを接続して数値をとってみた。

Raspberry Pi 5にUSBゲームパットコントローラを接続しました。python3-pygameを使います。その他必要な初期設定は完了しているとします。

sudo apt update && sudo apt upgrade
sudo apt install python3-pygame

Pythonのpygameライブラリがジョイスティックなどを認識する際に、デバイス名で接続します。USBゲームパットコントローラの名前を調べます。

sudo python3 -c "import pygame; pygame.init(); pygame.joystick.init(); [print(pygame.joystick.Joystick(i).get_name()) for i in range(pygame.joystick.get_count())]"

Logitech Gamepad F310であることがわかりました。Logitech Gamepad F310を認識するように以下に設定します。

sudo nano joystick_test.py

oystick_test.pyの内容

import pygame
import time

# Pygameの初期化
pygame.init()

# ジョイスティックの初期化
pygame.joystick.init()

# ターゲットとするコントローラーの名前を指定
target_joystick_name = "Logitech Gamepad F310"

# 利用可能なジョイスティックの中から目的のデバイスを検索
target_joystick_index = None
joystick_count = pygame.joystick.get_count()
for i in range(joystick_count):
    joystick = pygame.joystick.Joystick(i)
    joystick.init()
    if target_joystick_name in joystick.get_name():
        target_joystick_index = i
        print(f"目的のコントローラーが見つかりました: インデックス {i} - {joystick.get_name()}")
        break
else:
    print("目的のコントローラーが接続されていません。")
    pygame.quit()
    exit()

# ターゲットのジョイスティックを初期化
joystick = pygame.joystick.Joystick(target_joystick_index)
joystick.init()

# 入力をリアルタイムで取得するループ
try:
    while True:
        pygame.event.pump()  # イベントを更新
        # ジョイスティックの軸の動きを取得
        for i in range(joystick.get_numaxes()):
            axis_value = joystick.get_axis(i)
            print(f"軸 {i}: {axis_value:.3f}")

        # ボタンの状態を取得
        for i in range(joystick.get_numbuttons()):
            button_value = joystick.get_button(i)
            if button_value:
                print(f"ボタン {i} が押されました")

        # ハットスイッチの状態を取得
        for i in range(joystick.get_numhats()):
            hat_value = joystick.get_hat(i)
            print(f"ハットスイッチ {i}: {hat_value}")

        time.sleep(0.1)  # ちょっと待つ

except KeyboardInterrupt:
    # プログラムを終了する場合
    print("\n終了します...")
    pygame.quit()

自動起動する場合はゲームパットのsudo権限を解除しておきたいので、以下ルールを追加すればと思いますが、動作未検証です。メモメモメモ。

sudo nano /etc/udev/rules.d/99-joystick.rules
KERNEL=="event*", ATTRS{idVendor}=="046d", ATTRS{idProduct}=="c21d", MODE="0666"

以下実行します。

sudo python3 joystick_test.py

以下ゲームパットの情報が取得できました。

 

ラズパイ4でやってみたら上手く行かなくて以下など試行錯誤していたら動くようになりました。パーミッションの何かのようです。メモメモ。

sudo apt-get install joystick
jstest /dev/input/js0

にてジョイスティックの動作テスト

ls -l joystick_test.py
sudo chown $USER:$USER joystick_test.py

sudo usermod -aG input $USER