Archives

December 2007 の記事

バランスWiiボード を使って GoogleEarth 上を歩けるようにしてみました。

ダウンロード及び詳細はこちら
WbalanceGE v1.00

WbalanceGE

3D 視点のリアルスケールで、リアルな時間で実際に足を動かして移動します。

○特徴
・体重の表示は無く、純粋に歩き(走り)に特化しています。
・コントローラは不要で、バランスボードだけで歩きます。
・歩行と区別できる 走り検出 を行ってみました。
・ログファイル保存記録機能あり

正月に、箱根を一緒に走れるかもしれません!

自分視点なので GoogleEarth で「建物の 3D 表示」を ON にしないと
見栄えが良くならないので注意。
あまりに広いところは、歩いても遠いし風景も単調になりがちです。
周囲に細かい建物があって割と狭いところの方が歩いている気分になれるようです。


GoogleEarth のカメラを直接操作したあと、その場から歩き出すには
  メニューの「Earth」→「開始位置設定」
が必要です。

参考ページ
Google Earth
Google Earth COM API を C++ で使う

関連エントリ
地球上の座標


バランスWiiボード とのペアリングが前より簡単になりました。

ダウンロード
wiibalancepc v0.08 バランスWiiボードを使った PC体重計


Wiiリモコン にオキシライド電池を入れたら、wiibalancepc での
バッテリー残量表示が 113% に! (たぶん電圧の差)


関連エントリ
Windows Bluetooth API (2)
Windows Bluetooth API
バランスWiiボード をPCで使う wiibalancepc v0.07


100m (100歩) スプリントモードを追加しました。
100m (100歩) の時間を競います。[Enter] キーでスタート
バランスボードを複数台接続すれば、同時に対戦可能です。

ダウンロード
wiibalancepc v0.07 バランスWiiボードを使った PC版体重計

Bluetooth の限界まで接続できますが、画面表示の都合で
取りあえず最大 4台までとなっています。

また複数台接続した場合でも、歩数や速度などを独立して
保持できるようにしました。
小さい字ですがそれぞれ個別に表示されています。

動作テストやデバッグで、かなり走った(あしぶみした)気がします。
同時につけていた万歩計は今日 2万歩。


ルームランナー機能を追加してみました。
WiiFit のバランスボード上で足踏みすると歩数をカウントします。

wiibalance v0.06

カーソルキー左右で歩幅を設定しておけば

 ○歩数
 ○速度 (km/h)
 ○ペース (time/km)
 ○距離

の表示が可能です。

BMI 表示にも対応しました。あらかじめ身長の設定が必要です。
身長の設定はカーソルキー上下で行います。

ダウンロード
wiibalance v0.06 バランスWiiボードを使った PC版体重計

あくまで足踏みなので バランスWiiボード の制限とか注意事項を
良く読んで、安全に使ってください。

※キャプチャ画像の身長体重は架空のものです


関連エントリ
PCでバランスWiiボードの体重計

参考ページ
Wikipedia BMI



センサーの順番を間違えていました。

 左上, 右上, 左下, 右下

と書いていましたが、正しくは

 左上, 左下, 右上, 右下

の順番でした。訂正します。記事も修正しました。


体重計ソフトの表示を安定させて数値を読みやすくしてみました。

wiibalance v0.05 バランスWiiボードを使った PC版体重計

○その他の変更点
・前後左右のバランス表示の追加

・体重計によるマウス機能の挙動を改良、加速つき。
 Wiiリモコン を併用してマウスクリックもできます。

・体重表示の数値だけ消せるようにしました。[H]キー。
 人前でマウス操作だけ試したい場合などにも使えます。


解析結果を元に、体重計ソフトを作ってみました。
取りあえず表示するだけ。

wiibalance v0.03

PC 上で Wii Fit のバランスボードを使って体重測定できます。
Bluetooth が必要。

ついでに「体重マウス」機能を追加してみました。

[SPACE] または [M] キーで On になります。
体重マウスが On の場合、重心の移動でマウスカーソルが動きます。

wiibalance

バランスWiiボードは体重計以外にもいろいろ応用できます。
例えば PC の前にいるかどうか判定するセンサーとして、
椅子とか座布団代わりに使うとかどうでしょう。

本当に離籍したときだけ短い時間でスクリーンロックすれば
セキュリティ対策に。


