ブラウザアプリからSwitchのジョイコンの加速度センサとジャイロセンサの値を取得して、記録したものをJSONデータとしてローカルファイルに保存できるようにした。
ジョイコンの接続
Bluetoothデバイスとして接続する。今回はPC。
ジョイコンのシンクロボタンを長押しして認識できるようにする。
一度接続してもPCの電源を切ったりすると接続が切れるようなので、
毎回デバイスを削除して、接続の手順からやり直した方が確実。
ブラウザアプリからの接続
WebHID APIを使用する。
navigator.hid.requestDevice()
ベンダIDでフィルタをかける。
ベンダID:0x057e
表示名はLもRも"Wireless Gamepad"
区別する場合はプロダクトIDでのフィルタが必要。
L:0x2006
R:0x2007
HIDデバイスの配列が返ってくる。[0]を使う。
open()
コマンド送信
ジョイコンが慣性センサのデータを送信し続けるようにするために、
サブコマンドのレポートを送ってモードを切り替える必要がある。
※前回の状態を記憶している場合もある。
sendReport()
で送信する。
レポートID:0x01
慣性センサのデータを含むレポートを常時送信させるためのサブコマンドのレポート
- 0 パケット番号 1ずつインクリメントして0x0Fでループ
- 1-8 振動用のデータ 使わないので0x00,0x01,0x40,0x40,0x00,0x01,0x40,0x40を入れておく
- 9 サブコマンド 0x03
- 10 慣性センサを含むレポートを指定 0x30
慣性センサを有効にするためのサブコマンドのレポート
- 0 パケット番号
- 1-8 振動用のデータ
- 9 サブコマンド 0x40
- 10 慣性センサを有効にする 0x01
INPUTレポートの処理
addEventListener()
で"inputreport"に処理を入れる。
レポートID 0x30が慣性センサデータが含まれたレポート。
レポートのデータ構造
送られてくるレポートの内容のうち、慣性センサのデータは以下の部分。
- 12-13 X軸加速度(3)
- 14-15 Y軸加速度(3)
- 16-17 Z軸加速度(3)
- 18-19 X軸ジャイロ(3)
- 20-21 Y軸ジャイロ(3)
- 22-23 Z軸ジャイロ(3)
- 24-25 X軸加速度(2)
- 26-27 Y軸加速度(2)
- 28-29 Z軸加速度(2)
- 30-31 X軸ジャイロ(2)
- 32-33 Y軸ジャイロ(2)
- 34-35 Z軸ジャイロ(2)
- 36-37 X軸加速度(1)
- 38-39 Y軸加速度(1)
- 40-41 Z軸加速度(1)
- 42-43 X軸ジャイロ(1)
- 44-45 Y軸ジャイロ(1)
- 46-47 Z軸ジャイロ(1)
1回のレポートで3回分のデータが含まれていて、先に新しいデータが入っている形なので注意。
それぞれ
getInt16()
で符号付き整数にする。
サンプリングレート
レポートは毎秒約66回で送られる。
3回分のデータが含まれるので、5ms間隔でデータが生成されているはず。
JSONデータの出力、ローカルファイルへの保存
p5.jsでは、オブジェクトをそのままJSONで出力することが可能。
save()
でJSONファイルをダウンロードすることができる。
- 投稿タグ
- Bluetooth, HID, JavaScript, joycon