PlatformIO M5Stack開発の現状

2023/10/09追記

**この記事は2年以上前に書かれています！**
**現在はM5Unifiedを使用するのが便利みたいです。**
**下記の公式ガイドをご確認ください。**

Visual Studio Codeを用いたM5Unifiedの導入方法
https://docs.m5stack.com/ja/quick_start/m5unified/intro_vscode

以下、2年以上前に書いた内容です。

---

私が初めてM5Stackを触ったのは2019年4月のことでした。
あれからハードウェアではM5Stickシリーズを始めとした新製品が登場し、
Arduino IDEでの開発環境にもいくつかの変化がおこりました。

初代M5Stackに比べて他のM5Stack製品は
PlatformIO対応が完全な形ではないようですので、
現状と、開発する際のplatformio.ini定義をまとめてみました。

また、PlatformIOでLovyanGFXを用いた開発も試してみます。

## ざっくり

* PlatformIO便利
* 最近M5Stack公式もPlatformIOを使い始めた
* 最近M5Stack Grayのボード定義が追加された
* M5Stack Core2やM5Paperを使う時はGitリポジトリを直接指定する
* LovyanGFXは悩むことなく導入できる

## PlatformIO とは

組み込み開発を行うことができる開発環境およびVisual Studio Code用プラグインです。
Arduinoの開発をArduino IDEを用いずに行うことができます。

![スクリーンショット](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/74419/7eee35b6-9151-a8d5-895a-d718f55aac3c.png)

最近は[M5PaperのFactory Test](https://github.com/m5stack/M5Paper_FactoryTest)にPlatformIOが使われており、
もしかしたらM5Stack公式としてもこれからPlatformIOを取り入れていく予定なのかもしれません。

拙作の[CapsuleChord](https://twitter.com/wararyo/status/1312347586708168704)もPlatformIOでファームウェアを開発しています。

## PlatformIOのメリット

### グローバル環境に依存しない使い方ができる

Arduino IDEではライブラリやボード定義をグローバルにインストールしますが、
PlatformIOではプロジェクト単位でもライブラリをインストールすることができます。
これにより、プロジェクトごとに異なるバージョンのライブラリを用いる、ということもできます。

これを実現するために、
PlatformIOでは`platformio.ini`という定義ファイルを書きます。
npmで言うところの`package.json`みたいなものです。

``` ini:platformio.iniの例
[platformio]
default_envs = m5stack-fire

[env:m5stack-fire]
platform = espressif32
board = m5stack-fire
framework = arduino
lib_deps =
  m5stack/M5Stack ;PlatformIOに登録されたパッケージ名を指定
  https://github.com/lovyan03/LovyanGFX.git#develop ;Gitリポジトリを直接指定することもできる
```

### 書き込みやすい & シリアルモニタしやすい

ハードウェアを接続した後に書き込みボタンを押すだけで書き込むことができ、手軽です。
ボードやシリアルポートを切り替える必要はほとんどありません。

## PlatformIOのデメリット

### 上に書かれた関数から下に書かれた関数を呼び出せない

最後にデメリットですが、
PlatformIOでは多くのC++環境と同様に、
上に書かれた関数から下に書かれた関数を呼び出せません。
Arduino IDEでは関数を記述する順番が関係ないので、
移行の際は戸惑うかもしれません。

### VSCodeがちょっと重くなる

PlatformIO以外で頻繁にVisualStudioを用いられる方は
PlatformIOをグローバルで無効にし、
Workspace単位で有効にする運用にしてもいいかもしれないです。

![スクリーンショット](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/74419/8b3c001b-e317-1e0d-ddaa-f5fa21a96078.png)

## 初代M5StackとPlatformIO

初代M5Stack (M5Stack Basic/Gray/Fire) 向けにPlatformIOを用いる場合は、
boardに`m5stack-core-esp32` `m5stack-grey` `m5stack-fire`のいずれかを指定します。
lib_depsには`m5stack/M5Stack`を追加します。

``` ini:platformio.ini
[env:m5stack-fire]
platform = espressif32
board = m5stack-fire
framework = arduino
monitor_speed = 115200
lib_deps =
  m5stack/M5Stack
```

[CapsuleChordのplatformio.ini](https://github.com/wararyo/CapsuleChord/blob/master/M5Chorder/platformio.ini) ではこれSD-Updaterを追加したり、OTAに対応させたりしています。

ちょっと前はM5Stack Gray向けであっても`m5stack-fire`を指定していましたが、
最近`m5stack-grey`が追加されたようです。 
(製品名はGrayですが、boardで指定する文字列はgreyっぽいです…)

## M5Stack Core2とPlatformIO

Board、Library共にM5Stack Core2用の物はないため、
Boardは`m5stack-fire`で代用し、LibraryはGitリポジトリを指定します。

``` ini:platformio.ini
[env:m5stack-core2]
platform = espressif32
board = m5stack-fire
framework = arduino
monitor_speed = 115200
lib_deps = 
  https://github.com/m5stack/M5Core2.git
```

## M5PaperとPlatformIO

Board、Library共にM5Paper用の物はないため、
Boardは`m5stack-fire`で代用し、LibraryはGitリポジトリを指定します。

``` ini:platformio.ini
[env:m5stack-core2]
platform = espressif32
board = m5stack-fire
framework = arduino
monitor_speed = 115200
lib_deps = 
  https://github.com/m5stack/M5EPD.git
```

## LovyanGFXとPlatformIO

M5Stack開発を今から行うならやっぱりLovyanGFXは試したいですよね。

本当はPlatformIOからLovyanGFXを使う時にハマったことをメインに記事を書こうと思っていたんですが、
**何の問題もなく使えました…！**

### LovyanGFXとCore2とPlatformIO

Core2は本当に何も迷うことがないです。

``` ini:platformio.ini
[env:m5stack-core2]
platform = espressif32
board = m5stack-fire
framework = arduino
monitor_speed = 115200
lib_deps = 
  https://github.com/m5stack/M5Core2.git
  lovyan03/LovyanGFX
  ;https://github.com/tanakamasayuki/efont.git ; v0.3.0でLGFX本体に取り込まれたそうです
```

``` main.cpp
#include <M5Core2.h>

#define LGFX_M5STACK_CORE2
#include <efontEnableJa.h>
#include <efontFontData.h>
#include <LovyanGFX.hpp>

static LGFX lcd;

void setup() {
  M5.begin(true, true, true, true);
  lcd.init();
  lcd.setFont(&fonts::lgfxJapanGothic_40);
  lcd.println("Hello World");
}

void loop() {}
```

### LovyanGFXとM5PaperとPlatformIO

M5Paperに関しては少し前までは
developブランチを直接指定する必要がありましたが、
無事に最新のリリースで対応されたそうです。

``` ini:platformio.ini
[env:m5stack-core2]
platform = espressif32
board = m5stack-fire
framework = arduino
monitor_speed = 115200
lib_deps = 
  https://github.com/m5stack/M5EPD.git
  lovyan03/LovyanGFX
```

``` main.cpp
#include <M5EPD.h>

#define LGFX_M5PAPER
#include <efontEnableJa.h>
#include <efontFontData.h>
#include <LovyanGFX.hpp>

static LGFX gfx;

void setup() {
  M5.begin(true, true, true, true);
  gfx.init();
  gfx.setFont(&fonts::lgfxJapanGothic_40);
  gfx.println("Hello World");
}

void loop() {}
```

あとで書きたい: LGFXボード自動判別機能とPlatformIO

---

間違いやより良い方法などありましたら
ぜひコメントかTwitterのリプライでお知らせください。