別棟備忘録4

*

Wii速度計第参話「簡易記録の改善」

      2015/10/25

3夜連続更新(予定)でお届けする、Wiiリモコン速度計開発の記 第参話


昨晩はペルセウス座流星群が見ごろであったそうな…。気づいたら夜が明けてしまい、あくる朝に。12時間遅れでお届けする、第3夜。
Wiihayasaに演示ソフトとして意味を持たせる「最後の砦」と位置づけられる簡易記録モードの改善に取り組むエントリ。
改善内容は、次の2点。
1.前回エントリで示唆された、「500ms,1000ms,1500msといった瞬間瞬間の値を書き出すのではなく、500msの値を表示するなら、250msと750msの位置座標から平均の速さを求めたほうがいいのでは?」の具現化。
2.簡易表示で生徒にv-tグラフを書いてもらおう!というのがねらいであるが、この際簡単なグラフ表示機能を追加してみよう。
改良版Wiihayasaの・デザイン作成中・
Wiihayasa2.jpg
ソースWiitest12v7s.txt。長くなってきたので外部ファイル。
要点。

Private l(400) As Single ‘簡易記録時lのバッファ
Private t(400) As Long ‘簡易記録時tのバッファ

を宣言した上で、タイマーイベントに

If ksave = True Then
l(k) = l1
t(k) = timeCount1
k = k + 1
End If

を追加。50msごとの時刻と位置座標を記録する。401個まで記録できるので、約20秒保存可能。
簡易記録ボタンONOFFの処理

‘/簡易記録ボタン/
Private Sub Button5_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button5.Click
If ksave = False Then
Button5.Text = “記録中”
Button5.BackColor = Color.Pink
i = 0
ksave = True
startTime = timeGetTime()
Else
Button5.Text = “簡易記録”
Button5.BackColor = Color.Silver

簡易記録モードがONでksaveをTrueにして記録開始。簡易記録モードがオンからオフになったとき、

For j = 0 To 4
data_interval(j) = Int((saveint.Text * (j + 1)) / 50) ‘5つのデータの時刻。指定の時間間隔で5点。
data_pitch = Int(saveint.Text / 100) ‘平均の速さを求めるときに、いくつ前といくつ後のデータを参照するか。
Next
For j = 0 To 4
If t(data_interval(j) + data_pitch) = 0 Then ‘データが存在しない時は、0を簡易表示。
v(j) = 0
Average_Time(j) = 0
Else ‘平均の速さを求める。
v(j) = (l(data_interval(j) + data_pitch) – l(data_interval(j) – data_pitch)) / (t(data_interval(j) + data_pitch) – t(data_interval(j) – data_pitch))
Average_Time(j) = ((t(data_interval(j) + data_pitch) + t(data_interval(j) – data_pitch))) / 2
End If
Next j

前半部分は平均の速さを求める際に、中央値に対してどの時点とどの時点のデータをひっぱってくるか計算している。
たとえば、500ms間隔で簡易表示となれば、dataintervalは10,20,30,40,50となり、data_pitchは5になる。
その値を使って後半部分で例えば、

v(1)=(l(15)-l(5))/(t(15)-t(5))

を計算、つまり、(15)を付した750ms時点と(5)を付した250ms時点のデータから平均の速さを求めている。ちなみに、300ms間隔で簡易表示の場合は、dataintervalが6,12,18,24,30、datapitchは3だから、たとえば

v(1)=(l(9)-l(3))/(t(9)-t(3))

450ms時点と、150ms時点のデータを参照する。
そうです。簡易表示の間隔は、50msの偶数倍が望ましいのです。
そして、

v1.Text = Format(v(0), “0.00”)
v2.Text = Format(v(1), “0.00”)
v3.Text = Format(v(2), “0.00”)
v4.Text = Format(v(3), “0.00”)
v5.Text = Format(v(4), “0.00”)
t1.Text = Format(Average_Time(0) / 1000, “0.00”)
t2.Text = Format(Average_Time(1) / 1000, “0.00”)
t3.Text = Format(Average_Time(2) / 1000, “0.00”)
t4.Text = Format(Average_Time(3) / 1000, “0.00”)
t5.Text = Format(Average_Time(4) / 1000, “0.00”)
ksave = False
End If

各Label1にv(1)~v(5)、t(1)~t(5)を表示。
そして、各Labelに表示されたテキストファイルを元に、グラフを表示します。

‘/グラフ表示1ボタン/
Private Sub graph_ViewR_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles graph_ViewR.Click
‘それぞれの点をグラフに表示。x=146t+22.2、y=-256.08v + 311.95)
Rpoint1.Left = Int(t1.Text * 146.8 + 22.2)
Rpoint2.Left = Int(t2.Text * 146.8 + 22.2)
Rpoint3.Left = Int(t3.Text * 146.8 + 22.2)
Rpoint4.Left = Int(t4.Text * 146.8 + 22.2)
Rpoint5.Left = Int(t5.Text * 146.8 + 22.2)
Rpoint1.Top = Int(v1.Text * (-256.08) + 311.95)
Rpoint2.Top = Int(v2.Text * (-256.08) + 311.95)
Rpoint3.Top = Int(v3.Text * (-256.08) + 311.95)
Rpoint4.Top = Int(v4.Text * (-256.08) + 311.95)
Rpoint5.Top = Int(v5.Text * (-256.08) + 311.95)
‘もし、簡易表示の値が0なら、○deta1の○にマーカーを重ねる。
If (t1.Text = 0.0) Then
Rpoint1.Top = 17
Rpoint1.Left = 376
End If
If (t2.Text = 0.0) Then
Rpoint2.Top = 17
Rpoint2.Left = 376
End If
If (t3.Text = 0.0) Then
Rpoint3.Top = 17
Rpoint3.Left = 376
End If
If (t4.Text = 0.0) Then
Rpoint4.Top = 17
Rpoint4.Left = 376
End If
If (t5.Text = 0.0) Then
Rpoint5.Top = 17
Rpoint5.Left = 376
End If
End Sub

ここは、コメントの通り、です。起動のときにマーカーを6つ重ねておいて、そのうち5つを(x=146t+22.2、y=-256.08v + 311.95)の座標に移動させている、というわけです。我ながら何ともアマチュアなグラフの描き方。
運動の比較ができるように、グラフは2つ分用意しておきました。
・落し物・
サンプルプログラム:Wiihayasa_b.zip←右クリック+対象をファイルに保存
サンプルソース一式:Wiitest12v7s.zip←右クリック+対象をファイルに保存
(リンクが違っていてので修正2011.8.26)
…長くなってきたので、「傾斜6°の斜面を使った場合に、こんな感じのデータが得られました。」といった動作の様子は次回エントリで詳しく。
Wiihayasa6deg.jpg

次へ

 - Wiiリモコン→速度計