ESP32の書き込みサイズを変更する

いろんなことに使われているESP32ですが、先日のハッカソンで渡されたサンプルプログラムがデフォルトで92%もメモリを使用するということで、何に使えるんだコレと海原雄山みたいなこと言いました。

ということで今回はそんな時に使えるESP32の書き込みができるファイルサイズを変更する方法です。

やること

ESP32の書き込みメモリのサイズを変更する

工程

  1. 設定ファイルの場所を特定する
  2. 電卓とかで増やすサイズを割り出す
  3. 設定ファイルを書き換え
  4. テストとして実際に書き込みしてみる

実際に変更してみる

設定ファイルを見つける

まずは設定ファイルの場所を特定する必要がある。

ちなみに、今回使用したOSはLinux(xubuntu)です。他のOSを使用している方とはファイルの場所などに違いがある場合があるので注意してください。

僕の場合、設定ファイルは

~/Arduino/hardware/espressif/esp32/tools/partitions/default.csv に存在しました。

このcsvファイルに色々と情報が書き込まれていて、実際にプログラムが書き込まれるときなどにコレが参照されるそうです。

# Name,   Type, SubType, Offset,  Size, Flags
nvs,      data, nvs,     0x9000,  0x5000,
otadata,  data, ota,     0xe000,  0x2000,
app0,     app,  ota_0,   0x10000, 0x140000,
app1,     app,  ota_1,   0x150000,0x140000,
eeprom,   data, 0x99,    0x290000,0x1000,
spiffs,   data, spiffs,  0x291000,0x16F000,

初期の値はこうなっていて、0x140000 = 1310720 bytesだけ書き込めるようになっている。

nvsとotadataをいじってしまうと、動作が不安定になるので、よっぽどのことがなければotadata下の4行分データを変更します。

ちなみに、サイズを変更する時は 0x10000 ごとに変更をしないと怒られます。コンパイルエラーが出たときにも言われるので注意しましょう。

変更するサイズを決める

1310720 bytes ~ 1.3MBになるので、今回は1.5MBくらいまで増やすとこにしようと思います。

1500000 = 0x16E360になるので、1.5MBにするにはサイズを0x140000から0x1700000にすれば良さそうというのがわかります。

ちなみに 0x170000 = 1507328 > 1500000なので多分あってます。

というわけで変更していきます。

実際に設定ファイルを変更する

windowsのメモ帳でやる人はまさかいないと思うんですが、文字コードの影響とかでバグが起きそうなのでできるだけやめてください。

変更するときにはoffsetやsizeを逐次計算していったほうがいいです。

offsetはたぶんメモリ番地、sizeはその場所が専有しているサイズになります。

サイズを0x170000にする時はこうなります。

# Name,   Type, SubType, Offset,  Size, Flags
nvs,      data, nvs,     0x9000,  0x5000,
otadata,  data, ota,     0xe000,  0x2000,
app0,     app,  ota_0,   0x10000, 0x170000,
app1,     app,  ota_1,   0x180000,0x170000,
eeprom,   data, 0x99,    0x2F0000,0x1000,
spiffs,   data, spiffs,  0x2F1000,0x0DF900,

ポイントとしてはoffsetの値にsizeを加えた数が次の場所のoffsetの番地になることです。

このブログを見ている皆さんは16進数同士の掛け算も秒でできる hexadecimal native な方も多いでしょう、しかし僕は普通の人なのでPCに搭載されている電卓を叩きました。

ちなみに、ESP32自体のメモリサイズは4MBなので、最後のspiffsの行にあるOffsetとSizeの値の和が 0x3D900 = 4000000になれば成功です。

もしそうでなかったらどこか間違っている場所があるのでよく確認してください。

ちなみに、appの部分を変更したためにspiffsの値が減っていますが動作に問題はありません。戦争のための致し方ない犠牲だ。

boards.txtの変更

実際に書き込めたら、もう一つファイルを変更します。

変更するのはesp32のルートにある boards.txt

場所としては~/Arduino/hardware/espressif/esp32にありました。

このファイルの esp32.upload.maximum_sizeの部分を変更します。今回は0x30000増やしたので

esp32.upload.maximum_size = 1507328に変更します。

実際に確認してみる

適当に何かファイルを書き込みます。

簡単にLチカなどでも大丈夫です。

#define LEDPIN 13

void setup{
    pinMode(LEDPIN, OUT);
}

void loop() {
  digitalWrite(led, HIGH);
  delay(1000);

  digitalWrite(led, LOW);
  delay(1000);
}

あとは書き込むと、書き込んだ後に出るメッセージが変わると思います。

変わればきちんと変更がされたので終わり、お疲れ様でした。