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

記事公開日:2017年10月3日
最終修正日:2017年10月4日

スポンサーリンク

こんばんは。

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

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

ESP32_Chip_Info_01

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

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

ESP32_Chip_Info_02

これを 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でサポートされています。

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

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

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

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

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

そんなわけで、ESP-WROOM-32 ( ESP32 )用のチップ情報は 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が組めるということだと思われます。

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

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

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

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

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

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

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

  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("Free Heap Size = %d\r\n", esp_get_free_heap_size());
  Serial.printf("System Free Heap Size = %d\r\n", system_get_free_heap_size());
  Serial.printf("Minimum Free Heap 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 mac1[6];
  esp_efuse_read_mac(mac1);
  Serial.printf("EFuse Mac Address = %02X:%02X:%02X:%02X:%02X:%02X\r\n", mac1[0], mac1[1], mac1[2], mac1[3], mac1[4], mac1[5]);

  uint8_t mac2[6];
  system_efuse_read_mac(mac2);
  Serial.printf("System Mac Address = %02X:%02X:%02X:%02X:%02X:%02X\r\n", mac2[0], mac2[1], mac2[2], mac2[3], mac2[4], mac2[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-19行目:
malloc などの動的メモリ割り当てを行う場合、ヒープメモリのサイズを把握しておく必要があります。
そのための表示です。

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

コンパイル書き込み実行

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

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

実は、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内蔵と発表されていれば、ESP-WROOM-32 の Flash 実装容量は 4MB でほぼ確定だと思われますので、このメニューに最大値が 4MB と出ていれば、おそらくそれが実装容量だと思われます。
ということで、ここは 4MB を選択してください。

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

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

ESP32_Chip_Info_03

まとめ

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

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

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

ではまた・・・。

mgo-tec電子工作 関連コンテンツ ( 広告含む )

スポンサーリンク

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








投稿者:

mgo-tec

Arduino , ESP32 ( ESP-WROOM-32 ) , ESP8266 ( ESP-WROOM-02 )等を使って、主にスマホと連携した電子工作やプログラミング記事を書いてます。ライブラリも作ったりしてます。趣味、独学でやってますので、動作保証はしません。
電子回路やプログラミングの専門家ではありません。
畑違いの仕事をしてます。
でも、少しだけ電気の知識が必要な仕事なので、電気工事士や工事担任者等の資格は持ってます。

コメントを残す

メールアドレスが公開されることはありません。

*画像の文字を入力してください。(スパム防止の為)