ESP32, ESP32-S3, C3, C6 khác nhau thế nào: so sánh thông số, chọn chip theo việc, lưu ý chuyển code

So sánh ESP32, ESP32-S3, ESP32-C3, ESP32-C6 về nhân CPU, Wi-Fi, Bluetooth, USB, chân, DAC; gợi ý chọn chip theo việc, những điểm dễ vấp khi chuyển code, chương trình in thông tin chip.

"ESP32" ngày nay là cả một họ chip: ESP32 đời đầu, ESP32-S3, ESP32-C3, ESP32-C6 và vài dòng mới hơn. Chúng dùng chung công cụ lập trình (Arduino, ESP-IDF, MicroPython), nhưng khác nhau về nhân CPU, Wi-Fi, Bluetooth, USB, số chân và các khối ngoại vi. Bài này so sánh bốn dòng phổ biến nhất, chỉ ra những điểm dễ vấp khi chuyển chương trình từ dòng này sang dòng khác, gợi ý cách chọn theo việc, và một chương trình in thông tin chip chạy được trên cả bốn.

1. So sánh bốn dòng

Bảng so sánh ESP32, ESP32-S3, ESP32-C3, ESP32-C6 theo nhân CPU, tần số, SRAM, Wi-Fi, Bluetooth, Thread Zigbee, số GPIO, USB trong chip, DAC và cảm ứng, việc phù hợp
Thông số chính theo datasheet của Espressif (module, bo mạch có thể khác về flash, PSRAM, số chân đưa ra).
  • ESP32 (đời đầu): hai nhân 240 MHz, là dòng duy nhất trong bốn dòng có Bluetooth Classic (dùng cho tai nghe, loa, cổng Serial Bluetooth) và DAC 8 bit. Nhiều tài liệu, ví dụ nhất; bo DevKit V1 rẻ, dễ mua. Không có USB trong chip: bo phải có chip chuyển USB – Serial (CP2102, CH340).
  • ESP32-S3: hai nhân 240 MHz, thêm lệnh vector giúp chạy mô hình AI nhỏ nhanh hơn, có giao tiếp camera và màn hình song song, USB OTG (làm bàn phím, chuột, ổ nhớ USB). Nhiều module kèm PSRAM 8 MB. Chỉ có BLE, không có Bluetooth Classic.
  • ESP32-C3: một nhân RISC-V 160 MHz, ít chân (22 GPIO), nhỏ, rẻ, tiết kiệm điện. Có USB để nạp và gỡ lỗi ngay trong chip. Đủ cho cảm biến, relay, gửi dữ liệu.
  • ESP32-C6: một nhân RISC-V 160 MHz kèm một nhân phụ tiết kiệm điện, Wi-Fi 6 (2,4 GHz) và 802.15.4 cho Thread, Zigbee. Hợp với thiết bị nhà thông minh chuẩn Matter.

Ngoài ra còn ESP32-S2 (một nhân, có USB, không Bluetooth), ESP32-H2 (không Wi-Fi, chỉ BLE và 802.15.4), ESP32-C5 (Wi-Fi 6 hai băng tần 2,4 và 5 GHz) và ESP32-P4 (hiệu năng cao, không có vô tuyến). Với người mới và phần lớn dự án học tập, bốn dòng trong bảng là đủ.

2. Chọn chip theo việc

Năm câu hỏi theo thứ tự: cần Bluetooth Classic thì ESP32; cần camera, màn hình lớn, USB, AI thì ESP32-S3; cần Wi-Fi 6, Thread, Zigbee, Matter thì ESP32-C6; việc đơn giản cần nhỏ rẻ thì ESP32-C3; đang học cần nhiều tài liệu thì ESP32
Trả lời lần lượt từ trên xuống; câu đầu tiên trả lời có là chip nên chọn (gợi ý của bài).

Đừng chọn theo con số lớn nhất: chip mạnh hơn thường đắt hơn, ít ví dụ hơn và bo mạch khó mua hơn. Một dự án đọc cảm biến, đóng relay, gửi dữ liệu lên điện thoại chạy tốt trên ESP32 đời đầu hoặc ESP32-C3. Chỉ chuyển sang S3 hay C6 khi thật sự cần thứ mà chúng có.

3. Những điểm dễ vấp khi chuyển dòng

Thứ đang dùng trên ESP32Trên S3, C3, C6
dacWrite(), GPIO25/26 làm DACKhông có DAC: dùng PWM có lọc, hoặc I2S tới chip DAC/khuếch đại
BluetoothSerial (Bluetooth Classic)Không có: chuyển sang BLE (ví dụ dịch vụ UART qua BLE)
touchRead()S3 có (thang số khác); C3, C6 không có
Số chân GPIO, chân ADCKhác hoàn toàn: đọc lại sơ đồ chân của bo mới
Serial qua chip USB – SerialBo dùng USB của chip: bật "USB CDC On Boot" để Serial đi qua cổng USB, và chờ máy tính nhận cổng sau khi khởi động
xTaskCreatePinnedToCore(…, 1)C3, C6 chỉ có một nhân: dùng nhân 0 hoặc tskNO_AFFINITY

