別棟備忘録4

*

「WiimoteLibを使う」番外編~Timerを使うお勉強:後編~

      2015/10/24

以前作ったWiimoteLib版Wiikskに対し、「時間」的改造を施す。
時間の情報を加えて書き出し、測定機器としてそれなりに使えるように、と。
方針としては…
①従来「Wiiリモコンの状態の変化をキャッチ→画面に表示」としていたものを、
「とりあえず10ms間隔でWiimoteStateを取得して、表示」するように作り変える。
②wiiksk0.45にあったような、csv形式での書き出し機能を付加。
③ついでに、今まで一応書いてあったけど要らなそうな部分を削除。もっと良い書き方をラーニングした部分は書き換えて…。
参考ページ
・VBに関して、小数点以下の桁数について
・VBでのファイルへの書き込み


Imports WiimoteLib
Public Class Form1
Private mkLange As Integer = 2
Private wm As New Wiimote
Private cx, cy, cz As Single
Private save As Boolean = False
Private ksk As Boolean = True
Private sw As New System.IO.StreamWriter(“data.csv”, True, System.Text.Encoding.GetEncoding(“shift_jis”))
Private Declare Function timeGetTime Lib “winmm.dll” Alias “timeGetTime” () As Long
Private startTime As Long = 0
Dim timeCount4 As String
Public Sub New()
InitializeComponent()
End Sub
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
wm.Connect()
wm.SetReportType(InputReport.ButtonsAccel, True)
wm.SetLEDs(False, True, True, False)
Button1.BackColor = Color.Pink
End Sub
Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
Timer2.Interval = ComboBox1.Text
End Sub
‘/////このあたりから前回同様のどうでもいい部分/////
Private Sub Button3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button3.Click
mkLange = ComboBox2.Text
End Sub
Private Sub Button4_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button4.Click
Button4.BackColor = Color.Pink
If CheckBox1.Checked = True Then
cx = Label4.Text
End If
If CheckBox2.Checked = True Then
cy = Label5.Text
End If
If CheckBox3.Checked = True Then
cz = Label6.Text
End If
End Sub
Private Sub Button5_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button5.Click
cx = 0
cy = 0
cz = 0
Button4.BackColor = Color.Silver
End Sub
‘/////このあたりまで/////
‘/////記録ボタン/////
Private Sub Button6_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button6.Click
If save = False Then
Button6.Text = “記録中”
Button6.BackColor = Color.Pink
save = True
startTime = timeGetTime()
sw.WriteLine(“time(s)” & “,” & “ax” & “,” & “ay” & “,” & “az”)
Else
Button6.Text = “記録”
Button6.BackColor = Color.Silver
save = False
End If
End Sub
‘/////タイマーのイベント_加速度の表示他/////
Private Sub Timer2_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer2.Tick
timeCount4 = Format((timeGetTime() – startTime) / 1000, “0.000”)
Dim ws As WiimoteState = wm.WiimoteState
Label4.Text = Format((9.8 * -ws.AccelState.Values.X) – cx, “0.0”)
Label5.Text = Format((9.8 * ws.AccelState.Values.Y) – cy, “0.0”)
Label6.Text = Format((9.8 * -ws.AccelState.Values.Z) – cz, “0.0”)
If ksk = True Then
OvalShape1.Top = 256 + 25 * (1 + mkLange) * (Label6.Text / 9.8)
OvalShape1.Left = 363 + 25 * (1 + mkLange) * (Label4.Text / 9.8)
OvalShape2.Top = 195 + 25 * (1 + mkLange) * (Label5.Text / 9.8)
OvalShape2.Left = 138 + 25 * (1 + mkLange) * (Label4.Text / 9.8)
End If
If save = True Then
sw.WriteLine(timeCount4 & “,” & Label4.Text & “,” & Label5.Text & “,” & Label6.Text)
End If
End Sub
‘/////加速度の方向OFFボタン/////
Private Sub Button7_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button7.Click
If ksk = False Then
Button7.Text = “表示”
Button7.BackColor = Color.Pink
ksk = True
Else
Button7.Text = “非表示”
Button7.BackColor = Color.Silver
OvalShape1.Top = 256
OvalShape1.Left = 363
OvalShape2.Top = 195
OvalShape2.Left = 138
ksk = False
End If
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()
sw.Close()
End Sub
End Class

