Splatoon2で自動ドット打ちしてくれるやつをWindows10のWSLで使う

# おおまかまとめ

- Switch-Fightstickすごい
    - マイコンボードにポッ拳コントローラのフリをさせて1ドットずつ描画する
- スプラトゥーン2とPCを持っていれば、3,000円くらいで可能
    - teensy++ 2.0を買う、teensy 3.xは未対応なので買ってもできない
    - Arduino UNO R3やArduino microでも可能
- ソフトウェア開発・マイコンボードに対する知識があると良い
- Windows10ならWSLを利用すると、環境をあまり汚さなくてよい

# 必要なもの

- ハードウェア
    - Nintendo Switch（本体）
    - Splatoon2（ソフト）
    - Windows10 PC（cmdがあるWindowsやLinux PCやMac PCでも可能、本稿では手順の違いを述べない）
    - [teensy++ 2.0](http://amzn.to/2etSIpt)（マイコンボード）
        - 3,000円くらい
        - Switch-Fightstick公式によれば、Arduino UNO R3とArduino Microでも動作確認済みらしい
        - teensy 3.xはarm cpuになっておりLUFAライブラリが非対応
        - ~~うっかりteensy 3.2を買ってしまったよ…~~
    - （追記：なくてもOK）[USB-A to USB Type-C変換コネクタ](http://amzn.to/2iOlIdc)（teensy++ 2.0についているUSB-A/USB-Micro-BのケーブルをNintendo Switchに接続する）
        - Switchのクレードルを使えば、必要ない
        - 500円くらい
        - これが安かったし、動作もした
- ソフトウェア（少なくとも、個人利用ならどれも無料）
    - GIMP（画像編集ソフト、白黒化とpngデータ吐き出しをする。手持ちのソフトでもOK）
    - Switch-Fightstick（偉大なツール、LUFA同梱・非同梱のどちらかを使う）
    - LUFA（AVRマイコン用USBライブラリ、上記ツールが使用する）
    - teensy.exe（teensy公式のバイナリ書き込みソフト）
    - WSL (Bash on Windows)
        - python2.7（LL言語、WSLにすでに入っているはず）
        - gcc-avr、avr-libc（avrコンパイラとライブラリ、WSLでのUbuntuパッケージ）
        - git（バージョン管理ツール、Switch-Fightstickを落とすのに使う）
        - WSLを準備する方法については、本稿では取り上げない

# 手順

## 下準備

### GIMPのインストール

- GIMP公式からdirectlyダウンロードし、gimp-xxx-setup.exeを実行する
    - xxxはバージョン、本稿執筆時は2.8.22が最新だった
    - https://www.gimp.org/downloads

### WSL上に必要なパッケージをインストール

WSL上で作業する

- git、avrコンパイラとライブラリをインストールする
- python2.7（パッケージ名python）がなければ入れておく
    - たぶん元から入っている
    - `png2c.py`を動かすのにPILライブラリが必要

```bash
sudo apt install git gcc-avr avr-libc python-pil
```

### Switch-Fightstickをダウンロード

WSL上で作業する

#### LUFA同梱版で行う場合（簡単）

Switch-Fightstickの最新には追従しきれていないが、LUFAライブラリが同梱されている。
（追記）最近、高速化コミットを取り入れた。

- 同梱版Switch-Fightstickをクローンして、バージョン~~1.0.0f~~1.1.0fを使う
    - リリースのzipをダウンロードして使ってもよい
    - https://github.com/EsProgram/Switch-Fightstick/releases

```bash
git clone https://github.com/EsProgram/Switch-Fightstick.git
cd Switch-Fightstick
git checkout 1.1.0f
```

#### 非同梱版でやる場合（ちょっと手間だけど最新版）

こちらはLUFAライブラリが同梱されていない。
そのため、自分でダウンロードし配置してから作業する。
本稿執筆時点では、GithubのPRにて高速化バージョンが提案され、マージされた。

- githubのLUFAプロジェクトからクローン
    - https://github.com/abcminiuser/lufa
- または、LUFA公式ページの最後にあるzipをダウンロードして解凍する
    - http://www.fourwalledcubicle.com/LUFA.php
    - 解凍したLUFAライブラリをSwitch-Fightstickと同じディレクトリに配置する
- Switch-Fightstickをクローンしてくる

```bash
git clone https://github.com/abcminiuser/lufa.git
git clone https://github.com/shinyquagsire23/Switch-Fightstick.git
cd Switch-Fightstick
```

## 本作業

本節以降を繰り返せばいろいろなドット絵を扱える

### 元画像の準備

- 320x120サイズを良いする
- jpgでもpngでも、GIMPで開ければ良い

### 画像を白黒化

GIMPで作業する
もちろんGIMPを使わず、各自手元のIllustratorやPhotoshopやCOMIC STUDIOなどを使って320x120サイズの白黒画像を用意してもよい。（トーン使ってみたい）

- 画像を開く
    - 画像をGIMPにドラッグアンドロップで開ける
- 白黒化
    - [Image] -> [Mode] -> Grayscale]
        - 2値化はSwitch-Fightstickツールがやってくれるため、やらなくてもよい
        - [Image] -> [Mode] -> [Indexed]の「Use black and white (1-bit) paltette」を使い、自分で2値化してもよい
        - 2値化の処理によって見え方がだいぶ変わるため、自分でやるほうが綺麗な画像をつくれる
        - 拘るなら、明るさ、コントラスト、フィルター、2値化処理方法をいじる
        - さらに拘るなら、生成されたpngのドットを微修正する
        - さらにさらに、2値化前に、[Fileters] -> [Artistic] -> [Cartoon]で先に輪郭を強調しておくと、よりキレイにできる
            - 詳細な解説は[写真を漫画の一コマに変換する！無料ソフトGIMPで簡単レタッチ - 良いもんつたえ隊](http://iimonntsutaetai.hatenablog.com/entry/2016/11/09/%E5%86%99%E7%9C%9F%E3%82%92%E6%BC%AB%E7%94%BB%E3%81%AE%E4%B8%80%E3%82%B3%E3%83%9E%E3%81%AB%E5%A4%89%E6%8F%9B%E3%81%99%E3%82%8B%EF%BC%81%E7%84%A1%E6%96%99%E3%82%BD%E3%83%95%E3%83%88GIMP%E3%81%A7)様

- PNG画像で保存
    - [File] -> [Export As...]
    - [PNG image]を選択
    - ファイル名は`.png`にしておく

### 画像をc言語ソースファイルに埋め込み

WSL上で作業する
`git clone`したSwitch-Fightstickディレクトリ内で作業する

- python2.7と`png2c.py`でcソースファイルに埋め込むため、下記コマンドを打つ
    - ファイル名は自分が保存したパスと名前にする
    - PNGが2値化してあるなしを認識し、良しなにしてくれる
    - 用意した画像がraw data（.data）なら`bin2c.py`を使えばよい

```
python png2c.py [image.png]
```

うまく行けば、下記のメッセージが出る。
また、`git status`で`image.c`が更新されているのを確認できる。

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

### teensy++ 2.0用のバイナリファイルの作成

WSL上で作業する
`git clone`したSwitch-Fightstickディレクトリ内で作業する

- `make`を叩きビルドする
    - 成功すると、`[INFO]    : Finished building project "Joystick".`と出る
    - Makefile内のMCU項目を書き換えることで、Arduino UNO R3/Microへ対応できる（らしい）
- 生成された`Joystick.hex`をWindows側Cドライブ内へコピーする。

```bash
make
...(ログ省略)
cp ./Joystick.hex /mnt/c/[いい感じのところ]
```

- LUFA非同梱版を使った場合は`make`コマンドでLUFAライブラリのパスを指定する
    - もしくは、自分で`makefile`内の`LUFA_PATH`の項目を正しく書き換える

```bash
make LUFA_PATH=../lufa/LUFA
...(ログ省略)
cp ./Joystick.hex /mnt/c/[いい感じのところ]
```

### teensy++ 2.0への書き込み

Windows10環境にて作業する。
先項で生成された`Joystick.hex`を、公式の書き込みツールでteensy++ 2.0へ書き込む

- teensy.exeを起動する
- tennsy++ 2.0をPCに接続する
- [File] -> [Open HEX File]
   - `Joystick.hex`を指定する
- tennsy++ 2.0のスイッチを押す
- [Operation] -> [Program]
- [Operation] -> [Reboot]

![teensy-exe.png](https://qiita-image-store.s3.amazonaws.com/0/42721/02557f58-e7e8-82f4-752d-e233aba4fad9.png)

### Nintendo Switchで画像描画を実行

Nintendo Switchとスプラトゥーン2で作業する

- 投稿画像編集画面へ行く
- ペンを一番細いものにする
    - （追記）開始点への移動、キャンバスのクリア、は勝手にやってくれる。
- Nintendo Switchにteensy++ 2.0を接続する
    - 画像はUSB Type Cで接続している図
    - （追記）SwitchのクレードルのUSB-A端子に接続してもできる
- ~~1時間~~30分ほど待つ
    - ~~高速版なら30分くらいかかる~~
    - （追記）LUFA同梱版も高速化された

![switch-teensy.JPG](https://qiita-image-store.s3.amazonaws.com/0/42721/ec2421df-b34f-4dab-c20f-50f1e2636e24.jpeg)

# 参考文献

- Splatoon2で自動ドット打ちしてくれるやつ試した by @Es_Program さん
    - http://esprog.hatenablog.com/entry/2017/08/19/001717
    - 日本語で解説してくれている偉大なる先人様
- Switch-Fightstickツール
    - https://github.com/shinyquagsire23/Switch-Fightstick
    - さらにオリジナルがあるが、そちらは2ヶ月更新されていなかった
- LUFAライブラリ
    - https://github.com/abcminiuser/lufa
- Tennsy++ 2.0公式
    - https://www.pjrc.com/teensy/
- @ES_Program さんによる、Switch-FightstickツールのLUFAライブラリの同梱版
    - https://github.com/EsProgram/Switch-Fightstick
- GIMP2
    - https://www.gimp.org/
- 写真を漫画の一コマに変換する！無料ソフトGIMPで簡単レタッチ - 良いもんつたえ隊
    - http://iimonntsutaetai.hatenablog.com/entry/2016/11/09/%E5%86%99%E7%9C%9F%E3%82%92%E6%BC%AB%E7%94%BB%E3%81%AE%E4%B8%80%E3%82%B3%E3%83%9E%E3%81%AB%E5%A4%89%E6%8F%9B%E3%81%99%E3%82%8B%EF%BC%81%E7%84%A1%E6%96%99%E3%82%BD%E3%83%95%E3%83%88GIMP%E3%81%A7