ギアのかけらやチケットを無限に入手！Switch操作自動化のススメ【Splatoon2】

2019.05.10 **ポイントの交換まで含めて完全自動化**に対応しました
2019.05.25 注意事項をちょっと書き加えました
2019.08.14 必要なファイルの記載漏れを修正しました
2019.10.21 排出率を計算しました→[【Splatoon2】"曖昧かつ厳密"な画像認識で8836回のガチャ結果から排出率を計算する](https://qiita.com/Anaakikutsushit/items/c333180f9d1401199bd6)

<blockquote class="twitter-tweet" data-lang="ja" data-dnt="true"><p lang="und" dir="ltr"><a href="https://t.co/T1DGlZkANf">https://t.co/T1DGlZkANf</a></p>&mdash; あつし🌒けもケットM-19 (@Anaakikutsushit) <a href="https://twitter.com/Anaakikutsushit/status/1126449866090078208?ref_src=twsrc%5Etfw">2019年5月9日</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>
↑Twitterに貼った、実際に自動化している様子です

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">チケット(ほぼ)カンストしてました <a href="https://twitter.com/hashtag/Splatoon2?src=hash&amp;ref_src=twsrc%5Etfw">#Splatoon2</a> <a href="https://twitter.com/hashtag/%E3%82%B9%E3%83%97%E3%83%A9%E3%83%88%E3%82%A5%E3%83%BC%E3%83%B32?src=hash&amp;ref_src=twsrc%5Etfw">#スプラトゥーン2</a> <a href="https://twitter.com/hashtag/NintendoSwitch?src=hash&amp;ref_src=twsrc%5Etfw">#NintendoSwitch</a> <a href="https://t.co/BHinsYRcAN">pic.twitter.com/BHinsYRcAN</a></p>&mdash; あつし🎮デジゲー博B-04a (@Anaakikutsushit) <a href="https://twitter.com/Anaakikutsushit/status/1174770617326813185?ref_src=twsrc%5Etfw">September 19, 2019</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>
↑放っておくだけでこの通り、フードチケットもドリンクチケットもカンストまで自動的に溜まっちゃいます。
使い切れないレベルです。

# 概要

## これは何をするもの？

**外出中や 寝ている間に 機械がギアのかけらを集めてくれる**ようになるというものです！
Qiitaへの投稿ではありますが、Splatoon2プレイヤーは技術面に不慣れな方も多いと思いますので、少し優しめに書いていきますね。

### 注意
本体やソフトは改造しませんが、この方法を使って任天堂さんから怒られたりしても当方は責任を負いません。
本行為は特に「[Nintendo Switch利用規約](https://www.nintendo.co.jp/support/switch/eula/usage_policy.html)」における第1条第5項「任天堂の許諾を受けていない本ゲーム機の周辺機器およびソフトウェア等」の使用にあたる可能性がありますので、利用は自己責任でお願いします。

### 機械に操作させて深海メトロを無限にクリアする

Splatoon2は複雑な操作を求められるTPSのアクションゲーム。
対人戦はともかく、CPU相手となるサーモンランでも、機械操作でクリアすることは難しいです。

しかし、**一人用モードであれば機械に操作させてもなんとかクリアできる！**
そこに着目し、今回は次のようにかけら集めを自動化します。

1. オクト・エキスパンションの【D02 バツチー郡駅】を自動でクリアできるプログラムを作る。
2. 作ったプログラムを、マイコン（パソコンのちっちゃいやつ）に書き込む。
3. **マイコンとSwitchを接続して、マイコンの操作でバツチー郡駅を無限にクリア→自販機でポイント交換**する。

たまったポイントが自動的に消費されていくわけなので、**どんなに長時間放置しても途中で手を加える必要なしにかけらやチケットが溜まっていきます**。

# 具体的な作業内容

### 必要なもの（ハードウェア関連）

- Switch本体セット（最悪本体部分だけあればよい）
- ソフト Splatoon2
- [追加コンテンツ オクト・エキスパンション](https://ec.nintendo.com/JP/ja/bundles/70070000001403)：1800円 + 税
- パソコン（今回はWindows10として進めます。Macは記事末尾を参考にしてください）
- [マイコンボード](https://www.amazon.co.jp/gp/product/B07C31L2B6)（1枚あればよい）：1000円前後 ※1
- [micro USBケーブル](https://www.amazon.co.jp/dp/B06X18ZZ4V)：300円～800円くらい ※2
- [ミニブレッドボード](http://akizukidenshi.com/catalog/g/gP-05155/)（あると便利）：130円
- [ジャンパーワイヤ](http://akizukidenshi.com/catalog/g/gC-05371/)（1本で十分・あると便利）：180円

※1 このボードじゃなきゃダメという厳密な縛りはありません。開発元のリポジトリに記載がある「at90usb1286」「atmega16u2」「atmega32u4」いずれかのボードを搭載していればイケる？と思います。しかし私自身はマイコンは素人のため、詳細はわかりません。
※2 もしSwitchドックなしの環境で自動化したい場合は、Switch本体のUSB TypeC端子に繋ぐことになります。つまり[こういうケーブル](https://www.amazon.co.jp/dp/B01GGKYAIU)が必要になると思われますので注意。私はリンク先の商品ではなく、既に持っていたケーブルを使いました。

**オクトを買っていなければ4000円、買っているなら2000円くらい**の出費で実現できますね。
ただ、電子部品が故障することを考えていくつか余分に買っておくと安心です。

### 必要なもの（ソフトウェア関連）

いずれもWindows10のパソコンの中にインストールしていく形になります。
インストール手順も後述しますね。分かる方は下記リンクからどんどんインストールしてってください。

1. [マイコンに書き込むプログラム](https://github.com/anaakikutushita/One-Shot-Station)
2. [Arduino IDE](https://www.arduino.cc/en/main/software)
3. bash on windows
4. python
5. avr-gccなどその他
6. ちょっとだけソースコードを手直し

#### 各種インストール手順

##### マイコンに書き込むプログラム

二つのリポジトリをダウンロードして配置します。
片方は私が作成したものです。
[こちらのリポジトリ](https://github.com/anaakikutushita/One-Shot-Station)を開きます。

右上の方にある`Clone or download`というボタンをクリック。
`Download ZIP`をクリック。
リポジトリ全体のZIPファイルを適当な場所に保存してください。
ZIPを展開してください。こちらのフォルダをAとしましょう。

もう一つは別の方が作成したものです。
[こちらのリポジトリ](https://github.com/abcminiuser/lufa/tree/a8546529926fc87b5d73b75217ec011962e8ccaa)を開きます。
同様にダウンロードしてZIPを展開し、中身の`lufa`というフォルダを先ほど展開したフォルダAの中に配置します。
フォルダAの下に`lufa/LUFA/Build/...`のような階層構造ができればオッケーです！
lufa/**lufa/**/LUFA/Build... のように余計なフォルダを作らないように注意しましょう。
以上で完了です。

(補足：イチから私がプログラムを作ったわけではなく、フォーク元のリポジトリが存在するのですが、GitHub上でうまくFork出来てないままになってしまっています。なんかいい方法ないですか……)
(余談：リポジトリ内のJoystick.cの中に核となる操作手順を記載しているのですが、for文とかで書けそうな操作を上手くfor文に落とし込めませんでした。こちらも何かいい方法あれば教えてください……)

##### Arduino IDE

[Arduinoの公式サイト](https://www.arduino.cc/en/main/software)を参照して入手・インストールを完了してください。
マイコンにSwitch自動操作のプログラムを書き込むとき、このIDEに代わりに書き込み操作をやってもらいます。

##### bash on Windows

これについては完全に[こちらの記事](https://qiita.com/Aruneko/items/c79810b0b015bebf30bb)にお世話になりました！
ですのでインストール方法も丸投げさせて頂きます。

##### python

上記bash on Windowsのインストール終了後にインストールします。
bashを起動したあと、次の2つのコマンドを打ち込むとインストールできるはずです。
`sudo apt-get install -y python-minimal`
`sudo apt-get install -y python-pip`

##### avr-gccなどその他

作ったプログラム（ソースコード）を機械が理解できる形式に変換＝コンパイルするのに必要な機能などのインストールです。
python関連をインストールした時と同様に、下記のコマンドを打ち込んでいってください。
`sudo apt-get install -y zlib1g-dev`
`sudo apt-get install -y gcc-avr`
`sudo apt-get install -y avr-libc`
`pip install --upgrade pip`

##### ちょっとだけソースコードを手直し

私と全く同じ機材を使っていればこれで準備は完了です。
しかし、マイコンボードが異なるものを使っている場合は一つ手直しが必要になります。

ダウンロードしたリポジトリのZIPを展開した中から`makefile`というファイルを探してテキストエディタで開いてください。
この中の`MCU = atmega32u4`と書かれた行を修正します。
あなたの使っているマイコンが例えば「at90usb1286」なら`MCU = at90usb1286`のように修正して上書き保存です。

ここまで出来たら事前準備は完了です！

### プログラムをマイコンに書き込む

#### コンパイル

先ほどちょろっと触れましたが、コンパイルという作業を通してソースコードをマイコンにも読めるようにしてあげる必要があります。
とは言っても、コンパイルはコンピュータ任せで簡単にできます。心配ご無用！
`makefile`があるフォルダでbashを開いて、`make`コマンドを実行するだけ。
これでコンパイルが実行されて、`Joystick.hex`というファイルが同じフォルダの中に新しくできているはずです。
この`.hex`というファイルをマイコンの中に書き込んでいきます。
bashは終了してしまってください。

#### 書き込み

ここは少し難しいです。
まずはマイコンをPCから外した状態にします（当然、まだ繋いでいないと思いますが）。
ここでデバイスマネージャーを開いてください。
`ポート (COM と LPT)`と書いてあるノードを展開します。
既に色々なポート番号のデバイス名が見えるかもしれませんが、それらはいま無関係です。
現在何が繋がっているのかということを画面上で確認できる状態になったら、マイコンボードとPCをケーブルで接続します。

するとマイコンの方も光って反応しますが、デバイスマネージャーに注目してください。
**新しくポートが増えたのが確認できるはずです**。それがあなたのマイコンです。
ここでPCに繋いだままマイコンのリセットを行います。

マイコンのリセット方法は、`RST`と書いてある端子と`GND`と書いてある端子の二つを導線でつなぐだけです。
ブレッドボードとジャンパーワイヤを買った人は、それらを使うと少し楽にリセットできるでしょう。
リセットできたら、デバイスマネージャーに注目しながら導線を外してみてください。
そのとき、デバイスマネージャーで**あなたのマイコンを示すポートの番号が少しのあいだ変化する**のが確認できるでしょうか？
変化した番号を覚えておいてください。この番号を`X`としておきます。
私の場合では、`COM6`→`COM5`のように番号が変化したため、`X`は`6`となります。
再びマイコンの二つのリセット端子を繋いだら、いったんそのままにしてPCの方に戻ります。

PCに移ったら、`Joystick.hex`があるフォルダ（つまりは`makefile`があるのと同じフォルダ）でPowerShellを起動してください。
起動したら、マイコンへ`.hex`ファイルを書き込むコマンドを打ちます。
**ただし、タイピングするだけでEnter実行はしないようにしてください。**
コマンドは次の通りです。
`avrdude -c avrdude.conf -v -patmega32u4 -cavr109 -PCOMX -Uflash:w:Joystick.hex:i`
途中にある `-PCOMX` の`X`は先ほど確認したCOMポートの番号に置き換えてください。

このコマンドを打っていつでも実行できる状態になったら、またマイコンの方に戻ります。
ここからがいよいよプログラムの書き込みです！以下の要領で書き込みましょう。

1. マイコンで繋ぎっぱなしになっている`RST`と`GND`を外す。
2. デバイスマネージャーのCOMポートの数字が変わる。
3. 数字が変わっている間にPCから打ち込んでおいたコマンドを実行する。

うまくいけば`avrdude.exe done.  Thank you.`という表示が出て、書き込み成功です。お疲れさまでした。

### 実際に自動化を実行する

いよいよお待ちかねの自動化です。
プログラムは私のコントローラー設定（カメラオプション）に合わせてあるので、あなたのカメラオプションも同じにするとうまくいくでしょう。
※TVモードか携帯モードかは、お使いの状況によって適切な方を設定してください。

| 項目 | 設定値 |
|:--|:--|
| ジャイロ操作  | OFF  |
| [R]操作感度  | +0.5  |
| [R]上下操作  | リバース  |
| [R]左右操作  | リバース  |

自動化を走らせるたびにカメラオプションを切り替えるのが面倒だという場合は、`Joystick.c`の中身を書き換えてからコンパイル・書き込みの流れをやり直すことで機械操作の挙動を修正することができます。

あとは初期状態のセットです。
手動で深海メトロに入り、メトロ車内で`Xボタン`を押したときにバツチー郡駅にカーソルが合っている状態にしてください。
この状態にするには、一度バツチー郡駅に入ってブキを選択してからすぐに電車内に戻るのがお手軽です。

初期状態ができたらマイコンをSwitchドックのUSB端子に接続！
マイコンには起動スイッチや終了スイッチにあたるものはなく、接続した瞬間からすぐに動作が始まります。
最初はコントローラー（実際にはマイコン）の認識から始まり、やがてプレイヤーキャラが自動的に動き始めたら成功です！
念のため、2周か3周くらいの間はちゃんと自動でクリアできているか見守るのもよいでしょう。

あとはSwitchの電源をオンのしている限りずーーーーーっとバツチー郡駅をクリアし、ポイントがたまるたびに自販機まで行ってポイントの交換をし続けてくれます。
私が試しに計測したところ、おおよそ**20分に1度のペースで自販機まで交換しに行きます**。
たまったポイントが自動的に消費されていくわけなので、**どんなに長時間放置しても途中で手を加える必要なしにかけらやチケットが溜まっていきます**。

自動化を止めたいときは好きなタイミングでUSB端子を引っこ抜いてください。
そのあとプロコンなり何なりを再認識させることで自由に動き回れるようになります。

また自動化を再開したいなあと思ったら、上記の初期状態を自分でセットしたあと、またマイコンをSwitchのUSB端子に接続するだけでOKです。
カメラオプションの変更はつい忘れやすいので注意してください！

# それでは良き厳選ライフを！

実際のところ、NAMACOポイントガチャにどの程度の期待値があるのかはわかっていません。
その調査も同時並行で進めているところです。

実は、上記リポジトリの`statistics`ブランチでは「ガチャを回したときにスクショを撮影する」操作を追加してあります。
こうしてスクショを貯めておいて、あとから各アイテムの排出率を計算してみようという計画ですね。

ですが、そんなに神経質になることもないのかもしれません。

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">20万貯めたくらいで早くも成果出ました。ヒト速の未来は明るいぞ <a href="https://twitter.com/hashtag/Splatoon2?src=hash&amp;ref_src=twsrc%5Etfw">#Splatoon2</a> <a href="https://twitter.com/hashtag/%E3%82%B9%E3%83%97%E3%83%A9%E3%83%88%E3%82%A5%E3%83%BC%E3%83%B32?src=hash&amp;ref_src=twsrc%5Etfw">#スプラトゥーン2</a> <a href="https://twitter.com/hashtag/NintendoSwitch?src=hash&amp;ref_src=twsrc%5Etfw">#NintendoSwitch</a> <a href="https://t.co/z1Z6QcV5kS">pic.twitter.com/z1Z6QcV5kS</a></p>&mdash; あつし🌒けもケットM-19 (@Anaakikutsushit) <a href="https://twitter.com/Anaakikutsushit/status/1126449646950215680?ref_src=twsrc%5Etfw">May 9, 2019</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

なんと、私はヒト速のかけらを主に集めているのですが、上記ツイートのように早々とお目当てのかけらが出てきたのです！
これは排出率を計算できるくらいスクショが貯まるまでもなく、アッという間に必要なぶんだけのかけらが集まってしまうかもしれませんね。
2019.10.21 排出率を計算しました→[【Splatoon2】"曖昧かつ厳密"な画像認識で8836回のガチャ結果から排出率を計算する](https://qiita.com/Anaakikutsushit/items/c333180f9d1401199bd6)
実際にはギアパワーのかけらの期待値はそれほどでもありませんでした😂ドリンクチケット目的で回すのが良いかと思われます。

また、このプログラムにはまだまだ効率を追求できる余地が残っています。
あまり追求しすぎると動作が不安定になったりするので私はほどほどにしておきましたが、さらなる効率を重視する場合はプログラムの書き換えにもチャレンジしてみてください。
それでは良き厳選ライフを！

### 参考記事
- [NintendoSwitchをPCから操作する - おいら屋ファクトリー](https://blog.feelmy.net/control-nintendo-switch-from-computer/)
- [splatoon2用ドット打ち機(atmega32u4) - takashiskiのブログ](http://takashiski.hatenablog.com/entry/2017/09/13/012738)
- [Splatoon2 イラスト投稿の自動ドット打ちをAruduino UNO R3 + macOS High Sierra環境でおこなう手順](https://qiita.com/knyrc/items/a39a7433857e83cf39a8)
- [Splatoon2で自動ドット打ちしてくれるやつ試した - しゅみぷろ](http://esprog.hatenablog.com/entry/2017/08/19/001717)
- [Splatoon2で自動ドット打ちしてくれるやつをWindos10のWSLで使う](https://qiita.com/keita44_f4/items/7a514899a93acb421031)
- [Splatoon2で自動ドット打ちするやつをArduino UNO R3でやる](https://qiita.com/kjfsm4/items/ff60d899d8350820815a)
- [Windows Subsystem for Linuxをインストールしてみよう！](https://qiita.com/Aruneko/items/c79810b0b015bebf30bb)