ebith/Switch-Fightstick
#gadget
概要
マイコンをポッ拳 専用コントローラー for Wii Uに偽装させ, PCからマイコン経由でSwitchを操作できるようにするツール
https://gyazo.com/a7ad7288e3092a31b4832cede1242d05
作り方
Step.1 必要な材料を用意する
https://blog.feelmy.net/control-nintendo-switch-from-computer/ を参考に揃える.
マイコンボード (Pro Micro)
ebith/Switch-Fightstickが「ATmega32U4」と呼ばれるマイコンにしか対応してないため, ATmega32U4を搭載するマイコンボードが必要
PCからの信号を受信するためのシリアル通信用のピンも必要
最安値: https://www.aliexpress.com/item/2040881593.html
安いが届くまで時間が掛かるのが難点
Amazon: https://www.amazon.co.jp/gp/product/B01M6WULAO
AliExpressの2倍ほどするけどPrimeなのですぐ届く
mizdra.iconはここで買いました
micro-B to シリアル変換アダプタ (超小型USBシリアル変換モジュール)
コントローラ & 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 する
$ git clone --recursive https://github.com/ebith/Switch-Fightstick.git
$ cd Switch-Fightstick
## make に必要
$ 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のように繋ぐ必要がある
ref: https://learn.sparkfun.com/tutorials/serial-communication#wiring-and-hardware
ホスト側からバスパワー給電されるので, モジュールが消費する電力の供給に使われている+5Vピンはどこにも繋がなくてもOK
SwitchとマイコンボードをUSBケーブルで接続する
マイコンボード側のポートはモジュールで拡張したものではなく, ボードに元から付いていたもの
PCとマイコンボードをUSBケーブルで接続する
こちらはモジュールで拡張したポートに繋ぐ
Step.4 自動化スクリプトを実行する
ebith/Switch-Fightstickの/exampleにAボタンを連打するスクリプトがあるので, これを使って動作確認してみる
code:console
$ pip3 install pyserial
## USBポートではなくシリアルポート経由で通信するので, tty.usbserial* を指定する
$ ./example/rapid-fire-a.py /dev/tty.usbserial*
Switchのコントローラの動作確認画面で動作確認
設定 > コントローラーとセンサー > 入力デバイスの動作チェック > ボタンの動作チェック
Aボタンが押されていれば成功
亜種
Switch-Fightstickは多くの亜種があり, それぞれ独自の拡張が施されている.
progmem/Switch-Fightstick
一番最初にSwitchでポッ拳コントローラの偽装に成功したプロジェクト
全ての亜種のfork元
splatoon-2-printerブランチはmasterブランチをベースに「スプラトゥーン2」のペイント自動化用にカスタマイズされている
Teensy 2.0 ++というマイコンボードをサポート
shinyquagsire23/Switch-Fightstick
progmem/Switch-Fightstickのsplatoon-2-printerブランチのfork
Teensy 2.0 ++に加え, Arduino UNO R3, Arduino Microをサポートするよう拡張されている
bertrandom/snowball-thrower
shinyquagsire23/Switch-Fightstickのfork
BotWの雪玉ミニゲーム用にカスタマイズされている
ebith/Switch-Fightstick
bertrandom/snowball-throwerのfork
様々なソフトで利用できるよう, bertrandom/snowball-throwerではサポートされていなかったボタン (Xボタンなど) をサポートするよう拡張されている
また, Switchに送信するボタンの信号の種類やタイミングをPCから操作できるよう拡張が施されている
PCからシリアル通信で文字列Button Aをマイコンへと送信すると, マイコンがそれを受信し, SwitchへAボタンの押下イベントを送信する
FAQ
何故ポッ拳コントローラでSwitchを操作しているの?
(明確に言及している文献見当たらなかったけど, https://medium.com/@bertrandom/automating-zelda-3b37127e24c8 に書いてあったことからmizdra.iconが勝手に予想して書いています)
ポッ拳コントローラがPS3と互換性があることが以前より知られており, ポッ拳コントローラの挙動や偽装方法がすでに解明されていた
ref: https://github.com/progmem/Switch-Fightstick#but-games-like-arms-use-the-analog-sticks
その後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
http://takashiski.hatenablog.com/entry/2017/09/13/012738
https://qiita.com/keita44_f4/items/7a514899a93acb421031
ただしどちらもebith/Switch-Fightstickではなくshinyquagsire23/Switch-Fightstickを使っている
winでebith/Switch-Fightstickが動くかは不明
参考
http://takashiski.hatenablog.com/entry/2017/09/13/012738
https://medium.com/@bertrandom/automating-zelda-3b37127e24c8
https://blog.cheena.net/2533
https://github.com/mizdra/pokemon-swsh-scripts
mizdra.icon自作の自動化スクリプト
マニュアルモードが便利