ebith/Switch-Fightstick
概要
https://gyazo.com/a7ad7288e3092a31b4832cede1242d05
作り方
Step.1 必要な材料を用意する
マイコンボード (Pro Micro)
PCからの信号を受信するためのシリアル通信用のピンも必要
安いが届くまで時間が掛かるのが難点
AliExpressの2倍ほどするけどPrimeなのですぐ届く
mizdra.iconはここで買いました
コントローラ & PCと接続するため外部のデバイスと信号を送受信するポートが最低でも2つ必要だが, Pro Microには1つ (付属のmicro-B USBポート) しかないため, これを使って増やす
PC<=>マイコンボード間の接続に利用
PC<=>マイコンボード間接続用 USBケーブル
お使いのPCに搭載されているUSBポートの形状に合わせて適当に購入して下さい
マイコンボード側の端子はmicro-Bなので, そこだけ注意
Switch<=>マイコンボード間接続用 USBケーブル
上記と同じくこちらもマイコンボード側の端子はmicro-B
Dock経由で接続するならmicro-B to Type-A, Dock無しならmicro-B to Type-C
Pro Microと超小型USBシリアル変換モジュールの接続用
最低3本必要
Step.2 マイコンに偽装用のファームウェアを書き込む
まずは偽装に使うファームウェアのソースコードを用意する
code:console
## サブモジュールがあるので --recursive を付けて clone する $ cd Switch-Fightstick
$ brew install avrdude osx-cross/avr/avr-gcc
$ make
makeするとプロジェクトルートに成果物が生成される
Joystick.hexがこれからマイコンに書き込むファームウェアのバイナリ
PCとマイコンボードをUSBケーブルで接続する
超小型USBシリアル変換モジュールのポートではなく, マイコンボードに元から付いてるポートに繋ぐ
上手く接続できていれば/dev配下に/dev/usbmodem-XXXXXX(XXXXXXは任意の文字列)がマウントされているはず
最後にavrdudeで書き込めば完成...なのだけど, 書き込みにはちょっとコツがいる
ファームウェアを書き込むにはマイコンをDFUモードにする必要がある
そのまま書き込もうとするとavrdude: butterfly_recv(): programmer is not respondingとエラーが出て書き込めない
DFUモードにするにはRSTピンとGNDピンを一瞬だけ通電すれば良い
適当にテストワイヤとかで繋ぐだけでOK
通電したら以下のコマンドを実行してファームウェアを書き込む
code:console
$ avrdude -pm32u4 -cavr109 -D -P$(ls /dev/tty.usbmodem*) -b57600 -Uflash:w:Joystick.hex
通電してから数秒経過するとDFUモードで無くなってしまうので, 数秒以内に実行すること
Step.3 機器を接続する
まずマイコンボードとUSBシリアル変換モジュールをテストワイヤで接続する
GND<=>GND, TX0<=>RX, RX1<=>TXで接続する
GND<=>GND, TX0<=>TX, RX1<=>RXで繋ぐと動かないので注意
RxはReceiver, TxはTransmitterのこと
Txから送信された信号をRxで受けるよう,TX0<=>RX, RX1<=>TXのように繋ぐ必要がある
ホスト側からバスパワー給電されるので, モジュールが消費する電力の供給に使われている+5Vピンはどこにも繋がなくてもOK
SwitchとマイコンボードをUSBケーブルで接続する
マイコンボード側のポートはモジュールで拡張したものではなく, ボードに元から付いていたもの
PCとマイコンボードをUSBケーブルで接続する
こちらはモジュールで拡張したポートに繋ぐ
Step.4 自動化スクリプトを実行する
code:console
$ pip3 install pyserial
## USBポートではなくシリアルポート経由で通信するので, tty.usbserial* を指定する $ ./example/rapid-fire-a.py /dev/tty.usbserial*
Switchのコントローラの動作確認画面で動作確認
設定 > コントローラーとセンサー > 入力デバイスの動作チェック > ボタンの動作チェック
Aボタンが押されていれば成功
亜種
Switch-Fightstickは多くの亜種があり, それぞれ独自の拡張が施されている.
一番最初にSwitchでポッ拳コントローラの偽装に成功したプロジェクト
全ての亜種のfork元
splatoon-2-printerブランチはmasterブランチをベースに「スプラトゥーン2」のペイント自動化用にカスタマイズされている
Teensy 2.0 ++というマイコンボードをサポート
Teensy 2.0 ++に加え, Arduino UNO R3, Arduino Microをサポートするよう拡張されている
BotWの雪玉ミニゲーム用にカスタマイズされている
また, Switchに送信するボタンの信号の種類やタイミングをPCから操作できるよう拡張が施されている
PCからシリアル通信で文字列Button Aをマイコンへと送信すると, マイコンがそれを受信し, SwitchへAボタンの押下イベントを送信する
FAQ
何故ポッ拳コントローラでSwitchを操作しているの?
ポッ拳コントローラがPS3と互換性があることが以前より知られており, ポッ拳コントローラの挙動や偽装方法がすでに解明されていた
その後Switchのアップデート(Ver.3.0.0), ポッ拳コントローラがSwitchで使えるようになった
その結果, ポッ拳コントローラがSwitchの自動化に広く使われるようになった
mizdra.icon他のコントローラに偽装する方法が解明されていないだけで, 別にポッ拳コントローラでなくても良いはず
mizdra.icon間違ってたら教えて下さい
PCとSwitchを直接接続するのでは駄目なの?
疑問に思ったので詳しい人に聞いてみたmizdra.icon
USBは片方の装置をホスト, 片方をデバイスとして, ホストがデバイスを操作する規格
例えばPCとキーボードを接続する場合は, PCがホスト, キーボードがデバイスとなる
ある装置がホスト/デバイスどちらになることができるかは, 装置に内蔵されているUSBコントローラの種類による
ホストコントローラが内蔵されている場合はデバイスにはなれないし, 逆にデバイスコントローラが内蔵されている場合はホストにはなれない
(実際に調べたわけではないので勘だけど) PC及びSwitchに内蔵されているのはホストコントローラ
そのため, PCとSwitchを接続しようとするとホスト<=>ホストでの通信となってしまい, 成立しない
そこで, 間にデバイスコントローラをサポートするProMicroを挟むことにより, ホスト<=>デバイスの通信になるようにしていると思われる, とのこと
Windowsでもできますか?
いくつか先行事例あるので多分動くんじゃないかな…mizdra.icon
ただしどちらもebith/Switch-Fightstickではなくshinyquagsire23/Switch-Fightstickを使っている
winでebith/Switch-Fightstickが動くかは不明
参考
mizdra.icon自作の自動化スクリプト
マニュアルモードが便利