ESP32-WROOM-32 チップ・メモリ・MACアドレス情報取得方法

ESP32 ( ESP-WROOM-32 )

こんばんは。

前回の記事で紹介した、ESP-WROOM-02 ( ESP8266 ) の Flashメモリが 2MB に減っていたという情報を受けて、その上位機種 ESP32-WROOM-32 も将来的に有り得ると思い、ESP32-WROOM-32 についても過去のデータシートを見比べてみました。

この記事のコードが古く、2017/10月時点で使えた以下の関数が使えなくなっていました。
system_get_free_heap_size()
esp_efuse_read_mac()
system_efuse_read_mac()
よって、新たに2022/11月時点で使えた関数に書き換えました。

 

スポンサーリンク


まずは、Espressif Systems 社発行の2016年12月9日版の ESP32-WROOM-32 データシートはこのようになっていました。

これって、私のような素人アマチュア電子工作家にとっては、
「16MB が4つもサポートされている!」
・・・って、絶対に勘違いしてしまいますよね!
ESP32-WROOM-32 が日本で販売された当時は完全にそう思っていました。

では、最近発行された 2017年9月8日版データシートを見てみると、こうなっています。

これを Google 翻訳の力をお借りして訳してみます。

ESP32は、開発者のプログラムとデータを保護するために、AESに基づくハードウェア暗号化を備えた最大16MBの外部QSPIフラッシュとSRAMを4本までサポートします。
ESP32は、高速キャッシュを介して外部QSPIフラッシュとSRAMにアクセスできます。

●最大16 MBの外部フラッシュがCPUコード空間にメモリマップされ、8,16,32bitアクセスをサポートします。
コードの実行がサポートされています。
●最大8 MBの外部フラッシュ/ SRAMがCPUデータ空間にメモリマップされ、8,16,32bitアクセスをサポートします。
データ読み出しは、フラッシュとSRAMでサポートされています。
データ書き込みはSRAMでサポートされています。

ESP32-WROOM-32は、4 MBの外部SPIフラッシュを内蔵しています。
4-MB SPIフラッシュは、8,16,32ビットアクセスをサポートするCPUコード空間にメモリマップすることができます。
コードの実行がサポートされています。
統合されたSPIフラッシュは、GPIO6、GPIO7、GPIO8、GPIO9、GPIO10、およびGPIO11に接続されています。
これらの6本のピンは、通常のGPIOとして使用することはできません。

ということで、私は勝手に頭の中で ESP32-WROOM-32 の Flash は 16MB 内蔵されていると思っていたのは勘違いでした。
最近データシートを読み返してみて、「あれ??」っていう感じです。

ですから、以前のSPIFFS を使った記事を作っていた当時は、16MB にどうしても設定出来なくて悩んでいました。
ESP-IDF で試してみたり、Partition Table を書き換えたりいろいろやっていましたが、できないわけですよね。

ということで、ESP32-WROOM-32 についても、購入する前に事前に最新のデータシートを確認する癖をつけておいた方が良いですね。

それと、購入したら、チップ情報や Flash メモリ情報を確認した方が良いです。

そんなわけで、ESP32-WROOM-32用のチップ情報は Flashメモリを確認するためのプログラムを組んでみました。
Arduino core for ESP32用です。

因みに、ht-deko さんの以下のページにあるコードも少々参考にさせていただきました。
http://ht-deko.com/arduino/esp-wroom-32.html
ht-deko さんのページはいつも大変参考にさせていただいております。
情報ありがとうございます。
m(_ _)m

今回は、ht-dekoさんのチップ情報表示に更にプラスして、私が知りたい情報を有りったけ詰め込んでみました。

ESP32 Chip ID
Chip Revision
CPU Core数
CPU Frequency
Flash Chip Size
Flash Frequency
ESP-IDF version
Free Heapメモリ Size
System Free Heapメモリ Size
Minimum Free Heapメモリ Size
Devault Mac Address
EFuse Mac Address
System Mac Address
[Wi-Fi Station] Mac Address
[Wi-Fi SoftAP] Mac Address
[Bluetooth] Mac Address
[Ethernet] Mac Address

これらは、Arduino core for ESP32 のライブラリで関数化されていて、簡単に取得できます。

MAC アドレスは、ルーターで MAC アドレスフィルタリングをかけている場合には必要な情報ですね。
ただ、デフォルト MAC アドレスや EFuse MAC アドレス、System MACアドレスは同じで、Wi-Fi Stationモードの MACアドレスと同じになっています。

また、Ethernet MAC アドレスがあるということは、ESP32 には標準で有線LANが組めるということだと思われます。

試したESP32-WROOM-32開発ボードは以下のボードになります。

ESPr Developer 32
スイッチサイエンス(Switch Science)

事前にArduino core for ESP32をインストールしておく

Arduino IDE は ver 1.8.19 で動作確認しております。
Arduino core for ESP32 は 2.0.5で動作確認しております。
インストール方法は以下のページを参照してください。