落し物
サンプルプログラム:Wii加速度計wiiksk2←右クリック+対象をファイルに保存
↑リンクが違ってました。2010.12.3.19:00修正。
(自分のPCでも起動すると10回に1回くらいエラーが…。またいずれ。いずれ…。)
wiiksk2.jpg
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
記録ボタンを一応実装。wiitest08と同じフォルダのdata.csvにデータを書き出します。書き出してみると…
time(s),ax,ay,az
0.003,-1.5,-5.4,-7.8
0.041,0.8,-5.4,-9.4
0.081,2.3,-6.9,-6.3
0.109,1.9,-6.9,-5.1
0.134,2.3,-7.6,-3.9
0.161,1.5,-7.6,-3.9
0.186,0.4,-6.9,-3.9
0.211,-1.1,-8.3,-0.8
0.238,-1.9,-9.1,-0.4
0.267,-3.8,-10.2,2.4
0.305,-3.4,-9.1,2.0
0.331,-0.8,-7.3,-1.6
0.369,0.8,-6.5,-3.1
0.397,3.0,-6.2,-5.9
0.425,2.6,-6.5,-5.5
0.451,2.3,-6.2,-6.3
0.479,2.6,-5.4,-8.6
一番左の列注目。つまり、インターバルを10msに設定しても、実際のデータ取得・書き出しには30ms程度要しているというわけです。
併せて、残念ながら従来のWiikskのように、”カウントアップ”で時間を0,0.01,0.02…と放り込むのは無理があると発覚したわけです。やはり、イベントごとに時計を見た方が適切。
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
遅延の原因はどこ?やはりまず真っ先に考えるのが、「加速度の方向表示、止めてみたら?」って発想。止めるボタンを実装し、赤い円の動きを止めて、いざ測定してみると…
time(s),ax,ay,az
0.006,0.0,-5.1,-7.4
0.016,1.1,-6.9,-5.5
0.026,1.1,-6.9,-5.5
0.036,3.0,-8.3,-5.1
0.046,3.0,-8.7,-4.7
0.056,3.0,-8.7,-4.7
0.062,2.6,-9.4,-4.3
0.072,3.0,-9.4,-4.3
0.082,3.0,-9.1,-5.1
0.092,2.6,-8.3,-5.5
0.103,2.3,-7.6,-5.9
0.112,1.5,-6.5,-5.9
0.122,1.1,-5.4,-6.7
0.132,1.1,-4.0,-7.8
0.142,1.1,-4.0,-7.8
0.152,1.1,-0.7,-8.6
0.162,-0.4,0.7,-8.6
0.172,-3.4,1.1,-7.4
0.182,-3.4,1.1,-7.4
はい、OK!! (…なのか?)
だいたい10msでデータがとれてるみたいですな。円を動かす処理が、案外重たいことが発覚。測定をするときにはこうした「余分な部分」をできるだけ止める。さすれば、0.01秒の精度は出そう、というわけで。
よくよくみると、だめですね。リモコンからのデータが100回/s来てないんですね。
そして関数timeGetTimeはシビアには50msの精度しかないそうな。
感覚的には「有効数字2桁の壁」が分厚いWiiリモコンなのでした。
・備忘録・
①sw.Close()の位置が微妙。現状一旦ソフトを閉じなければ、data.csvには書き出されない。
②軸の向きはこれでいいのか?でもなんだかこれだと各軸のwiimoteLib.dllでの向きが統一されていないような…
内部リンク
前編「timerについて」に戻る
WiimoteLibを使ってみる。に戻る

 - WiimoteLib