4. Chương trình in thông tin chip

Chương trình dùng esp_chip_info() của ESP-IDF và các hàm ESP.get…() của Arduino để in dòng chip, phiên bản, số nhân, tần số, các loại vô tuyến có trong chip, dung lượng flash, PSRAM, địa chỉ MAC. Chọn đúng bo trong Arduino IDE (ESP32 Dev Module, ESP32S3 Dev Module, ESP32C3 Dev Module, ESP32C6 Dev Module…) rồi nạp; mã nguồn không cần sửa.

// PYWORLD.VN - In thông tin chip ESP32 đang cắm: dòng chip, số nhân, tần số, Wi-Fi, Bluetooth, Thread/Zigbee, flash, PSRAM, địa chỉ MAC
// Cùng một chương trình chạy được trên ESP32, ESP32-S3, ESP32-C3, ESP32-C6: chỉ cần chọn đúng bo trước khi nạp
// Không cần thư viện ngoài

#include <esp_chip_info.h>

void setup() {
  Serial.begin(115200);
  delay(1500);                           // ESP32-S3, C3, C6 dùng cổng USB của chip: chờ máy tính nhận cổng
  esp_chip_info_t chip;
  esp_chip_info(&chip);

  Serial.printf("Chip: %s, ban %u.%u\n", ESP.getChipModel(), chip.revision / 100, chip.revision % 100);
  Serial.printf("Nhan: %u, tan so %lu MHz\n", chip.cores, (unsigned long)ESP.getCpuFreqMHz());
  Serial.printf("Wi-Fi 2.4 GHz: %s | Bluetooth LE: %s | Bluetooth Classic: %s | 802.15.4 (Thread, Zigbee): %s\n",
                chip.features & CHIP_FEATURE_WIFI_BGN ? "co" : "khong", chip.features & CHIP_FEATURE_BLE ? "co" : "khong",
                chip.features & CHIP_FEATURE_BT ? "co" : "khong", chip.features & CHIP_FEATURE_IEEE802154 ? "co" : "khong");
  Serial.printf("Flash: %lu MB%s | PSRAM: %s\n", (unsigned long)(ESP.getFlashChipSize() >> 20),
                chip.features & CHIP_FEATURE_EMB_FLASH ? " (trong chip)" : "",
                psramFound() ? String(String(ESP.getPsramSize() >> 20) + " MB").c_str() : "khong co");
  uint64_t mac = ESP.getEfuseMac();
  Serial.printf("MAC: %02X:%02X:%02X:%02X:%02X:%02X\n", (uint8_t)mac, (uint8_t)(mac >> 8), (uint8_t)(mac >> 16), (uint8_t)(mac >> 24),
                (uint8_t)(mac >> 32), (uint8_t)(mac >> 40));
  Serial.printf("Heap trong: %lu byte | Chuong trinh: %lu byte\n", (unsigned long)ESP.getFreeHeap(), (unsigned long)ESP.getSketchSize());
}

void loop() {}

5. Kết quả mong đợi

Hai khung Serial Monitor: ESP32 DevKit V1 chip ESP32-D0WD-V3 hai nhân 240 MHz có Wi-Fi, BLE, Bluetooth Classic, không có 802.15.4, flash 4 MB, không PSRAM; bo ESP32-C6 một nhân 160 MHz có Wi-Fi, BLE, 802.15.4, không Bluetooth Classic
Cùng chương trình trên ESP32 DevKit V1 và một bo ESP32-C6 (MAC, heap, kích thước là ví dụ).

Chương trình hữu ích khi mua bo về mà không chắc chip bên trong là gì, hoặc để biết bo có PSRAM không trước khi làm dự án camera, màn hình. Địa chỉ MAC in ra là duy nhất cho mỗi chip, dùng được để phân biệt nhiều thiết bị trong cùng một hệ thống.

6. Xử lý lỗi thường gặp

Hiện tượngNguyên nhân thường gặpCách xử lý
Serial Monitor trống trên bo S3, C3, C6Bo dùng USB của chip, chưa bật USB CDC On BootBật USB CDC On Boot; hoặc cắm cổng USB-UART nếu bo có hai cổng
Nạp báo "This chip is ESP32-S3, not ESP32"Chọn sai loại bo trong Arduino IDEChọn bo đúng dòng chip
Lỗi biên dịch dacWrite, BluetoothSerialChip mới không có DAC, Bluetooth ClassicĐổi cách làm như bảng ở mục 3
Bo S3, C3 không vào chế độ nạpChương trình cũ chiếm cổng USB hoặc treoGiữ nút BOOT, nhấn RESET, thả BOOT rồi nạp
Chương trình chạy khác trên C3Gán task vào nhân 1, dùng chân không tồn tạiSửa nhân, sửa số chân theo bo mới