Arduino core for the ESP32 のインストール方法

チップ情報取得スケッチの入力

では、以下のスケッチを入力してみてください。

この記事のコードが古く、2017/10月時点で使えた以下の関数が使えなくなっていました。
system_get_free_heap_size()
esp_efuse_read_mac()
system_efuse_read_mac()
よって、新たに2022/11月時点で使えた関数に書き換えました。

 

【ソースコード】 (※無保証 ※PCの場合、ダブルクリックすればコード全体を選択できます)

void setup(void) {
  Serial.begin(115200);
  Serial.println("\r\n-----------------------------");

  uint64_t chipid;
  chipid=ESP.getEfuseMac();//The chip ID is essentially its MAC address(length: 6 bytes).
  Serial.printf("ESP32 Chip ID = %04X\r\n",(uint16_t)(chipid>>32));//print High 2 bytes

  Serial.printf("Chip Revision %d\r\n", ESP.getChipRevision());
  esp_chip_info_t chip_info;
  esp_chip_info(&chip_info);
  Serial.printf("Number of Core: %d\r\n", chip_info.cores);
  Serial.printf("CPU Frequency: %d MHz\r\n", ESP.getCpuFreqMHz());  
  Serial.printf("Flash Chip Size = %d byte\r\n", ESP.getFlashChipSize());
  Serial.printf("Flash Frequency = %d Hz\r\n", ESP.getFlashChipSpeed());
  Serial.printf("ESP-IDF version = %s\r\n", esp_get_idf_version());
  //利用可能なヒープのサイズを取得
  Serial.printf("Available Heap Size= %d\r\n", esp_get_free_heap_size());
  //利用可能な内部ヒープのサイズを取得
  Serial.printf("Available Internal Heap Size = %d\r\n", esp_get_free_internal_heap_size());
  //これまでに利用可能だった最小ヒープを取得します
  Serial.printf("Minimum Free Heap Ever Available Size = %d\r\n", esp_get_minimum_free_heap_size());
  Serial.println();

  uint8_t mac0[6];
  esp_efuse_mac_get_default(mac0);
  Serial.printf("Default Mac Address = %02X:%02X:%02X:%02X:%02X:%02X\r\n", mac0[0], mac0[1], mac0[2], mac0[3], mac0[4], mac0[5]);

  uint8_t mac3[6];
  esp_read_mac(mac3, ESP_MAC_WIFI_STA);
  Serial.printf("[Wi-Fi Station] Mac Address = %02X:%02X:%02X:%02X:%02X:%02X\r\n", mac3[0], mac3[1], mac3[2], mac3[3], mac3[4], mac3[5]);

  uint8_t mac4[7];
  esp_read_mac(mac4, ESP_MAC_WIFI_SOFTAP);
  Serial.printf("[Wi-Fi SoftAP] Mac Address = %02X:%02X:%02X:%02X:%02X:%02X\r\n", mac4[0], mac4[1], mac4[2], mac4[3], mac4[4], mac4[5]);

  uint8_t mac5[6];
  esp_read_mac(mac5, ESP_MAC_BT);
  Serial.printf("[Bluetooth] Mac Address = %02X:%02X:%02X:%02X:%02X:%02X\r\n", mac5[0], mac5[1], mac5[2], mac5[3], mac5[4], mac5[5]);

  uint8_t mac6[6];
  esp_read_mac(mac6, ESP_MAC_ETH);
  Serial.printf("[Ethernet] Mac Address = %02X:%02X:%02X:%02X:%02X:%02X\r\n", mac6[0], mac6[1], mac6[2], mac6[3], mac6[4], mac6[5]);
}

void loop() {

}

【解説】

●5-7行目:
ESP32 のチップID を表示させます。
Arduino core for ESP32 の「スケッチの例」の GetChipID そのままです。
要するに、MACアドレスの上位2バイトがチップID ということです。

●9-12行目:
ht-deko さんのスケッチを参考にさせていただきました。
チップリビジョンや CPU core 数を表示させています。
チップリビジョン 0 はコンパイル後のシリアル書込みエラーがあるのですが、最近の Arduino core for ESP32 アップデートで殆ど気にならなくなりました。
エラーが解消されているものはチップリビジョン1のものだそうです。
ただ、日本の販売店ではまだ流通していないようです。

●16行目:
Arduino core for ESP32 は ESP-IDF を基に作られています。
ですから、SDKバージョンはいわゆる ESP-IDFバージョンということになります。
ESP-WROOM-02 ( ESP8266 )の場合は SDKバージョンということになります。
Arduino core for ESP32 のライブラリ関数にも、ESP8266と同じ getSdkVersion() という関数があるのですが、将来的に廃止されるようです。

●17-22行目:
malloc などの動的メモリ割り当てを行う場合、ヒープメモリのサイズを把握しておく必要があります。
そのための表示です。

