はじめに
以下のポストなどにあるように、2018年・2026年に入手した Nintendo Switch・Nintendo Switch 2 のそれぞれのコントローラーである「Joy-Con/Joy-Con 2」に関する話です。
これらを、Nintendo Switch・Nintendo Switch 2以外のデバイスで扱う方法が GitHub や技術記事などで書かれているのですが、その概要を書きます。合わせて、Nintendo Switch用の特殊なコントローラー(ルーレット型コントローラーなど)の話も少し書こうと思います。
Nintendo Switch・Nintendo Switch 2 を入手したのポストなど
全部paypayのせいですね・・・。 pic.twitter.com/9q8HOG41Re
— you (@youtoy) December 10, 2018
Joy-Con 2/Joy-Con に関する技術情報
Joy-Con 2/Joy-Con の技術情報について、公式が出しているものは以下の通りです。
●Joy-Con 2 (L)/(R)|Nintendo Switch 2|任天堂
https://www.nintendo.com/jp/hardware/switch2/accessories/joyCon.html
●Nintendo Switch|任天堂
https://www.nintendo.com/jp/hardware/switch/modal/specs/joy-con.html
Joy-Con 2 のハードウェア
上記の Joy-Con 2 のページで、正面・背面・側面のボタン・センサーなどの情報を見ることができます。
上記の図の下に、テキストで書かれた仕様の情報もあります。その一部を以下に抜粋してみます。
- ボタン
- スティックボタン
- <L> Lスティック/Lスティックボタン
- <R> Rスティック/Rスティックボタン
- 各種ボタン
- <L・R> 取り外しボタン
- <L・R> シンクロボタン
- <L> 上/下/左/右/L/ZL/SL/SR/-ボタン
- <R> A/B/X/Y/R/ZR/SL/SR/+ボタン
- <L> キャプチャーボタン
- <R> HOMEボタン
- <R> Cボタン
- スティックボタン
- 通信機能
- L・R共通
- Bluetooth
- Rのみ
- NFC(近距離無線通信)
- L・R共通
- センサー
- L・R共通
- 加速度センサー
- ジャイロセンサー
- マウスセンサー
- L・R共通
- 振動機能: L・R共通
- HD振動2(より強く、重く、鋭い振動表現が可能)
上で書いた部分の L と R の違いについては、「キャプチャーボタン」と「HOMEボタン、およびCボタン」を共通ととらえれば、明確に異なるのは Rの「NFC(近距離無線通信)」のみです。
それと、公式では Bluetooth の機能詳細は書かれていません。
Joy-Con のハードウェア
- ボタン
- スティックボタン
- <L> Lスティック/Lスティックボタン
- <R> Rスティック/Rスティックボタン
- 各種ボタン
- <L・R> 取り外しボタン
- <L・R> シンクロボタン
- <L> 上/下/左/右/L/ZL/SL/SR/-ボタン
- <R> A/B/X/Y/R/ZR/SL/SR/+ボタン
- <L> キャプチャーボタン
- <R> HOMEボタン
- スティックボタン
- 通信機能
- L・R共通
- Bluetooth 3.0
- Rのみ
- NFC(近距離無線通信)
- L・R共通
- センサー
- L・R共通
- 加速度センサー
- ジャイロセンサー
- Rのみ
- モーションIRカメラ
- L・R共通
- 振動機能: L・R共通
- HD振動(バリエーション豊かな振動表現が可能)
ここで書いた部分の L と R の違いについては、Rの「NFC(近距離無線通信)」と R の「モーションIRカメラ」があります。それと、Bluetooth の機能詳細は書かれていないのは、Joy-Con 2 と同様です(こちらは Bluetooth のバージョン番号が書かれている、という違いはあるものの)。
Joy-Con 2 を Nintendo Switch 2 以外で使う方法の情報
それでは、まずは Joy-Con 2 を Nintendo Switch 2 以外で使う方法の情報について記載します。
ブラウザの JavaScript で扱う
最初はブラウザの JavaScript で扱う方法です。それについて、以下の記事がけっこう前に公開されています。
●【Web Bluetooth API】Joy-Con 2 をプレゼンリモコンにする
https://zenn.dev/mascii/articles/joy-con-2-web-bluetooth-api
Joy-Con 2 をブラウザの JavaScript で扱う場合、Chrome系のブラウザで使える「Web Bluetooth API」を利用する形になるようです。
●Web Bluetooth API - Web API | MDN
https://developer.mozilla.org/ja/docs/Web/API/Web_Bluetooth_API
Joy-Con を PC で扱う場合は、Joy-Con と PC を事前にペアリングしておいて扱うというやり方になるのですが、Joy-Con 2 の場合は PC と事前にペアリングしておくという手順はありません。
上記の Web Bluetooth API を使った方法は、自分は実際に以下の内容などを試してみました。
ブラウザの JavaScript以外での実装
ブラウザの JavaScript以外での実装に関する情報を、ざっくり検索していくつか列挙してみます。
以下は C++関連のものです。
●TheFrano/joycon2cpp: repo for the joycon2cpp syncer script
https://github.com/TheFrano/joycon2cpp
上記の「joycon2cpp」のフォークで、以下などもあるようです。
●Misaka10571/joycon2-connector: Connect joycon2/pro2 to PC wirelessly
https://github.com/Misaka10571/joycon2-connector
また、以下の Joy-Con・Joy-Con 2 の両対応のプロジェクトもあるようです。
●TiernanDeFranco/JoyConPlusPlus: An open source Joy-Con & Joy-Con 2 project for deciphering inputs.
https://github.com/TiernanDeFranco/JoyConPlusPlus
M5Stack系デバイスでのお試し
上で書いたようなリポジトリの情報から、Joy-Con 2 の Bluetooth の通信部分の情報が分かるので、それを元に M5Stack系デバイスでのお試しもやってみています。
試行錯誤中ではありますが、具体的には以下の NimBLE-Arduino を使った実装です。
●h2zero/NimBLE-Arduino: A fork of the NimBLE library structured for compilation with Arduino, for use with ESP32, nRF5x.
https://github.com/h2zero/NimBLE-Arduino
現時点で、以下のようにボタン押下に反応させるという処理は少し試せています。
Joy-Con を Nintendo Switch 以外で使う方法の情報
次は Joy-Con の話です。
ブラウザの JavaScript で扱う
ブラウザの JavaScript で扱う話です。その場合の方法は 2つあります。
1つは「Gamepad API」を使った方法で、もう 1つは「WebHID API」を使った方法です。
●ゲームパッド API の使用 - Web API | MDN
https://developer.mozilla.org/ja/docs/Web/API/Gamepad_API/Using_the_Gamepad_API
●WebHID API - Web API | MDN
https://developer.mozilla.org/ja/docs/Web/API/WebHID_API
どちらも、PC と Joy-Con をペアリングして扱う流れになります。
ブラウザの JavaScript で扱う方法の補足
上記の Gamepad API を使った方法と WebHID API を使った方法では、Joy-Con のどの機能を使えるかに違いがあります。ボタン・十字キーやアナログスティックはどちらの API でも扱えますが、IMU(加速度・ジャイロ・姿勢)の利用は WebHID API のほうでしか扱えません。
それと「WebHID API」を使った方法については、Gamepad API を使った方法と比べると少し仕様の部分がややこしいです。そのため、WebHID API を使った方法を用いる場合は、例えば以下のようなライブラリを用いると良いです。
●tomayac/joy-con-webhid: Use the Nintendo Switch Joy-Cons via the WebHID API
https://github.com/tomayac/joy-con-webhid
「Gamepad API」を使った方法は、WebHID API を使う場合と比べると難しいところはなく、通常のゲームパッドを各種プログラミング言語で扱うのと同じような処理を書けば OK です。
ブラウザの JavaScript で Joy-Con を扱うというお試しは、自分はすでに色々やっていて、例えば以下のようなものがあります。
ブラウザの WebHID API(JavaScript の処理)で特殊なコントローラーを扱う
ブラウザの WebHID API(JavaScript の処理)で扱うやり方は、上で書いたとおり Gamepad API で扱うやり方よりも少し複雑な処理が扱えます。
それについて、Joy-Con単体の処理に関するのものに限らず、例えば Joy-Con(R)との組み合わせで使うルーレットコントローラーのような、特殊なコントローラーも扱うことができます。
以下は、ルーレットコントローラーをブラウザの JavaScript で扱った事例です。
ルーレット 2台といった複数台の制御もできます。
ブラウザの Gamepad API(JavaScript の処理)で特殊なコントローラーを扱う
ブラウザの Gamepad API(JavaScript の処理)で扱える、Nintendo Switch用の特殊なコントローラーもあるので、その話も書いてみます。
以下は、太鼓の達人用のコントローラーです。Nintendo Switch に USB接続する仕様のコントローラーで、PC とも USB で接続できます。
これは「太鼓の面やふちを叩く」という動作が Joy-Con のボタン押下と同じイベントを出す仕様なので、Gamepad API でのボタンを扱う処理で普通に処理できます。
以下は「サオコン」という特殊な形状のコントローラーです。こちらは、電気的な特殊な仕組みはなく、物理的に作られた仕組みで「リールのハンドルを回転させる動作 → Joy-Con の物理的なボタン押下への変換」が行われています。
そのため、Gamepad API でのボタンを扱う処理で普通に処理できます。
おわりに
雑多な内容になったかもしれないですが、Joy-Con 2/Joy-Con の Bluetooth の仕様に関する情報をメモしてみました。
引き続き、Joy-Con 2/Joy-Con を使った作品作りを試していければと思います。
Joy-Con 2/Joy-Con の Bluetooth の仕様の違いで作品作りに少し影響すること
Joy-Con 2/Joy-Con を自分の作品に使う中で、それらの Bluetooth の仕様の違いが少し影響しそうなところがあるのでメモしておきます。
公開実装・解析例で見ると、Joy-Con は Bluetooth Classic HID で(Nintendo公式での記載で「Bluetooth 3.0」)、Joy-Con 2 は BLE / GATT となっている感じです。
「M5Stack/ESP32系」を使ったモノづくりへの影響
そのため、自分の作品作りでは「M5Stack/ESP32系」を使ったモノづくりに影響が出そうです。
具体的には、Bluetooth LE のみに対応していて Bluetooth Classic には非対応の「ESP32-S3」は、Joy-Con の Bluetooth Classic を扱えないということになりそうです。Joy-Con を「M5Stack/ESP32系」との組み合わせで扱う場合は、M5StickC Plus2 や M5Stack Core2 などの ESP32系で扱う必要がありそうです(M5StickS3、ATOMS3、M5Stack CoreS3 などの ESP32S3系では Joy-Con 2 を扱うのが良さそうです)。





