M5PaperのFactoryTest書込み手順メモ

# はじめに
* 以前から気になっていた[M5Paper](https://www.switch-science.com/catalog/6749/) が11月末についに発売された。
 * 出たばかりで手探りの状況ではあるが、今までに無い電子ペーパーの表現力、久々にワクワクする製品である。
* 公式リポジトリ https://github.com/m5stack/M5EPD のサンプルコードを一通り動かした後、工場出荷時に書き込まれているFactoryTestに戻そうとした際、これまでとの環境の違いに戸惑ったため、ここにメモしておく。


![IMG_3268.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/283854/2d2f024d-644f-8ef9-b37e-4ac4a5537ac5.jpeg)

# M5Paperについて
* 画面が大きいので色々こだわってアプリ作ったら楽しそう。

![IMG_3257.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/283854/4b639ba3-edb7-34cf-804a-60bd34aa2fc7.jpeg)

* スペックはこんな感じ。
 * 540*960 4.7インチ E-ink タッチスクリーン 
 * ESP32（Wi-Fi / Bluetooth）
 * 16MBフラッシュ内蔵、8MB PSRAM
 * マルチファンクションボタン
 * TF cardスロット
 * Groveポート
 * 1150mAh lipo battery
 * などなど


# M5Paper FactoryTest

* 工場出荷時は、以下のFactoryTestが書き込まれている。
 * https://github.com/m5stack/M5Paper_FactoryTest
 * FactoryTestと言っても非常に完成度が高く、電子ペーパーを活かした一通りの機能と操作を試すことができる。
 * 暫くはリファレンスとしてコードを読んだり、いじったりするために使えそう。
 * と言うことで、少なくとも１回はこれを書き込み直すことになるため、再現できる環境は確保しておきたい。

![IMG_3265D.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/283854/315eb45d-ccc5-2118-0807-371b018f83b2.jpeg)

* 例えば、こんなスマートホーム用のコントロールパネルのサンプルが用意されていたりする。
 * このままボタンに機能を実装すれば、イケてるアプリになりそう。

![IMG_3267D.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/283854/ae594c51-b0bd-4ac0-2288-f19d421c4e31.jpeg)

# 関連リポジトリ情報まとめ
* 最近のM5Stack製品のコードはArduinoライブラリとは別の場所にあることが多いので、いくつかURLを知っておく必要がある。
 * M5Paperライブラリに付属するArduinoIDEのスケッチ例は本当にベーシックな物しか入ってない。
 * そのため、以下の別リポジトリにあるサンプルを使ってみたほうがやりたいことのイメージが付きやすい。
 * 現時点では、本家の製品ページにこれらのリンクが集約されているので、リンクを片っ端から開いてみるのが間違いない気がする。

|サイト|URL| 
|:---|:----| 
| 本家の製品ページ  | https://docs.m5stack.com/#/en/core/m5paper |
| M5Paperライブラリ | https://github.com/m5stack/M5EPD |
| FactoryTest |https://github.com/m5stack/M5Paper_FactoryTest |
| 計算機のサンプル | https://github.com/m5stack/M5EPD_Calculator |
| Microsoft To Do連携サンプル | https://github.com/m5stack/M5EPD_Todo |
| その他サンプル | 上記製品ページの[Example](https://docs.m5stack.com/#/en/core/m5paper?id=example)にリンクあり。 |

# M5Paper FactoryTestのビルド環境
* M5Paperについては、これまで通りArduino IDEで開発可能である。
* しかし、M5PaperのFactoryTestや上記サンプル群については、[PlatformIO](https://platformio.org)のプロジェクトで作られているため、別途、PlatformIOのビルド環境が必要となる。
 * PlatformIOについてはこちらに記載がある( [マイコン開発するならPlatformIOがめちゃくちゃいいぞ](https://qiita.com/JotaroS/items/1930f156aab953194c9a) )
* 一方、最近のトレンドとして、組み込み開発でもVisual Studio Codeを使う人が増えてきている。
 * 自分も使い始めているが、Arduino IDEには無い高機能なエディタやGit連携など、使い始めるともう戻れない。
 * M5Paperの開発はVSCode + Arduino拡張 で行くつもりだが、FactoryTestのコードで色々動かして実験するために今回PlatformIO拡張を加える。
 * PlatformIOはいくつかのIDEと連携できるが、VSCodeとの親和性も良いらしいので、今回はこれで行く。

![スクリーンショット 2020-12-01 23.05.06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/283854/fffc40f6-7deb-e082-2b09-d40d5dde7a2f.png)


# Visual Studio Codeのインストール
* 既に環境構築されている方もいると思うので、さらっと。
 * [https://code.visualstudio.com](https://code.visualstudio.com) から自分のOSのものを取得してインストール。
 * 自分は自宅で macOS Catalinaを使っているが、職場のWindows10でも全く同じようセットアップできる。


![スクリーンショット 2020-12-01 23.14.21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/283854/310d99cd-bbb1-56ff-4433-bb9acd69cb94.png)

## 拡張機能のインストール
* VSCodeを起動したら、拡張機能をインストールしておく。
* VSCodeで使うPlatformIOについてもこの拡張機能として提供される。
 * 画面左側のツールバーの中のブロックみたいなアイコンを選択すると表示される機能拡張画面でプラグインを検索し、インストールする。
* 自分が入れてる拡張機能はこんな感じ。

![スクリーンショット 2020-12-01 23.17.51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/283854/6cdd606d-169d-2959-aaa3-f00f9fd10c0e.png)

* 本格的に開発する場合は豊富な拡張機能からお気に入りを吟味されると思うので、ここでは主要なものを。
* (FactoryTestを入れるだけならPlatformIOだけでいい気がする。)
 * C/C++
 * GitLens
 * PlatformIO
 * (Arduino)


![スクリーンショット 2020-12-01 23.18.32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/283854/125f7f31-8884-188b-e235-194ba4350515.png)

## M5Paper FactoryTestのリポジトリをgit clone
* ファイルメニューの「Clone Repository」を選択し、画面上部の入力フィールドに https://github.com/m5stack/M5Paper_FactoryTest をペーストし、実行する。
 * 展開先のディレクトリを聞かれるので、適当な場所を指定すると、そこにリポジトリがcloneされる。

![スクリーンショット 2020-12-01 23.36.35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/283854/b7396283-2e62-3c0b-ce41-e2e25b3934ac.png)

* git cloneされるとプロジェクトを開くか聞かれるので、「開く」を選択するとPlatformIOのプロジェクトが開かれる。

![スクリーンショット 2020-12-01 23.05.06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/283854/28f50098-5e31-4281-748b-e59b8bb398b5.png)

## PlatformIOの設定
### M5Stackライブラリの取り込み
* Libraries でRegistryタブのフィールドで「M5stack」を入力して検索。
* 検索結果の中から「M5Stack by Zibin」を選択。

![スクリーンショット 2020-12-01 23.42.54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/283854/a28e9449-9444-4ddd-5e5d-82b60344fd13.png)

* 追加先のプロジェクト名を「gitHub/M5Paper_FactoryTest」を選択し、Add。

![スクリーンショット 2020-12-01 23.45.39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/283854/092f3b8f-5e3b-9834-ff2c-ccac17a05f15.png)

### M5Paperライブラリの取り込み
* 「platformio.ini」を開いて、lib_depsにM5PaperライブラリのGitHubのURLを追記。
 * インデントのTabに注意。

```
lib_deps = 
	https://github.com/m5stack/M5EPD
	m5stack/M5Stack@^0.3.1
```

![スクリーンショット 2020-12-01 23.50.50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/283854/1114de8d-b21c-6593-3be9-21156f21c042.png)

## ビルド
* 左端のツールバーのPlatformIOのアイコンを選択して開き、Buildを実行。
 * 先ほど選択した M5Paperライブラリがローカルにダウンロードされ、しばらくするとビルドが終了する。

![スクリーンショット 2020-12-01 23.55.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/283854/61092689-aad1-d355-9205-0b3380338d46.png)

## ファームのアップロード
* M5PaperをUSBケーブルでつなぎ、先ほどと同じ画面で、Uploadを実行
 * 特にボードを選択するとか、シリアルポートを指定する必要もなく、書き込みが完了する。

![スクリーンショット 2020-12-01 23.59.29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/283854/a77049a5-1d29-388f-943e-65dce5b339b2.png)

## 動作チェック
* 書き込みが完了するとM5Paperが再起動し、例のFactoryTestの画面が表示される。
 * これでいつでも工場出荷状態に戻せる。

![IMG_3258.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/283854/4e3be578-457a-bc2f-8282-96c917d5ddfc.jpeg)

## ちなみに
* PlatformIOのプロジェクトで外部からダウンロードしたライブラリは「.pio」と言うディレクトリに格納される。
 * あと、よく見るとボードのプロファイルは M5stack-fireになってる。
* ビルドすると、出力メッセージにライブラリの依存関係をツリー表示してくれるのが、さりげなく良い。

![スクリーンショット 2020-12-02 0.11.58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/283854/a2b354cf-91de-ff3b-c6ae-e485f17eff4f.png)



# まとめ
* 今回初めてPlatoformIOに触れてみた。
 * 軽く調べた限りPlatformIOは、pythonでOSやボードに合わせてgccを使いやすくしたものと言うことで、確かにやってみると簡単。
 * これまで触れたことがないツールではあるが、やってることは大した事ない感じ。
 * M5Paperは色々高機能ではあるので、１つのプロジェクトでいろんなライブラリを寄せ集めて開発するって場合にはいいかも。
 * ただ、個人的にはVSCode + Arduinoで開発を始めたばかりなので、しばらくは使わないかなぁ。
* これでいじれる環境が確保できたので、M5Paperで思う存分遊んでみたいです。