2025/04/15 電子書籍「PlatformIOではじめるM5Stackプログラミング「入門編」: 最速で学ぶ!M5Stackプログラミング」出版

ESP32のチップ情報の取得

ESP32

ESP32のチップ情報(チップのリビジョン、CPUの動作周波数、フラッシュメモリのサイズ、MACアドレスなど)を取得する方法について説明します。チップ情報は、ESP-IDFライブラリを使用するか、ESP32のArduinoライブラリを使用して取得します。

Miscellaneous System APIs

ESP-IDFライブラリを使用する場合は、以下のWebページで説明されているAPIを使用します。

Miscellaneous System APIs - ESP32 - — ESP-IDF Programming Guide v5.2.5 documentation

主なAPI

機能関数プロトタイプ宣言
Software Resetesp_restart()void esp_restart(void)
Reset Reasonesp_reset_reason()esp_reset_reason_t esp_reset_reason(void)
Heap Memoryesp_get_free_heap_size()
esp_get_minimum_free_heap_size()
uint32_t esp_get_free_heap_size(void)
MAC address(factory-programmed)esp_efuse_mac_get_default()esp_err_t esp_efuse_mac_get_default(uint8_t *mac)
MAC Addressesp_read_mac()esp_err_t esp_read_mac(uint8_t *mac, esp_mac_type_t type)
Chip Versionesp_chip_info()
esp_chip_info_t
void esp_chip_info(esp_chip_info_t *out_info)
SDK Versionesp_get_idf_version()const char *esp_get_idf_version(void)

Reset Reason

esp_reset_reason関数を使用すると、リセットの要因をチェックすることができます。

#include "esp_system.h"

void GetResetReason(void)
{
    esp_reset_reason_t reason = esp_reset_reason();
    String wstr = "リセット理由: ";
    switch(reason)
    {
        case ESP_RST_UNKNOWN:
            wstr    += " Reset reason can not be determined";
            break;
        case ESP_RST_POWERON:
            wstr    += "Reset due to power-on event";
            break;
        case ESP_RST_EXT:
            wstr    += "Reset by external pin (not applicable for ESP32)";
            break;
        case ESP_RST_SW:
            wstr    += "Software reset via esp_restart";
            break;
        case ESP_RST_PANIC:
            wstr    += "Software reset due to exception/panic";
            break;
        case ESP_RST_INT_WDT:
            wstr    += "Reset (software or hardware) due to interrupt watchdog";
            break;
        case ESP_RST_TASK_WDT:
            wstr    += "Reset due to task watchdog";
            break;
        case ESP_RST_WDT:
            wstr    += "Reset due to other watchdogs";
            break;
        case ESP_RST_DEEPSLEEP:
            wstr    += "Reset after exiting deep sleep mode";
            break;
        case ESP_RST_BROWNOUT:
            wstr    += "Brownout reset (software or hardware)";
            break;
        case ESP_RST_SDIO:
            wstr    += "Reset over SDIO";
            break;
        default:
            wstr    += "???";
            break;
    }
    M5.Lcd.println(wstr);
}

構造体esp_reset_reason_tは、esp_system.h内で、以下のように定義されています。

typedef enum {
    ESP_RST_UNKNOWN,    //!< Reset reason can not be determined
    ESP_RST_POWERON,    //!< Reset due to power-on event
    ESP_RST_EXT,        //!< Reset by external pin (not applicable for ESP32)
    ESP_RST_SW,         //!< Software reset via esp_restart
    ESP_RST_PANIC,      //!< Software reset due to exception/panic
    ESP_RST_INT_WDT,    //!< Reset (software or hardware) due to interrupt watchdog
    ESP_RST_TASK_WDT,   //!< Reset due to task watchdog
    ESP_RST_WDT,        //!< Reset due to other watchdogs
    ESP_RST_DEEPSLEEP,  //!< Reset after exiting deep sleep mode
    ESP_RST_BROWNOUT,   //!< Brownout reset (software or hardware)
    ESP_RST_SDIO,       //!< Reset over SDIO
} esp_reset_reason_t;

esp_get_free_heap_size

esp_get_free_heap_size関数は、ESP32の空きヒープサイズを取得します。メモリリークの検出やメモリ不足の回避に役立ちます。

#include "esp_system.h"

void GetHeapMemory(void)
{
    //利用可能なヒープのサイズを取得
    M5.Lcd.printf("Available Heap Size= %d\r\n", esp_get_free_heap_size());
    //利用可能な内部ヒープのサイズを取得
    M5.Lcd.printf("Available Internal Heap Size = %d\r\n", esp_get_free_internal_heap_size());
    //これまでに利用可能だった最小ヒープを取得します
    M5.Lcd.printf("Minimum Free Heap Ever Available Size = %d\r\n", esp_get_minimum_free_heap_size());
    M5.Lcd.println();
}

MACアドレスの取得

