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個までは対応しているようです。もちろん、その数のスイッチとコードの実装が必要です。


コメント