2019年3月13日水曜日

ESP32-WROOM-32のプログラム領域が足りなくなった時に、パーティションの設定を変更(OTAを無効化)して領域を増やす方法


背景

ESP32とはWiFiとBluetootn通信ができるチップです。
ESP32-WROOM-32(以下WROOM)とはESP32、フラッシュメモリ、水晶振動子などを搭載したESP32を利用できるプログラム可能なモジュールです。

OTAとはover the airの略であり、WiFi経由でプログラムを書き込む機能のことです。
ESP32は標準でOTAが有効になっています。
OTAを利用する場合、プログラムを動かしながら新しいプログラムを受信する必要があるため、OTAを有効にした状態のプログラムを書き込める領域はフラッシュメモリの半分以下の大きさになっています。

秋月電子やスイッチサイエンスで売られているWROOMやWROOMの開発ボードのほとんどは体4MBのフラッシュメモリが載っています。
しかし、ビルドするプログラムの配置領域は4MB中約1.3MBに設定されているため、1.3MBを超えるプログラムは領域不足でエラーになることがあります。
自分はWiFiとBLEを同時に利用するプログラムを書いたら領域不足になりました。

フラッシュメモリが8MB16MBのWROOMも売られているので、それらに変えればこの問題は回避できます。
しかし、調べてみたところ、OTAを無効にしてフラッシュメモリのプログラムを書き込む領域を拡張することで、1.3MBを超えるプログラムも書き込めるようでした。

m5stack program size is greater than maximum allowed

試してみたら見事書き込みに成功したので、備忘録を兼ねてやった内容を共有します。

注意

この記事の内容は、OTA(over the air: WiFi経由での書き込み)で利用する領域を削除して実現しています。
そのため、紹介する変更を行うとOTAではプログラムを書き換えられなくなります。
OTAを利用しつつ1.3MB以上のプログラムを書き込みたい場合は8MB16MBのフラッシュメモリを搭載したWROOMを利用するのが良いと思います。

使ったもの

ESP32を使えるボード

WROOM搭載のボードは、秋月電子スイッチサイエンスで売られています。
WROOMは使われていませんが、M5Stackでも今回の記事の内容は効果があるようです。

ESP32の開発環境

2種類の環境でパーティションを変更する方法が分かりました。

Arduino IDE

Arduinoというプログラムを書き込めるボードのために作られた開発環境です。
ボード情報を追加するとESP32の開発もできます。

Download the Arduino IDE

PlatformIO

様々な組み込み機器に対応している開発環境です。
ArduinoIDEと比べてライブラリのダウンロードや今回のような細かな設定をプロジェクトごとに管理出来ます。
そのため、サンプルプログラムの実行はArduinoIDEを利用し、プロジェクトを始める場合はPlatformIOを利用するというのを、自分は半年前くらいから採用しています。

Installation - PlatformIO
PlatformIOを使うと、Arduinoのプロジェクトのライブラリの管理が楽そうだった話

方法1: OTAを使わないパーティション設定を適用

Arduino IDEの場合

ツール -> Partition Scheme -> No OTAもしくはHuge APP を選択します。


PlatformIOの場合 

platformio.iniにboard_build.partitionsとして no_ota.csvかhuge_app.csvを設定すれば、OTAを無効化したパーティション設定が使えます。
(arduino-esp32のpartitionsディレクトリのcsvファイルを指定できるようです。)
platformio.ini
[env:esp32dev]
..
board_build.partitions = no_ota.csv

これでプログラム領域を増やせました。

ではビルドしてみます。
(領域が足りないと書き込み前にビルドエラーになります。)
pio run

変更を行う前は領域不足で失敗していたビルドが、


プログラムを書き込む領域を広げたことにより成功するようになりました。


方法2: 独自のパーティション設定を適用

Arduino IDEの場合

ArduinoIDEで独自のバーティション設定を利用する場合は、Arduino IDEが隠しファイルとして管理しているesp32のパーティション設定ファイルを書き換えれば可能です。

パーティションファイルが入っているディレクトリ
~/.arduino15/packages/esp32/hardware/esp32/1.0.1/tools/partitions

しかし、上記のファイルを変更すると他のesp32に関するファイルのビルドにも影響を及ぼしてしまいます。
そのため、パーティション設定を利用する際は上記のファイルを編集するのは止めて、PlatformIOでパーティション設定も含めてプロジェクトを管理することをお勧めします。

