Wii クラシックコントローラについてのメモ

本当はコメ噛めの方のネタなんだけれども、まだ解析途中なんでこちらでひっそりとメモまでに。
ようやく Wii が手に入ったのでさっそくパンヤに夢中バーチャルコンソールで遊びまくり。やあ、FC の忍者龍剣伝は今やってもおもしろいなあ。
でもやっぱり、スーパースターソルジャーとかのシューティング系はジョイスティックで遊びたいので、なんとか接続できないかとクラシックコントローラの解析を始めるのであった。

前提知識として、Wiiリモコンの拡張ポートは I2C シリアル通信であることが先人の解析でわかっている。
また、ある程度の解析データも WiiLi.org Wiki にまとめてあるが、PC から BlueTooth 経由でコントロールすることを目的に書かれているので、I2C でダイレクトに扱うには情報が不足している。

■ クラシックコントローラ

I2C スレーブデバイスでスレーブアドレスは 52h。
通常の I2C デバイスと同じく内部アドレス式。1バイト内部アドレスを送信し、その後続けてデータを送受信するとその内部アドレスからインクリメンタルでアクセスされる。
内部アドレス 00h から 6byte 読み出しでパッド情報。ただし、内部アドレス 40h に何か書き込まないとコントローラが動作開始せず、情報を読んでも FFh しか返ってこない。
接続後 40h に 00h とかを書き込む初期動作が必要。

読み出したデータのフォーマットは WiiLi の情報に従う。
x = (y xor 17h) + 17h という式でデコードする必要がある事に注意。

上記手順だけで良いので、クラシックコントローラの情報をマイコンで読み取ることは容易。というか手元では既にできている。
といっても、クラシックコントローラを PS2 に繋ぎたいとかそういった欲求は別にないので置いておく。

■ Wiiリモコンにクラシックコントローラを接続したとき

スレーブアドレス 52h の適当な I2C デバイスをマイコンで作って Wiiリモコンに接続しても反応してくれない。接続時になにやらやっていて、それに応じる必要がある模様。
ヌンチャクとクラシックコントローラの I2C スレーブアドレスは同じ 52h。返すデータの中身は異なっている。
ヌンチャクとクラシックコントローラの内部アドレス F0h から 16Byte に異なる識別子があり、その違いでどちらかを見分けている様子。

Wiiリモコンの拡張端子に外部コントローラが接続されたら Wiiリモコンはそれを感知する。(1ピンと3ピンのショートでそれを検知しているものと思われる)
外部コントローラが接続されたあと、Wiiリモコンから接続デバイスへやりとりの要求が出されるが、そのときの I2C デバイス内部アドレスと発行順は以下の通り。
F0h
40h
46h
4Ch
20h
30h

F0h, 20h, 30h は先人の解析でコントローラ ID とキャリブレーションデータ(ではないかと言われている)だという事がわかっている。
40h はそこに 00h を書き込まないとコントローラが起動しないこともわかっている。
46h, 4Ch は今回初めて見つけた物で詳細調査はこれから。

要するに、クラシックコントローラを名乗るマイコンを作りたいのですな。さすれば俺コントローラが Wiiリモコンに繋げられるはず。

I2C アナライザがあると簡単にわかりそうな物だけれども、流石に手元にはないのでマイコンで簡単な I2C 監視プログラムを書いて調べている。
ある程度の速度が必要なので、V850 の出番なのですよ。

—–




You can follow any responses to this entry through the RSS 2.0 feed. You can skip to the end and leave a response. Pinging is currently not allowed.

Leave a Reply