Splatoon2 イラスト投稿の自動ドット打ちをAruduino UNO R3 + macOS High Sierra環境でおこなう手順

## 目的
Splatoon2 のイラスト投稿の自動ドット打ちをAruduino UNO R3 + macOS High Sierra環境でおこなう際の手順メモです。特に Mac OSX での動作確認手順が見つからなかったため、メモとして残しておきます。

## Splatoon2 のイラスト投稿とは
Splatoon2 のイラスト投稿とは、Splatoon2 内の赤いポストから投稿できる投稿済みのユーザーに他のユーザーが話しかけようとした際に表示されるドット絵のことです。

投稿済みのユーザーに話しかけた画面（吹き出しとフェスのタオルにドット絵）：
![DQp070gVAAAfFqp.jpg](https://qiita-image-store.s3.amazonaws.com/0/92806/8b517a91-0f3b-f95d-d2e7-acd4e8455816.jpeg)

赤いポスト前（Aボタン選択で投稿）：
![DQp1CaJVoAMvFZQ.jpg](https://qiita-image-store.s3.amazonaws.com/0/92806/80092214-2678-f40d-eaa0-8a5299ee826e.jpeg)

## 参考
手順自体は下記3つの記事を参照しながら行いました。

* [Splatoon2で自動ドット打ちするやつをArduino UNO R3でやる（環境：Arduino+Ubuntu)](https://qiita.com/kjfsm4/items/ff60d899d8350820815a)
* [Splatoon2で自動ドット打ちしてくれるやつをWindows10のWSLで使う（環境：teensy++ 2.0+Windows10](https://qiita.com/keita44_f4/items/7a514899a93acb421031)
* [splatoon2用ドット打ち機(atmega32u4)(環境：pro micro+Windows10](http://takashiski.hatenablog.com/entry/2017/09/13/012738)

## 結果

下記 JUSTICE のロゴ画像を自動ドット打ちさせてみました。

JUCTICE のロゴ（元画像）：
![JUSTICE_r2.png](https://qiita-image-store.s3.amazonaws.com/0/92806/37752b5d-20a4-5527-193f-9c44c6f79637.png)

自動ドット打ち画像：
![tmpnqoed62e.png](https://qiita-image-store.s3.amazonaws.com/0/92806/2b8f9f70-3cd4-beb0-d409-dc52eda171ee.png)

自動ドット打ち中のgifアニメ：
![ezgif-5-3a714535f0.gif](https://qiita-image-store.s3.amazonaws.com/0/92806/393f968a-d399-bb1a-42df-92343f382b6f.gif)

## ハードウェア環境
準備したハードウェア環境は下記です。

* [Nintendo Switch + 付属のドック](http://amzn.to/2AIorKa)
* [MacBook Air（macOS High Sierra）](http://amzn.to/2AK5G9z)
* [Arduino UNO R3](http://amzn.to/2AI854p)
* [ジャンパーワイヤ（メス-メス）](http://amzn.to/2B6xZ4w)

## ソフトウェア環境
準備したソフトウェア環境は下記です。ターミナルから下記コマンドでインストールしました。

* Python 3.6.2
* pillow @ Python：画像処理用のライブラリ
* xcode-select @ macOS High Sierra：Xcodeのコマンドラインツール
* crosspack-avr　@ macOS High Sierra：Arduino書き込み用ファイルのビルドツール
* dfu-programmer @ macOS High Sierra：Arduino書き込み用のコマンドラインツール

```:Terminal
brew install python3 # 入っていない場合のみ
pip install pillow
xcode-select --install # 入っていない場合のみ
brew cask install crosspack-avr
export PATH=$PATH:/usr/local/CrossPack-AVR/bin/ # crosspack-avr にパスを通す
brew install dfu-programmer
```
## 手順

## 1. ドット打ちさせたい画像の用意
**320x120サイズ** の **png画像** を作成or準備します。ここでは、上記結果に示した JUCTICE のロゴ画像（"JUSTICE.png"）を用意しました。

元々のロゴ画像は別にあったので、それを [任意のサイズに画像変換して書き出すWEBサービス](https://www.iloveimg.com/ja/resize-image) を使いました。

## 2. 画像を自動ドット打ちさせる処理の書かれたCソースファイルへ変換する

Github の [イカのドット打ち専用に改造されたリポジトリ（EsProgram/Switch-Fightstick）](https://github.com/EsProgram/Switch-Fightstick) のサイトに行って変換ツールをダウンロードしてきます。

サイト画面（Download ZIPを押せばダウンロードできます）：
![スクリーンショット 2017-12-10 12.27.52.png](https://qiita-image-store.s3.amazonaws.com/0/92806/aed0ca56-368f-9aed-92e0-533b2c610cf0.png)

ダウンロードした zip を展開し、上記 "JUSTICE.png" を展開したフォルダに置き、ターミナル開いて展開したフォルダパスに移動して、次のコマンドでCソースファイルに変換します。

```:Terminal
python png2c.py JUSTICE.png
```

成功するとメッセージが出ます。

```:OK_Message
JUSTICE.png converted with original colormap and saved to image.c
```

png2c.py の中身1行が Python2 系の記載なので Python3 系で利用する場合、その点下記の修正が必要です。

```:png2c.py一行抜粋（変更前）
for i in range(0, 320*120) / 8):
```

```:png2c.py一行抜粋（変更後）
for i in range(0, 4800):
```

CソースをArduino UNO R3用にビルドするため、makefile を一部編集します。"atmega16u2"はArduino UNO R3を指し、デフォルトの"at90usb1286"はTeensy2.0++というボードを指します。

```:makefile（一部抜粋）
#MCU = at90usb1286 コメントアウトする
MCU = atmega16u2 #追加する
```

下記 makeコマンドでCソースをビルドします。うまくいくと "Joystick.hex" という Arduino 書き込み用データが作成されます。

```:Terminal
make
```

```:OK_Message（最後の1行のみ）
 [INFO]    : Finished building project "Joystick".
```

## 3. ArduinoをMacに接続する

Arduino の基板書き換えのため下記ピンをジャンパワイヤ（メス-メス）で繋げた状態で Mac にUSBで接続します。

Arduino（赤で囲まれた2本のピン）：
![Arduino_Uno_004.jpg](https://qiita-image-store.s3.amazonaws.com/0/92806/f303add0-33d4-1f3a-d90d-390b4fdd3457.jpeg)

ジャンパワイヤ（メス-メス）：
![31I-IXJcXoL.jpg](https://qiita-image-store.s3.amazonaws.com/0/92806/23a30f11-072d-0e48-da44-24ddecdcc627.jpeg)

Arduino を Mac に接続後、ジャンパワイヤを Arduino からエイヤと抜き取ります。

## 4. Arduino へデータの書き込み

手順2. で作成した"Joystick.hex"というデータを下記コマンドでArduino に書き込みます。書き込み成功した場合は下記のようなメッセージが出力されます

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

```:OK_Message
Checking memory from 0x0 to 0x217F...  Empty.
0%                            100%  Programming 0x2180 bytes...
[>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>]  Success
0%                            100%  Reading 0x3000 bytes...
[>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>]  Success
Validating...  Success
0x2180 bytes written into 0x3000 bytes memory (69.79%).
```

### 5. ArduinoをNintendo Switchドッグに接続し自動ドット打ち実行

Nintendo Switch をドッグに刺した状態で起動し、スプラトゥーン2にログインして先に紹介した赤いポストまで移動し投稿画面を開きます。ペン先を一番細いものに変更した後、ArduinoをSwitchドッグのUSBに刺すと勝手にカーソルが移動し左上から順次ドット打ちによる描画が開始されます。

投稿画面（ドット絵を描く画面）：
![DQqKEG5UMAA-41b.jpg](https://qiita-image-store.s3.amazonaws.com/0/92806/403a9c10-e7eb-19dc-a27b-59f0c3ff547e.jpeg)

ArduinoをSwitchに接続する（と勝手に描画が開始される）：
![P_20171210_134548_2_2.jpg](https://qiita-image-store.s3.amazonaws.com/0/92806/aa26e96a-30f1-87f1-a973-ecca6550bc20.jpeg)

注意点としては、**Arduinoの描画途中に手動でコントローラを操作してはいけない** ということです。描画タイミングがずれてドット画がぐちゃぐちゃになります。せっかく時間かけても途中で台無しです。

また、描画時間が**1枚あたり30分**程度かかるため、ゲームで遊ぼうと友人と約束している時には避けた方が良いと思います。

## 最後に

なぜこんな遅れたタイミングで自動ドット打ちをしようと思ったかというと、スプラトゥーンのイラスト投稿機能に昨日（2017/12/9 夕方ごろ）に気づいたからです（それまで赤いポストはただの無意味なオブジェクトだと思い素通りしてました）。

上記手順で今後は好きな絵や写真を描画させたり思いのままなので、もっと良さそうな絵や写真を見つけたらArduinoにドット打ちさせて投稿してみようと考えています。

皆様の楽しいイカライフに少しでもお役に立てばと思います。

## 修正履歴
2018.2.20 きばんのばんの字が間違えてました。修正しました。✕基盤→◯基板