ゲームコントローラー
片手でゲームをしたい!
…でも市販のゲームコントローラーはほぼ両手用。
ということで、今回はWiiのヌンチャクコントローラーをArduino Leonardoに接続して、USB接続のゲームコントローラー*1を作ってみます。
Windows PCからは何の変哲もない普通のゲームコントローラーに見えるので、ゲームとの相性問題が出ることもないはず。
ヌンチャクを使ったゲームコントローラー(≒ジョイスティック)なので、JoyChuckという名前にしました。
必要なもの
ハードウェア
項目 | 説明 |
Arduino Leonardo | 比較的小型で安価で簡単に使えるマイコンボード。 なお、Arduino UnoでもUSB接続のHID(human interface device)を作ることはできますが、その場合ATMEGA8U2マイコンのファームウェアを書き換える必要があります。 難しそうなので、今回は素直にLeonardoを使用することにしました。 |
ヌンチャクコントローラー | 通常はWiiリモコンに接続して使うヌンチャクコントローラー。 |
WiiChuck | Arduinoにヌンチャクコントローラーを接続しやすくする基板。 なくても頑張れば接続できるでしょう。 |
ピンヘッダ(4P) | 何でも良いです。今回は 秋月電子通商で購入しました。 |
ソフトウェア
項目 | 説明 |
chuck_funcs.h | ヌンチャクコントローラーの情報をArduinoで取得するための関数が定義されたヘッダファイル。 todbotさんのgithubからダウンロードしてください。 (「Raw」を右クリックして名前をつけて保存。) |
USBAPI.h | USB機器用ヘッダファイル。 Imaginary Industriesからダウンロードしてください。 または、USBAPI.hのパッチをお手持ちの環境のUSBAPI.hに当ててください。 |
HID.cpp | HID用プログラム。 Imaginary Industriesからダウンロードしてください。 または、HID.cppのパッチをお手持ちの環境のHID.cppに当ててください。 |
leoJoy.ino | テスト用ランダム入力スケッチ。 Imaginary Industriesからダウンロードしてください。 |
JoyChuck.ino | ヌンチャクコントローラをゲームパッドにするスケッチ。 下記からダウンロードしてください。 |
手順
ソフトウェアの準備(Arduino Leonardoをゲームコントローラーとして認識させる)
- arduinoの開発環境をインストールしたディレクトリの配下のhardware\arduino\cores\arduinoを開く。
(私の場合は、「C:\Program Files (x86)\Arduino\hardware\arduino\cores\arduino」でした) - 上記で示したUSBAPI.hとHID.cppをコピーする。
- USBケーブルを挿す。
- leoJoy.inoを開き、Arduino Leonardoに書き込む。
ソフトウェアの動作確認
- [コントロールパネル]>[デバイス マネージャー]>[ヒューマン インターフェース デバイス]を開く。
- 「HID 準拠ゲーム コントローラー」が表示されていることを確認する。
- [コントロールパネル]>[デバイスとプリンター]を開く。
- 「デバイス」欄に「Arduino Leonardo」が表示されていることを確認する。
- 右クリックし、「ゲームコントローラーの設定」をクリックする。
- 「プロパティ」ボタンをクリックする。
- 右のようなウィンドウが表示され、「軸」「ボタン」「ハットスイッチ」がランダムに入力されていることを確認する。
(leoJoy.inoはランダムな入力を発生させるスケッチです)
ハードウェアの準備
- WiiChuckにピンヘッダを半田付けする。(labs.thingm.comと書いてある側からピンヘッダの短い方を差込み、逆側から半田付けする。)
- ArduinoのGNDピンに-、3.3Vピンに+、D2ピン*2にd、D3ピン*3にcを接続する。
- WiiChuckにヌンチャクコントローラを挿す。(ヌンチャクの金属端子の凹みがある方が上になるように挿す。)
ソフトウェアの準備(ヌンチャクコントローラーをゲームコントローラーとして使えるようにする)
- JoyChuck.inoとchuck_funcs.hをJoyChuckというフォルダに格納する。
- nunchuck_funcs.hの25行目〜34行目は次のようにコメントアウトする。*4
// Uses port C (analog in) pins as power & ground for Nunchuck static void nunchuck_setpowerpins() { /* #define pwrpin PORTC3 #define gndpin PORTC2 DDRC |= _BV(pwrpin) | _BV(gndpin); PORTC &=~ _BV(gndpin); PORTC |= _BV(pwrpin); delay(100); // wait for things to stabilize */ }
- JoyChuck.inoを開き、Arduino Leonardoに書き込む。
最終動作確認
- [コントロールパネル]>[デバイスとプリンター]を開く。
- 「デバイス」欄に「Arduino Leonardo」が表示されていることを確認する。
- 右クリックし、「ゲームコントローラーの設定」をクリックする。
- 「プロパティ」ボタンをクリックする。
- ヌンチャクコントローラーのジョイスティックの操作が、軸欄に反映されることを確認する。
- ヌンチャクコントローラーのCボタンの操作が、ボタン欄の1に反映されることを確認する。
- ヌンチャクコントローラーのZボタンの操作が、ボタン欄の2に反映されることを確認する。
以上で終了です。お疲れ様でした
Arduinoの基板がむき出しだとトラブルの元なので、 ALTOIDSミントサイズ缶に穴を空けて線を通し、穴部分の切り口で線が切れないようにスポンジ(激落ちくんなどでも可)で保護するとスマートです。
スケッチ
JoyChuck.ino
|
設定について
- DEBUG定数を1にすると、シリアルモニタにヌンチャクのセンサの現在の値が表示されます。
JoyState_tのメンバ変数とゲームコントローラーの関係
JoyState_tのメンバ | 説明 |
xAxis, yAxis | 左スティックに対応。0-255の範囲で指定。 |
zAxis, rudder | 右スティックに対応。0-255の範囲で指定。 |
buttons | ボタンのオンオフをビットで指定。 1番目のボタンは1/0でオンオフを表現、2番目のボタンは2/0でオンオフを表現、3番目のボタンは4/0でオンオフを表現…という感じ。 各ボタンの同時押し込みは加算で表現する。 |
hatSw1 | POVキーに対応。上方向を0として、時計回りに0〜7で指定。 |
デバイスとプリンターに表示される名称を変更したい
USBCore.cppのSTRING_IPRODUCTとSTRING_IMANIFACTUREを修正してください。
【発展】ボタンを増やす
ヌンチャクコントローラーのボタン数は2個。これではちょっと少ない。
そこで発展系としてボタンを増やしてみます。
Arduinoではマイコン内にプルアップ抵抗を持っていて、設定で使用できるため、スイッチのみ用意すればボタンを簡単に増やすことが出来ます。(参考)
右の写真は十字キーを増設してヌンチャクコントローラーと合体させたものです。
必要なもの
あるとよいもの
項目 | 説明 |
DS LiteやPSPの保守パーツ | 十字キーやボタンの外装とラバードームを利用します。 秋葉原なら三月兎などで買えます。 |
Y字ドライバ | ヌンチャクコントローラーには特殊なネジが使われています。 頑張ればマイナスドライバでもネジを破壊しつつ開けられますが、安全に開けるにはこれが必要です。 秋葉原なら三月兎などで買えます。 |
手順
- ユニバーサル基板にタクトスイッチを挿す。
- タクトスイッチの =□= となっている4本の足のうち、=の1本ずつをGNDとデジタル端子に接続する。(下記ではデジタル10番ピンを使用)
複数のスイッチを設けたいときはGNDは共有しても大丈夫です。 - スケッチのinclude文の下辺りに下記を追加する。
#define PIN_SWITCH1 10 byte switch1;
- スケッチのsetup()の中に下記を追加する。
pinMode(PIN_SWITCH1, INPUT_PULLUP);
- スケッチのloop()の中に下記を追加する。(下記はタクトスイッチが押されると、POVキー上が入力されるようになる)
switch1 = digitalRead(PIN_SWITCH1); Serial.print(" SWITCH1:"); Serial.print(switch1); if (switch1 == LOW) { joySt.hatSw1 = 0; }
- DEBUG定数を1にしてArduinoに書き込むと、シリアルモニタに"SWITCH1:1"と表示され続け、スイッチを押すと"SWITCH1:0"に表示が変わるはずです。
- あとはお好みでラバードームと外装を両面テープで貼ってください。
- また、ヌンチャクコントローラと合体させたい場合は、Y字ドライバでコントローラを開けた後、外装を適当に切断し、埋め込んでください。
関連
参考
- スイッチサイエンス - WiiChuckアダプタ
- “WiiChuck” Wii Nunchuck Adapter Available » todbot blog
- Turning an Arduino Leonardo into a joystick. | Imaginary Industries
- 意外と知られていない?INPUT_PULLUP | スイッチサイエンス マガジン