MacでWireless Gamepad F710を使う(Pygame使用)

スポンサーリンク

ものづくり界隈ではわりと有名なLogicool社製ワイヤレスゲームパッドF710は、メーカー説明ではWindowsのみ対応となっていますが、Macでも使えます。

MacでF710を使うやり方を易しく紹介してくれるサイトが少ないようなので、Anaconda Python3環境での使い方を紹介します。

以下の動画では、本記事の内容を実践するとともに、Pygameのサンプルゲームを改造してF710で遊べるようにする方法を紹介しています。

MacでLogicool Wireless Gamepad F710を使う(Pygame使用)

実行環境

以下の環境で動作確認しました。

項目バージョン
macOSCatalina 10.15.7
AnacondaAnaconda3-2020.11-MacOSX-x86_64
Python3.8.5
Pygame2.0.1

環境構築

Anacondaインストール

Python3の作業環境としてAnacondaがおすすめなので、以下の記事に従ってAnacondaをインストールし、任意の名称で仮想環境を作成します。

以降は仮想環境名をGamepadにしたとして説明します。

Pygameインストール

作成したAnacondaの仮想環境Gamepadのターミナルを立ち上げ、以下を実行します。

pip install pygame

上記の方法でPygameをインストールした方は、次の節をスキップして、「Gamepadの動作確認」へ進んでください。

(参考)Anacondaをインストールしない方法

Gamepadを動かすためだけにAnacondaのようなサイズの大きいアプリをインストールするのが嫌だという場合は、通常のターミナルから以下でインストールできます。

※Anaconda仮想環境からpipでインストールした場合、下記は実行不要

/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
curl https://bootstrap.pypa.io/get-pip.py -o get-pip.py
python3 get-pip.py
python3 -m pip install -U pygame --user

HomeBrewをインストール済みの場合は1行目は不要です。

Gamepadの動作確認

F710に単3電池を入れ、上面にあるスイッチをD側にします。

F710 Switch

Aなどのボタンを押しながら、USB受信機を差し込みます。

Install F710

ボタンを押している間、緑のランプが点滅します。

ボタンを押しながら差し込むのがポイントです。

MacのメニューバーにあるAppleマークからoptionキーを押して出てくる「システム情報」を開き、以下のように表示されれば認識されています。

USB device recognition

ドライバなどのインストールは必要ありません。

GitHubからGamepad動作確認用のプログラムをダウンロードして、できたjoystickフォルダに移動します。

git clone https://github.com/tak6uch1/joystick
cd joystick

以下のコマンドでGamepad動作確認用プログラムjoystick.pyを実行します。

python joystick.py

joystick.pyの中身は以下です。

# Copyright (c) 2021 Takenoshin
# Released under the MIT license
# https://opensource.org/licenses/mit-license.php

import time
from decimal import Decimal
import pygame

def main():
    pygame.init()
    joy = pygame.joystick.Joystick(0)
    joy.init()
    try:
        n_btn = joy.get_numbuttons()
        n_axe = joy.get_numaxes()
        n_hat = joy.get_numhats()
        print("Joystick Name: " + joy.get_name())
        print("Number of Button : " + str(n_btn))
        print("Number of Axis : " + str(n_axe))
        print("Number of Hats : " + str(n_hat))

        pygame.event.get()
        s_btn = [0] * n_btn
        s_axe = [0.0] * n_axe
        s_hat = [0] * n_hat
        while True:
            # Buttons
            for i in range(n_btn):
                s_btn[i] = joy.get_button(i)
            # Axes
            for i in range(n_axe):
                #s_axe[i] = round(joy.get_axis(i), 2)
                s_axe[i] = float(Decimal(joy.get_axis(i)).quantize(Decimal('0.01')))
            # Hats
            for i in range(n_hat):
                s_hat[i] = joy.get_hat(i)

            print("Btn", end="")
            print(s_btn, end="")
            print("  Axe", end="")
            print(s_axe, end="")
            print("  Hat", end="")
            print(s_hat)
            #pygame.event.pump()
            pygame.event.get()

            time.sleep(0.1)
    except( KeyboardInterrupt, SystemExit): # Exit with Ctrl-C
        print("Exit")

if __name__ == "__main__":
    main()

0.1秒ごとにボタン(Btn)、アナログレバー(Axe)、十字キー(Hat)の入力状態をチェックして画面表示しています。

pygame 2.0.1 (SDL 2.0.14, Python 3.8.5)
Hello from the pygame community. https://www.pygame.org/contribute.html
Joystick Name: Logicool Cordless RumblePad 2
Number of Button : 12
Number of Axis : 4
Number of Hats : 1
Btn[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]  Axe[0.0, -0.0, 0.0, -0.0]  Hat[(0, 0)]
Btn[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]  Axe[0.0, -0.0, 0.0, -0.0]  Hat[(0, 0)]
Btn[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]  Axe[0.0, -0.0, 0.0, -0.0]  Hat[(0, 0)]
Btn[0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0]  Axe[-1.0, -0.01, 0.0, -0.0]  Hat[(0, 0)]
Btn[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]  Axe[0.78, 1.0, 0.0, -0.0]  Hat[(0, 0)]
Btn[0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]  Axe[0.0, 0.08, 0.0, -0.0]  Hat[(-1, 0)]
Btn[1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]  Axe[1.0, 0.65, 0.0, -0.0]  Hat[(-1, 0)]
Btn[1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]  Axe[0.0, -0.0, 0.0, -0.0]  Hat[(-1, 0)]
Btn[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]  Axe[-0.97, -0.57, 0.0, -0.0]  Hat[(-1, 0)]

数値が0以外になっている箇所が何らかの入力に反応している部分になります。

F710の場合、それぞれの数値の並びは以下でした。

Btn[ X, A, B, Y, LB, RB, LT, RT, BACK, START, (動かせず), (動かせず) ]
Axe[ アナログ左-左右方向, アナログ左-上下方向, アナログ右-左右方向, アナログ右-上下方向 ]
Hat[ 左右方向, 上下方向 ]

AxeとHatの左右方向は、-1〜+1の値を取り、マイナスは左、プラスは右です。

上下方向も同じく-1〜+1ですが、向きがAxeとHatで異なっており、Axeではマイナスは上、プラスは下、Hatではマイナスが下、プラスは上でした。

終了するにはcontrol+Cを押します。

このようにPython3プログラムからGamepadの入力値を取得することができるので、自作ゲームやものづくりに応用してください。

なお、F710は以下から購入できます。

ロジクール ワイヤレスゲームパッド F710

ちなみにどこで購入したかも忘れてしまった無名のコントローラ(アナログ入力なし)も試したのですが、なぜか十字キーがHatではなく、Axeの右(3番目と4番目の数値)として値が出てきました。

Other Gamepad

このプログラムでどのように認識されるか確認してから自作ゲームなどに組み込むのが良さそうです。

まとめ

Anaconda Python3環境でPygameのライブラリを利用して、Logicool Wireless Gamepad F710の各種入力を捉える方法を紹介しました。

ケーブルがないF710は、遊びの幅が広がりそうです。

他のGamepadやJoystickでも同様に入力状態を確認できるのでご活用ください。

参考文献

タイトルとURLをコピーしました