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 python3 joystick_test.py

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

 

ラズパイ4で試したところ上手くゆきません。video system not initializedエラーが出るのです。試行錯誤して動いたと思ったらまた動かず。。。。。Pygameを使うとビデオ周りでこのようなエラーが出るそうです。inputs ライブラリを利用するとこういった問題を回避らしくinputsライブラリをインストールします。

pip3 install inputs

 

 

sudo nano joystick_test.py

oystick_test.pyの内容

from inputs import get_gamepad
from gpiozero import AngularServo
from gpiozero.pins.pigpio import PiGPIOFactory
import time

# GPIOの設定(PiGPIOFactoryを使って精密制御)
factory = PiGPIOFactory()
servo = AngularServo(12, min_angle=-90, max_angle=90, min_pulse_width=0.5/1000, max_pulse_width=2.4/1000, frame_width=1/50, pin_factory=factory)

def main():
    print("ジョイスティックを監視中...")
    while True:
        events = get_gamepad()
        for event in events:
            print(event.ev_type, event.code, event.state)
            if event.code == "ABS_Y":
                # ジョイスティックのY軸が動いた場合
                # 状態は -32768 から 32767 の範囲; 中央が0
                axis_value = event.state / 32767  # -1 から 1 の範囲に正規化
                angle = axis_value * 90  # 軸の値を角度に変換(-90度から90度)

                # 角度を -90 から 90 に制限
                if angle < -90: angle = -90 elif angle > 90:
                    angle = 90

                servo.angle = angle
                print(f"サーボの角度を {angle:.1f} 度に設定")

if __name__ == "__main__":
    try:
        main()
    except KeyboardInterrupt:
        print("\nプログラムを終了します...")