7. Xem thêm


Tin tức liên quan

1-Wire là gì: khe thời gian, mã ROM và cách đọc DS18B20 bằng ESP32
1-Wire là gì: khe thời gian, mã ROM và cách đọc DS18B20 bằng ESP32

Giải thích giao tiếp 1-Wire: một dây dữ liệu, điện trở kéo lên, bốn kiểu khe thời gian, mã ROM 64 bit và CRC. Kèm hai chương trình ESP32 tự viết giao thức để đọc mã ROM và nhiệt độ DS18B20.

Arduino, ESP32, STM32 hay Raspberry Pi: chọn nền tảng nào cho dự án, so sánh và gợi ý theo việc
Arduino, ESP32, STM32 hay Raspberry Pi: chọn nền tảng nào cho dự án, so sánh và gợi ý theo việc

Vi điều khiển và máy tính nhúng khác nhau thế nào; so sánh Arduino Nano, ESP32, STM32, Raspberry Pi Pico và Raspberry Pi 5; bốn câu hỏi để chọn nhanh, gợi ý theo dự án và cách dùng kết hợp.

Jack DC 5.5×2.1 và 5.5×2.5: phân biệt, cực tính, chọn jack gắn hộp và dây nguồn DC
Jack DC 5.5×2.1 và 5.5×2.5: phân biệt, cực tính, chọn jack gắn hộp và dây nguồn DC

Jack DC 5.5×2.1 và 5.5×2.5 khác nhau ở lỗ trong: cách phân biệt khi không có nhãn, ký hiệu tâm dương, đo cực tính adapter, lắp jack gắn hộp và nối nguồn vào mạch an toàn.

Cảm biến pH: cấu tạo điện cực thủy tinh, nguyên lý Nernst, cách chế tạo và đo pH bằng ESP32
Cảm biến pH: cấu tạo điện cực thủy tinh, nguyên lý Nernst, cách chế tạo và đo pH bằng ESP32

Cảm biến pH hoạt động thế nào: thang pH, điện cực thủy tinh kết hợp, phương trình Nernst và bù nhiệt độ, hiệu chuẩn, bảo quản, cách chế tạo điện cực và đo pH bằng module với ESP32.

Modbus TCP/IP (phần 1): phần đầu MBAP và ESP32 làm máy chủ qua Wi-Fi
Modbus TCP/IP (phần 1): phần đầu MBAP và ESP32 làm máy chủ qua Wi-Fi

Giải thích Modbus TCP/IP: phần đầu MBAP, cổng 502, điểm khác với Modbus RTU. Kèm chương trình ESP32 làm máy chủ Modbus TCP qua Wi-Fi với 10 thanh ghi giữ và 8 cuộn, tự phân tích khung, không dùng thư viện.

TCP và UDP là gì: địa chỉ IP, cổng, kết nối và cách dùng trên ESP32
TCP và UDP là gì: địa chỉ IP, cổng, kết nối và cách dùng trên ESP32

Giải thích TCP và UDP cho người làm vi điều khiển: địa chỉ IP, cổng, kết nối, xác nhận, vì sao TCP là dòng byte. Kèm hai chương trình ESP32: máy chủ TCP nhận lệnh và phát, nhận gói UDP trong mạng Wi-Fi.

Cấu tạo máy CNC mini và máy khắc laser: khung, ray trượt, truyền động, đầu công cụ, bộ điều khiển
Cấu tạo máy CNC mini và máy khắc laser: khung, ray trượt, truyền động, đầu công cụ, bộ điều khiển

Cấu tạo máy CNC kiểu cổng và máy khắc laser khung hở: khung nhôm định hình, ray dẫn hướng, vít me và dây đai, động cơ bước, spindle, module laser, phần điện và ba kiểu kết cấu.

Modbus RTU (phần 2): ESP32 làm thiết bị tớ, tự xử lý khung tin và mã lỗi
Modbus RTU (phần 2): ESP32 làm thiết bị tớ, tự xử lý khung tin và mã lỗi

Hướng dẫn biến ESP32 thành thiết bị tớ Modbus RTU qua RS-485: lập bảng thanh ghi, tách khung bằng khoảng lặng, kiểm tra CRC, xử lý mã hàm 0x01, 0x03, 0x05, 0x06, 0x10 và trả lời mã lỗi, không dùng thư viện.


Bình luận
Đã thêm vào giỏ hàng