Wiiリモコンで計る距離 第3話データロガー化
2015/10/25
こちらのエントリでは、リアルタイムにグラフを描画する予行演習を行った。WiiZahyouにそれを応用し、位置座標センサー&データロガーっぽくするエントリ。
デザインの変更。従来のボタン群は残したうえで…
1.グラフを描画するPictureBoxを配置。
2.数値入力+接待ボタンで、縦軸横軸のスケール変更を可能に。
3.距離表示にZERO-setボタンを装備。
・ソースの要点・
Private Sub Form1_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
PictureBox1.Image = New Bitmap(PictureBox1.Width, PictureBox1.Height)
g = Graphics.FromImage(PictureBox1.Image)
g.Clear(Color.White)
‘グラフの目盛り線の描画
For i = 0 To 4
g.DrawLine(Pens.Black, 0, 75 * i, 440, 75 * i)
g.DrawLine(Pens.Black, 110 * i, 0, 110 * i, 300)
g.DrawLine(Pens.Gray, 110 * i + 55, 0, 110 * i + 55, 300)
Next
End Sub
PictureBox1.Image = New Bitmap(PictureBox1.Width, PictureBox1.Height)
g = Graphics.FromImage(PictureBox1.Image)
g.Clear(Color.White)
‘グラフの目盛り線の描画
For i = 0 To 4
g.DrawLine(Pens.Black, 0, 75 * i, 440, 75 * i)
g.DrawLine(Pens.Black, 110 * i, 0, 110 * i, 300)
g.DrawLine(Pens.Gray, 110 * i + 55, 0, 110 * i + 55, 300)
Next
End Sub
初めにNewBitmapの準備+目盛り線引いておきます。
Private Sub Bt_Yset_Click(sender As System.Object, e As System.EventArgs) Handles Bt_Yset.Click
Lb_Y01.Text = Int(TB_00.Text + (CInt(TB_01.Text) – CInt(TB_00.Text)) * 1 / 4)
Lb_Y02.Text = Int(TB_00.Text + (CInt(TB_01.Text) – CInt(TB_00.Text)) * 2 / 4)
Lb_Y03.Text = Int(TB_00.Text + (CInt(TB_01.Text) – CInt(TB_00.Text)) * 3 / 4)
End Sub
Private Sub Bt_Xset_Click(sender As System.Object, e As System.EventArgs) Handles Bt_Xset.Click
Lb_X01.Text = Int((TB_02.Text) / 4)
Lb_X02.Text = Int((TB_02.Text) * 2 / 4)
Lb_X03.Text = Int((TB_02.Text) * 3 / 4)
End Sub
Lb_Y01.Text = Int(TB_00.Text + (CInt(TB_01.Text) – CInt(TB_00.Text)) * 1 / 4)
Lb_Y02.Text = Int(TB_00.Text + (CInt(TB_01.Text) – CInt(TB_00.Text)) * 2 / 4)
Lb_Y03.Text = Int(TB_00.Text + (CInt(TB_01.Text) – CInt(TB_00.Text)) * 3 / 4)
End Sub
Private Sub Bt_Xset_Click(sender As System.Object, e As System.EventArgs) Handles Bt_Xset.Click
Lb_X01.Text = Int((TB_02.Text) / 4)
Lb_X02.Text = Int((TB_02.Text) * 2 / 4)
Lb_X03.Text = Int((TB_02.Text) * 3 / 4)
End Sub
テキストに数字を入れて、設定ボタンを押す。各Labelに、1/4の値を入れまして。
Private Sub Bt_ksave_Click(sender As System.Object, e As System.EventArgs) Handles Bt_ksave.Click
If ksave = False Then
Bt_ksave.Text = "記録中"
Bt_ksave.BackColor = Color.Pink
ksave = True
j = 0
y = 0
old_j = 0
old_y = 300 – ((Int(Label2.Text) – TB_00.Text) * 300 / (TB_01.Text – TB_00.Text))
g.Clear(Color.White)
For i = 0 To 4
g.DrawLine(Pens.Black, 0, 75 * i, 440, 75 * i)
g.DrawLine(Pens.Black, 110 * i, 0, 110 * i, 300)
g.DrawLine(Pens.Gray, 110 * i + 55, 0, 110 * i + 55, 300)
Next
startTime2 = timeGetTime()
Else
Bt_ksave.Text = "グラフ記録"
Bt_ksave.BackColor = Color.Silver
ksave = False
End If
End Sub
If ksave = False Then
Bt_ksave.Text = "記録中"
Bt_ksave.BackColor = Color.Pink
ksave = True
j = 0
y = 0
old_j = 0
old_y = 300 – ((Int(Label2.Text) – TB_00.Text) * 300 / (TB_01.Text – TB_00.Text))
g.Clear(Color.White)
For i = 0 To 4
g.DrawLine(Pens.Black, 0, 75 * i, 440, 75 * i)
g.DrawLine(Pens.Black, 110 * i, 0, 110 * i, 300)
g.DrawLine(Pens.Gray, 110 * i + 55, 0, 110 * i + 55, 300)
Next
startTime2 = timeGetTime()
Else
Bt_ksave.Text = "グラフ記録"
Bt_ksave.BackColor = Color.Silver
ksave = False
End If
End Sub
簡易記録ボタンが押された時の処理。グラフをさらにして線を引き直し、時間軸と位置座標軸のそれぞれ_oldの値を放り込む。ksaveをTrueに。
If ksave = True Then
timeCount2 = timeGetTime() – startTime2
y = 300 – ((Int(Label2.Text) – TB_00.Text) * 300 / (TB_01.Text – TB_00.Text))
j = timeCount2 * 440 / TB_02.Text
g.DrawLine(RED_Pen, old_j, old_y, j, y)
PictureBox1.Refresh()
old_y = y
old_j = j
End If
timeCount2 = timeGetTime() – startTime2
y = 300 – ((Int(Label2.Text) – TB_00.Text) * 300 / (TB_01.Text – TB_00.Text))
j = timeCount2 * 440 / TB_02.Text
g.DrawLine(RED_Pen, old_j, old_y, j, y)
PictureBox1.Refresh()
old_y = y
old_j = j
End If
タイマーのところに追記。ksave=Trueのとき、縦横値を調節して線を引く。
どんな感じのグラフが描画されるか例1「単振動」
こんな感じで吊るして、振幅6cm位で揺らします。すると、得られるグラフはこんな感じ。
…ちょっと変位の値がバグっていますが…。
台車に置くなどして、あんまりWiiリモコンがねじれないようにすると、いい感じでグラフ描画ができる感じ。
・とにかく試用の落し物・
サンプルプログラム:WiiZahyou2.zip←右クリック+対象をファイルに保存
サンプルソース一式:WiiZahyou2s.zip←右クリック+対象をファイルに保存
***********「Wiiリモコン座標計」 幕************