ブラウザアプリから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ファイルをダウンロードすることができる。