ブラウザアプリから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
 
