요약
ESP32를 아두이노에서 MAC, CHIP ID, 고유 값을 읽는 방법에 대해서 알아보겠습니다.
각각의 장치마다 고유 식별 값으로 ID를 지정해서 관리하기 위해서 사용합니다.
ESP32 내부 함수를 사용해서 읽는 방법입니다.
wokwi에서 ESP32 MAC, CHIP ID 값 읽는 방법
wokwi에서 프로젝트 설정하는 방법은 ESP32 → 장치설정 → ESP32 웹에서 간단히 시뮬레이션 테스트 wokwi에서 확인하실 수 있습니다. (아래 링크로도 확인 가능합니다.)
wokwi에 접속해서 먼저 프로젝트를 생성합니다.
바로 SAVE 하셔서 CHIPID이름으로 지정해 줍니다.
Public으로 저장하시면 됩니다.(유료 결제하면 Private 할 수 있으나 그냥 Public으로 진행하는 게 좋습니다.)
Wokwi에 MAC, CHIP ID 값 읽는 방법
이번 시간에는 ESP32 내부 칩의 정보를 얻는 것이므로 별도로 추가해 줄 건 없습니다.
코드 출처는 초코볼의 inside Tech이며 링크는 아래와 같습니다.
https://chocoball.tistory.com/entry/Hardware-ESP32-spec-check
아래의 코드를 복사 붙여 넣기 해서 실행하면 됩니다.
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[6];
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() {
// 루프 내용은 비어있습니다.
}
아래의 링크를 통해 ESP32 API 문서에서 각각의 내용들을 확인할 수 있습니다.
https://docs.espressif.com/projects/esp-idf/en/latest/esp32/
이제 시작을 눌러서 실행하면 됩니다.
그림과 같이 Chip ID, CPU core, flash size, frequency, heap size, MAC address 등 정보를 얻을 수 있습니다.
실제 가지고 계신 ESP32, ESP8266 등 보드에 따라서 값은 다르게 나올 겁니다.
아두이노 세팅 및 코드 작성
ESP32를 아두이노 세팅하는 방법은 ESP32 → 장치설정 → ESP32 아두이노 2 설치를 찾아가셔도 되고 아래의 링크로도 확인 가능합니다.
[ESP32/장치설정] - ESP32 아두이노 2 설치
코드는 wokwi에서 사용한 코드 그대로를 복사 붙여 넣기 해주면 됩니다.
업로드하시고 결과를 확인하면 wokwi와 정확하게 똑같이 동작합니다.
wokwi (40000000hz)와 실제 보드 flash frequency (80000000hz)가 다른데요.
보드에서 80Mhz 이므로 flash 메모리 읽고 쓰는 속도가 wokwi보다 2배는 더 빠르게 동작할 수 있습니다.
Flash chip size는 동작하기 위한 코드를 작성하고 저장하는 곳입니다.
Flash size를 결정하는 곳은 도구 → partition scheme 여기서 하며 default는 4MB with spiffs (1.2MB APP / 1.5MB APP) 입니다. Flash size에서 크게 No OTA와 그외 나머지로 보시면 됩니다. OTA는 Over the Air의 약자이며 ESP32를 컴퓨터와 USB를 연결하지 않고 WiFi를 통해 펌웨어를 업로드할 수 있게 해주는 기능입니다. No OTA는 WiFi를 통해 업로드를 할 수 없지만 대신에 APP size를 Flash 메모리 전체를 사용할 수 있습니다. OTA는 간단하게 우리가 사용하는 C 드라이버 + D 드라이버 이렇게 나누고 OTA할 때 D 드라이버에 넣은 후 C 드라이버로 옮겨서 진행된다.라고 생각하시면 됩니다. 그래서 OTA가 되는 기본 default나 minimal spiffs 등 보면 플래시메모리의 절반정도 사용합니다. ex) default 4MB with spiffs (1.2MB APP / 1.5MB APP) 1.2MB+1.5MB = 2.7MB (아두이노 사용) 4MB - 2.7MB = 1.3MB (OTA 여유분) |
heap size는 동적 메모리를 저장하는 곳이며 지역 변수를 사용하거나 클래스 안에서 포인터 등 임시로 사용되는 공간입니다.
간단하게 오른쪽 그림처럼 클래스를 생성하고 그 안에 private로 data 포인터와 size를 지정하면 동적메모리 값이 올라갑니다. 클래스로 myarray(5000)의 배열 값을 추가했습니다. 위에서 배열을 지정하지 않았을 때 free heap size = 314524 배열을 지정한 후 free heap size = 294508 대략 20000 정도가 사용된 것으로 보입니다. 지역변수와 포인터 배열값이 많을 때에 free heap size가 부족하여 원인 모를 재부팅이 발생할 수 있습니다. 코드를 작성하고 메모리 사용량이 90%가 넘는다면 메모리 체크를 해주시는게 좋습니다. 주로 BLE/WIFI, LED 라이브러리를 사용하면 90%가 넘게되며 반드시 메모리 체크를 해주셔야 됩니다. |
MAC 어드레스는 기본 값이 WIFI Station (흔히 와이파이 기본 연결) MAC 주소로 되어 있습니다.
프로젝트 상황에 따라 SoftAP, 블루투스, 이더넷 등의 MAC으로 사용하시면 됩니다.
이렇게 ESP32 MAC, CHIP ID, 고유 값 등 내부 함수를 사용하여 읽는 방법을 배웠습니다.
마지막에 실제 개발하면서 자주 놓치거나 기억해야 되는 부분을 전달하려다 보니 내용이 길어졌습니다.
소프트웨어와 달리 펌웨어는 장치의 속성에 맞게 한계를 지정해서 사용하는 게 좋습니다.
꼭 스케치 파일의 크기가 클 경우 메모리와 힙사이즈는 체크하여 개발해 주시면 좋습니다.
오늘도 긴 글 읽어주셔서 감사합니다!
'ESP32 > 장치설정' 카테고리의 다른 글
[아두이노] ESP32 deep sleep mode 전력 관리 (Timer) (0) | 2024.03.06 |
---|---|
[아두이노] ESP32 Multi Thread 구현하는 방법 (easy RTOS) (2) | 2024.03.06 |
[아두이노] ESP32 웹에서 간단히 시뮬레이션 테스트 wokwi (2) | 2024.02.18 |
[아두이노] ESP32 PIN OUT 사용 가능한 핀 (0) | 2024.02.18 |
[아두이노] ESP32 아두이노 2 설치 (1) | 2024.02.15 |