「WiimoteLibを使う」番外編~Timerを使うお勉強:前編~
2015/10/24
v-tグラフなり、a-tグラフを描けば、なんとなく運動の様子と、未来が見える。
高校の力学のスタンスはそんなところにあるわけで。
Wiiリモコンをゆくゆくは計測機として使うなら、timerを扱う事、避けては通れない。ということで、予習。
勉強になるページ・[VisualBasic] タイマー処理・
http://www.mb.ccnw.ne.jp/garger-studio/gameprog/vb0131.html
要約:timerで時間間隔を指定してイベントを発生させられる。
しかし、それを利用して、たとえば
「timerで計って10ミリ秒毎に0.01秒を加算してカウントアップ」
とやって時間を計るとずれるので、どちらかというと、
「イベントごとに時計を眺めて、差分で経過時間を測る」
の方がかしこい。云々。
プログラムを組んでみると…こんな感じ。(zip形式) スタートすると、図のように。
上が、
Private Sub Timer2_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer2.Tick
timeCount = timeCount + 1
m = timeCount \ 6000
s = timeCount \ 100 Mod 60
ms = timeCount Mod 100
Label2.Text = Format$(m, “00”) & “:” & Format$(s, “00”) & “.” & Trim$(Str$(ms))
End Sub
こんな感じ。timer2のインターバルは10sに。つまり、タイマーで10msを計って、0.01秒を加えていく。
まんなかは、
Private Declare Function timeGetTime Lib “winmm.dll” Alias “timeGetTime” () As Long
Private Sub Timer3_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer3.Tick
timeCount2 = timeCount2 + 1
timeCount3 = timeCount3 + 1
m1 = timeCount2 \ 600
s1 = timeCount2 \ 10 Mod 60
ms1 = timeCount2 Mod 10
Label3.Text = Format$(m1, “00”) & “:” & Format$(s1, “00”) & “.” & Trim$(Str$(ms1))
If timeCount3 = 50 Then
timeCount2 = Int((timeGetTime() – startTime) / 100)
timeCount3 = 0
End If
End Sub
基本的に一番上のものと、同じだが、たまに時計を見て修正するヴァージョン。挙動が気持ち悪い。
一番下が、
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
startTime = timeGetTime()
End Sub
Private Sub Timer4_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer4.Tick
timeCount4 = (timeGetTime() – startTime)
m1 = timeCount4 \ 60000
s1 = timeCount4 \ 1000 Mod 60
ms1 = timeCount4 Mod 1000
Label6.Text = Format$(m1, “00”) & “:” & Format$(s1, “00”) & “.” & Trim$(Str$(ms1))
End Sub
こんな感じ。timer4のインターヴァルは1ms。時計をみて差分で常に表示する。
環境にも左右されるものの、これで1分半あたり約1秒上の方が遅れる。1%のずれ。割と重大。
別のPCでやってみると、1分半で30秒ずれる。WAO!
より正確に時間を計る方法が上記ページに書かれてはいるが、試せども動かず。
とりあえずストップウォッチくらいの精度は得られそう。
ここはひとまず、後編へ先を急ぐ。