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」 に修正しました。

0 件のコメント :

コメントを投稿