🎮

Nintendo Switchをブラウザから操作する

6 min read

🚀 はじめに

Nintendo Switchをブラウザから操作し、自動化もできるツールPhantomHandを公開しました。
本記事は「PhantomHand」の技術面について書かれています。

使い方や導入方法だけサクッと知りたい方はマクロコンを自作してNintendo Switchをブラウザから操作する【導入編】をご覧ください。

リポジトリ

https://github.com/noov-smash/PhantomHand

完成品

https://phantom-hand.web.app/

本記事の内容には改造ファームウェアのアップロードなどの違法行為は含まれておりませんが、Nintendo Switch利用規約 第1条第5項の「任天堂の許諾を受けていない本ゲーム機の周辺機器を使用しないこと」には該当するおそれがあります。ご利用は必ず自己責任でお願いいたします。

💡 何ができるか?

簡潔に言うと、PCのブラウザに移植されたマクロコントローラーです。

C0010_5

具体的には、以下の機能をReactとArduinoで開発しました。

  • ブラウザのGUIでSwitchを操作
  • 一連の操作をコマンドとして保存(マクロ機能)
  • 保存したコマンドを呼び出して再現(マクロ再生機能)
  • コマンドをTwitterでフォロワーに共有

偉大なる先駆者たちが作ったマクロツールとの違いは以下の通りです。

  • OSを問わずに(Windows / Mac / Linux のChromeで)動く
  • Switchの画面を見ながらマクロコマンドを作成可能
  • 無線(Bluetooth)接続ができる
  • スマブラに使える【最重要!】

⚙️ 機能説明

マクロ作成

useage
ブラウザのGUIで入力したコマンドをマクロとして保存できます。PCにプロコンを接続すれば、プロコンの操作でもマクロを作成できます。

マクロ再生

useage2
保存したマクロをブラウザのGUIで呼び出します。
無制限に保存でき、呼び出すマクロコマンドはワンクリックで変更できます。
リピート再生にも対応しています。

📦 必要なもの

  • Arduino Leonard (Atmega32u4)
  • BLE Device または FT232
  • ジャンパワイヤ

詳しい接続方法Amazonの購入リンクについてはマクロコンを自作してNintendo Switchをブラウザから操作する【導入編】をご覧ください。

🛠 仕組み

specs

Arduino

Arduino LeonardoというマイコンがSwitchの遠隔操作を可能にしてくれます。Arduino Leonardoには、ATmega 32U4というチップが搭載されています。ATmega 32U4はUSBデバイスとして動作する特徴があります。
つまり、Arduino Leonardoを使えば、Switchに接続した時にコントローラーとして振る舞うように設定できるという事です。

NintendoSwitchControlLibrary

コントローラーとして振る舞う部分のロジックは、偉大なる先駆者がMITライセンスでライブラリ化してくれています。

https://github.com/lefmarna/NintendoSwitchControlLibrary

NintendoSwitchControlLibraryはボタンやスティックの操作をプログラムで行えるようにするライブラリです。PhantomHandはNintendoSwitchControlLibraryを利用してWebブラウザからSwitchを制御できるようにしています。

React

GUIはReactで開発しました。将来的に、ElectronやReactNativeでネイティブアプリ化する可能性を考慮したためです。

WebUSB / WebBluetooth

ブラウザとArduino Leonardoの連携にはシリアル通信を採用しました。Arduinoに繋げたシリアル通信モジュールに対して、無線(WebBluetooth)または有線(WebUsb)でコントローラーの操作信号を送信します。

Uint8ArrayとJSON

コントローラー操作信号は、8ビットのバイナリデータ配列でArduinoに送信します。配列のlengthは2で、中身はコントローラのボタン・スティックの識別子(0 - 21)と、ボタン・スティックの状態(0 or 1, 0-255 )になります。

config

マクロ機能を実現するために、Arduinoに送ったバイナリに加えて「開始から何秒後にそのコマンドを発火するか」という時間データを加えてJSONで保存しています。

type command = {
  t: number, // Time
  s: Uint8Array[] // Signal => [buttonNumber, buttonState]
}[]

GamePad API

スマブラのような操作が複雑なゲームのコマンドを作成するには、ブラウザのGUIは適しません。そこで、JavaScriptのGamePadAPIを使って、プロコンの状態を取得する機能を作りました。

