「WiimoteLibを使う」第四話~赤外線センサーの活用~
2015/10/24
wiikskでは、加速度センサー機能をクローズアップした。一方、今回の大きな目的はその赤外線センサー周りの機能を活用することにある。WiimoteLibをつかってみる第一部の最後に、赤外線センサー(カメラ、とでも言うべきか)に触れておく。
Wiiで遊ぶ際にはテレビの上にWiiセンサーバーを置く必要がある。テレビやエアコン等の通常リモコンは、リモコンから出る赤外線の信号を本体のセンサー側で受信することで遠隔操作を可能にする。
しかし、Wiiリモコンについてはそれが全く逆であることが知られている。
つまり、センサーと名のつくセンサーバーは単に左右に配された赤外線LEDが光っているのみであり、それをWiiリモコン側のCMOSで読み取り、ボタンの情報等とともにWii本体に送っているのである。このCMOSは200~300fps程度の高い能力を有するものであるらしく、それこそおもちゃにしておくにはもったいない。なんとか活用できないか、と考えるわけである。
今回はとりあえずさわりだけ。プログラムの基本的な部分はボタン情報取得のエントリに同じ。レポートタイプを変更し、情報を取得する部分を赤外線センサの情報取得に置換。
Imports Microsoft.VisualBasic
Imports WiimoteLib
Public Class Form1
Private Delegate Sub UpdateWiimoteStateDelegate(ByVal args As WiimoteChangedEventArgs)
Private wm As New Wiimote
Public Sub New()
InitializeComponent()
End Sub
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
AddHandler wm.WiimoteChanged, AddressOf wm_WiimoteChanged
End Sub
‘接続ボタン
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
wm.Connect()
wm.SetReportType(InputReport.IRExtensionAccel, True)
wm.SetLEDs(True, False, False, False)
End Sub
Private Sub wm_WiimoteChanged(ByVal sender As Object, ByVal args As WiimoteChangedEventArgs)
UpdateState(args)
End Sub
Public Sub UpdateState(ByVal args As WiimoteChangedEventArgs)
BeginInvoke(New UpdateWiimoteStateDelegate(AddressOf UpdateWiimoteChanged), args)
End Sub
Private Sub UpdateWiimoteChanged(ByVal args As WiimoteChangedEventArgs)
Dim ws As WiimoteState = args.WiimoteState
‘1つ目のIR検出
If ws.IRState.IRSensors(0).Found = True Then
OvalShape1.FillColor = Color.Red
OvalShape1.Left = 300 * ws.IRState.IRSensors(0).Position.X
OvalShape1.Top = 300 – 300 * ws.IRState.IRSensors(0).Position.Y
Label3.Text = ws.IRState.IRSensors(0).Position.X
Label4.Text = ws.IRState.IRSensors(0).Position.Y
Else
OvalShape1.FillColor = Color.Silver
End If
‘2つ目のIR検出
If ws.IRState.IRSensors(1).Found = True Then
OvalShape2.FillColor = Color.Red
OvalShape2.Left = 300 * ws.IRState.IRSensors(1).Position.X
OvalShape2.Top = 300 – 300 * ws.IRState.IRSensors(1).Position.Y
Label5.Text = ws.IRState.IRSensors(1).Position.X
Label6.Text = ws.IRState.IRSensors(1).Position.Y
Else
OvalShape2.FillColor = Color.Silver
End If
‘2点間の距離を導出
Label7.Text = 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)
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()
End Sub
End Class
・起動画面・
・落し物・
サンプルプログラム:WiiIRtest←右クリック+対象をファイルに保存
サンプルソース一式:wiitest10s.zip←右クリック+対象をファイルに保存
・備忘録事項・
・背景があった方が様にはなるが、ポイントが動くと消えてしまう分ちょっと使い勝手が落ちる。といった具合。
・IRSensorsは(0)から(3)まで最大4点捉えられる模様。Wiiセンサバーを使うと、2点検出される。案外視野は狭い。
・床面での反射を誤認?と思われる挙動が稀に現れる。絨毯の上だと挙動が安定。
・赤外線の位置情報は1~0で渡される、が、そもそもリモコンから送られてくる生データはどんな形なのかちょっと調査不足。カメラの知識にも乏しく、分解能は後日の宿題。
・WiimoteLibの扱いがこなれてきたあとは、もう少し言語自体について勉強しなければならない。とつくづく。そもそもPrivateとDimってなにが違うの?とか、今ようやく調べている状態では…。「プログラムの工夫で、引き出されるハードの性能」の一端の一端の一端位を垣間見ている気もするので、時間ができたら、やるぞ。と言って暇がない。
・WiimoteLib_1.8のβが公開され、ついにWiiモーションプラスに対応。Wiiリモコンの回転をセンシングできるようになった。サンプルプログラム触って、軽く感動。正式版リリースの頃には、使って遊んでみよう。。
内部リンク
WiimoteLibを使ってみる。に戻る
「WiimoteLibを使う」第五話~Wiiモーションプラスの活用~ →進む
戻る← 「WiimoteLibを使う」第三話~加速度計再び~