Windows環境でArduino Unoを使ってSwitchをPCから操作する

概要

Arduino Unoをポッ拳コントローラに偽装することでPCからSwitchを操作する。

フォーク元はこれ

blog.feelmy.net

相違点は

であること

手順

winavrのインストール

https://sourceforge.net/projects/winavr/

git clone

$ git clone --recursive https://github.com/ebith/Switch-Fightstick.git

makefile修正

Arduino Uno R3を使うのでmakefileMCUをatmega16u2に変更

- MCU          = atmega32u4
+ MCU          = atmega16u2

このままmakeすると'clock_div_1' undeclaredみたいなエラーが出る。

おそらくwinavrのミスで/avr/include/avr/power.hにatmega16u2の設定が抜けてるので

|| defined(__AVR_ATmega16U2__) \

を1289行目に追加してからmakeする。Joistick.hexが実際に書き込むファイル。

arduinoへの書き込み

ATmega16U2に書き込むためにdfu-programmerを使うらしい、あんまり良くわかってない。

qiita.com

これをするとPC接続時にATmega16U2として認識される(Arduinoとして認識されなくなる)

詳細手順

another.maple4ever.net

ATmega16U2として認識されたら

$ ./dfu-programmer atmega16u2 erase
$ ./dfu-programmer atmega16u2 Joistick.hex
$ ./dfu-programmer atmega16u2 reset

をして書き込み完了

動作確認

[PC] - [シリアル変換アダプタ] - [Arduino] - [Switch]の状態になるように接続する。

f:id:aiueokaki0:20200202020846j:plain

このとき[Arduino] - [Switch]のSwitch側の接続はドックのUSB-Aでもいいし本体のUSB-Cでもいい。

[シリアル変換アダプタ] - [Arduino]間はRXとTXを間違えないこと。


接続したらデバイスマネージャでシリアルポートの番号(COM6等)を確認する。
接続が確認できなければUSBが充電専用のものな可能性あり。
python3系で

$ pip install pyserial
$ python example/rapid-fire-a.py /dev/ttyS_

シリアルポートがwindowsのデバイスマネージャでCOM6と認識されているならcygwinでは/dev/ttyS5になる。

rapid-fire-a.py によりA連打されていることをコマンドライン、Switch本体で確認する。


確認できなければRXとTXが逆かも。

あとポケモンがコントローラの1Pにしか対応していないためからだと思うが、ジョイコンをSwitch本体にガッチャンコしてArduinoを1Pにしないと反応してくれない。