ArduinoでWiiNunchukを使用する
コンポーネントと消耗品
| × | 1 | ||||
| × | 1 | ||||
![]() |
| × | 1 |
このプロジェクトについて
序文
もともと、この投稿はwww.xarg.orgで公開されていました。
ArduinoでWiiNunchukを使用する
私たちは皆、ゲームパッドを手にして成長してきました。そのため、文字通りあらゆるアプリケーションと組み合わせるのに理想的です。任天堂の素晴らしい発明は、WiiUリモコンの安価な拡張機能であるNunchukです。トランスポートプロトコルとしてI2Cを使用しているため、コントローラーの生データに簡単にアクセスできます。とても簡単なので、標準的な解決策があるはずだと思いましたが、安定した実装を見つけることができず、コードスニペットをロードするだけでした。だから私はこのギャップを埋めることに焦点を合わせました、そしてここにあります。この記事では、詳細をガイドし、Arduinoに実装します。
ハードウェア <図>

Nunchukには、ボタンCとボタンZと呼ばれる2つのメンブレンボタンがあります。加速度計は3次元すべてに作用する力を測定するため、デバイスの上部にはアナログ2軸ジョイスティックがあり、デバイス全体が動きに敏感です。 Nunchukを3v3で動作させることをお勧めします。その電圧を供給できない場合は、レベルシフターを使用して寿命を延ばす必要があります。この設定には、少なくとも次のパーツが必要です。
パーツ
- ニンテンドーヌンチュク(またはレプリカ)
- Arduino
- レベルシフター(オプション)
- Nunchukアダプター(オプション)
オリジナルのヌンチュクまたはレプリカ
大きな問題は、オリジナルの任天堂ヌンチュクと中国のレプリカのどちらを購入するべきかということです。 Nunchukドライバーをテストするために、オリジナルと安価なコピーの両方を購入しました。どちらのバージョンも高価にはほど遠いですが、違いは約10〜15€です。私が言えることは、元のヌンチュクのケーブルのワイヤーはシールドされているため、外乱に対してより堅牢になっています。オリジナルのジョイスティックは高品質で、すべての値の範囲のすべての動きを解決できますが、コピーは最小限の動きに反応しません。また、オリジナルの加速度計の品質も優れています。ただし、これらの違いを平準化するカルマンフィルターを適用しました。したがって、長寿命のコントローラーが必要な場合は、オリジナルを使用します。安価な入力デバイスが必要な場合は、Nunchukのコピーで運が良かったかもしれません。
Nunchukコネクタ
任天堂は、すべての周辺機器を独自のプラグで接続します。私はWiiを持っておらず、ゲーム関連の何かにコントローラーを使用しないので、コネクターを分解しました。この抜本的な手順を実行したくない場合は、数ドルでNunchukアダプターを入手できますが、はんだ付けのスキルがあれば、とにかくプラグを修理できるはずです。ワイヤーがピンにどのように接続されているかがわかるので、プラグを開くことをお勧めします。ワイヤはランダムに接続できるため、これはNunchukレプリカにとって特に重要です。もう1つの奇妙なことは、元のコントローラーには4本のワイヤーがあり、レプリカには5本のワイヤーがありますが、コネクターには実際には6本のピンがあります。さて、仕事に行き、コネクタを開きましょう:
<図>
そして、ワイヤーを切断します:
<図>
プラグを正面から見ると、次のピンが表示されます。
<図>
オリジナルのNunchukの場合、コネクタの色とピン配置は次のとおりです。
- 緑→ SDA
- nc
- 赤→ 3v3
- 白→ GND
- nc
- 黄色→ SCL
私が入手したNunchukクローンの場合、コネクタの色とピン配置は次のとおりです。
- 黄色→ SDA
- 黒→nc
- 緑→ 3v3
- 赤→ GND
- nc
- 白→ SCL
私が言ったように、あなたは間違いなくワイヤーがどのように配置されているかを見て、その色で何も接続しないようにする必要があります。使用される頭字語は次のとおりです。 nc
接続されていない場合、SDA-データライン(Arduinoボード上のA4に接続されている必要があります)およびSCL-クロック(A5に接続されている)。 Arduinoには電圧レギュレーターがあり、3v3を直接使用できます。 WiiChuckまたは同様のNunchukアダプターを使用する場合は、3v3をA2に接続し、GNDをA1に接続します。後で nunchuk_init_power()
を呼び出す必要があります。 これらの電源コネクタを初期化します。次のフリッツのスケッチは、接続を示しています。

