ものづくり界隈ではわりと有名なLogicool社製ワイヤレスゲームパッドF710は、メーカー説明ではWindowsのみ対応となっていますが、Macでも使えます。
MacでF710を使うやり方を易しく紹介してくれるサイトが少ないようなので、Anaconda Python3環境での使い方を紹介します。
以下の動画では、本記事の内容を実践するとともに、Pygameのサンプルゲームを改造してF710で遊べるようにする方法を紹介しています。
実行環境
以下の環境で動作確認しました。
項目 | バージョン |
---|---|
macOS | Catalina 10.15.7 |
Anaconda | Anaconda3-2020.11-MacOSX-x86_64 |
Python | 3.8.5 |
Pygame | 2.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側にします。
Aなどのボタンを押しながら、USB受信機を差し込みます。
ボタンを押している間、緑のランプが点滅します。
MacのメニューバーにあるAppleマークからoptionキーを押して出てくる「システム情報」を開き、以下のように表示されれば認識されています。
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は以下から購入できます。
ちなみにどこで購入したかも忘れてしまった無名のコントローラ(アナログ入力なし)も試したのですが、なぜか十字キーがHatではなく、Axeの右(3番目と4番目の数値)として値が出てきました。
このプログラムでどのように認識されるか確認してから自作ゲームなどに組み込むのが良さそうです。
まとめ
Anaconda Python3環境でPygameのライブラリを利用して、Logicool Wireless Gamepad F710の各種入力を捉える方法を紹介しました。
ケーブルがないF710は、遊びの幅が広がりそうです。
他のGamepadやJoystickでも同様に入力状態を確認できるのでご活用ください。
書籍紹介
Pythonのおすすめ書籍を紹介します。
基礎から応用までわかりやすい説明でコード例も多数載っていて、初学者の入門書としては必要十分と感じています。
さらにPythonらしいコードの書き方も言及されていて、スマートなコードが書けるようになります。
参考文献
- Joystickの入力を取得する(http://nakamura001.hatenablog.com/entry/20101212/1292163993)
- pygameを用いたゲームパッド操作機能の実装(https://sd08419ttic.hatenablog.com/entry/2019/06/26/224930)
- 【Mac】Anacondaのインストールから仮想環境作成まで(https://take6shin-tech-diary.com/mac-anaconda-install/)