🎮

ラズパイでゲームパッドの入力を取得 🎮

2022/01/15に公開

はじめに

ラズベリーパイでジョイステックなどのなんらかの入力を受けるときはブラウザを使ってWi-Fi経由で信号を送信するすることが多いですが、やっぱり物理ボタンで操作したい!というときはゲームパッドが役に立ちます。

今回は2,000円台で販売されているELECOMのPCゲームパッドの信号をラズパイで取得してみたいと思います。

今回使うもの

ラズパイ - Raspberry Pi Model B
ワイヤレスゲームパッド - JC-U4113SBK
Python 3.9.2

pygameのインストール

ゲームパッドの入力を取得するにはpygameを使用します。
pygameはゲームパッドの入力を取得するだけでなくPythonで簡単なゲームを作成することができるライブラリです。
aptでインストール

$ sudo pip3 install pygame

ゲームパッドの入力を取得するプログラム

関数の説明

map_axis()

ジョイスティックの値を扱いやすいようにするための関数。
中央位置から上と右に倒したときは1〜100、下と左に倒したときは-1〜-100の値を出力。

map_axis_t()

L2、R2のトリガーボタンをの値を扱いやすいようにするための関数。
開放状態を0、押し込んだ時を100の0〜100の値を出力。

pygame.joystick.Joystick()

.get_axis()
 ジョイスティックの値を取得。

.get_hat()
 トリガーボタンの値を取得。

.get_button()
 ボタン類の値を取得。

gamepad.py
import pygame


# pygame初期化
pygame.init()
joystick = pygame.joystick.Joystick(0)
joystick.init()


# ジョイスティックの出力数値を調整
def map_axis(val):
    val = round(val, 2)
    in_min = -1
    in_max = 1
    out_min = -100
    out_max = 100
    return int((val - in_min) * (out_max - out_min) / (in_max - in_min) + out_min)


# ジョイスティックの出力数値を調整(L2 R2ボタン)
def map_axis_t(val):
    val = map_axis(val)
    if val <= 0 and val >= -100:
        in_min = -100
        in_max = 0
        out_min = 0
        out_max = 50
        return int((val - in_min) * (out_max - out_min) / (in_max - in_min) + out_min)
    else:
        in_min = 0
        in_max = 100
        out_min = 50
        out_max = 100
        return int((val - in_min) * (out_max - out_min) / (in_max - in_min) + out_min)


def main():
    while True:
        # イベントチェック
        if pygame.event.get():
            gamepad_data = {
                "joy_lx": map_axis(joystick.get_axis(0)),
                "joy_ly": -map_axis(joystick.get_axis(1)),
                "joy_rx": map_axis(joystick.get_axis(3)),
                "joy_ry": -map_axis(joystick.get_axis(4)),
                "joy_lt": map_axis_t(joystick.get_axis(2)),
                "joy_rt": map_axis_t(joystick.get_axis(5)),
                "hat_x": joystick.get_hat(0)[0],
                "hat_y": joystick.get_hat(0)[1],
                "btn_a": joystick.get_button(0),
                "btn_b": joystick.get_button(1),
                "btn_x": joystick.get_button(2),
                "btn_y": joystick.get_button(3),
                "btn_lb": joystick.get_button(4),
                "btn_rb": joystick.get_button(5),
                "btn_back": joystick.get_button(6),
                "btn_start": joystick.get_button(7),
                "btn_guide": joystick.get_button(8),
                "btn_joyl": joystick.get_button(9),
                "btn_joyr": joystick.get_button(10)
            }
            print(gamepad_data)


if __name__ == '__main__':
    main()

プログラム実行

$ sudo python3 gamepad.py

終わり

以上、ゲームパッドとラズパイでラジコンカーやドローンを作成してみると面白いかもです!

次回はゲームパッドでサーボモータを動かしてみたいと思います。
 →「ラズパイでサーボモータを制御(PCA9685)

Discussion