PlatformIOの場合

標準のパーティション設定を参考にしながらプログラム書き込み領域(app0)を大きくしたcsvを作成します。
custom.csv
# Name,   Type, SubType, Offset,  Size, Flags
nvs,      data, nvs,     0x9000,  0x5000,
otadata,  data, ota,     0xe000,  0x2000,
app0,     app,  ota_0,   0x10000, 0x250000,
app1,     app,  ota_1,   0x260000,0x30000,
eeprom,   data, 0x99,    0x290000,0x1000,
spiffs,   data, spiffs,  0x291000,0x16F000,

作成したcsvファイルをplatformio.iniで読み込ませるようにします。
platformio.ini
[env:esp32dev]
..
board_build.partitions = custom.csv

独自に定義したパーティション設定を利用して、プログラム書き込み領域を増やせました。


まとめ

フラッシュメモリのパーティションを変更することで、標準の設定では書き込めない大きさのプログラムをWROOMに書き込めました。
フラッシュメモリの大きいWROOMに買い換えなくて済むのでありがたいです。

記事の内容が何かの参考になれば嬉しいです。

参考

Custom partitions table - espressif/arduino-esp32

変更履歴

2019.10.01
タイトルのwroomが「ESP32-WROOM032」になっていたので「ESP32-WROOM-32」に修正しました。
2019.11.29
platformioの設定ファイルを「platformio.ino」と間違えていたので、「platformio.ini」 に修正しました。

8 件のコメント :

n_shinichi さんのコメント...

ありがとうございます。
参考になりましした。
OTAでBLEを使うのはできないんですね。。。

Asuki Kono さんのコメント...

参考になって良かったです。

> OTAでBLEを使うのはできないんですね。。。

OTAでBLEを扱うプログラムは書き込めると思いますが、この場合「BLEでOTAが出来ない」のを意図しているのでしょうか。
だとすると、はい、自分が把握している範囲ではBLE通信でOTAはできなさそうです。

n_shinichi さんのコメント...

お久しぶりです。。。その節はありがとうございました。
忘れた頃にメールでコメントに返信があります...ってのがありまして。

>OTAでBLEを使うのはできない・・・

自分で書いておいて変です。すみません。
OTAとBLE両方を使えるようにする。はできないんですね...が正しいです。

OTAはWiFiでやってましたので。
で、BLEも使おうとすると領域が足りない。 のエラーだったかと思います。
で、こちらの記事を拝見してそもそもできないのか・・・と納得したように思います。

Asuki Kono さんのコメント...

返信ありがとうございます。

> OTAとBLE両方を使えるようにする。はできないんですね...が正しいです。

BLEのプログラムが容量不足でエラーになっているなら、そのままではでき無さそうです。
ESP32は保存領域が4MBのものが多いですが、8MB16MBのものを使えば容量が増えるのでOTAの仕組みを維持したままBLEも使えると思います。

n_shinichi さんのコメント...

ありがとうございます。
承知しました。

実際にはESP32・・・が載ってる、M5stickC_Plus を使っての
ことなのですが、それなら何かやりようがある... 
なんてことがあれば 記事で紹介して頂ければ幸いです。


BLEでリモコンにするとOTA使えないので毛皮を脱がないといけない。
毛皮を脱がずに書き換えできるようにOTA使うとBLEでリモコン操作ができない。
両方できるようにならんかなと思ってたところでした。
https://n-shinichi.hatenablog.com/entry/2022/05/28/190046?_ga=2.16773311.865417847.1660230942-124876159.1618931563

Asuki Kono さんのコメント...

作品共有ありがとうございます。
M5stickC_Plusを使っているのですね。
それはESP32-PICO-D4という4MBのFlashが回路に組み込まれているESP32が使われているので、4MBより大きいものは今の所無いようです。
しかしながら、ESP32-PICO-V3-02という8MBのFlashが組み込まれたESP32が新しく出ているので、それを利用したM5stickCが出たらBLEを使うプログラムをOTAで書き換えれそうです。

n_shinichi さんのコメント...

なるほど・・・です。
お返事ありがとうございました。

8MB M5stickC 楽しみに待つとします...

Asuki Kono さんのコメント...

ESP32でspiffsを使わない設定にすれば、BLEを使いながらOTAに対応する領域を確保できるようです。
こちらを試してみるのはいかがでしょう?
【PlatformIO】ESP32(M5Stick-C)のOTAとBLEを同時に使う