レトロでハードな物語

レトロなゲーム機・マイコン・中古デバイスなどをArduinoやAVRで再活用する方法を模索しています。

Wiiリモコンにつなげるゲームコントローラーを作る

2021年04月07日 | 電子工作

こちらのWiiリモコン、昔ハードオフで300円で購入しました。



Wiiは持っていませんが、Linuxでは簡単にBluetoothキーボードとして扱えるので試しに購入したものです。詳細はこちらとかこちらのサイトにありますが、LinuxでXWiimoteをインストールしてコンフィグレーションファイルを設定するだけでWiiリモコンのボタンに任意のキーを割り当てることが出来ます。寝転びながら片手で操作できるので、ブックリーダーなどのアプリケーションに最適です。確認はしていませんがWindowsやAndroidなどでも同じようなことは出来るみたいです。

ところで、ご存知のようにWiiリモコンの外部拡張コネクタにはヌンチャクコントローラーやクラシックコントローラーなどのゲームコントローラーをつなぐことが出来ます。実は最近こんなサイトを見つけました。ArduinoをWiiリモコンにつないで、クラシックコントローラーにするためのスケッチです。
Wiiリモコンの外部拡張コネクタにはI2Cで様々なデバイスを接続できますが、通信が暗号化されているので簡単につなぐことはできません。でも世の中にはすごい人がいて、この暗号は解析されています。今回見つけたサイトのスケッチはこの暗号化されたI2C通信でWiiリモコンとArduinoを接続してくれる優れものです。

スケッチを見てみると簡単にクラシックコントローラーが実現できそうだったので、試してみたくなりました。

I2Cさえ使えればArduinoのデバイスは何でも良さそうなので、あえてゲームコントローラーにするのが難しい生のAVRのATtiny85でチャレンジしてみようと思います。



ATtiny85は標準状態で利用できるピンは5本で、I2Cで2本使うのでゲームコントローラーには残り3本しか使えません。そこで3ピンで利用できるファミコンジョイスティックを使うことにしました。



このジョイスティックは以前から何度も利用しているのでATtiny85につなぐのは簡単です。配線は以下のようにしました。

ATtiny85 ⇔ ジョイスティック・Wiiリモコン
0 ⇔ SDA  (Wiiリモコン)
1 ⇔ CLOCK(NES 4ピン)
2 ⇔ SCL  (Wiiリモコン)
3 ⇔ LATCH(NES 3ピン)
4 ⇔ DATA (NES 8ピン)

ATtiny85とジョイスティック、Wiiリモコン拡張コネクタのVCCとGNDもつなぎます。Wiiリモコンは3.3V動作ですのでATtiny85も3.3Vで動作させますが、ファミコンジョイスティックは5V動作なので本来はレベルコンバータが必要です。でも、このジョイスティックは3.3Vでも動作してしまうので直に接続してしまいました。



Wiiリモコンの拡張コネクタとAVRの接続には、過去に利用したヌンチャクコントローラーから取り外しておいたコネクタを使いました。ファミコンジョイスティックはWiiリモコンから供給される3.3Vでも動作するのですが、長時間の使用だとWiiリモコンの乾電池の消耗が気になるので3.3VのACアダプターからも電力を供給することにしました。

スケッチはこちらです。

ATtiny85WiiNES.ino

上記サイトからダウンロードできるwiimote.hとwm_crypto.hも、このスケッチと同じフォルダに入れておきます。

スケッチのコンパイルにはATTinyCoreを使います。設定は以下のようにしました。



スケッチを書き込む前に、必要ならこのボード設定でブートローダー書き込みを行ってATtiny85のヒューズビットを書き換えておいてください。今回うっかり忘れてしまい、動作クロックが一致していなくてちょっとハマりました。

スケッチを書き込んだら、WiiリモコンとATtiny85をつなげておきます。LinuxとWiiリモコンのBluetoothのペアリングも事前に行っておきます。
Linux側の準備が出来たらWiiリモコンのボタンを押してBluetooth接続します。このときATtiny85の3.3V外部電源はつなぎません。Bluetooth接続が完了してから外部電源をつなぎます。(外部電源がなくても動きます)

ここで、ゲームコントローラーとして認識されているかどうか確認します。jstest-gtkを起動するとこうなりました。



ちゃんとWiiのクラシックコントローラーとして認識されています。割り当てたボタンは4つしかありませんが、押すと正しく入力されていました。ファミコンジョイスティックのスティック入力をデジタルの方向キーに割り当てると、ハットスイッチではなくキーボードのカーソルキーに割り当てられるようです。アナログスティックに割り当てればジョイスティックとして認識されます。
ちょっと気なるのがクラシックコントローラー左右のアナログスティックの分解能が異なっていることです。左のアナログスティックは0〜63の値になりますが、右のアナログスティックは0〜31となっています。ちょっと調べてみたところ、ここのクラシックコントローラーとArduinoのI2C接続ライブラリのWiiClassic.hでもアナログスティックの値は上記のとおりになっているので、これは仕様なんでしょうね。
ゲームでの動作確認のためRetroArchで使用してみるとちゃんとジョイスティックとして機能していました。

このスケッチを利用すれば、I2CさえサポートしていればどんなArduinoマイコンでもBluetoothゲームコントローラーに出来ますね。ゲームコントローラー限定ということならESP32もいらないですね。
これなら実用になりそうなので、次はWiiクラシックコントローラーと同じようなボタン構成のプレイステーションコントローラーを、Bluetoothゲームコントローラーにしたいと思います。



最新の画像もっと見る

コメントを投稿