1. ESP32 specification
ESP32 는 ATmega328 베이스의 arduino 보다는 훨씬 많은 성능을 가지고 있습니다.
거기에 더하여 ESP32 자체도 버전이 조금씩 달라, 구입 후 실적용 전에 spec. 을 확인해 보는 것이 중요하다고 합니다.
2. 참조 사이트
내부 스펙에 대해 확인할 수 있는 글을 발견하여 소개된 소스를 실행해 봤습니다.
* mgo-tec電子工作
- https://www.mgo-tec.com/blog-entry-chip-info-esp-wroom-32-esp32.html
* ESP32-WROOM-32
- https://ht-deko.com/arduino/esp-wroom-32.html
위에서 참조한 사이트의 소스를 그냥 실행하니, 동작은 하지만 compile 시 warning 이 뜨더군요.
이유는, 글쓴이의 ESP-IDF (ESP8266 의 SDK 와 같은 기능) 가 예전 버전을 사용해서 확인했기 때문이었습니다. (2017년 버전)
EFUSE 정보에 접근하는 방법도 바뀌었으며, 특히 Heap Memory 확인 방법이 바뀌었습니다.
* ESP32 Arduino: Getting the Free Heap
- https://techtutorialsx.com/2017/12/17/esp32-arduino-getting-the-free-heap/
...
//Internal RAM
uint32_t getHeapSize(); //total heap size
uint32_t getFreeHeap(); //available heap
uint32_t getMinFreeHeap(); //lowest level of free heap since boot
uint32_t getMaxAllocHeap(); //largest block of heap that can be allocated at once
the esp.h file: https://github.com/espressif/arduino-esp32/blob/80c110ece70b179ddfe686e8ee45b6c808779454/cores/esp32/Esp.h
...
출처: https://chocoball.tistory.com/archive/202003 [초코볼의 inside Tech]
다행히 업데이트 된 core library 에서 변경된 API 명령어를 찾을 수 있었습니다.
Warning 부분을 모두 확인 했으니, 하나씩 정리해 봅니다.
3. API
ESP32 는, library / API 를 통해 간단하게 컨트롤 할 수 있게 만들어져 있습니다.
자세한 사양을 확인하는 방법도 API 를 통해 확인할 수 있게 되어 있으므로, API 문서만 참고하면 됩니다.
* Miscellaneous System APIs
- https://docs.espressif.com/projects/esp-idf/en/v3.2.3/api-reference/system/system.html
API 사이트가 잘 만들어져 있습니다.
화면의 왼쪽 밑부분의 버전을 클릭하면, 원하는 version 의 API 문서로 옮겨갈 수 있게 되어 있습니다.
제가 사용하고 있는 ESP-IDF 버전이 v3.2.3-14 이므로, API 문서에서 v3.2.3 을 선택해서 확인 했습니다.
4. API - 사용한 명령어
위에서 설명한 Heap Memory 부분을 제외한 내용 입니다.
ESP32 의 CPU 를 확인할 수 있는 명령어 입니다.
CPU 의 모델과 revision, 그리고 CPU core 갯수 까지 확인 할 수 있습니다.
사용하고 있는 ESP-IDF 버전 확인 명령어 입니다.
위에서 잠깐 언급한 EFUSE 확인용 커멘드 입니다.
확인해 보면, 기기의 기본 MAC 주서는 WiFi Station MAC 주소와 동일하다는 것을 알 수 있습니다. WiFi Station MAC 정보는 세상에서 유일하니, 기기의 유일성을 WiFi Station MAC 로 정의해도 문제는 없겠네요.
WiFi / WiFi Software AP / Bluetooth / Ethernet 의 MAC 주소는 다음과 같은 API 로 정보를 확인 할 수 있습니다.
최종 사용된 API 들 입니다.
ESP.getEfuseMac()
ESP.getChipRevision()
esp_chip_info_t
esp_chip_info
ESP.getCpuFreqMHz()
ESP.getFlashChipSize()
ESP.getFlashChipSpeed()
esp_get_idf_version()
ESP.getHeapSize()
ESP.getFreeHeap()
ESP.getMinFreeHeap()
ESP.getMaxAllocHeap()
esp_efuse_mac_get_default()
esp_read_mac(array, ESP_MAC_WIFI_STA)
esp_read_mac(array, ESP_MAC_WIFI_SOFTAP)
esp_read_mac(array, ESP_MAC_BT)
esp_read_mac(array, ESP_MAC_ETH)
출처: https://chocoball.tistory.com/archive/202003 [초코볼의 inside Tech]
5. sketch
참조한 사이트와 ESP-IDF v3.2.3 용으로 조금 바꾼 소스 입니다.
void setup(void) {
Serial.begin(115200);
uint64_t chipid;
chipid=ESP.getEfuseMac(); // The chip ID is essentially its MAC address(length: 6 bytes)
Serial.printf("ESP32 Chip ID = %04X", (uint16_t)(chipid>>32)); // print High 2 bytes
Serial.printf("%08X\n", (uint32_t)chipid); // print Low 4bytes
Serial.println("---------------------------------");
Serial.printf("Chip Revision %d\n", ESP.getChipRevision());
esp_chip_info_t chip_info;
esp_chip_info(&chip_info);
Serial.printf("Number of Core: %d\n", chip_info.cores);
Serial.printf("CPU Frequency: %d MHz\n", ESP.getCpuFreqMHz());
Serial.println();
Serial.printf("Flash Chip Size = %d byte\n", ESP.getFlashChipSize());
Serial.printf("Flash Frequency = %d Hz\n", ESP.getFlashChipSpeed());
Serial.println();
Serial.printf("ESP-IDF version = %s\n", esp_get_idf_version());
Serial.println();
Serial.printf("Total Heap Size = %d\n", ESP.getHeapSize());
Serial.printf("Free Heap Size = %d\n", ESP.getFreeHeap());
Serial.printf("Lowest Free Heap Size = %d\n", ESP.getMinFreeHeap());
Serial.printf("Largest Heap Block = %d\n", ESP.getMaxAllocHeap());
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() {
}
출처: https://chocoball.tistory.com/archive/202003 [초코볼의 inside Tech]
결과 입니다.
이정도면, 사용되는 ESP32 가 어떤 상황인지 알 수 있을 것 같습니다.
6. RESET
소스를 ESP32 에 처음 업로드 하면, Serial Monitor 에 정보가 표시되지 않습니다.
이럴 때에는 "RESET" 버튼을 누르면 reboot 되면서 진행이 됩니다.
RESET 버튼을 누르고 reboot 이 되면, 부팅 시퀀스를 볼 수 있습니다.
MCU 가 arduino nano 와 완전 다른 차원이다 보니, 기본 스펙 파악도 중요하네요.
출처: https://chocoball.tistory.com/archive/202003 [초코볼의 inside Tech]