背景
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を同時に利用するプログラムを書いたら領域不足になりました。
フラッシュメモリが8MBや16MBのWROOMも売られているので、それらに変えればこの問題は回避できます。
しかし、調べてみたところ、OTAを無効にしてフラッシュメモリのプログラムを書き込む領域を拡張することで、1.3MBを超えるプログラムも書き込めるようでした。
m5stack program size is greater than maximum allowed
試してみたら見事書き込みに成功したので、備忘録を兼ねてやった内容を共有します。
注意
この記事の内容は、OTA(over the air: WiFi経由での書き込み)で利用する領域を削除して実現しています。そのため、紹介する変更を行うとOTAではプログラムを書き換えられなくなります。
OTAを利用しつつ1.3MB以上のプログラムを書き込みたい場合は8MBや16MBのフラッシュメモリを搭載した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」 に修正しました。
ありがとうございます。
返信削除参考になりましした。
OTAでBLEを使うのはできないんですね。。。
参考になって良かったです。
返信削除> OTAでBLEを使うのはできないんですね。。。
OTAでBLEを扱うプログラムは書き込めると思いますが、この場合「BLEでOTAが出来ない」のを意図しているのでしょうか。
だとすると、はい、自分が把握している範囲ではBLE通信でOTAはできなさそうです。
お久しぶりです。。。その節はありがとうございました。
返信削除忘れた頃にメールでコメントに返信があります...ってのがありまして。
>OTAでBLEを使うのはできない・・・
自分で書いておいて変です。すみません。
OTAとBLE両方を使えるようにする。はできないんですね...が正しいです。
OTAはWiFiでやってましたので。
で、BLEも使おうとすると領域が足りない。 のエラーだったかと思います。
で、こちらの記事を拝見してそもそもできないのか・・・と納得したように思います。
返信ありがとうございます。
返信削除> OTAとBLE両方を使えるようにする。はできないんですね...が正しいです。
BLEのプログラムが容量不足でエラーになっているなら、そのままではでき無さそうです。
ESP32は保存領域が4MBのものが多いですが、8MBや16MBのものを使えば容量が増えるのでOTAの仕組みを維持したままBLEも使えると思います。
ありがとうございます。
返信削除承知しました。
実際にはESP32・・・が載ってる、M5stickC_Plus を使っての
ことなのですが、それなら何かやりようがある...
なんてことがあれば 記事で紹介して頂ければ幸いです。
BLEでリモコンにするとOTA使えないので毛皮を脱がないといけない。
毛皮を脱がずに書き換えできるようにOTA使うとBLEでリモコン操作ができない。
両方できるようにならんかなと思ってたところでした。
https://n-shinichi.hatenablog.com/entry/2022/05/28/190046?_ga=2.16773311.865417847.1660230942-124876159.1618931563
作品共有ありがとうございます。
返信削除M5stickC_Plusを使っているのですね。
それはESP32-PICO-D4という4MBのFlashが回路に組み込まれているESP32が使われているので、4MBより大きいものは今の所無いようです。
しかしながら、ESP32-PICO-V3-02という8MBのFlashが組み込まれたESP32が新しく出ているので、それを利用したM5stickCが出たらBLEを使うプログラムをOTAで書き換えれそうです。
なるほど・・・です。
返信削除お返事ありがとうございました。
8MB M5stickC 楽しみに待つとします...
ESP32でspiffsを使わない設定にすれば、BLEを使いながらOTAに対応する領域を確保できるようです。
返信削除こちらを試してみるのはいかがでしょう?
【PlatformIO】ESP32(M5Stick-C)のOTAとBLEを同時に使う