Arduinoでボタンが1つだけのゲームコントローラーを自作

マイコン/Arduino

ArduinoJoystickLibrary(AJL)というものが公開されていて、arduinoをUSBゲームパッド(ジョイスティック)として振舞わせることができます。
わざわざ自分で作らなくてもゲームパッドを買ってくればよいのですが、操作が複雑だったり特殊だったりして、一般的なゲームパッドではまともに操作できない場合があります。例えばEuroTruckSimulator2(ETS2)やMicrosoftFlightSimulator(MSFS)などです。フライトスティックやハンドルコントローラーといった専用品も売られていますが、自分の好きな配置のコントローラーで遊べるというのは市販品では実現できません。

何回かに分けてETS2やMSFSで使えるゲームコントローラーを自作する方法を紹介したいと思います。また、ArduinoはProMicroを使います。実用的な大きさと、値段の安さで選んでいます。

本記事は、最低限のArduinoと電子工作の知識がある前提です。

ライブラリのインストール

まずは専用のライブラリ(AJL)をArduinoIDEにインストールしてください。

GitHub - MHeironimus/ArduinoJoystickLibrary: An Arduino library that adds one or more joysticks to the list of HID devices an Arduino Leonardo or Arduino Micro can support.
An Arduino library that adds one or more joysticks to the list of HID devices an Arduino Leonardo or Arduino Micro can s...

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秒ごとにボタンが押されているはずです。

USBゲームコントローラーのセットアップWindowsでのゲームコントローラーの動作確認画面

この画面でゲームコントローラーが認識されないことがあります。ただ、この場合でも実際のゲームでは認識されていることが多いです。原因は不明です。
この場合は下記リンク先のレジストリを削除してみる、もしくはスケッチ中の”JOYSTICK_TYPE_GAMEPAD”を別のタイプに変えると解決することがあります。
Arduinoでゲームコントローラーのデバイス名を設定する
Arduinoでゲームコントローラーを作るときのデバイス名設定方法とはまりやすいポイントを説明します。

ボタンをつなげてみる

次の例は、物理的なボタンをつなげてこれをゲームパッドのボタン1に対応させます。図のようにProMicroにスイッチをつなげ、以下のスケッチをコンパイル・書き込みしてください。

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

XINPUTという種類のゲームコントローラーににしか対応していないゲームではここで紹介している方法では動作しないことがあります。ForzaHorizonなどが該当します。

コメント