(Arduino互換の)JapaninoにWiiリモコンを接続て無線化する実験 その2です。

今回は、(たイトルとは逆になりますが) Wiiリモコンの拡張コントローラー ヌンチャクのフリをしてArduinoを接続しました。 以下 作業メモ。
ArduinoとWiiリモコンの接続には、ヌンチャクのコードを一本つぶしました。
もったいないですが、、、 中古ゲーム屋さんなどを回ってみたところ、なぜか新品のヌンチャクと中古品が同じ値段で売られてたので新品を使うことにしました。中古なら 安いかと思ったのですけれども。。。っていうか 価格統制?
当初はWiiリモコンをBluetoothモデム代わりにすると安くあがるかと思っていたのですが、、、具体的に作業を進めてから気が付いたのですが、
◎Wiiリモコンとヌンチャクを足すと、市販の技適マーク付きのBluetoothシリアルモデムぐらいの値段になっちゃいます。 当初思っていたほどは 安上がりにならないみたいです。
◎Wiiリモコンはジョイスティックやマウスなどと同じHIDデバイスとしての接続なので、プログラミングが ちょっとややこしいです。
ということで、 思っていたほど魅力的なプロジェクトじゃなかったかも。
wiiリモコンに外部機器を接続して遊ぶんだと思えば別の面白さがあるかもしれません。

熱収縮チューブがなかったのでダクトテープで被服したので、ちょっとババちいですね。
配線は以下のようになります
| コード | Arduino | ||
| 白 white | GND | GND | |
| 赤 red | +3.3V | +5Vピン | |
| 緑 green | Data | アナログ4 | |
| 黄 yellow | Clock | アナログ5 |
Japaninoの +5Vピンに、 Wiiリモコンから来ている+3.3V(赤)を差して、 3.3V動作させています。 (VINピンに差したら動きませんでした。あとで回路図を確認してみます)
WiimoteLib付属のユーティリティWiimoteTest.exeを使って確認したところ、ヌンチャクとして認識。
ただし、今回のスケッチでは まだ、ヌンチャクのフリをして、拡張コントローラの型式コードを送信するだけで、意味のある信号を送る実験はしてません。
拡張コネクタ(I²C接続)経由で送信した数値(ヌンチャクの識別コード)が化けないでWiiリモコン ->PC に届いている、ということの確認がとれたので、続きは今度。
今回のスケッチ
#include <Wire.h>
#define CPU_FREQ 8000000L
#define TWI_FREQ_NUNCHUCK 400000L
uint8_t outbuf[6];
void
receiveEvent (int howMany)
{
while (Wire.available ())
{
char c = Wire.receive (); // receive byte as a character
}
}
/**
// comment out
void
requestEvent ()
{
outbuf[0] = 125; // joystick X
outbuf[1] = 126; // joystick Y
outbuf[2] = 227; // Axis X
outbuf[3] = 241; // Axis Y
outbuf[4] = 140; // Axis Z
outbuf[5] = 1; // Press C button, byte[5] is buttons
//C,Z and accelaration data
//outbuf[5] = nunchuk_encode_byte(2); // Press Z button
//outbuf[5] = nunchuk_encode_byte(0); // Press Z and C button
Wire.send (outbuf, 6); // send data packet
}
**/
void
resetEvent()
{
//ExtensionType Nunchuk
// 0x00 00 a4 20 00 00
outbuf[0] = 0;
outbuf[1] = 0;
outbuf[2] = 0xa4;
outbuf[3] = 0x20;
outbuf[4] = 0;
outbuf[5] = 0;
Wire.send (outbuf, 6); // send data packet
//Wire.onRequest (requestEvent); // register event
// at first , send reset signal and change mode ?
}
void
setup ()
{
Wire.begin (0x52); // join i2c bus with address 0x52
// this is the nunchuk address.
// all nunchuks use this address
TWBR = ((CPU_FREQ / TWI_FREQ_NUNCHUCK) - 16) / 2;
// I²Cバスのクロックを変更
Wire.onReceive (receiveEvent); // register event
Wire.onRequest (resetEvent); // register event
}
void
loop ()
{
delay (100);
}
参考ページのコードをまとめなおしたものです。
Read wii nunchuck data into arduino
HOWTO make your own Wiimote peripheral