ArduinoでNintendo Switchの自動化環境作成する（Mac環境）

ポケモン剣盾か発売から2ヶ月ほど経ちましたが育成やっていますか:smiling_imp:

今作ではレイドバトルが導入され育成に必要なものが少し増えました。
ダイマックスレベルをあげるためのダイマックス飴が登場し、わざマシンはレコードという形で4世代までの消耗品扱いに逆戻りしてしまいました。

剣盾では様々な効率化方法が公開されていますが、今回は自動ワット収集プログラムとArduinoを使って環境構築する手順を確認していきます。

Arduinoの環境周りはWindowsの情報が多いですが今回はMacを使用します。
ワット稼ぎだけならHomebrewを使ったソフトウェアのインストールだけなので、動作させるまではとても簡単です。
（Macはドライバ不要）

#目的
自動「ワット」収集プログラムをArduinoに書き込みSwitchを自動化プログラムを動かす。ArduinoをSwitchに挿すと自動化プログラムが動く仕組みを作ります。
チップにhexファイルを書き込むことで別の自動化プログラムを動作できる状態にします。

[無限ワットの裏技](https://appmedia.jp/pokemon_swordshield/4168579)を使った方法なので剣盾本体が修正されるとできなくなる可能性があります。

![ダウンロード (1).gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/537165/02c4f88f-c3bc-6404-384c-3dc76570c901.gif)






#環境・用意するもの
・**Mac Mojave 10.14.6**　**※Catalina（10.15.0）以降では動作しない可能性があります**
・[Arduino UNO R3](https://www.amazon.co.jp/%E3%82%B9%E3%82%A4%E3%83%83%E3%83%81%E3%82%B5%E3%82%A4%E3%82%A8%E3%83%B3%E3%82%B9-%E3%80%90%E6%B0%B8%E4%B9%85%E4%BF%9D%E8%A8%BC%E4%BB%98%E3%81%8D%E3%80%91Arduino-Uno/dp/B0044X2E5S)
![71bYEHhPo8L._SX679_.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/537165/fff5ea9f-7b7f-3128-5a67-40f183e2b0a4.jpeg)
・Mac、Switchと接続するためのケーブルやハブ。どちらも繋げるTypeB-TypeCが便利。
![51Sun8EocgL._SX679_.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/537165/f9369870-d812-d791-d3cd-3046eefdddc6.jpeg)

・ジャンパワイヤ（メス-メス）あれば



下記のGitHubリポジトリや記事を参考にしています。
・[GitHub -無限ワット自動化](https://github.com/john-ditto/timewalk-with-watt)
・[GitHub -ゼルダBoWの雪転がし](https://github.com/bertrandom/snowball-thrower)
・[GitHub -スプラトゥーン2自動ドット打ち](https://github.com/shinyquagsire23/Switch-Fightstick)
・[Qiita -Splatoon2 イラスト投稿の自動ドット打ちをAruduino UNO R3 + macOS High Sierra環境でおこなう手順](https://qiita.com/knyrc/items/a39a7433857e83cf39a8)
・[Qiita -Arduino Uno R3 で作るESC専用USBキーボード](https://qiita.com/ssatoru/items/3919b0e46aed5525b078)
・[dfu-programmer で Arduino UNO の ATmega16U2 に Windows から書き込む](https://another.maple4ever.net/archives/2380/)



#手順
##1.Arduino書き込み用ツールのインストール
Homebrewを使ってArduinoのツールをインストールします。
Homebrewが入っていない場合は[ここの手順](https://brew.sh/index_ja)でインストールします。

brewコマンドでインストール状態を確認

```:Terminal
brew -v
Homebrew 2.2.2
```

Arduinoに書き込むために[crosspack-avr](https://www.obdev.at/products/crosspack/index.html)をインストール

```:Terminal
brew cask install crosspack-avr
export PATH=$PATH:/usr/local/CrossPack-AVR/bin/ # にパスを通す
```
コマンドラインツール[dfu-programmer](https://dfu-programmer.github.io/)をインストール

```:Terminal
brew install dfu-programmer
```

##2.ワット自動取得プログラムを取得
[自動ワット収集](https://github.com/murufon/AutoRaid/releases/tag/1.0.0aw)リポジトリからzipファイルをダウンロードする。もうひとつ[lufa](https://github.com/abcminiuser/lufa/tree/d6a7df4f78898957fa6d5b63e62015ce763560d4)のリポジトリからも取得します。

自動ワット収集のディレクトリにlufaという空のフォルダがあるので、ダウンロードしたlufaのファイル一式をそこにコピーします。

```:ディレクトリ構造
Config
lufa
 -Bootloaders
 -BuildTests
 -Demos
 -LUFA
  ....
```

makefileファイルのMCUの設定値をArduino UNO R3のチップ`atmega16u2`に書き換えます。
始めから`atmega16u2`ならそのままで。

```:makefile
MCU          = atmega16u2
```

自動ワット収集リポジトリのディレクトリ（makefileが置いてある場所）に移動した後、makeコマンドでC言語ソースをビルドしJoystick.hexファイルを生成します。
このhexファイルをチップへと書き込むことでArduinoで動作するプログラムが変更します。

```:Terminal
make
```

##3.チップへの書き込み
DFUモードにするため写真のようにArduinoをジャンパワイヤでショートさせた状態でPCと接続します。DFUモードとはチップのソフトウェアを書き込みできる状態のことです。

ジャンパワイヤがなければドライバー等で電気的に繋げてからPCと接続すればいけるはずです。

![3109_0.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/537165/6ecdd479-5729-b7ac-93af-3de3b1bf7769.jpeg)


接続した後に点灯し始めるのでジャンプワイヤを抜きます。
これでDFUを使える状態になったのでターミナルのコマンドでチップにHexファイルを書き込んでいきます。


まずは削除

```:Terminal
sudo dfu-programmer atmega16u2 erase

// 以下出力
Checking memory from 0x0 to 0x2FFF...  Not blank at 0x1.
Erasing flash...  Success
```

次に書き込み

```:Terminal
sudo dfu-programmer atmega16u2 flash Joystick.hex

// 以下出力
hecking memory from 0x0 to 0xF7F...  Empty.
Validating...  Success
0xF80 bytes written into 0x3000 bytes memory (32.29%).
```

そしてリセット

```:Terminal
sudo dfu-programmer atmega16u2 reset
```

これで書き込みが完了しました。Switchに接続すれば自動でボタン入力が行われるはずです。
[自動ワット収集](https://github.com/murufon/AutoRaid/releases/tag/1.0.0aw)リポジトリでは柱が出た状態の巣穴の前からスタートして無限にワットの自動回収を行います。

動作を変更したい場合は、Cソースファイルを修正して、hexファイルを作って、チップに書き込めばOKです！IDくじの自動化とかはすぐできそうです。

スプラトゥーンの自動ドットは今回の手順に加えてPython3のインストールなどが必要です。こちら記事の通りにすれば動作しました。（Python2.x系と3.x系ではコマンドが違うので注意）
[Qiita -Splatoon2 イラスト投稿の自動ドット打ちをAruduino UNO R3 + macOS High Sierra環境でおこなう手順](https://qiita.com/knyrc/items/a39a7433857e83cf39a8)

先日発表されたPS5の新ロゴを自動でドット入力しているところ
![ps5.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/537165/28abbb49-895e-7d45-9120-98fea4b17519.gif)

今回はボタン入力を手順化しているだけなのでポケモンだけではなく他のソフトでも手順部分を変更すればすぐに対応可能です。
高度な自動化をしようとなると画像認識を使った方法がありますが別途キャプチャボードが必要です。
[参考 -Switch版DEAD OR ALIVE Xtreme3 Scarlet (DOAX3S) 自動プレイ](https://randdtips.com/switch-doax3s-autoplay/)

##共に働くWebエンジニアを募集しています!
不動産SHOPナカジツでは自社サービスを作っていく仲間を募集しています。
詳しくは[Wantedly](https://www.wantedly.com/projects/134741)からお問い合わせください。