レトロでハードな物語

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

Wiiのヌンチャクコントローラー×2を1つのコントローラーにする

2018年11月13日 | 電子工作

前からハードオフのジャンク品として大量に置いてあるWiiのヌンチャクコントローラーが気になっていたので、つい2個購入してしまいました。ひとつ税抜き¥300でした。



このコントローラー、アナログスティックと加速度センサーが付いていて素晴らしいものなのですが、1つのコントローラーにボタンが2個しかないのでPCでゲームコントローラーとして使うにはボタンが少ないなと思っていました。そこで今回、2つのコントローラーを一緒にArduinoで制御してボタン4つのコントローラーに仕立てようと考えたのです。

Arduinoにヌンチャクコントローラーを接続する事例やライブラリはたくさんあったので、コントローラー1つでの動作テストはすぐに出来ました。しかし、コントローラー2つを使った事例がなかなか見つかりません。
それもそのはず、このコントローラーはI2C通信で状態を読み取るのですが、接続先デバイスを識別するアドレスがどれも同じなので別々に通信できないのです。せっかくI2Cを使っているのに…残念。

なにか策はないのかとネットを探し回ってみたところ、やっとここでヒントになる情報を見つけました。トランジスタでデバイスを切り替えるようです。さっそく前回の7セグメントLEDの学習で学んだことが役に立ちます。
7セグメントの回路のときは1つのポートでデバイスを切り替えていたので、切り替え制御用のポートは1つでもよさそうなのですが、上記のサイトではそれではうまく行かなかったとあります。それならば回路図の通り2つにしておいた方がいいでしょう。
とはいえ電子回路については初心者なので、トランジスタを使った回路について知識を得るために色々なサイトの情報を調べて、最終的に決めたのが以下の回路です。



回路図中、左がArduino Pro Microで右がヌンチャクコントローラーです。コントローラーはケーブルの色、赤・白・緑・黄の順にVcc・GND・SDA・SCLとなっています。Pro Microの4ピンと5ピンはトランジスタのオンオフに使用します。
ヌンチャクコントローラーは3.3vで動作するので、Pro Microには以前使用したKEYESTUDIOの3.3v 8MHz動作のものを流用しました。

回路で使用する部品は2SC1815の相当のトランジスタ2個と抵抗4個です。それほど難しい回路ではないので部品のはんだ付けはすぐに出来たのですが、悩ましかったのは抵抗の値をいくつにするのかということでした。
様々なサイトの情報を元にしながら、手持ちの抵抗で合いそうなものを幾つか試してみました。すぐには安定動作させられる抵抗値が見つからなかったのですが、最終的にR1を330ΩにR2を10KΩにしたら正常に動作するようになりました。念の為、数時間使用テストしてみましたが、まったく問題ありませんでした。ただし、今回3.3vのPro Microでの動作なので他のArduinoの場合は抵抗値が異なるかもしれません。この構成で必ず動作するかどうかは保証できませんので、もし製作される方がいらしたら自己責任でお願いします。



スケッチについてですが、ヌンチャクコントローラーとの通信部分は上記サイトのものをベースにし、ジョイスティックライブラリは何度も使用させてもらっているこちらを使わせてもらいました。
作成したスケッチは2つです。

NunchuckFullController.ino

NunchuckController.ino

ヌンチャクコントローラーの加速度センサーは常に値が変化しているので、一般的なゲームコントローラーとしての利用にはあまり向いていません。そこで加速度センサーの値を取得するものとしないものの2つのスケッチを用意しました。NunchuckFullController.inoはセンサーの値をゲームコントローラーのスティック操作に置き換えるもので、NunchuckController.inoはセンサーを使用しないものです。

ヌンチャクコントローラーのアナログスティックが返してくる数値の範囲は、コントローラーによって多少バラツキがあります。そのため使用前にキャリブレーションする必要があるのですが、上記スケッチではキャリブレーションしなくても使えるように予めこれらの数値を設定しておくようにしました。

スケッチの先頭の方の#define文で1つめのヌンチャクのアナログスティックX軸の中央の値、最小の値、最大の値、Y軸の中央の値、最小の値、最大の値、続いて2つめヌンチャクのX軸、Y軸の値を登録します。加速度センサーについてはコントローラーの振り方で0〜255まで変化するようなので、中央値128、最小値0、最大値255に設定してあります。

その次にアナログスティックの軸の"あそび"と加速度センサー(NunchuckFullController.inoのみ)の"あそび"を登録します。これはスティックの中央から±"あそび"の数値までの間、スティックまたはセンサーが動いていないと判断するものです。アナログ値やセンサー値はわずかな動作で変化し続けてしまうので、コントローラーの感度をすこし鈍くするためとPCへの無駄なデータ転送を抑えるための処理です。
値についてはお好みで設定して下さい。

これらキャリブレーション値の調べ方ですが、下記のスケッチを使います。

NunchuckTest.ino

使い方ですが、スケッチを書き込んでPro Microを起動してからArduino IDEのシリアルモニタを開きます。次にヌンチャクコントローラーを持つとアナログスティックのX軸の最小値・最大値、Y軸の最小値・最大値と加速度センサーの3軸の値が(この値は使用しませんが)表示されます。
この時アナログスティックを動かさずにおくと表示されているアナログスティックのXY軸の最小値・最大値は同じになっていると思いますが、これがスティックの中央の値になりますのでメモしておきましょう。次にコントローラーのアナログスティックをぐるぐる回します。最大値と最小値が変化しなくなるまでシリアル端末への表示が続きますので、表示が止まったらXY軸の最小値・最大値をメモします。
これらの操作を2つのヌンチャクコントローラーで行い、値をスケッチに書き込んでください。

このスケッチでスティックのアナログ値を取得するときに、それほど動かしていないのに255という値が入ることがありました。この値は実際に255ではないと判断しましたので(読み取りエラー時の値か?)255という数値は無視するようにしています。もし、数値の最大値に254があったら(手持ちのコントローラーで254まで届いたのは加速度センサーだけでした)それは255としてもいいと思います。

動作テストは主にRaspberry pi 3で動作しているRetroPieで行いました。アナログスティックとしての動作はもちろん、アナログをデジタルパッドとして設定しても問題なく使用できました。2個のコントローラーの計4つのボタンでは割り当てきれないボタンにアナログスティックを割り当てても問題ありませんでした。

このヌンチャクコントローラーは小さくて軽いので長時間使用しても手首が疲れなくていいですね。アクションゲーム以外ならほとんどの操作を片手で行うことも出来るので、寝転びながらでも楽に使用できます。さすがにアクションゲームは片手操作では指が辛いです。

残念なのは、普通のゲームコントローラーとして使うと加速度センサーを有効に使えないことですね。手首とか頭とかに付けてマウスとして使えば、キーボードから手を離さずに済んでいいかもしれません。ああ、でもボタンを押すときに手を離さなきゃならないか...



最新の画像もっと見る

コメントを投稿