関連エントリ
バランスWiiボードの解析メモ 3
バランスWiiボードの解析メモ 2
バランスWiiボードのメモ


取りあえず体重らしき値が取れました。

バランスWiiボードの解析メモ 3」のキャリブレーションパラメータを使用。
あらかじめレジスタから A0-A2 ~ D0-D2 を読み出しておきます。

WiiFit の バランスWiiボード は max 136kg なので、単純に
A1/B1/C1/D1 を中点 (68kg) とみなして補間してみます。

右上のセンサー(A) でサンプリングした値を P0a とすると
補間値 P1a は

・P0a < 68 A1

  P1a = 68 * (P0a - A0) / (A1 - A0)

・P0a >= 68 A1

  P1a = 68 * (P0a - A1) / (A2 - A1) + 68

これを A,B,C,D の 4センサー分求めて平均をとると、これだけで
自分の体重に一致しました。

まだ試したサンプル数が少ないのでもっと検証が必要でしょう。
これで PC 上でも Bluetooth による履歴付き体重計が作れそうです。


参考ページ
Wikipedia バランスWiiボード

関連エントリ
バランスWiiボードの解析メモ 3
バランスWiiボードの解析メモ 2
バランスWiiボードのメモ



もう一台 WiiFit 買いました。
2台目は最初のバランスボードとはかなり異なる数値が出ています。
バランスWiiボードの解析メモ 2」ではセンサーが2種類あると
書きましたが単なる個体差だったようです。

HID のレポートは 0x34 より 0x32 の方が多少効率的です。
加速センサーも IR センサーも無いのと、圧力値のサンプリング
だけなら 8個で十分なため。

キャリブレーション用の値が 0x04a40020 以降に格納されているようです。

A = センサー右上
B = センサー左上 右下
C = センサー右下 左上
D = センサー左下

04a40024 - 25 :  A0
04a40026 - 27 :  B0
04a40028 - 29 :  C0
04a4002a - 2b :  D0

04a4002c - 2d :  A1
04a4002e - 2f :  B1
04a40030 - 31 :  C1
04a40032 - 33 :  D1

04a40034 - 35 :  A2
04a40036 - 37 :  B2
04a40038 - 39 :  C2
04a4003a - 3b :  D2
* 2byte 単位 BigEndian

おそらく A0 - A1 - A2 この 3点が右上センサーの圧力に対応する
カーブをあらわしているのではないかと思われます(憶測)。
B~D も同様。

balancewiiboard0
balancewiiboard1

足の部分だけ分解してみると機械的な可動部分は特に無く
金属の棒の中央からコードが出ています。

サスペンションのような構造で浮いていて、棒の片端が本体側、
反対側に浮かせた足が接地していました。



●拡張機器用レジスタのダンプ

バランスWiiボード 1台目
04a40000 :  49 2b 0c 24 0a 84 4a 89 1d 00 99 00 00 00 00 00
04a40010 :  00 00 00 00 00 ff ff ff ff ff ff ff ff ff ff ff
04a40020 :  41 69 00 00 49 69 0c 67 0a a4 4a b6 50 7c 13 3d
04a40030 :  11 6d 51 a6 57 87 1a 17 18 3f 58 9e d8 94 ce 81
04a40040 :  ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
04a40050 :  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
04a40060 :  1b 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00
04a40070 :  ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
04a40080 :  ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
04a40090 :  ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
04a400a0 :  ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
04a400b0 :  ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
04a400c0 :  ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
04a400d0 :  ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
04a400e0 :  ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
04a400f0 :  ff ff 00 00 ff ff 00 00 00 00 00 00 a4 20 04 02


バランスWiiボード 2台目
04a40000 :  13 b2 13 ed 0b f5 48 47 0f 00 96 00 00 00 00 00
04a40010 :  00 00 00 00 00 ff ff ff ff ff ff ff ff ff ff ff
04a40020 :  01 69 00 00 13 66 13 f2 0b f6 48 91 1a 5f 1a a3
04a40030 :  12 dd 4f 48 21 5a 21 62 19 ce 56 0f b9 34 f5 28
04a40040 :  ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
04a40050 :  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
04a40060 :  11 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00
04a40070 :  ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
04a40080 :  ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
04a40090 :  ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
04a400a0 :  ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
04a400b0 :  ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
04a400c0 :  ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
04a400d0 :  ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
04a400e0 :  ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
04a400f0 :  ff ff 00 00 ff ff 00 00 00 00 00 00 a4 20 04 02


