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プログラムを終了します...")