Nintendo Switchをブラウザから操作する
🚀 はじめに
Nintendo Switchをブラウザから操作し、自動化もできるツールPhantomHandを公開しました。
本記事は「PhantomHand」の技術面について書かれています。
使い方や導入方法だけサクッと知りたい方はマクロコンを自作してNintendo Switchをブラウザから操作する【導入編】をご覧ください。
リポジトリ
完成品
💡 何ができるか?
簡潔に言うと、PCのブラウザに移植されたマクロコントローラーです。
具体的には、以下の機能をReactとArduinoで開発しました。
- ブラウザのGUIでSwitchを操作
- 一連の操作をコマンドとして保存(マクロ機能)
- 保存したコマンドを呼び出して再現(マクロ再生機能)
- コマンドをTwitterでフォロワーに共有
偉大なる先駆者たちが作ったマクロツールとの違いは以下の通りです。
- OSを問わずに(Windows / Mac / Linux のChromeで)動く
- Switchの画面を見ながらマクロコマンドを作成可能
- 無線(Bluetooth)接続ができる
- スマブラに使える【最重要!】
⚙️ 機能説明
マクロ作成
ブラウザのGUIで入力したコマンドをマクロとして保存できます。PCにプロコンを接続すれば、プロコンの操作でもマクロを作成できます。
マクロ再生
保存したマクロをブラウザのGUIで呼び出します。
無制限に保存でき、呼び出すマクロコマンドはワンクリックで変更できます。
リピート再生にも対応しています。
📦 必要なもの
- Arduino Leonard (Atmega32u4)
- BLE Device または FT232
- ジャンパワイヤ
詳しい接続方法やAmazonの購入リンクについてはマクロコンを自作してNintendo Switchをブラウザから操作する【導入編】をご覧ください。
🛠 仕組み
Arduino
Arduino LeonardoというマイコンがSwitchの遠隔操作を可能にしてくれます。Arduino Leonardoには、ATmega 32U4というチップが搭載されています。ATmega 32U4はUSBデバイスとして動作する特徴があります。
つまり、Arduino Leonardoを使えば、Switchに接続した時にコントローラーとして振る舞うように設定できるという事です。
NintendoSwitchControlLibrary
コントローラーとして振る舞う部分のロジックは、偉大なる先駆者がMITライセンスでライブラリ化してくれています。
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 )になります。
マクロ機能を実現するために、Arduinoに送ったバイナリに加えて「開始から何秒後にそのコマンドを発火するか」という時間データを加えてJSONで保存しています。
type command = {
t: number, // Time
s: Uint8Array[] // Signal => [buttonNumber, buttonState]
}[]
GamePad API
スマブラのような操作が複雑なゲームのコマンドを作成するには、ブラウザのGUIは適しません。そこで、JavaScriptのGamePadAPIを使って、プロコンの状態を取得する機能を作りました。
PCにBluetoothまたはUSBでプロコンを繋ぐと、JavaScriptやArduinoを経由しつつもSwitchに直接繋いでいるような感覚でゲームをプレイできます。
コマンドのシェア機能
せっかくブラウザで動くツールにするので、ユーザー同士で作ったコマンドを共有できたら面白いと思いました。
データベースを作ってもよかったのですが、今回はRisonを使用してURLのクエリパラメータにJSONを埋め込むことにしました。共通されたURLにアクセスした人は、再生ボタンを押すだけでそのコマンドをSwitchにエミュレートできます。
長すぎるURLでTwitterの文字数制限に達してしまうことを回避するために、BitlyというURL短縮サービスも使用しました。(無料枠なので、すぐにリミットに達するかもしれません)
🎮 プロダクト
ReactプロジェクトをFirebaseにデプロイしたものがこちらです。
プログラムを書き込んだArduinoと接続すれば、この記事に書かれていたことが全て体験できます。
*Arduinoの構築方法等は、マクロコンを自作してNintendo Switchをブラウザから操作する【導入編】をご覧ください。
🛌 さいごに
3日ほど自分でテスト運用してみましたが、スマブラの練習がビックリするほど捗りました。ポケモンやRPGのガチ勢にも喜んでもらえると思ってます。それなりに需要がありそうなら、製品化してみたいと思っています。
ただ、私にはハードウェア量産の知識がほぼありませんので時間がかかると思います。
量産化を手伝っていただけそうな方がおりましたら、TwitterにDMをください🙏
📚 Appendix
参考にした記事や、その他のSwitch自動化のアイデアを紹介します。この記事を読んでSwitch自動化に興味を持った方には、ぜひ色々な方法を開拓してもらいたいです!
Switch自動化の歴史
分かりやすくまとまっている記事です。歴史を時系列で知りたい方にはおすすめです。
ArduinoUno (Atmega16u)
ArduinoUnoでもSwitchのコントローラーをエミュレート可能なようです。ただし、動作環境がWindowsのみです。
Joycontrol
JoycontrolというPythonのライブラリを使用する方法です。Bluetoothでコントローラー信号を送るため、Switch側にはデバイスを装着する必要がありません。画期的ですね。
Raspberry Pi
Joycontrol系ライブラリを仮想環境ではなく、ラズパイを使って実行する方法です。参考記事のようにHDMIでプレイ映像をキャプチャして、画像認識でポケモンの選別をしたりなど、より高度な自動化を目指すならラズパイは良いかもしれません。(2021年10月現在、半導体不足により日本国内ではほぼラズパイの販売がありません)
ESP-32
ESP-32とはWiFiとBluetoothを内蔵するマイコンモジュールです。
この方法もトライしてみたいのですが、私にはESP-32自体の使い方がサッパリ分かりません。ハードウェアに詳しい方はトライの価値ありだと思います。
ローカルネットワーク、WebSocket、OSC、他を使った方法
ESP8266というWiFiモジュールを搭載したArduinoマイコン(Atmega32u4)がいくつかあります。ESP8266を使うと自身をサーバーにしたり、WiFiに繋げてIoTデバイス化させるなど、色々な使い方ができます。
コレをSwitchに繋げれば、外出先から操作するとか….面白いことが色々できそうですね。発展性が一番あるアイデアだと思います。
Discussion