工作と競馬2

電子工作、プログラミング、木工といった工作の記録記事、競馬に関する考察記事を掲載するブログ

ESP32のRAM周りの理解のなさを反省、カメラを使うならRAM増強が必要

背景

ここ最近、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が使えそうだ。

f:id:dekuo-03:20210214220004p:plain


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日という風に適用されるのだろうか? また、技適未取得のものでも申請すれば一定期間使えるというルールの運用が始まった?のか、始まるのかわからないが、申請はしないといけない。

参考1 参考2

なので、結局ESP32-CAMが日本で大っぴらに使える状況なのかどうか、いまいち自信が持てないので、買うのを避けた。

じゃあ、ESP32-CAMが使えないとすると、手持ちのESP32に外付けSRAMをつければいいのだが、上述のIPS6404も、ESP-IDF Programming GuideにあるESP-PSRAM32も、ネットで探しても全く入手ルートがなさそうだった。ニーズがあまりないんだろうなあ。と、悩んでいたが、色々調べた結果、ESP32-WROVER-EというモジュールにはPSRAMが載っていて、技適マークも付いていて、すぐに使える開発ボードの形で秋月に売られてる

akizukidenshi.com

ことがわかった。 なので、これを買えばよい。もともと、ESP32-WROVER-Eというものがあることは知っていたのだが、手持ちのESP-WROOM-32で間に合ってしまったので全然気にしていなかった。やっと存在意義を知ることができた。