Nintendo Switch自動化 【2021年9月最新】

# はじめに
みなさんこんにちは。コロナ禍のご時世いかがお過ごしでしょうか。
Nintendo Switchをはじめとして、ゲームで遊ぶ機会は増えたのではないでしょうか。
1年半ほど前にArduinoを用いてSwitchを自動化する記事を書きました

https://qiita.com/sobassy/items/cb707e50f2f27a851886

こちらの記事を書いてからTwitter等で色々質問等受け付けておりましたが、先日同じように自動化を試みたものの色々な点が変わっていましたので、今回最新版ということで記事を改めて書くことにしました。

初期セットアップに詰まる方が多かったので、今回はファクトリーリセットを行なったPCで1から実装を行い、注意点等もまとめることにしました。

これを機に始められる方の参考になれば幸いです。

# 必要なもの
### ハードウェア
- Arduino __Leonardo__ または Arduino __Micro__

https://www.switch-science.com/catalog/968/

https://www.switch-science.com/catalog/1389/

一番多かった質問が「Arduino Unoでもできますか？」です。__そのままではできません。__
ArduinoにはデフォルトでUSB機器として信号を送信できるチップが搭載されていません。
この２つの機種にはデフォルトでそのチップ __ATmega32u4__ が搭載されています。ですので必ずこのチップが搭載されたArduinoを選ぶ必要があります。

Amazonで探す際には必ずこのチップが搭載されているか確認して購入されることをお勧めします。
(似た名前にATmega328p というのがありますが異なります) 

- PC (windows mac どちらでも可能)

言わずもがなですが。今回使用したのは Mac OS Big Sur 11.4 です。

- USB ケーブル (Type-A - microUSB)

https://www.amazon.co.jp/%E3%82%B1%E3%83%BC%E3%83%96%E3%83%AB%E3%80%902M-2-4A%E6%80%A5%E9%80%9F%E5%85%85%E9%9B%BB%E3%82%B1%E3%83%BC%E3%83%96%E3%83%AB-%E3%82%B3%E3%83%B3%E3%83%88%E3%83%AD%E3%83%BC%E3%83%A9%E3%83%BC%E5%AF%BE%E5%BF%9C-Android%E5%A4%9A%E6%A9%9F%E7%A8%AE%E3%82%B9%E3%83%9E%E3%83%9B%E5%AF%BE%E5%BF%9C-%E3%83%9E%E3%82%A4%E3%82%AF%E3%83%ADusb%E3%82%B1%E3%83%BC%E3%83%96%E3%83%AB/dp/B0871ZKR8C/ref=sr_1_5?__mk_ja_JP=%E3%82%AB%E3%82%BF%E3%82%AB%E3%83%8A&crid=1DVN3SZIEJFVR&dchild=1&keywords=microusb+%E3%82%B1%E3%83%BC%E3%83%96%E3%83%AB&qid=1630476324&sprefix=microusb%2Caps%2C330&sr=8-5

PC に Arduino を接続するのに必要です

- Type-C 変換器

https://www.amazon.co.jp/Rampow-%E5%A4%89%E6%8F%9B%E3%82%A2%E3%83%80%E3%83%97%E3%82%BF%E3%80%902%E5%80%8B%E3%82%BB%E3%83%83%E3%83%88-%E3%80%91MacBook-s%E3%81%AE%E8%B6%85%E9%AB%98%E9%80%9F%E3%83%87%E3%83%BC%E3%82%BF%E8%BB%A2%E9%80%81-%E5%9B%9E%E3%81%AE%E6%8A%9C%E3%81%8D%E5%B7%AE%E3%81%97%E3%83%86%E3%82%B9%E3%83%88/dp/B0791YX2D1/ref=sxin_14_ac_d_rm?__mk_ja_JP=%E3%82%AB%E3%82%BF%E3%82%AB%E3%83%8A&ac_md=1-1-dHlwZWMgdXNi-ac_d_rm_rm_rm&crid=16FQN3RD4JR6X&cv_ct_cx=typec+%E5%A4%89%E6%8F%9B&dchild=1&keywords=typec+%E5%A4%89%E6%8F%9B&pd_rd_i=B0791YX2D1&pd_rd_r=6335af03-2258-48f8-b101-01ca225d0506&pd_rd_w=ozu3U&pd_rd_wg=mPQq6&pf_rd_p=899a88e9-0734-4bf7-a3d7-3b1fa1f60317&pf_rd_r=4RMZW0BX453QQBKN929K&psc=1&qid=1630476357&sprefix=TypeC%2Caps%2C353&sr=1-2-eae12a9f-704c-43fb-a70a-f41f45ba37e4

USBtype-AをSwitchに接続するために使用します

# PC のセットアップ

### Arduino IDE のインストール
まずは Arduino にプログラムを書き込むための Arduino IDE をインストールします。

https://www.arduino.cc/en/software

![スクリーンショット 2021-09-01 15.07.37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/275720/ead52058-65e9-edf9-c7a0-805452959fbc.png)

ご自身の使用しているOSに合ったものをインストールしてください。

### 依存ライブラリのインストール
インストールが終わったら起動して、上部メニューから __`ツール > ライブラリを管理`__ と進みます。

![スクリーンショット 2021-09-01 15.10.42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/275720/c366c15b-a9d6-b5f8-2215-af111101bd6b.png)

右上に検索ボックスがありますので、そこに __`ArduinoSTL`__ と入力すると全く同じ名前のライブラリが見つかると思います。(今回の画像だと2番目)
そちらをインストールしてください。(バージョンは最新で大丈夫です)
画像のように __INSTALLED__ となっていれば大丈夫です。

