ゼノブレイド2のゴルトムント飛行甲板で自動採集している様子。

既にSplatoon2で自動ドット打ちゼルダの雪玉ボウル自動化があり、これらの元であるprogmem/Switch-Fightstickをシリアル通信経由で操作するようにしたやつ。
Aボタン連打の様な単純なことをしたいだけなら雪玉ボウルのJoystick.cを書き換えるのが手っ取り早いしそれで用は済んでるんだけどせっかくなので作った。
ebith/Switch-Fightstick: Automate operation for Nintendo Switch

ハードウェア

ハードウェアの例

あたりが最低限必要。ブレッドボードの代わりにスルホール用テストワイヤという手もある。リセットはピンセットとか。

マイコンボードを新しく買うならPro Micro系統(ATMega32U4搭載ボード)が安くて良い。
最近発売されたAdafruitのItsy Bitsy 32u4が$10でリセットボタン有りピン省略無し強固そうなUSB端子で良さそうだけど入手難易度が高い。
その他バリエーションや詳細に関しては(Arduino) Pro Microが詳しい。
A-Star 32U4なんかもATMega32U4が載ってる。
こだわりが無ければAliExpressで売ってるやつが安いが初期不良や納期にリスクがある。
*追記: Adafruit Itsy Bitsy 32u4が国内で買えるようになってる Adafruit Itsy Bitsy 32u4 - 5V 16MHz - スイッチサイエンス

ソフトウェア

ポッ拳コントローラ(WiiU)に偽装することでスイッチを操作する。
Macでやったがavr-dudeとavr-gccがあればなんでも良いはず。

Pro MicroをPCに繋いでソフトウェアを書き込む

brew install avr-dude osx-cross/avr/avr-gcc
git clone --recursive https://github.com/ebith/Switch-Fightstick.git
cd Switch-Fightstick
make
# ここでPro Microをリセット
avrdude -pm32u4 -cavr109 -D -P$(ls /dev/tty.usbmodem*) -b57600 -Uflash:w:Joystick.hex

動かす

A連打を試す

pip install pyserial
./example/rapid-fire-a-button.py /dev/tty.usbserial*

もちろんscreen /dev/tty.usbserial*などから手入力することも可能で後述のコマンドを入力して改行(エンター)すると動く。

コマンド

  • Button (Y|B|A|X|L|R|ZL|ZR|SELECT|START|LCLICK|RCLICK|HOME|CAPTURE|RELEASE)
  • (LX|LY|RX|RY) (MIN|MAX|CENTER)
  • HAT (TOP|TOP_RIGHT|RIGHT|BOTTOM_RIGHT|BOTTOM|BOTTOM_LEFT|LEFT|TOP_LEFT|CENTER)
    • Button ZR
    • RY MIN
    • HAT BOTTOM

動作の確認にはHTML5 Gamepad Testerが便利。

次回

Raspberry Pi Zero WをUSBデバイスにして同じことをしたいなと思って下調べしているところ。
Zero WHが発表されて買いやすくなりそうだし、価格もそこそこだし、できることがめっちゃ増えるし楽しそう。