別棟備忘録4

*

「WiimoteLibを使う」第五話~Wiiモーションプラスの活用~

      2015/10/24

3軸ジャイロセンサーを付加することで、「ひねる」動きを捉え、より直観的なコントローラーへとWiiリモコンを進化させるWiiモーションプラス。1500円で3軸ジャイロセンサーが手に入ると話題になった。
近頃では「Wiiリモコンプラス」として内蔵されているというから驚きである。
800px-Wiiモーションプラス
(画像ソース:Wikipedia)
「Wiiリモコンを力学のセンサーとして使う」という試みにとって、回転を検出するこのセンサーは無視できない。ということで、今回のエントリーはWiiモーションプラスをWiimoteLib+VisualBasicで使う入り口の試み、である。
Wiiモーションプラスに対するWiimoteLibの反応は早く、2009年6月に発売されるや否や2009年7月には1.8beta版(http://wiimotelib.codeplex.com/releases/view/30401)でいきなり対応がなされた。
未来は明るいと思われた。が、しかし。それ以降WiimoteLibのリリースが途絶えてしまった…。
つまり、Wiiモーションを使うにはベータ版ながら1.8betaを使うより他ない。
1.8betaにも他のバージョンと同じくサンプルプログラムが付いているが、ソースはC#のみである。Webには「正式版でVBのソースを公開」とあり、期待を膨らませたが、公開されずはや2年。…そろそろ限界である。お試しがてら触ってみることにする。
とりあえず過去のエントリーのこの辺り(加速度計のエントリー)を引っ張ってきて、このページ(kosaka-Lab.com)
を参考に書いてみる。

motionxval.Text = ws.MotionPlusState.RawValues.X

と書くと、どうやらいい感じでコンパイル通る。しかし、値は一向に表示されない。
そこからあれこれしているうちに、

wm.InitializeMotionPlus()

この記述が大事なことに気づく。(後で見ると、本家にも参考ページにもはっきりと書いてあった。自己嫌悪。)
とりあえず過去を思い出すために作ったバッテリー残量+ボタンONOFF、WiimoteLibのサンプルを参考にwm.WiimoteState.ExtensionTypeを書き出すLabelを付加してみた。
・起動画面・
WiimotionTest.jpg
ソースコード的なもの

Imports WiimoteLib
Public Class Form1
Private wm As New Wiimote
Public Sub New()
InitializeComponent()
End Sub
Private Sub ConnectButton_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ConnectButton.Click
wm.Connect()
wm.SetReportType(InputReport.IRExtensionAccel, True)
wm.SetLEDs(False, True, True, False)
ConnectButton.BackColor = Color.Pink
End Sub
Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
Dim ws As WiimoteState = wm.WiimoteState
BattBar.Value = ws.Battery
batt_Val.Text = ws.Battery
motionxval.Text = ws.MotionPlusState.RawValues.X
motionyval.Text = ws.MotionPlusState.RawValues.Y
motionzval.Text = ws.MotionPlusState.RawValues.Z
Yaw_ck.Checked = wm.WiimoteState.MotionPlusState.YawFast
Pitch_ck.Checked = wm.WiimoteState.MotionPlusState.PitchFast
Roll_ck.Checked = wm.WiimoteState.MotionPlusState.RollFast
A_ck.Checked = ws.ButtonState.A
B_ck.Checked = ws.ButtonState.B
StateLbl.Text = wm.WiimoteState.ExtensionType.ToString()
End Sub
Private Sub Form1_FormClosing(ByVal sender As Object, ByVal e As FormClosingEventArgs) Handles MyBase.FormClosing
wm.SetLEDs(False, False, False, False)
wm.Disconnect()
End Sub
Private Sub IniMotionPlus_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles IniMotionPlus.Click
wm.InitializeMotionPlus()
End Sub
End Class

・落し物・
サンプルプログラム:Wiimotion_test←右クリック+対象をファイルに保存
サンプルソース一式:Wiitest20s.zip←右クリック+対象をファイルに保存
数値は整置状態で7900位の値が返ってきている。上限16000位。
ws.MotionPlusState.RawValues.Zの”Raw”が示すとおり、この値は生データで、単純に電圧が変換されたものであると思われる。先のページにもあるように、これを意味のあるデータにしてくれるであろうMotionPlusState.Valuesはbeta版の現時点では動かない。正式版での実装が謳われていたらしいが…(以下略)
したがってセンサとしての肝であるそれぞれの数値が何°/secなのかってのは未検証。これについてはネットで相当量のマルチポストをしている方も…。近いうちになんとか。
…と言いながら2年放置したりして。
・備忘録・
データ値について。勉強になる先人たちの試み他
kako.com(http://www.kako.com/neta/2009-017/2009-017.html
独自のソフト(&回路も?)avr_motionplus_02.zipで測定した 中央下のグラフに注目。
レンジを切り替えて広範囲を測定できる仕様になっている模様。データだけでなく、wm.WiimoteState.MotionPlusState.RollFast他が送られてきているのはそのためだったという訳ですな。
WiiBrew(http://wiibrew.org/wiki/Wiimote/Extension_Controllers/Wii_Motion_Plus
Data Format の項目にほぼ答えが。6byteに格納されて各軸14bitのデータが送られてきている。静値した状態で大体8063位が出力されている。云々。英語苦手。
↑に対する解釈と評価エントリ『Wii角速度計File.1 換算式の評価 I』(2011.7.31追記)
内部リンク
WiimoteLibを使ってみる。に戻る
戻る← 「WiimoteLibを使う」第四話~赤外線センサーの活用~
余談

100億!?…驚いた。FC2全体、か。

 - WiimoteLib