### ボードマネージャのバージョン変更

先ほどインストールしたライブラリは今回使用するSwitch操作用のライブラリの依存パッケージなのですが、最新のボードマネージャだと不具合で動作しないのでバージョンを変更する必要があります。

上部メニューから __`ツール > ボード > ボードマネージャ`__ と進みます。

おそらく一番上にリストされた __Arduino AVR Boards__ のバージョンが1.8.3かそれ以上になっていると思いますので、こちらのバージョンを __1.8.2__ に変更します。

バージョンを選択から 1.8.2 を選択してインストールします。

![スクリーンショット 2021-09-01 15.17.01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/275720/9025bd52-1de5-db63-230d-6f7c834cb51e.png)

このようにバージョンが 1.8.2 に変わっていたら大丈夫です。

### Switch操作用ライブラリの追加

以下のGitHubのリポジトリを使用させていただきます。

https://github.com/celclow/SwitchControlLibrary

<p align="center">
<img width="40%" alt="ファイル" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/275720/2c0ad613-22ce-a8f2-4b79-e91ffa0adcf4.png" />
</p>

右上の緑色の __code__ というボタンから __Download ZIP__ を選択してダウンロードします。
ダウンロードが終わったら、ZIPを展開すると `SwitchControlLibrary-master` というフォルダになると思います。こちらをArduinoのライブラリフォルダにコピーします。

Windowsの人は
`C:\Program files(x86)\Arduino\libraries`
Macの人は
`~/Documents/Arduino/libraries`

# コードを書く
実際にArduino IDEにコードを書いていきましょう。
詳しいリファレンスは先ほどのGitHubのページに詳しく書いてくださっているのでそちらを参考にしてください。

前に書いた記事ではバージョンが1系だったのですが、今回2系にアップデートされており、__互換性はありません。__ 
1系で既に書いてしまった人はダウンロードする際に1系を選択してください。
以下のコード例は全て2系で記述しています。

バージョン1系と2系の違いは

- 送信する関数が追加された
- ボタンを押す関数が統一された

主にこの2点です。Aボタンを押したい時は

```C++
SwitchControlLibrary().pressButton(Button::A);
```

のように記述します。また、これだけではボタンの送信は行われず

```C++
SwitchControlLibrary().sendReport();
```

こちらを呼び出すことで初めてキーの送信がされます。例えばAとBを同時押ししたい時には

```C++
SwitchControlLibrary().pressButton(Button::A);
SwitchControlLibrary().pressButton(Button::B);
SwitchControlLibrary().sendReport();
```

とすることで同時押しが可能になっています。

今回はAボタンを秒間１０回連打するプログラムを書いてみます。

```C++
#include <SwitchControlLibrary.h>

void setup() {
  // put your setup code here, to run once:
  SwitchControlLibrary(); // 初期化
}

void loop() {
  // put your main code here, to run repeatedly:
   SwitchControlLibrary().pressButton(Button::A); // Aボタンを押す
   SwitchControlLibrary().sendReport(); // Aボタンを押したことを反映
   delay(50); // 50 ms 待機
   SwitchControlLibrary().releaseButton(Button::A); // Aボタンを離す
   SwitchControlLibrary().sendReport(); // Aボタンを離したことを反映
   delay(50); // 50 ms 待機
}
```

# Arduinoへの書き込み
それでは書き込みを行いますが、ここでも設定事項があります。

上部メニューの __`ツール > ボード`__から __`Arduino Leonardo`__ に変更します
![スクリーンショット 2021-09-01 15.37.34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/275720/a8f6121e-8c52-10b7-a761-bcce3cf0e772.png)

上部メニューの __`ツール > シリアルポート`__から Arduinoが接続されているポートに変更します
![スクリーンショット 2021-09-01 15.39.43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/275720/e918b32b-703d-0d06-ac28-32b84caf8c2f.png)

これで１度書き込みを行います。書き込みはIDE左上の矢印ボタンで行います。

完了したらWebでゲームパッドをテストするところがあるのでそこで確認をしてみましょう。

https://gamepad-tester.com/

![スクリーンショット 2021-09-01 15.51.40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/275720/b7994b35-a248-1398-ca69-6ca0bff22899.png)

次にこのコントローラをPro Controllerと認識させるために細工をします。以下の設定ファイルを開きましょう。

Windowsの人は
`C:\Program files(x86)\Arduino\hardware\avr\1.8.2\boards.txt`

Mac の人は
`/Library/Arduino15/packages/arduino/hardware/avr/1.8.2/boards.txt`

こちらの 311, 312 行目を以下のように変更します

```bash
# 変更前
leonardo.build.vid=0x2341
leonardo.build.pid=0x8036

# 変更後
leonardo.build.vid=0x0f0d
leonardo.build.pid=0x0092
```

変更が終わったら再度IDEで書き込みを行います。

無事に変更が適用されていたら成功です！
![スクリーンショット 2021-09-01 15.58.56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/275720/a28f7251-6c91-f7f7-5422-c4d780f55895.png)

313行目の名前を変えるとコントローラの名前も好きに設定できます
Switchは先ほど設定したIDで判断しますのでここは何を書いても大丈夫です

![スクリーンショット 2021-09-01 16.02.58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/275720/a8dfaf37-e59a-44f5-7f3d-68f14f7f0d4f.png)

# 最後に

より良い自動化ライフを！