小ネタ 2008-009
Wiiリモコンの赤外線センサをマイコンに接続して使ってみる (+マウス化)
去年(2007年)、Wiiリモコンのポインティング用赤外線センサを解析して、他の機器に接続する方法を試した。
その続きで、今回は、AVRマイコンを使ったArduinoキットに接続する回路を試作してみた。(2008-04-13)
1. ハードウェア
基板はArduinoキットに試作用のユニバーサル基板を重ねている。
白い棒状のケースにはWiiリモコンから取り出したセンサと自作回路が入っている。
接続は、この図のように接続している。
・Wiiリモコン赤外線センサ回路
・I2C電圧変換シールド
・Arduino Diecimila
以上の3つの部分で構成されている。
3.3Vで動作する赤外線センサを、5Vで動作するマイコンに接続するために電圧変換が必要である。
Wiiリモコン赤外線センサ回路は、前に作った回路と同じものを小型にして作り直した。
I2C電圧変換シールドは、試作用のPrototype Shieldというユニバーサル基板を使って作った。
I2C電圧変換シールドは、Aruduinoの基板の上に重ねるように接続する。
I2C電圧変換の回路は、LTC4301LというICを使用して作った。
このICは、I2Cバスの電圧を変換する。 LTC4301Lでなく、LTC4301でも動くはず。
2. ソフトウェア
前回のソースコードを元にして、Arduino用のソフトを作成した。
[ wii_remote_ir_sensor_sample.zip - source code (download) ]
(後日加筆 2008-09-21)
WinAVRを使ってソフトを書き直してみた。
[ wii_remote_ir_sensor_sample2.zip - source code (download) ]
Wiiリモコンの赤外線センサの使い方
簡単にセンサの使い方の解説を書いてみる。
I2Cバス規格のプロトコルでは、デバイスとの通信には、デバイスのアドレス番号を最初に送信する必要がある。
Wiiリモコンに使われている赤外線センサのアドレスは、0x58である。
ソースコードには0xB0と書いてあったりするが、これは上位7ビットがアドレスで、下位1ビットがR/W指定ビットとなるように、シフトするからである。
センサの初期化は、Wiiリモコン内部のセンサにBluetooth経由でアクセスする場合より簡単である。
なぜなら、チップイネーブル制御や、クロック発振回路のON/OFF制御をしないからである。
初期化のためのコマンドの送信は、次の形式で行う。
[STARTコンディション] [0xB0] [制御レジスタアドレス] [書き込みデータ] [STOPコンディション]
制御レジスタのアドレスは、8bitで指定する。
どのアドレスがどういう機能なのかは、まだ詳しく分かっていない。
とりあえず、ある決まった値と手順で書き込むとセンサを動作させることができる。
初期化コマンド手順
(1) 制御レジスタアドレス0x30に対して、データ0x01を書き込む
(2) 制御レジスタアドレス0x30に対して、データ0x08を書き込む
(3) 制御レジスタアドレス0x06に対して、データ0x90を書き込む
(4) 制御レジスタアドレス0x08に対して、データ0xC0を書き込む
(5) 制御レジスタアドレス0x1Aに対して、データ0x40を書き込む
(6) 制御レジスタアドレス0x33に対して、データ0x33を書き込む
これは、以下で説明する感度設定の手順を簡略にしたようなものらしい。
赤外線センサの感度の設定方法について
上記で簡易的に設定されているようだが、ちゃんと設定したい場合には、4つのパラメータp0,p1,p2,p3を指定して、次の手順で書き込む
(1) 制御レジスタアドレス0x30に対して、データ0x01を書き込む
(2) 制御レジスタアドレス0x00に対して、データ0x02,0x00,0x00,0x71,0x01,0x00,p0を書き込む (7バイトの書き込み)
(3) 制御レジスタアドレス0x07に対して、データ0x00,p1を書き込む (2バイトの書き込み)
(4) 制御レジスタアドレス0x1Aに対して、データp2,p3を書き込む (2バイトの書き込み)
(5) 制御レジスタアドレス0x33に対して、データ0x03を書き込む
(6) 制御レジスタアドレス0x30に対して、データ0x08を書き込む
複数バイトの書き込み時はレジスタアドレスが自動インクリメントされるので連続で書き込み可能である。
感度のパラメータは、
感度1の場合、p0=0x72 , p1=0x20 , p2=0x1F,p3=0x03
感度2の場合、p0=0xC8 , p1=0x36 , p2=0x35,p3=0x03
感度3の場合、p0=0xAA , p1=0x64 , p2=0x63,p3=0x03
感度4の場合、p0=0x96 , p1=0xB4 , p2=0xB3,p3=0x04
感度5の場合、p0=0x96 , p1=0xFE , p2=0xFE,p3=0x05
初期化後(感度設定後)は、センサで検知した光点の座標を読み出すことができる。
センサ出力の読み出し方法
[STARTコンディション] [0xB0] [0x36] [STOPコンティション]
というコマンドを送信後、次のとおり読み出す。
[STARTコンディション] [0xB1] [データの読み出し] x 16bytes
読み出したデータの形式
3バイトずつ下記の順に格納されている。
[先頭1byte] [座標1... 3bytes] [座標2 ... 3bytes] [座標3 ... 3bytes] [座標4 ...
3bytes]
この3バイトを、XX,YY,SSとすると、
X座標 = (SS & 0x30) <<4 + XX
Y座標 = (SS & 0xC0) <<2 + YY
という計算をすることで、座標の値を得ることが出来る。
座標値が無効な場合に0x3FFが返ってくる。
制御レジスタの役割
アドレス 0x00〜0x08 --- 検出のためのパラメータ設定
アドレス 0x1A〜0x1B --- 検出のためのパラメータ設定(2)
アドレス 0x30 --- センサの動作モード(?) 最初に0x01を書き込んで, 次に0x08を書き込む
アドレス 0x33 --- センサの動作モード(?) 0x03 ( あるいは0x33 ? ) を書き込む
検出のためのパラメータ設定
不明
カメラで撮影した画像を画像処理して光点を検出するためのセンサ内部のソフトウェアのパラメータ設定
2値化の敷居値とか光点の大きさの敷居値とかのパラメータがあるのではないかと推測される。
(後日加筆 2008-10-06)
いくつかのパラメータは判明してきているらしい。
http://wiki.wiimoteproject.com/IR_Sensorというページに色々と情報が出ている。
赤外線センサを使ってWiiリモコンをマウスとして使うのを試してみる
以前に、Wiiリモコンを机の上に置いた状態で、リモコン内蔵の赤外線センサを使って左右と前後の移動量を検出できるかどうか試した。
純正のセンサーバーのような左右に並んだ2点の光源でも前後(奥行き)方向の移動量を検出するのは可能なのだが、マウスに使えるほどの精度は出なかった。
光学系の部品を外付けすることで、前後方向の移動量を精度良く検出する方法を考えてみた。 (2008-08-05)
・Wiiリモコンを机の上で滑らせやすいようにマウスパッドを敷く。
・マウスパッドの左側と上側に赤外発光ダイオードを固定する。
・左側の発光ダイオードよりも、上側の発光ダイオードの高さを高くしておく。
・Wiiリモコンの先端の赤外線センサーの先にハーフミラーを45度の傾きで取り付ける。Wiiリモコンと一緒になって動くように取り付けること。
・ハーフミラーの効果で、赤外線センサーは上側と左側の発光ダイオードを同時に検出できる。
・リモコンを左右に動かすと、上側の発光ダイオードの光点が画面上の左右の動きとして検出される。
・リモコンを前後に動かすと、左側の発光ダイオードの光点が画面上の"左右"の動きとして検出される。
・つまり、画面上に2点の光点が検出され、それぞれが左右に動く。
・どちらの光点が上側か左側かを判別するために、上側の発光ダイオードの高さを高くしてあり、画面上の上方向の光点が上側の発光ダイオードである。
・画面上の光点の移動量をマウスのX軸の動き/Y軸の動きに変換するソフト処理を入れることで、Wiiリモコンのセンサをマウスとして使うことが可能。
・ただし、ソフト処理が必要なので、いまのところPC上でWiiリモコン制御ソフトを作成した場合しか使うことができない。
ハーフミラーを使う方法は昨年(2007年)の始め頃に思いついていたのだが、ハーフミラーを入手して実際に作るのに時間が掛かってしまった。
マウスでWiiのゲームをするには
赤外線センサの解析で、リモコンを向けている座標に対応して、どのような信号がセンサから出てくるかが分かっている。
同じ信号を出す回路を自作することで、赤外線センサ以外のポインティングデバイスからの出力をWiiリモコンの基板に接続して、例えばマウスでWiiを操作できるかもしれない。(2008-08-05)