ArduinoJoystickLibrary(AJL)というものが公開されていて、arduinoをUSBゲームパッド(ジョイスティック)として振舞わせることができます。
わざわざ自分で作らなくてもゲームパッドを買ってくればよいのですが、操作が複雑だったり特殊だったりして、一般的なゲームパッドではまともに操作できない場合があります。例えばEuroTruckSimulator2(ETS2)やMicrosoftFlightSimulator(MSFS)などです。フライトスティックやハンドルコントローラーといった専用品も売られていますが、自分の好きな配置のコントローラーで遊べるというのは市販品では実現できません。
何回かに分けてETS2やMSFSで使えるゲームコントローラーを自作する方法を紹介したいと思います。また、ArduinoはProMicroを使います。実用的な大きさと、値段の安さで選んでいます。
ライブラリのインストール
まずは専用のライブラリ(AJL)をArduinoIDEにインストールしてください。
GithubからダウンロードしてArduinoのLibraryフォルダにコピーしてください。ArduinoIDEの”ライブラリを管理”から検索してインストールしてもOKです。
動作確認
まずは一番簡単なスケッチです。最初の例は、自動でボタン1を1秒ごとに押してくれる、ボタンが1つだけのゲームパッドです。
#include <Joystick.h> #include <Wire.h> Joystick_ Joystick = Joystick_( 0x03, // reportid JOYSTICK_TYPE_GAMEPAD, // type 1, // button count 0, // hat switch count false, // x axis enable false, // y axis enable false, // z axis enable false, // right x axis enable false, // right y axis enable false, // right z axis enable false, // rudder enable false, // throttle enable false, // accelerator enable false, // brake enable false // steering enable ); void setup() { Joystick.begin(); } void loop() { Joystick.pressButton(0);//ボタン1を押す delay(1000); Joystick.pressButton(0);//ボタン1を離す delay(1000); }
コントローラーのボタン①を押すためのコードは次のようになります。
Joystick.pressButton(0);//ボタン1を押す
ボタン1はプログラム上では”0″に対応しているので注意してください。
また、きちんとボタンを離す処理を入れないと、一回押したら永久に押されっぱなしになります。
Joystick.pressButton(0);//ボタン1を離す
入力出来たらマイコンに書き込んでください。スタートメニューから”USBゲームコントローラーのセットアップ”を開いて動作を確認してください。1秒ごとにボタンが押されているはずです。
ボタンをつなげてみる
次の例は、物理的なボタンをつなげてこれをゲームパッドのボタン1に対応させます。図のようにProMicroにスイッチをつなげ、以下のスケッチをコンパイル・書き込みしてください。
#include <Joystick.h> #include <Wire.h> Joystick_ Joystick = Joystick_( 0x03, // reportid JOYSTICK_TYPE_GAMEPAD, // type 1, // button count 0, // hat switch count false, // x axis enable false, // y axis enable false, // z axis enable false, // right x axis enable false, // right y axis enable false, // right z axis enable false, // rudder enable false, // throttle enable false, // accelerator enable false, // brake enable false // steering enable ); const int Button01Pin = 2; void setup() { pinMode(Button01Pin, INPUT_PULLUP); Joystick.begin(); } void loop() { if(!digitalRead(Button01Pin)) { Joystick.pressButton(0);//ボタン1を押す } else { Joystick.releaseButton(0);//ボタン1を離す } delay(10); }
先ほどと同様に”USBゲームコントローラーのセットアップ”で動作を確認してみてください。
ボタンを押せばゲームパッドのボタン1が反応するはずです。
ここでは簡単のためにボタン1つだけの例を示しましたが、10個20個といった数のボタンも可能です。Joystickの宣言でbutton countの項目を変えてください。少なくとも32個までは対応しているようです。もちろん、その数のスイッチとコードの実装が必要です。
コメント