WebHID APIを使ってJoy-ConとChromeを簡単コネクト

#Joy-ConとChromeがツナガル
![joy-con.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206972/5c1d0c28-4ffe-4053-d774-6e3b7e491cbe.gif)
こんな感じでJoy-Conをクネクネ動かしたりスティックをグリグリしたりすると、Chromeに表示されたJoy-Conが連動して動きます。Joy-Conって、普段はNintendo Switchでゲームする時に使うコントローラーなので、こうしてブラウザのChromeと連動して動くだけでワクワクします。

このアプリはGoogleのエンジニアの方が作られたもので、以下のGitHubで公開されています。
https://tomayac.github.io/joy-con-webhid/demo/
https://github.com/tomayac/joy-con-webhid


#どうやっているの？
**[WebHID API](https://wicg.github.io/webhid/)**という技術が使われています。

このAPIを使うことで、Webアプリケーションからニンテンドースイッチのジョイコンやプレイステーションのデュアルショックコントローラなど、**キーボードやマウス以外のさまざまなデバイスを制御**できます。

以下では、上記アプリでJoy-Conを使えるようになるまでの手順をまとめています。


#手順
##必要なもの
以下の3つだけあればOKです。

- Joy-Con
- Bluetooth対応したPC
- [Chrome](https://www.google.com/intl/ja_jp/chrome/)

##1. PCとJoy-ConをBluetooth接続する
PCのBluetoothを有効にしたら、Joy-Conの側面にあるシンクロボタンを押してペアリングモードにし、PCとJoy-Conを接続します。

ちなみに、Joy-Conの側面にあるシンクロボタンとは以下の丸ポチボタンです。
ここを長押しするとペアリングモードになり、ランプがピコピコ点滅します。

※参考サイト（任天堂の公式Q&A）
[【Switch】はじめて使用するコントローラーを、無線でSwitch本体に登録したい。](https://support.nintendo.co.jp/app/answers/detail/a_id/36558/session/L2F2LzEvdGltZS8xNjE0NDc5MzM1L3NpZC9mVUVSTkJFUTBDNWo1ZDhrZW9mSU04dVlGcyU3RUd3TVEwSUk0VGNNYlpuR1ExVFh2bE1wR0xndTBubGZ3MW12eTdWdE8lN0VZSnNvekVaQ3ZEa2lVdzZjNThCNnhyME5qNVZMTHA4anhHJTdFOVVOdWVJdkhSY3p1NkM0WEElMjElMjE%3D)

![joy-con.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206972/997ef8e9-35f8-7be4-2d14-c41ccb9dce75.jpeg)

無事に接続が完了すると、こんな感じになります。
![スクリーンショット 2021-02-22 22.39.42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206972/24584356-bcea-10e8-a4b4-9997ca558011.png)
ゲームしている時はあんまり意識していませんでしたが、Joy-ConってBluetooth接続だったんですね。


##2. ChromeをWebHID対応させる
**※2021/03/04 追記**
先日Chrome89がリリースされましたね！
Chrome89ではWebHIDがデフォルトで有効化されているので以下の手順は不要です。
https://developer.chrome.com/blog/new-in-chrome-89/

~~WebHIDは次期バージョンである**Chrome89**からデフォルト有効化されますが、既に今使っているChromeでも**試験運用版のウェブプラットフォームの機能**を使えば有効化して利用することができます。~~

~~1. Chromeのアドレスバーに以下を入力しアクセスする~~
~~chrome://flags/#enable-experimental-web-platform-features~~
~~2. 「Experimental Web Platform features」の値を「Enabled」に変更しブラウザを再起動する~~

![スクリーンショット 2021-02-22 22.42.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206972/c79d39df-ee47-6b8b-073c-67d0b249be6e.png)
~~もしくは、以下のリンクからChrome89ベータ版をインストールすれば、デフォルトで有効化されているので上記のような設定変更なしで使えます。~~
~~[Google Chrome ベータ版](https://www.google.com/intl/ja/chrome/beta/)~~


##3. [Joy Con WebHIDのサイト](https://tomayac.github.io/joy-con-webhid/demo/)にアクセス
サイトにアクセスすると、以下のようなページが表示されると思います。
2番目の手順が書かれているあたりに「Connect Joy-Cons」というボタンがあるので押してください。
![joy-con2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206972/59c363a7-1004-ea13-7915-fbd931ee268b.png)
そうすると、以下のような画面が表示されます。
Joy-Conとの接続を要求しているため、それぞれ選択して「接続」ボタンを押します。
![スクリーンショット 2021-02-22 22.43.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206972/c0b98a59-2dea-806a-99c2-d17e18159a10.png)
以下のように両方とも「ペア設定済み」となればOKです。

![スクリーンショット 2021-02-22 22.43.35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206972/6b2e9ec7-eab5-aa86-4c34-7f4e0a8559e1.png)

あとはJoy-Conを自由に動かしたりボタンを押したりすれば、それに応じて画面のJoy-Conも連動して動きます。

ちなみに一番下の行にある「Show debug info」にチェックを入れると、センサの値などをリアルタイムに表示させることができるのでちょっとカッコよくなります。


#さいごに
WebHID APIを使えば、**特殊なソフトや機器などを別途インストールすることなくChromeだけで**Joy-Conを使って遊べるようになります。
今回取り扱ったアプリを動かせるようになるまで、実際にやってみると思った以上に簡単でその手軽さに大変驚きました。学生の頃にWiiリモコンを使って操作できるアプリを作ったこともありましたが、その時はこんな便利なAPIがなく苦労したような記憶があるので・・・WebHID API様様です。
今回はデモサイトを動かすだけでしたが、WebHID APIについてもう少し勉強してアプリも作ってみたいと思っているので、またできたら記事として公開できればと思います。

#参考サイト
英語ですが、以下のサイトにWebHIDの説明やサンプルなどが書かれているので参考になりそうです。

- Connecting to uncommon HID devices
 - https://web.dev/hid/
- Human interface devices on the web: a few quick examples
 - https://web.dev/hid-examples/
- WebHID API
 - https://wicg.github.io/webhid/