esp_efuse_mac_get_default関数、esp_read_mac関数を使用してMACアドレスを取得できます。ネットワーク通信や個体識別に必要となることがあります。

#include "esp_system.h"


void CheckMACAddress(void)
{
	uint8_t mac0[6];
	esp_efuse_mac_get_default(mac0);
	M5.Lcd.printf("Default Mac Address\n  %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);
	M5.Lcd.printf("[Wi-Fi Station] Mac Address\n  %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);
	M5.Lcd.printf("[Wi-Fi SoftAP] Mac Address\n  %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);
	M5.Lcd.printf("[Bluetooth] Mac Address\n  %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);
	M5.Lcd.printf("[Ethernet] Mac Address\n  %02X:%02X:%02X:%02X:%02X:%02X\r\n", 
       mac6[0], mac6[1], mac6[2], mac6[3], mac6[4], mac6[5]);
}

M5Stack(ESP32)は、以下の4つのMACアドレスを持っています。

InterfaceMAC Address (4 universally administered, default)MAC Address (2 universally administered)
Wi-Fi Stationbase_macbase_mac
Wi-Fi SoftAPbase_mac, +1 to the last octetLocal MAC (derived from Wi-Fi Station MAC)
Bluetoothbase_mac, +2 to the last octetbase_mac, +1 to the last octet
Ethernetbase_mac, +3 to the last octetLocal MAC (derived from Bluetooth MAC)

esp_chip_info関数

esp_chip_info関数 及び esp_chip_info_t 構造体を使ってチップのコア数、WiFi機能、リビジョン、フラッシュサイズなどの情報を取得できます。

#include <Arduino.h>
#include <M5Unified.h>

#include "esp_chip_info.h"
#include "esp_system.h"

void GetChipInfo(void)
{
	esp_chip_info_t chip_info;
	esp_chip_info(&chip_info);
	M5.Lcd.printf("このチップはESP32ファミリーです\n");
	M5.Lcd.printf("このチップはESP32ファミリーです\n");
	M5.Lcd.printf("コアの数: %d\n", chip_info.cores);
	M5.Lcd.printf("WiFi%s%s%s\n", 
           (chip_info.features & CHIP_FEATURE_WIFI_BGN) ? "WiFi " : "",
           (chip_info.features & CHIP_FEATURE_BT) ? "BT " : "",
           (chip_info.features & CHIP_FEATURE_BLE) ? "BLE " : "");
	M5.Lcd.printf("リビジョン番号: %d\n", chip_info.revision);
	M5.Lcd.printf("フラッシュ容量: %dMB\n", spi_flash_get_chip_size() / (1024 * 1024));
}
 
void setup()
{
    auto cfg = M5.config();         // 設定用の構造体を取得。
    M5.begin(cfg);                  // M5Unifiedを使用する準備をする。
    M5.Lcd.setFont(&fonts::lgfxJapanMinchoP_16);
	GetChipInfo();
}

void loop()
{
    M5.delay(1);
}
  • esp_chip_info_t構造体: チップの情報を格納する構造体です。
  • esp_chip_info関数: チップ情報を「esp_chip_info_t」構造体に取得します。
  • spi_flash_get_chip_size関数: フラッシュメモリのサイズを取得します。

esp_get_idf_version関数

ESP-IDFのバージョンを取得します。 使用しているESP-IDFのバージョンを確認できます。

#include "esp_system.h"

void GetESPIDFVersion(void)
{
    M5.Lcd.print("ESP-IDF Version: ");
    M5.Lcd.println(esp_get_idf_version());
}

EspClassクラス

ESP32のArduinoライブラリを使

#include <Arduino.h>
#include <M5Unified.h>



void GetChipInfo2(void)
{
	M5.Lcd.printf("チップモデル: %s\n", ESP.getChipModel());
	M5.Lcd.printf("コア数: %d\n", ESP.getChipCores());
	M5.Lcd.printf("リビジョン: %d\n", ESP.getChipRevision());
	M5.Lcd.printf("フラッシュメモリサイズ: %dMB\n", ESP.getFlashChipSize() / (1024 * 1024));
}
 
void setup()
{
    auto cfg = M5.config();         // 設定用の構造体を取得。
    M5.begin(cfg);                  // M5Unifiedを使用する準備をする。
    M5.Lcd.setFont(&fonts::lgfxJapanMinchoP_16);
	GetChipInfo2();
}

void loop()
{
    M5.delay(1);
}

EspClassクラス

ESP32の情報は、EspClassクラスを使用して取得できます。のソースファイルは、Esp.cpp、Esp.h となります。

EspClassクラスのオブジェクトとして、ESPが使用できます。Esp.cpp内で、以下のように宣言されています。

EspClass ESP;

システム情報の取得

メソッド説明
ESP.getChipModel()チップのモデルを取得
ESP.getChipCores()コア数を取得
ESP.getChipRevision()チップのリビジョンを取得
ESP.getFlashChipSize()フラッシュメモリのサイズを取得
ESP.getSdkVersion()SDKバージョンを取得
ESP.getCpuFreqMHz()CPUのクロック周波数を取得

void GetChipInfo()
{
    M5.Lcd.printf("チップモデル: %s\n",  ESP.getChipModel());
    M5.Lcd.printf("コア数: %d\n",        ESP.getChipCores());
    M5.Lcd.printf("リビジョン: %d\n",    ESP.getChipRevision());
    M5.Lcd.printf("フラッシュメモリ: %dMB\n", ESP.getFlashChipSize() / (1024 * 1024));
    M5.Lcd.printf("SDKバージョン: %s\n", ESP.getSdkVersion());
    M5.Lcd.printf("CPU周波数: %d MHz\n", ESP.getCpuFreqMHz());
}

メモリ情報の取得

メソッド説明
ESP.getFreeHeap()空きヒープメモリを取得
ESP.getHeapSize()全体のヒープメモリサイズを取得
ESP.getPsramSize()PSRAM(拡張RAM)のサイズを取得
ESP.getFreePsram()空きPSRAMサイズを取得

void GetHeapMemory2()
{
    M5.Lcd.printf("空きヒープメモリ: %d バイト\n", ESP.getFreeHeap());
    M5.Lcd.printf("ヒープサイズ: %d バイト\n", ESP.getHeapSize());
    M5.Lcd.printf("PSRAMサイズ: %d バイト\n", ESP.getPsramSize());
    M5.Lcd.printf("空きPSRAM: %d バイト\n", ESP.getFreePsram());
}

PSRAMがない場合は 0 が返ります。

リセット・電源管理

メソッド説明
ESP.restart()ソフトウェアリセット
ESP.reset()ハードリセット(ESP.restart()推奨)
ESP.deepSleep(microseconds)ディープスリープ
    ESP.restart();  // ソフトウェアリセット

MACアドレスの取得

メソッド説明
ESP.getEfuseMac()eFuse に格納されているMACアドレスを取得
void GetMACAddress()
{
    M5.Lcd.printf("eFuse MACアドレス:\n %llX\n", ESP.getEfuseMac());
}

ESP32のChipID(チップID)

ESP32のChipID(チップID)の計算方法は幾通りかあるようです。基本的には、ユニークなMACアドレスを利用して計算します。

MACアドレスの下位2バイトを使用

MACアドレスの下位2バイトを使用する方法。

	// 上位4バイト(32ビット)を使用
	uint64_t ESP32_MacAddress0	= ESP.getEfuseMac();//The chip ID is essentially its MAC address(length: 6 bytes).
	uint16_t ESP32_ChipId		= (uint16_t)(ESP32_MacAddress0 >> 32);
	M5.Lcd.printf("ESP32_ChipId : (%04X)\n", ESP32_ChipId);
    
    // 上位4バイト(32ビット)を使用
	uint32_t chipId;
	uint64_t mac = ESP.getEfuseMac();  // 64ビットのMACアドレス取得
	chipId = (uint32_t)(mac >> 32);  // 上位4バイト(32ビット)を使用
	M5.Lcd.printf("Chip ID: %08X\n", chipId);

MACアドレスの上位3 or 4バイトを使用

MACアドレスの下位3 or 4バイトを使用する方法。

ESP32のArduinoのサンプルに、チップIDwo計算するサンプルコード「GetChipID.ino」があります。

	// framework-arduinoespressif32/libraries/ESP32/examples/ChipID/GetChipID/GetChipID.ino
    // GetChipID.ino
    uint32_t chipId = 0;
	for(int i=0; i<17; i=i+8)
	{
	  chipId |= ((ESP.getEfuseMac() >> (40 - i)) & 0xff) << i;
	}
    M5.Lcd.printf("Chip ID: %d(%x)\n", chipId, chipId);
// -----------------------------------------
    // 上位3バイトを使用
	uint8_t mac[6];
	esp_efuse_mac_get_default(mac);

    uint32_t old_chip_id = mac[3] << 16 | mac[4] << 8 | mac[5];
    M5.Lcd.printf("Old Chip ID: %06X\n", old_chip_id);

MACアドレスの下位 4バイトを使用した計算方法です。

    uint8_t mac[6];
    esp_efuse_mac_get_default(mac);

    // 上位4バイトを使用
    uint32_t new_chip_id = mac[2] << 24 | mac[3] << 16 | mac[4] << 8 | mac[5];
    M5.Lcd.printf("New Chip ID: %08X\n", new_chip_id);
ESP32: ChipID の取得 - Qiita
こちらのページを参考にしました。ESP32-WROOM-32 チップ・メモリ・MACアドレス情報取得方法Ubuntu 24.04 上の Arduino IDE 2.3.2 を使います。ボードは、ESP32 Dev Modul…

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