ソフトウェア
Nunchukとの通信を実装する小さなヘッダーライブラリを作成しました。実際、舞台裏で何が起こっているのかを心配する必要はありません。箱から出してすぐに機能するはずです。詳細に興味があれば、とにかくこれについてすぐに説明します。
Nunchukライブラリをダウンロード
Nunchukとの通信は、I2Cの別名であるTWIバスを介して行われます(ただし、一部の詳細は異なりますが、私たちの目的には関係ありません)。 I2Cバスの速度は、デフォルトで高速モード(400kHz)に設定されています。 ArduinoでNunchukを使用するには、次のものだけが必要です。
#include #include "nunchuk.h" void setup(){Serial.begin(9600); Wire.begin(); // nunchuk_init_power(); // A1とA2は電源装置ですnunchuk_init();} void loop(){if(nunchuk_read()){// nunchuk_dataを操作しますnunchuk_print(); } delay(10);}
ライブラリに付属のProcessingファイルを開始するときに、このコーンとNunchukのバランスをとることができます:
<図>
nunchuk_print()
の代わりに 実際のデータにアクセスするために多くの関数を使用できます:
Nunchuk関数
-
nunchuk_buttonZ():
Zボタンが押されているかどうかに関係なく1または0
-
nunchuk_buttonC():
Cボタンが押されているかどうかに関係なく1または0
-
nunchuk_joystickX_raw()/ nunchuk_joystickX()nunchuk_joystickY_raw()/ nunchuk_joystickY():
ジョイスティックのx値またはy値。各関数の未加工バージョンを使用すると、キャリブレーションなしでデータにアクセスできます。
-
nunchuk_joystick_angle():
ジョイスティックの角度をラジアンで計算します。
-
nunchuk_accelX_raw()/ nunchuk_accelX()nunchuk_accelY_raw()/ nunchuk_accelY()nunchuk_accelZ_raw()/ nunchuk_accelZ():
x-、y-またはz-
加速度計の値。各関数の未加工バージョンを使用すると、キャリブレーションなしでデータにアクセスできます。
-
nunchuk_pitch():
コントローラのピッチ角をラジアンで計算します。
-
nunchuk_roll():
コントローラのロール角をラジアンで計算します。
注: nunchuk_yaw()
はありません 加速度計は方向力のみを測定でき、回転速度は測定できないため、機能します。この状況では、ピッチが180°に制限され、ピッチが180°を超えるとロール角が正しくなくなります。
ピッチとロール角の計算は、コントローラーに作用する速度は重力だけであるという単純化された仮定の下でも機能します。これは、ヌンチュクが静止しているか、外力によって一定の速度が発生するために機能します。
キャリブレーション
機能の概要で説明されているように、ジョイスティックと加速度計のすべての機能には、校正済みの未加工バージョンが付属しています。ライブラリファイルの先頭で、いくつかの定数がゼロ位置を定義します。最良の方法は、コントローラーをニュートラル位置に保持し、それに応じて定数を調整するときに、コントローラーの生の測定値を読み取ることです。
I2Cプロトコル
ここの最後のセクションでは、実際のI2Cプロトコルについて説明します。コントローラを使用するだけの場合、この情報は必要ありませんが、プロトコルを理解したい場合は、時間を節約できることを願っています。
私は、I2CスキャナーでNunchukの実際のアドレス(0x52)をスキャンすることから開発を開始しました。 I2Cバスを介してNunchukのメモリからパラメータを読み取ることは、通常のI2CEEPROMとの通信と非常によく似ています。 Nunchukからのデータを読み取る前に、初期化シーケンスを送信する必要があります。
Nunchukからデータを読み取るには、Nunchukのコントローラーが読み取るたびにアドレスをインクリメントするため、読み取るアドレスを送信する必要があります。実際に関心のあるデータはアドレス0x00にあり、長さは6バイトです。アドレス0x20および0x30(0x20のバイトの正確なコピーのようです)には、16バイトのキャリブレーションデータが格納されます。アドレス0xFAで、デバイスのID番号を見つけることができます。これは、ヌンチャクの場合は0xA4200000、クラシックコントローラーの場合は0xA4200101、バランスの場合は0xA4200402などです。
Nunchukにデータを書き込む必要がある場合、形式は読み取りコマンドに類似しています。最初のバイトはアドレスで、その後に実際のデータが続きます。
説明されている機能について、Nunchukの実際のバイトシーケンスを見ていきましょう。
1. Nunchukを初期化します:
START、0x40、0x00、STOP
このシーケンスは通常の初期化シーケンスであり、暗号化アルゴリズムをデフォルトに設定します。 Nunchukから読み取られたすべてのバイトは、(x ^ 0x17)+ 0x17
で復号化する必要があります。 。より良い方法は、次のシーケンスで暗号化を無効にすることです:
2.暗号化せずにNunchukを初期化します:
START、0xF0、0x55、STOPSTART、0xFB、0x00、STOP
これには、実際のデータを復号化式なしで使用でき、Nunchukクローンでも機能するという利点があります。
3.拡張レジスタからデバイスIDを読み取ります:
START、0xFA、STOPREAD6バイト
接続されたデバイスがNunchukまたはClassicコントローラーなどである場合、データはすでに述べたIDです。
4.デバイスから測定値を読み取ります:
START、0x00、STOPREAD6バイト
見返りとして得られるものは、この概要で説明されています:
- ビットバイト76 5 4 3 2 1 0
- 1ジョイスティックX軸[7:0]
- 2ジョイスティックY軸[7:0]
- 3加速度計のX軸[9:2]
- 4加速度計のY軸[9:2]
- 5加速度計のZ軸[9:2]
- 6 Az [1:0] Ay [1:0] Ax [1:0]¬Bc¬Bz
したがって、ボタンの値が反転され、加速度計のLSBビットがバイト6に含まれます。ライブラリでは、LSBビットを残りのビットと結合します。 LSBビットのない値を使用している人を見たことがあります。これは、信号をより安定させるための単純化された方法です。私には、ADCからのノイズの多い信号が好きです。これは、多くの情報が失われる丸めによって数値を切り捨てるのではなく、相補フィルターまたはカルマンフィルターで簡単にフィルター処理できます。
5.デバイスから実際のキャリブレーションデータを読み取ります:
START、0x20、STOP READ 16byte
見返りとして得られるものは、この概要で説明されています:
バイト
説明
- 1 X軸の0G値[9:2]
- 2 Y軸の0G値[9:2]
- 3 Z軸の0G値[9:2]
- X、Y、Z軸のゼロ値の4LSB
- 5 X軸の1G値[9:2]
- 6 Y軸の1G値[9:2]
- 7 Z軸の1G値[9:2]
- X、Y、Z軸の1G値の8LSB
- 最大9つのジョイスティックX軸
- 10ジョイスティックの最小X軸
- 11ジョイスティックのX軸の中心
- 12ジョイスティックのY軸の最大値
- 13ジョイスティックのY軸の最小値
- 14ジョイスティックのY軸の中心
- 15チェックサム
- 16チェックサム
バイト0〜3は、X、Y、およびZ軸のゼロ値を格納し、バイト4〜7は、1G(地球の重力)での値を格納します。キャリブレーションデータは、ソフトウェアの実装ではまだ使用されていません。
コード
- コードスニペット#1
コードスニペット#1 プレーンテキスト
#include#include "nunchuk.h" void setup(){Serial.begin(9600); Wire.begin(); // nunchuk_init_power(); // A1とA2は電源装置ですnunchuk_init();} void loop(){if(nunchuk_read()){// nunchuk_dataを操作しますnunchuk_print(); } delay(10);}
Github
https://github.com/infusion/Fritzing/tree/master/Nunchukhttps://github.com/infusion/Fritzing/tree/master/Nunchuk カスタムパーツとエンクロージャー

製造プロセス