M5PaperS3 と VS Code + PlatformIO で始める名札ソリューション

先日、次のような記事を投稿しました。今回は、その記事の続きです。新しい玩具を入手しました。

https://qiita.com/mitsuharu_e/items/e7d28a85e9c3fe921e0b

## M5PaperS3

以前の記事で紹介した [M5PaperS3](https://docs.m5stack.com/ja/core/paperS3) を入手しました。ということで、前回と同様に M5PaperS3 でも名札ソリューションを作りましょう。

https://docs.m5stack.com/ja/core/paperS3

## 開発準備

開発環境は MacBook Pro 14インチ 2021 / Apple M1 Pro / メモリ 32 GB / macOS Sequoia 15.3.2 です。前回は [Arduino IDE](https://www.arduino.cc/en/software/) を利用しましたが、今回は VS Code + [PlatformIO](https://platformio.org/) を利用しました。PlatformIO は、VS Code のアドオンとして、モダンな環境でマイコンモジュールのソフト開発ができます。

https://platformio.org/

なぜ Arduino IDE ではなく、VS Code + PlatformIO を採用したか？ですが、開発環境を構築できなかったからです。当初は公式ドキュメントから M5PaperS3 向けの Arduino IDE 開発環境を構築しましたが、残念なことにビルドできませんでした。詳しいことは分かりませんが M5PaperS3 は M5Paper V1.1 と内部構成が異なるので、M5Paper V1.1 の開発環境は利用できません。M5PaperS3 向けの開発環境を構築しないといけません。

そこで、モダンな開発環境ができる VS Code + PlatformIO に乗り換えました。他の人も PlatformIO 環境で開発した実績があり、勝ったなガハハと言いたいところでしたが、これも失敗しました。ビルドできる環境を作る開発が始まります。

## ビルドできる開発環境を作るのが本編

ライブラリ [M5Unified](https://github.com/m5stack/M5Unified) を利用しました。M5Unified は、M5Stack 製品の異なるハードウェアを共通の API で扱うことができます。

https://github.com/m5stack/M5Unified

その M5Unified が提供する PlatformIO の設定ファイル [platformio.ini](https://github.com/m5stack/M5GFX/blob/master/docs/M5PaperS3.md) は次のようになります。

```ini:M5Unified が提示する platformio.ini だが、動かない
[env:PaperS3]
platform = espressif32
board = esp32-s3-devkitm-1
framework = arduino
board_upload.flash_size = 16MB
board_upload.maximum_size = 16777216
board_build.arduino.memory_type = qio_opi
build_flags = -DBOARD_HAS_PSRAM
lib_deps = epdiy=https://github.com/vroland/epdiy.git
```

https://github.com/m5stack/M5GFX/blob/master/docs/M5PaperS3.md

ファイル中で利用されている依存ライブラリ [EPDiy](https://github.com/vroland/epdiy) は電子ペーパーのドライバーです。ちなみに、電子ペーパーの制御をこの外部ライブラリで行うことで、V1.1 からコストダウンできたのでは？という書き込みも見ました。

https://github.com/vroland/epdiy

話戻って、この platformio.ini ですが、残念ながら、ビルドができません。開発環境ができません。他の方が公開している M5PaperS3 のプロジェクトもビルドできませんでした。platformio.ini に大きな違いもないです。なぜだ…

### platformio.ini の問題

M5Unified はドキュメントから EPDiy 2.0.0 以上を指定しています。2.0.0 を設定した場合、M5Unified の依存でインストールされる M5GFX が EPDiy 2.0.0 以降に修正された lcd_bus_config_t 型を利用しているため、未定義変数の利用となりエラーになります。

そこで、最新 main ブランチの EPDiy を設定すると、M5GFX と EPDiy の lcd_bus_config_t 型は一致するので解決します。しかし、新たな問題として EPDiy が ESP-IDF 5 で削除された driver/rmt_tx.h を参照しており、ビルドできません。また、miniz.h が存在せず、include で失敗します。miniz は新たに依存ライブラリを追加することで解決します。一方で driver/rmt_tx.h に関しては、削除された ESP-IDF 4 に存在するので、対応は難しいです。

### 原因はバージョン指定にありました

詰んだ。環境構築を諦め、私は ゼノブレイドクロスDE に逃避しました。プレイの合間に考えました。公式ドキュメントや他の方のプロジェクトは M5PaperS3 が発売された時期に公開されている。その時期はビルドできたということです。

期間限定？、まさか、ねえ…。そこで、EPDiy のコミットログを見ました。

https://github.com/vroland/epdiy/commits/main/?since=2025-01-01&until=2025-03-22

力技の対応になりますが、2.0.0 より新しく、2025年3月28日時点の main 未満の EPDiy で、ESP-IDF 4 系をサポートしているコミットを選択しました。ーーー、ビルドできた！
	
```ini:ビルドできるplatformio.ini
[env:M5PaperS3]
platform = espressif32@6.10.0
board = esp32-s3-devkitm-1
monitor_speed = 115200
framework = arduino
board_build.partitions = default_16MB.csv
board_upload.flash_size = 16MB
board_upload.maximum_size = 16777216
board_build.arduino.memory_type = qio_opi
build_flags =
	-DBOARD_HAS_PSRAM
	-DARDUINO_USB_MODE=1
lib_deps = 
	m5stack/M5Unified@0.2.5
	m5stack/M5GFX@0.2.6
	epdiy=https://github.com/vroland/epdiy.git#d84d26ebebd780c4c9d4218d76fbe2727ee42b47 
```

2025年3月28日現在は、この platformio.ini でビルドできます。EPDiy だけでなく、利用するフレームワークやライブラリすべてのバージョンを固定しました。

ちなみに他の方が公開している M5PaperS3 のプロジェクトも、EPDiy のバージョンを指定したらビルドできました。やったね。

Arduino IDE でも EPDiy のバージョン指定を注意したら動くと思います。ただ、platformio.ini で開発環境を定義できるので、ソフト開発に慣れている方は VS Code + PlatformIO の利用をおすすめします。

## 名札ソリューションの開発

次の動画のような名札ソリューションを開発しました。SD カードにある画像をリストアップして、画像を選択表示します。

<iframe width="560" height="315" src="https://www.youtube.com/embed/dRgxxADyUGU?si=fNqaAkXRrYnXyF6H" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen></iframe>

M5PaperS3 は M5Paper V1.1 にあった物理ボタンがなくなっているので、どうやって画像選択するか苦労しました。タップイベントで画像選択してます。

その他は、基本的に前回開発した M5Paper V1.1 向けのコードと同様です。詳しくは、[前回の記事](https://qiita.com/mitsuharu_e/items/e7d28a85e9c3fe921e0b) を読んでください。または、今回作成したコードを GitHub に公開しました。ご興味ある方はご確認・ご利用ください。

https://github.com/mitsuharu/CardCase-For-M5PaperS3

## まとめ

M5PaperS3 でも名札ソリューションを作ることができました。M5Paper V1.1 と比較して、筐体にストラップを付けられるフックがあるので、そのまま利用できるので便利ですね。ただ、搭載インタフェースや電子ペーパー制御のハードウェア部分、そしてソフトウェア開発のし易さを比べると、M5Paper V1.1 の方が親切だなと思いました。

また、バージョン指定の誤りでビルドできなくなるのは開発不備あるあるですね。このマイコンモジュールのソフト開発環境では lock ファイル的なものもないので、最初からしっかりと指定・固定するのは大事ですね。