きかいや。

機械といいつつだいたいプログラミングのはなし

Unity+WindowsでWiiのBalanceBoardを使う

Unityで任天堂バランスWiiボードのデータを取れるようになったのでメモです。

VR用の移動系コントローラとして使用予定。

追記:サーバ、クライアント(Unity)のプロジェクト全体をアップロードしました。ライセンスはMs-PL。

使い方は後日。

 

drive.google.com

 

動画


WiiBalanceBoardCOPTest


WiiBalanceBoardTestCoPTrail

 

動作確認した構成:

PC:Windows 10 Home
サーバ:C#(VisualStudio2013)+WiimoteLib1.7

クライアント:Unity5.3.5f

バランスWiiボード

 

背景:
MacだとUnityとバランスボードをつなげるアセットが売ってるので楽らしいのですが、Windows非対応。

・よく使われているWiimoteLibというライブラリはUnity上ではうまく動かない 。せっかくC#なのに!※

 

手法:

・UnityとTCP通信するサーバを立てる。このサーバはWiimoteLibを使ってbalanceboardと通信してセンサ値を取得しており、センサ値をUnityに送信する仲介役。(WiimoteLibのサンプルを改造して、C#で書いた)

・Unityアプリ側はサーバへTCPで接続し、センサデータを受け取る(クライアント)

・Unityアプリの起動時にサーバアプリを起動するようにした、Editor実行時に勝手にサーバも立ち上がってくれるので便利です。

 

何の情報が取れるか:

いまのところ、Unity側では

・重量

・圧力中心の位置情報

・各センサの生値

・コントローラ番号

の取得が可能です。

 

その他:

・マルチバランスボード対応です。

・サーバアプリはUnityアプリ(クライアント)から自動起動できます。(デフォルトではバックグラウンド起動しませんが、フラグを立てるとバックグラウンド起動します)

 

参考:

外部アプリケーションを起動して終了まで待機する: .NET Tips: C#, VB.NET

 

 

※UnityアプリとBalanceBoard間で直接通信したかったのですが、WiimoteLibはC#向けのLibがあるにもかかわらずUnityでは使えません。(どうもWin32APIあたりのSafeHandlesを中で使ってるのが原因っぽい。動かない。)そこで一段間に別のアプリとしてかませています。

※PC-バランスボード間はBluetoothで接続するため、あらかじめペアリングが必要になります。通常のやり方だとbalanceboardを再起動するたびにペアリングが必要になるので、以下のサイトを参考にしてください。

Wiiリモコン(バランスボード)とWindowsの再接続の話

-----------------

いまのところTCP通信はfloat型の数値をString型で通信してfloat.TryParse()して数値に戻すという無駄なことをやってるのですが、TCPでbinary通信する方法が良く分かりませんでした…(教えて下さると幸いです)
あとTryParseがミスる確率がだいぶ高いのですが、原因が良く分かりません

 --------------------

参考リンク:この辺を参考にしています

wiimotelib.codeplex.com

 

TCPクライアント・サーバープログラムを作成する: .NET Tips: C#, VB.NET

 

 

d.hatena.ne.jp

----------------

追記:リンクのセキュリティアップデートで共有できなくなっていたので再掲しました。