1) ส่วนประกอบพื้นฐานของไมโครคอนโทรลเลอร์
ทุกตัว (ทั้ง UNO/ESP32) จะมีบล็อกหลักคล้ายกัน:
- CPU Core: หน่วยประมวลผลคำสั่ง (ALU, Register, Pipeline)
- หน่วยความจำ:
- Program (Flash/ROM) เก็บเฟิร์มแวร์
- SRAM เก็บตัวแปรขณะรัน
- (อาจมี) EEPROM/NVS เก็บค่าถาวร
- (ESP32) Cache + SPI Flash ภายนอก + RTC Memory + PSRAM (เสริม)
- Bus/Interconnect: เส้นทางเชื่อม CPU ↔ หน่วยความจำ ↔ เพอริเฟอรัล
- Peripherals: GPIO, Timer/Counter, PWM, ADC/DAC, UART/I²C/SPI, Watchdog ฯลฯ
- Clock/Power: แหล่งสัญญาณนาฬิกา, PLL, ตัวจัดการพลังงาน, โหมด Sleep
- Interrupt & Event: ระบบขัดจังหวะ เรียก ISR
- Boot & Security: ขั้นตอนบูต, fuse/eFuse, Bootloader, Partition (ESP32), Secure Boot/Flash Encrypt (ESP32)
2) Arduino UNO (ATmega328P – AVR 8-บิต @16 MHz)
2.1 CPU & สถาปัตยกรรม
- AVR 8-บิต RISC, single-core, Single-cycle ALU หลายคำสั่งรันใน 1–2 cycle
- Register File 32 ตัว (R0–R31), Harvard แยกคำสั่ง/ข้อมูล (Flash ≠ SRAM)
- Pipeline สั้น (fetch/execute) → predictable timing (สำคัญกับงานเวลา)
2.2 หน่วยความจำ (โดยทั่วไปบน UNO)
- Flash 32 KB (โปรแกรม) – ส่วนหนึ่งใช้ Bootloader
- SRAM 2 KB (ตัวแปร runtime, stack)
- EEPROM 1 KB (ค่าถาวร เช่น ค่าคาลิเบรต, การตั้งค่า)
- Stack อยู่ใน SRAM (ต้องระวังเมื่อใช้ String/array ใหญ่)
2.3 Bus & การเชื่อมต่อภายใน
- AVR Bus แบบง่าย: CPU ↔ (Flash via instruction bus) และ ↔ (SRAM/Peripherals via data bus)
- Peripheral Registers (I/O Space) map เป็น address (อ่าน/เขียนด้วยคำสั่ง
IN/OUTหรือผ่านPORTx,PINx,DDRx)
2.4 เพอริเฟอรัลหลัก
- GPIO: พอร์ต B/C/D, รีจิสเตอร์
PORTx (output),DDRx (direction),PINx (input) - Timer/Counter:
- Timer0/2 8-บิต (ใช้ PWM และ millis()/delay())
- Timer1 16-บิต (ละเอียด, ใช้ PWM/IC/servo)
- ADC 10-บิต ~ 6 ช่อง
- USART 1 ชุด, SPI 1, TWI (I²C) 1
- Watchdog (WDT), Brown-out Detector (BOD), Analog Comparator
- PWM ผ่าน Timer (Fast/Phase Correct)
2.5 ระบบนาฬิกา/พลังงาน
- Clock 16 MHz จากคริสตัล/เรโซเนเตอร์
- โหมดประหยัดพลังงาน: Idle/ADC Noise Reduction/Power-down/Standby ฯลฯ
- ตัวคุมพลังงานเรียบง่าย (ไม่มีโซนพาวเวอร์แยกมากนัก)
2.6 Interrupt & Boot
- Vector Table ที่ Flash ต้นทาง, ISR ผ่าน
ISR(VECT_NAME){…} - External Interrupt INT0/INT1 และ Pin-change หลายพิน
- Bootloader (Arduino) นั่งท้าย Flash → รออัปโหลดผ่าน UART (stk500)
- Fuse bits ตั้งค่าพื้นฐาน (clock, boot size, BOD ฯลฯ)
2.7 ลักษณะเด่น
- เวลา/พฤติกรรม คาดเดาง่าย (ไม่มี cache/OS/คอร์คู่)
- ทรัพยากรจำกัด → โค้ดกะทัดรัด, ระวัง RAM/stack
- เหมาะกับงานควบคุมเรียลไทม์เบา ๆ, เรียนพื้นฐาน MCU
3) ESP32 (Dual-core Xtensa LX6 สูงสุด ~240 MHz)
หมายเหตุ: ตระกูล ESP32 มีหลายรุ่น (ESP32, S2, S3, C3/RISC-V ฯลฯ) แนวคิดรวมคล้ายกัน
ที่ยกนี้อ้างอิง “ESP32 คลาสสิก” (Xtensa LX6 2 คอร์)
3.1 CPU & สถาปัตยกรรม
- Xtensa LX6 32-บิต 2 คอร์ (CPU0/CPU1), มี Cache และ MMU เบื้องต้นสำหรับแผนที่ SPI Flash
- Harvard-like + Cache → แยก instruction/data พร้อมดึงจาก SPI Flash ภายนอก
- มี ULP Co-processor (Ultra-Low-Power) ทำงานตอนหลักหลับ (อ่าน ADC/Touch/RTC I/O)
3.2 หน่วยความจำ (ทั่วไป)
- ROM (ภายใน) – Boot ROM/Wi-Fi/BT stack low-level
- SRAM รวม ~520 KB (แบ่ง bank/fast/slow/RTC)
- RTC Fast/Slow Memory อยู่ในโดเมน RTC (คงค่าได้ใน Deep Sleep)
- SPI Flash ภายนอก (เช่น 4–16 MB) เก็บโปรแกรม + FS (SPIFFS/LittleFS) + พาร์ทิชัน
- (ทางเลือก) PSRAM 2–8 MB สำหรับบัฟเฟอร์/รูป/เว็บเซิร์ฟเวอร์
- Cache I/D 32 KB+32 KB โดยประมาณ (ขึ้นกับรุ่น)
3.3 Bus/Interconnect & พาวเวอร์โดเมน
- AHB-like/AXI-like interconnect เชื่อม CPU ↔ Cache ↔ SPI Flash/PSRAM ↔ Peripherals
- Power Domains: Digital/RTC/Radio แยกกัน → ควบคุม Sleep/Wake ยืดหยุ่น
- RTC Controller คุม Deep-sleep, Wake sources (Timer/Touch/EXT)
3.4 เพอริเฟอรัล “แน่นมาก”
- GPIO ~30+ พิน (บางพินเฉพาะ input/boot/แฟลช)
- ADC 12-บิต 2 โมดูล, รวมได้ ~18 ช่อง, DAC 8-บิต x2
- Touch Sensor 10 ช่อง, Hall Sensor (บนบางรุ่นคลาสสิก)
- Timer (General-purpose 64-บิต), LEDC PWM 16 ช่อง (ปรับความถี่/ความละเอียดได้)
- RMT (Remote Control), MCPWM (มอเตอร์), I²S (ออดิโอ/DMA), SPI หลายชุด, I²C 2 ชุด, UART 3 ชุด
- TWAI (CAN), SD/SDIO, Ethernet MAC, USB-OTG (บนบางรุ่น), DMA ในหลายเพอริเฟอรัล
- Wi-Fi 802.11 b/g/n + Bluetooth Classic/BLE (บน ESP32 คลาสสิก)
3.5 นาฬิกา/พลังงาน
- Clock หลักจาก PLL (คริสตัล 40 MHz → 80/160/240 MHz)
- โหมดพลังงาน: Active / Modem-sleep / Light-sleep / Deep-sleep
- ULP ทำงานได้แม้เข้า Deep-sleep (ประหยัดมาก)
3.6 Interrupt, RTOS & Multi-core
- ใช้ FreeRTOS (ใน Arduino-ESP32 core) → มี Tasks, Queues, ISR-safe APIs
- ขัดจังหวะยืดหยุ่น, ISR ใส่
IRAM_ATTR(วางไว้ใน IRAM ลด latency) - งานแบ่งคอร์: Wi-Fi/BT stack มักผูกกับคอร์หนึ่ง อีกคอร์รันงานแอปได้
3.7 Boot & Security
- ROM Bootloader อ่าน eFuse + สถานะ Strapping pins → บูตแฟลช SPI → โหลด 2nd-stage bootloader
- Partition Table: มี bootloader / app(s) / spiffs/littlefs / nvs ฯลฯ
- รองรับ OTA หลายพาร์ทิชัน, Secure Boot, Flash Encryption, eFuse สำหรับคีย์
3.8 ลักษณะเด่น
- ประสิทธิภาพสูง, เพอริเฟอรัลหลากหลาย, ต่อเน็ตในตัว
- มี RTOS → ทำงานพร้อมกันหลายอย่าง (Multitasking) ได้ดี
- สลับพลังงานยืดหยุ่นมาก (IoT/แบตเตอรี่), มี ULP/RTC memory
4) ตารางสรุบเทียบ (สั้น กระชับ)
| หัวข้อ | Arduino UNO (ATmega328P) | ESP32 (คลาสสิก LX6 Dual-core) |
|---|---|---|
| สถาปัตยกรรม | AVR 8-บิต, single-core, Harvard | Xtensa 32-บิต, dual-core, cache + SPI Flash |
| นาฬิกา | 16 MHz | 80–240 MHz (PLL) |
| หน่วยความจำหลัก | 32 KB Flash, 2 KB SRAM, 1 KB EEPROM | SPI Flash ภายนอก (4–16 MB), ~520 KB SRAM, RTC mem, (ทางเลือก) PSRAM |
| อนาล็อก | ADC 10-บิต | ADC 12-บิต, DAC x2, Touch, Hall |
| เพอริเฟอรัลเด่น | Timer0/1/2, PWM, UART, SPI, I²C | LEDC PWM, RMT, MCPWM, I²S, SPIx, I²C x2, UART x3, TWAI, SDIO, Ethernet MAC |
| การสื่อสารไร้สาย | — | Wi-Fi + BT/BLE |
| ระบบปฏิบัติการ | ไม่มี (bare-metal) | FreeRTOS (ผนวกใน core) |
| พลังงาน | โหมด sleep พื้นฐาน | Light/Deep-sleep, ULP, RTC domain |
| การบูต | Bootloader UART + fuse | ROM boot → 2nd loader → partitions, OTA, Secure Boot/Flash Enc |
5) โฟลว์การบูต (ย่อ)
UNO: รีเซ็ต → เริ่ม Bootloader ใน Flash (รออัปโหลดช่วงสั้น ๆ) → กระโดดเข้าโปรแกรมหลัก
ESP32: ROM boot ตรวจ eFuse/strap → อ่าน 2nd-stage bootloader จาก SPI Flash → เลือกพาร์ทแอปตาม partition table → init RTOS/stack → เริ่ม setup()/loop() (ผ่าน core Arduino)
6) ระบบขัดจังหวะ (Interrupt) & เวลา
- UNO: เวลาคาดเดาง่าย (ไม่มี cache/RTOS) → งานจับเวลาความละเอียดสูงทำได้ตรง ๆ ผ่าน Timer/ISR
- ESP32: มี cache/RTOS/คอร์คู่ → latency ซับซ้อนกว่า แต่ได้ throughput สูงกว่า และมี RMT/I²S/DMA ช่วยงานเวลาจริง
7) พลังงาน & การปลุก (Wake Sources)
- UNO: Sleep แบบง่าย (คุม Timer/ADC/Peripheral) ปลุกด้วย external/Timer
- ESP32: Deep-sleep ปลุกด้วย RTC Timer, Touch, EXT0/EXT1, ULP ฯลฯ, เก็บค่าผ่าน RTC memory
8) แนวทางเลือกใช้งาน
- เลือก UNO/AVR เมื่อ:
- ต้องการ “โครงสร้างเรียบง่าย/คาดเดาเวลา” สูง, เริ่มต้นเรียน MCU, คุมโหลดง่าย ๆ
- เลือก ESP32 เมื่อ:
- ต้องการ Wi-Fi/BLE, ประสิทธิภาพ, RTOS, อุปกรณ์รอบด้าน, โหมดพลังงานขั้นสูง, OTA/Security
9) ตัวอย่างเช็คหน่วยความจำ/สถาปัตยกรรมในโค้ด
UNO (AVR): เช็คขนาดประเภท (แนวสอนเรื่อง RAM)
C++
void setup() {
Serial.begin(9600);
Serial.print("sizeof(int)="); Serial.println(sizeof(int));
Serial.print("sizeof(long)="); Serial.println(sizeof(long));
Serial.print("sizeof(float)="); Serial.println(sizeof(float));
}
void loop(){}
ESP32: เช็ค Heap/Chip Info (ต้องใช้ Arduino-ESP32 core)
C++
void setup(){
Serial.begin(115200);
Serial.printf("Free heap: %u bytes\n", ESP.getFreeHeap());
Serial.printf("Chip rev: %d\n", ESP.getChipRevision());
Serial.printf("CPU freq: %d MHz\n", ESP.getCpuFreqMHz());
}
void loop(){}