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, HarvardXtensa 32-บิต, dual-core, cache + SPI Flash
นาฬิกา16 MHz80–240 MHz (PLL)
หน่วยความจำหลัก32 KB Flash, 2 KB SRAM, 1 KB EEPROMSPI 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²CLEDC 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 + fuseROM 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(){}