背景
ここ最近、ESP32とカメラモジュールを繋いでをいじっていたのだが、RAM周りについて理解が深まったというか、そもそも理解が足らなかったと痛感した。
わかったこと
1. ユーザープログラム上の変数データで使えるRAMは120数kB
私の使っているESP-WROOM-32 DevKitCには、ESP-WROOM-32が載っていて、SRAMが520kBとあり、この分がすべて使えそうである。しかし、実際にユーザープログラム上の変数データで使えるのは、マニュアルにある通り、SRAM2の領域200kBのうちの一部のようだ。(ただし、あらゆる方法を試したわけではない。下記の方法で調べた限りで。)
以下のような全く何もしないArduinoプログラムを書き込んだ場合、
void setup(){ } void loop (){ }
Arduino IDEの書き込みログで、約307kB使えると表示される。
最大327680バイトのRAMのうち、グローバル変数が13228バイト(4%)を使っていて、ローカル変数で314452バイト使うことができます。
一方、こちらを使って残りメモリを求めると、setup関数スタート時点で、
127168
となる。結局使えるのは124kB程度。背景で動いているFree RTOSなのか、Arduinoのせいなのか細かいことはわからないが。
以下のように、各変数の配置先アドレスを調べてみる。
const int a = 1; // constはFlashメモリに配置される int c[256 * 108 + 185] = {0}; // グローバル変数としてRAMが消費される int b = 2; // グローバル変数としてRAMが消費される void setup() { int i = 0; Serial.begin(115200); Serial.printf("a, address=%x\n", &a); Serial.printf("i, address=%x\n", &i); Serial.printf("b, address=%x\n", &b); Serial.printf("c, address=%x - %x\n", &c[0], &c[256 * 108 + 185 - 1]); } void loop (){ }
マニュアルと照らし合わせると、aは、constなのでFlashメモリに配置されている。i, b, cこれはSRAM2の領域だ。他にもいろいろやってみたが、SRAM1への配置はされなかった。どうやら、SRAM2の120kB強くらいしか使えないらしい。
a, address=3f400178 i, address=3ffb878c b, address=3ffbdbb4 c, address=3ffbfdd0 - 3ffdb0b0
2. PSRAMを外付け(External)することでRAMが増強できる
マニュアルを読むと、External Memoryという項目が確認できる。 SPI接続のSRAMを外付けすることで、4MBまでRAMが増強できるらしい。
ESP-IDF Programming Guideには、より詳しくプログラムから利用する方法がかかれている。 やってはいないが、Arduino IDEのメニューバー>ツールの中にPSRAMという項目があってこれを有効化すれば、外付けSRAMが使えそうだ。
3. ESP32-CAMはPSRAMが増強されている
最近、ESP32にカメラを繋いでいじっていたときに、最高解像度設定(UXGA)で撮影したところ、一見ちゃんと取れたかに見えたのに、実は画像の一部が欠けて表示されていなかった。プログラムをいろいろいじってわかったのだが、上述の使用可能メモリ量のせいで、画像全体のデータが保持できていないことがわかった。
じゃあ、Amazonなどで格安で売っているESP32-CAMはどうしてちゃんと撮れるのか?というと、上述のPSRAMが増強されているから、ということがわかった。
ESP32-CAMの基板の写真をよく見ると、IPS6404という8本足のICが載っていて、調べたらこれがまさに外付けSRAMだった。まあ、カメラモジュール基板として作られているので必要なRAM容量が確保されているのは当たり前ではあるが、改めてちゃんと見ると納得。
3. ESP32-CAMが使えないとすると、PSRAMが一緒に載っているモジュールESP32-WROVER-Eを使って、カメラを繋げばいい
とはいえ、Amazonなどで売られているものの写真を見る限り、ESP32-CAMは技適をクリアしていない。(ように見える。)技適マークのあるものは見つからない。米国のFCCなどの認証はクリアしている。 総務省の説明によれば、FCC FCC認証OKのものは持ち込んでから90日は使えるとあるが、主に観光で来た外国人の持ち物を想定した話なので、ESP32-CAMをAmazonで買ったとしてそこから90日という風に適用されるのだろうか? また、技適未取得のものでも申請すれば一定期間使えるというルールの運用が始まった?のか、始まるのかわからないが、申請はしないといけない。
なので、結局ESP32-CAMが日本で大っぴらに使える状況なのかどうか、いまいち自信が持てないので、買うのを避けた。
じゃあ、ESP32-CAMが使えないとすると、手持ちのESP32に外付けSRAMをつければいいのだが、上述のIPS6404も、ESP-IDF Programming GuideにあるESP-PSRAM32も、ネットで探しても全く入手ルートがなさそうだった。ニーズがあまりないんだろうなあ。と、悩んでいたが、色々調べた結果、ESP32-WROVER-EというモジュールにはPSRAMが載っていて、技適マークも付いていて、すぐに使える開発ボードの形で秋月に売られてる
ことがわかった。 なので、これを買えばよい。もともと、ESP32-WROVER-Eというものがあることは知っていたのだが、手持ちのESP-WROOM-32で間に合ってしまったので全然気にしていなかった。やっと存在意義を知ることができた。