参考ページ
WiiBrewWiki Wiimote
WiiLi.org Wiimote

関連エントリ
バランスWiiボードの解析メモ 2
バランスWiiボードのメモ


やはり拡張ポート経由扱いで接続されていました。
アクセス方法は Nunchuk や Classic Controller と同じです。

他の拡張ポート経由のデバイス同様、16 でレジスタに書き込んで初期化を
行えば拡張デバイスの更新情報を取得できます。

例えばレポート番号 0x34 を使った場合下記の形式でデータが取れます。

34 00 00 AA AA BB BB CC CC DD DD ?? ?? EE ..

 AA AA 右上 (L)
 BB BB 左上  右下 (S)
 CC CC 右下  左上 (S)
 DD DD 左下 (L)

(AA AA~は BigEndian)
EE にも何らかの値が入っているように見えますが用途は不明です。
センサーは4つ。
バランスボード本体の4本の足の位置に入っているようです。

 +----------------+
 | BB(S)  AA(L) |
 | DD(L)  CC(S) |
 |      Power     |
 +----------------+

裏返して足部分だけ押してみると、上の AA~DD の値が個別に
反応する様子がわかります。

センサーの種類は、値の範囲から見て2種類。

(L) が 18000~ 程度
(S) が 2700~ あたり

この2つはそれぞれ精度の担当範囲が異なっているのかもしれません。
対角に配置して精度を補いつつ、向きもわかる構造になっていると
考えられます。


2007/12/17追記: 単なるセンサーのばらつきでした

またこの値は Nunchuk/Classic のような 0x17 デコードが不要です。
実際に 0x04a40000 ~ 0x04a400ff をダンプしてみても、そのまま
素の値が取れているように見えます。
例えば 0x04a400fc は最初から 0xa4 です。

識別に使うと思われる 0x04a400f0~ のライン

04a400f0 : ff ff 00 00 ff ff 00 00 00 00 00 00 a4 20 04 02


その他わかったこと
・電源ボタンは Wii Remote の (A) ボタン相当
・電源ランプは LED1
・Nintendo RVL-WBC-01


●バランスWiiボード の判別アルゴリズム
(1) 0x20 レポートを読み出し、拡張ポートが使われているかチェック
(2) 拡張ポートが使われていなければ Wii コントローラのみ
(3) 拡張ポートへ接続があれば 0x04a400fc を読み出し 0xa4 かチェック
(4) 0xa4 なら 0x17 デコードをしない。0xa4 でなければ 0x17 変換を行う
(5) 0x04a400fe~ff を読み出し判別する。
   0x00 0x00 Wiimote+ヌンチャク
   0x01 0x01 Wiimote+クラシックコントローラ
   0x04 0x02 バランスWiiボード

キャリブレーション等その他の情報は不明。
追記: 解析済みです。解析メモ 3以降を参照してください。
これは blog の1エントリに過ぎないので、他の後日のエントリも参照してください。


参考ページ
WiiLi.org Wiimote
WiiLi.org Wiimote/Extension Nunchuk
WiiLi.org Wiimote/Extension Classic Controller
WiiBrewWiki Wiimote

リンク
WiiFit 、バランスWiiボード


関連ページ
バランスWiiボードの解析メモ 3 / 4
バランスWiiボードの解析メモ 5
wiibalancepc PC版体重計 Download




WiiFit の体重計 バランスWiiボード
コントローラと同じように Bluetooth で認識可能。

Bluetooth での機器名

・Nintendo RVL-CNT-01 (Wiiリモコン)
・Nintendo RVL-WBC-01 (バランスWiiボード)

Vista x64 でもペアリング OK。
ただしそのままではコントローラとして使えません。

Bluetooth での名称は異なるものの、HID でアクセスすると
プロダクトID も名称も Wiiリモコン と全く同じ。特に区別なし。

Wiiリモコンの LED コントロールを使うと、LED1 がバランスWiiボード
の電源ランプに相当。0x11 0x10 等。

0x20 の Status を見ると、Nunchuk, Classic Controller と同じように
拡張ポート扱いで接続されているように見えます。
バッテリー容量はそのまま取れそうです。

参考
WiiLi.org Wiimote
MSDN Human Input Devices

HID へのアクセス方法は WindowsDriverKit (WDK) の
\WinDDK\6000\src\hid\hclient あたりが参考になります。