●25-43行:
システムやWi-Fi 、Bluetooth、Ethernet のMAC アドレスを表示させています。
Wi-Fiルーターのセキュリティで、MACアドレスフィルタリングをかけている場合にはこれを知っておく必要があります。
Wi-Fi については、ルーターを介すStationモードと、ESP32自体がルーターになる SoftAPモードの両方を表示させることができて便利ですね。

コンパイル書き込み実行

コンパイルする前に、下図の様に「ツール」メニューの「 Flash Size 」を4MBにしてください。
このスケッチは、Arduino core for ESP32 の設定で変わりますので、必ず最大値でコンパイルしてください。

ただ、これでは、実装済みの本来のメモリ容量が分からないのではないかと思いますよね。

実は、Arduino core for ESP32 は、ESP-IDF ( Espressif Systems社推奨開発環境 )を基に作られています。
私は何度もこの ESP-IDF で Flashメモリを 16MB に出来ないかと実験をしていましたが、どうしても Auto-detected ( 自動検出 )で 4MB になってしまうんです。

要するに、Arduino core for ESP32 のこの「ツール」メニューの Flash Size は、おそらく Flash Size を自動検出したサイズが出ているものと思われます。
Espressif Systems公式データシートで、4MB内蔵と発表されていれば、ESP32-WROOM-32 の Flash 実装容量は 4MB でほぼ確定だと思われますので、このメニューに最大値が 4MB と出ていれば、おそらくそれが実装容量だと思われます。
ということで、ここは 4MB を選択してください。

次に、スケッチをコンパイル書き込みしてください。

シリアルモニターを 115200 bps で起動して、こんな感じに表示されればOKです。
私の手持ちの ESP32 は全て Chip Revision はゼロでした。

ESP32のチップ情報をシリアルモニタで表示させた結果の画像

ESP32のチップ情報をシリアルモニタで表示させた結果の画像

まとめ

結局のところ、ESP32-WROOM-32 の Flash メモリサイズは 4MB で、初期の ESP-WROOM-02 と同じということです。
SPIFFS を使おうとしても大して使えないということです。
SPIFFS についてはあまり期待せずに、素直に SDカードを使った方が良いかもしれません。

今回の教訓は、新しい ESP-WROOM-02関連ボードを購入する前に、Espressif Systems 社の最新のデータシートをチェックしておくべきということですね。

ということで、今回はここまでです。

ではまた・・・。

Amazon.co.jp 当ブログのおすすめ

スイッチサイエンス ESPr Developer 32 Type-C SSCI-063647
スイッチサイエンス
¥2,420(2024/03/19 08:55時点)
ZEROPLUS ロジックアナライザ LAP-C(16032)
ZEROPLUS
¥22,504(2024/03/19 15:23時点)
Excelでわかるディープラーニング超入門
技術評論社
¥2,068(2024/03/19 03:23時点)

コメント

  1. Yordan より:

    Thank You very much for this tutorial! It helped me a lot ! 🙂

  2. totuto より:

    「お問い合わせ」のところで質問しましたが、よく見ると「記事中の質問や技術的なお問い合わせは、ここではなく、記事最下部のコメント投稿欄にお願いします」と書いてあることに気が付きましたので再度ここに書きます。

    このスケッチをコンパイルすると 18, 28, 32の各行の関数が was not declared in this scope というエラーになり、代わりの関数が提案(suggested alternative)されます。

    18 // system_get_free_heap_size() —> esp_get_free_heap_size()
    28 // esp_efuse_read_mac(mac1) —> esp_read_mac()
    32 // system_efuse_read_mac(mac2) —> esp_read_mac()

    これらの各行をコメントアウトするとそれ以外の情報がシリアルモニタに表示されます。

    代替の関数を試してみました。
    18行目の代替の esp_get_free_heap_size() は17行目の関数と同じものです。
    28行目と32行目を代替関数に変更すると too few arguments というエラーになります。

    私の環境と設定は以下の通りです。
    ・Arduino IDE 1.8.19
    ・ボードはアマゾンで購入した ESP32 DEVKIT V1
    ・「ツール」メニューの「ボード」は “ESP32 Dev Module”
    ・「ツール」メニューの「Flash Size」は “4MB(32Mb)”

    Arduino IDE の「ツール」メニューで表示される項目がかなり増えてますし
    発表された当時と何かが変わったのでしょうか?

    • mgo-tec mgo-tec より:

      totutoさん

      記事をご覧いただき、ありがとうございます。
      この記事は2017年10月に書いたもので、いろいろと進化してしまいましたね。
      Arduino core for the ESP32のボードライブラリがバージョンアップして、2022/11月時点で2.0.5になっていて、おっしゃる通り以前使えた関数がエラーで使えなくなっていました。
      よって、この記事のコードを書き換えましたので試してみて下さい。
      こちらで使った環境は以下の通りです。
      Arduino IDE ver 1.8.19
      Arduino core for the ESP32 ver 2.0.5

タイトルとURLをコピーしました