PCにBluetoothまたはUSBでプロコンを繋ぐと、JavaScriptやArduinoを経由しつつもSwitchに直接繋いでいるような感覚でゲームをプレイできます。

https://developer.mozilla.org/ja/docs/Web/API/Gamepad_API/Using_the_Gamepad_API
https://www.npmjs.com/package/react-gamepad

コマンドのシェア機能

share

せっかくブラウザで動くツールにするので、ユーザー同士で作ったコマンドを共有できたら面白いと思いました。
データベースを作ってもよかったのですが、今回はRisonを使用してURLのクエリパラメータにJSONを埋め込むことにしました。共通されたURLにアクセスした人は、再生ボタンを押すだけでそのコマンドをSwitchにエミュレートできます。

長すぎるURLでTwitterの文字数制限に達してしまうことを回避するために、BitlyというURL短縮サービスも使用しました。(無料枠なので、すぐにリミットに達するかもしれません)

https://app.bitly.com/Bl9miVlf2zr/bitlinks/3AUZ7PB
https://qiita.com/townewgokgok/items/290c587c30b583dacd9e

🎮 プロダクト

ReactプロジェクトをFirebaseにデプロイしたものがこちらです。
プログラムを書き込んだArduinoと接続すれば、この記事に書かれていたことが全て体験できます。
*Arduinoの構築方法等は、マクロコンを自作してNintendo Switchをブラウザから操作する【導入編】をご覧ください。

https://phantom-hand.web.app/

🛌 さいごに

3日ほど自分でテスト運用してみましたが、スマブラの練習がビックリするほど捗りました。ポケモンやRPGのガチ勢にも喜んでもらえると思ってます。それなりに需要がありそうなら、製品化してみたいと思っています。

ただ、私にはハードウェア量産の知識がほぼありませんので時間がかかると思います。

量産化を手伝っていただけそうな方がおりましたら、TwitterにDMをください🙏

📚 Appendix

参考にした記事や、その他のSwitch自動化のアイデアを紹介します。この記事を読んでSwitch自動化に興味を持った方には、ぜひ色々な方法を開拓してもらいたいです!

Switch自動化の歴史

分かりやすくまとまっている記事です。歴史を時系列で知りたい方にはおすすめです。

https://note.com/gamewagashi/n/n6251719c5867

ArduinoUno (Atmega16u)

ArduinoUnoでもSwitchのコントローラーをエミュレート可能なようです。ただし、動作環境がWindowsのみです。

https://blogenist.jp/2020/03/20/10317/

Joycontrol

JoycontrolというPythonのライブラリを使用する方法です。Bluetoothでコントローラー信号を送るため、Switch側にはデバイスを装着する必要がありません。画期的ですね。

https://qiita.com/almtr/items/38a7f0c3056024532e8d

Raspberry Pi

Joycontrol系ライブラリを仮想環境ではなく、ラズパイを使って実行する方法です。参考記事のようにHDMIでプレイ映像をキャプチャして、画像認識でポケモンの選別をしたりなど、より高度な自動化を目指すならラズパイは良いかもしれません。(2021年10月現在、半導体不足により日本国内ではほぼラズパイの販売がありません)

https://smdbanana.hatenablog.com/entry/2021/02/02/223311

ESP-32

ESP-32とはWiFiとBluetoothを内蔵するマイコンモジュールです。
この方法もトライしてみたいのですが、私にはESP-32自体の使い方がサッパリ分かりません。ハードウェアに詳しい方はトライの価値ありだと思います。

https://note.com/gamewagashi/n/n3922695a5e87

ローカルネットワーク、WebSocket、OSC、他を使った方法

esp8226

ESP8266というWiFiモジュールを搭載したArduinoマイコン(Atmega32u4)がいくつかあります。ESP8266を使うと自身をサーバーにしたり、WiFiに繋げてIoTデバイス化させるなど、色々な使い方ができます。

https://www.amazon.co.jp/dp/B07X3RV5KX/ref=cm_sw_em_r_mt_dp_ZRCQ29KVQKXB585ED6BR
https://ja.aliexpress.com/i/32839674193.html

コレをSwitchに繋げれば、外出先から操作するとか….面白いことが色々できそうですね。発展性が一番あるアイデアだと思います。

Discussion

ログインするとコメントできます