別棟備忘録4

*

Wii速度計 第壱話「Wii座標改造」

      2015/10/25

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


話の前提は、Wii座標計。位置座標がセンチとか、ミリとかの精度で得られれば、「時間で微分」することによって「速さ」(正確には、差分を取って平均の速さ)を求めることができる。と考えるのは至極当然の流れ。
ではなぜその記事作成に半年もの時間を要したのか…その紆余曲折の備忘録。
最初に作ったWiihayasaの・デザイン作成中・
Wiihayasa0810_0
つまり、WiiZahyouの距離の部分をリモコンの速さにして、一定の時間間隔で記録した速さを表示できる簡易記録の表示Lebelを付け加えた、と。
ソース的には、とりあえずWii座標計の一部改変。変更点の大事なところを以下に。「続きを読む」に全体像。


‘//////////////////距離算出//////////////////////////
ird = Math.Sqrt((ws.IRState.IRSensors(0).Position.X – ws.IRState.IRSensors(1).Position.X) ^ 2 + (ws.IRState.IRSensors(0).Position.Y – ws.IRState.IRSensors(1).Position.Y) ^ 2)
l2 = l1
l1 = (1.3228 * (wsd / ird) – 9.7373)
Label2.Text = Format((l1 – l2) / Timer1.Interval, “0.00”) ‘Label2に距離書き出し
If save = True Then
sw.WriteLine(timeCount1 & “,” & Label2.Text)
End If
If ksave = True Then
If timeCount1 * 1000 > i * ksaveint AndAlso i < 5 Then t(i) = timeCount1 v(i) = Label2.Text i = i + 1 End If End If End Sub

距離算出の後、初期設定でTimer1.Intervalは50ms。つまりここでは50ms前の位置座標との差をとり、50msで割ることで速さを求め、Label2に表示する。
後半部分では、後述の簡易記録に備えて、指定された時間間隔で、5つ分時間と速さのデータを保持しておく。


‘////////////簡易記録ボタンと、データ書き出し/////////////
Private Sub Button5_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button5.Click
If ksave = False Then
ksaveint = saveint.Text
Button5.Text = “記録中”
Button5.BackColor = Color.Pink
i = 0
ksave = True
startTime = timeGetTime()
Else
Button5.Text = “簡易記録”
Button5.BackColor = Color.Silver
v1.Text = v(0)
v2.Text = v(1)
v3.Text = v(2)
v4.Text = v(3)
v5.Text = v(4)
t1.Text = Int(t(0) * 10) / 10
t2.Text = Int(t(1) * 10) / 10
t3.Text = Int(t(2) * 10) / 10
t4.Text = Int(t(3) * 10) / 10
t5.Text = Int(t(4) * 10) / 10
ksave = False
End If
End Sub
End Class

簡易記録表示の部分に、保持していた5セットの時間-速さのデータを書き出す。
いろんな突っ込みは想定されますが、とりあえず初期段階の試作の試作ってことで。やっつけ。
・落し物・
サンプルプログラム:Wiihayasa_a.zip←右クリック+対象をファイルに保存
サンプルソース一式:Wiitest12v3s.zip←右クリック+対象をファイルに保存
動かしてみると…速さの表示部分が目まぐるしく変わる。正直、あっているのか違っているのかすら分からない。座標計のような感動は、ない。授業でも使いづらい…か。
・起動画面・最後の希望「簡易記録」を、物体を等加速度運動(一定の力加えて)させてテストの図。
Wiihayasa0810
ほら。おんなじ割合で速さが速くなっていって…ない!誤差というには余りに違い過ぎている。何度やってもこんな感じ。(…というか寧ろ、図はまだうまくいった方。)これではいかに純朴な生徒たちとはいえ騙されないだろう。
という訳で、続く。


ソース全体像


Imports WiimoteLib
Public Class Form1
Private wm As New Wiimote
Private save As Boolean = False
Private ksave As Boolean = False
Private ksaveint As Single
Private i As Integer = 0
Private v(4) As Single
Private t(4) As String
Private wir As Boolean = True
Private wsd As Single = 150
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
Private l1 As Double = 1
Private l2 As Double = 1
Private ird As Double = 200
Dim timeCount1 As String
Public Sub New()
InitializeComponent()
End Sub
Private Sub Button2_Click_1(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
Timer1.Interval = ComboBox1.Text
End Sub
Private Sub Button6_Click_1(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)” & “,” & “x(mm)”)
Else
Button6.Text = “記録”
Button6.BackColor = Color.Silver
save = False
End If
End Sub
Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
timeCount1 = Format((timeGetTime() – startTime) / 1000, “0.000”)
Dim ws As WiimoteState = wm.WiimoteState
‘//////////////////IRLEDの位置表示に関する部分//////////////////////////
If ws.IRState.IRSensors(0).Found = True Then
If wir = True Then
OvalShape1.FillColor = Color.Red
OvalShape1.Left = 160 * ws.IRState.IRSensors(0).Position.X
OvalShape1.Top = 160 – 160 * ws.IRState.IRSensors(0).Position.Y
End If
Else
OvalShape1.FillColor = Color.Silver
End If
If ws.IRState.IRSensors(1).Found = True Then
If wir = True Then
OvalShape2.FillColor = Color.Red
OvalShape2.Left = 160 * ws.IRState.IRSensors(1).Position.X
OvalShape2.Top = 160 – 160 * ws.IRState.IRSensors(1).Position.Y
End If
Else
OvalShape2.FillColor = Color.Silver
End If
‘//////////////////距離算出//////////////////////////
ird = Math.Sqrt((ws.IRState.IRSensors(0).Position.X – ws.IRState.IRSensors(1).Position.X) ^ 2 + (ws.IRState.IRSensors(0).Position.Y – ws.IRState.IRSensors(1).Position.Y) ^ 2)
l2 = l1
l1 = (1.3228 * (wsd / ird) – 9.7373)
Label2.Text = Format((l1 – l2) / Timer1.Interval, “0.00”) ‘Label2に距離書き出し
If save = True Then
sw.WriteLine(timeCount1 & “,” & Label2.Text)
End If
If ksave = True Then
If timeCount1 * 1000 > i * ksaveint AndAlso i < 5 Then t(i) = timeCount1 v(i) = Label2.Text i = i + 1 End If 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 Private Sub Button3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button3.Click wsd = TextBox1.Text End Sub Private Sub Button1_Click_1(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click wm.Connect() wm.SetReportType(InputReport.IRAccel, True) wm.SetLEDs(False, True, True, False) Button1.BackColor = Color.Pink End Sub Private Sub Button4_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button4.Click If wir = False Then Button4.Text = "表示" Button4.BackColor = Color.Pink wir = True Else Button4.Text = "非表示" Button4.BackColor = Color.Silver wir = False End If End Sub '////////////簡易記録ボタンと、データ書き出し///////////// Private Sub Button5_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button5.Click If ksave = False Then ksaveint = saveint.Text Button5.Text = "記録中" Button5.BackColor = Color.Pink i = 0 ksave = True startTime = timeGetTime() Else Button5.Text = "簡易記録" Button5.BackColor = Color.Silver v1.Text = v(0) v2.Text = v(1) v3.Text = v(2) v4.Text = v(3) v5.Text = v(4) t1.Text = Int(t(0) * 10) / 10 t2.Text = Int(t(1) * 10) / 10 t3.Text = Int(t(2) * 10) / 10 t4.Text = Int(t(3) * 10) / 10 t5.Text = Int(t(4) * 10) / 10 ksave = False End If End Sub End Class

次へ

 - Wiiリモコン→速度計