ESP32 Beginner Guide – P2: Cài đặt và nạp code đầu tiên
Cài Arduino IDE, thêm Arduino-ESP32, chọn đúng board và Port, nạp sketch đầu tiên rồi xử lý lỗi Failed to connect trên ESP32, ESP32-C3 và ESP32-S3.
Chia sẻ

Ở P1, mình và bạn đã phân biệt chip, module và development board. Bây giờ ta sẽ làm việc quan trọng nhất sau khi mở hộp: khiến máy tính nhận board, nạp được một chương trình và đọc được log từ ESP32.
Mình chọn Arduino IDE cho lần đầu vì đường đi ngắn và dễ đối chiếu lỗi. PlatformIO và ESP-IDF đều đáng học, nhưng thêm chúng lúc này chỉ làm xuất hiện nhiều biến số hơn. Khi đã nạp ổn định bằng Arduino IDE, bạn chuyển sang công cụ khác cũng tự tin hơn.
Chuẩn bị trước khi cài

Cáp data có thêm cặp dây truyền tín hiệu; nhìn bên ngoài, nó có thể giống hệt cáp chỉ sạc.
Bạn cần một development board ESP32, một cáp USB có truyền dữ liệu và máy tính chạy Windows, macOS hoặc Linux. Cáp chỉ sạc vẫn làm LED nguồn sáng nên rất dễ đánh lừa mình: board có điện nhưng Arduino IDE không bao giờ thấy cổng serial.
Trước khi cài driver ngẫu nhiên trên mạng, hãy kiểm tra board đang dùng đường nào:
- USB-to-UART: thường đi qua chip CP210x, CH340 hoặc FTDI. ESP32-Classic DevKit và cổng
UARTtrên nhiều board S3 dùng kiểu này. - USB native: cổng nối thẳng tới USB peripheral của C3/S3. Nó có thể dùng để nạp và làm USB CDC, nhưng cần đúng cổng và đúng tùy chọn trong Arduino IDE.
Nếu board có hai cổng như ESP32-S3-DevKitC-1, mình khuyên dùng cổng ghi USB-to-UART cho lần nạp đầu. Nó ít phụ thuộc vào firmware đang có trong board hơn. Chỉ cài driver từ nhà sản xuất chip USB-to-UART khi hệ điều hành thật sự không nhận thiết bị.
1. Cài Arduino IDE và Arduino-ESP32
Tải bản Arduino IDE hiện hành từ trang Arduino chính thức, cài đặt và mở ứng dụng. Sau đó:
- Vào Arduino IDE → Settings (Windows/Linux thường là File → Preferences).
- Dán URL stable này vào Additional Boards Manager URLs:
https://espressif.github.io/arduino-esp32/package_esp32_index.json
- Mở Boards Manager, tìm
esp32 by Espressif Systemsvà bấm Install. - Đợi cả core lẫn toolchain tải xong rồi khởi động lại IDE nếu danh sách board chưa được cập nhật.
Đây là package chính thức của dự án mã nguồn mở espressif/arduino-esp32. Đừng dùng development package cho bài đầu tiên; bản stable giúp kết quả dễ lặp lại hơn.
2. Chọn đúng board và đúng Port

Chọn đúng họ chip, đúng board và đúng Port trước; các tùy chọn nâng cao có thể giữ mặc định.
Cắm board vào máy tính, chờ vài giây rồi chọn board trong menu thả xuống của Arduino IDE. Nếu tên thương mại không có sẵn, Espressif cho phép dùng generic board đúng họ chip:
| Phần cứng trước mặt bạn | Lựa chọn an toàn để bắt đầu |
|---|---|
| ESP32 DevKitC / board WROOM classic | ESP32 Dev Module |
| ESP32-C3-DevKitM-1 / C3 generic | ESP32C3 Dev Module |
| ESP32-S3-DevKitC-1 / S3 generic | ESP32S3 Dev Module |
Sau đó chọn Port vừa xuất hiện. Cách chắc nhất là rút board ra, nhìn danh sách Port, cắm lại và chọn mục mới. Đừng đoán theo COM3, /dev/cu.usbserial... hay /dev/ttyACM..., vì tên này đổi theo máy và cổng USB.
Ở lần đầu, hãy giữ nguyên Flash Mode, Flash Frequency và Partition Scheme mặc định. Với board có nhiều biến thể, chọn Flash Size/PSRAM theo mã in trên module hoặc tài liệu của nhà sản xuất, không theo tiêu đề của shop. Nếu IDE báo kiểu “This chip is ESP32-S3, not ESP32”, bạn đã chọn sai họ chip.
3. Nạp sketch đầu tiên
Mình dùng Serial thay cho LED làm phép thử đầu tiên vì nó chạy nhất quán trên ESP32 classic, C3 và S3:
void setup() {
Serial.begin(115200);
delay(1000);
Serial.println("ESP32 is ready");
}
void loop() {
Serial.printf("Uptime: %lu ms\n", millis());
delay(1000);
}
Bấm Verify để biên dịch. Nếu thành công, bấm Upload. Trong output, bạn sẽ thấy quá trình kết nối, ghi từng vùng flash và kết thúc bằng thông báo reset. Không rút cáp khi phần trăm đang chạy.
Sau khi nạp xong, mở Serial Monitor, chọn 115200 baud, rồi nhấn EN/RESET một lần nếu chưa thấy gì. Kết quả mong đợi:
ESP32 is ready
Uptime: 1000 ms
Uptime: 2000 ms
...

Serial Monitor ở 115200 baud là phép thử ổn định hơn LED onboard vì mỗi board có thể dùng một loại LED khác nhau.
Nếu chữ biến thành ký tự rác, baud rate của Monitor không khớp với Serial.begin(115200). Nếu dùng cổng USB native của C3/S3, bạn có thể cần bật USB CDC On Boot; lần cấu hình đầu tiên cũng có thể cần đưa board vào download mode thủ công. Với cổng USB-to-UART, cứ để tùy chọn USB mặc định.
4. Blink đúng với board của bạn
LED nguồn sáng liên tục không phải LED mà là code điều khiển được. ESP32-DevKitC Classic chính thức không có một LED_BUILTIN chung để tutorial nào cũng dùng; C3/S3 lại có thể gắn LED RGB địa chỉ thay vì LED đơn.
Hãy mở File → Examples → ESP32 → GPIO:
- Dùng Blink nếu định nghĩa board có
LED_BUILTIN. - Dùng BlinkRGB nếu board có
RGB_BUILTIN. - Nếu cả hai không phù hợp, dùng LED rời nối tiếp với điện trở 220–1.000 Ω vào một GPIO an toàn theo đúng pinout của board. Phần GPIO và cách đấu LED sẽ nằm ở P3.
Đừng sửa số GPIO chỉ để “thử đại”. Trên một số board, LED onboard khác theo revision; trên C3/S3, vài GPIO còn là strapping pin hoặc được flash/PSRAM sử dụng.
5. Sửa lỗi Failed to connect theo đúng thứ tự

Chỉ dùng thao tác BOOT và RESET khi board không tự vào download mode; đa số DevKit làm việc này tự động.
Khi upload đứng ở Connecting..., mình xử lý từ thứ dễ nhất:
- Rút cảm biến và dây ngoài, chỉ để board cùng cáp USB. Mạch ngoài có thể kéo sai strapping pin.
- Đổi cáp data và cổng USB, tránh hub rẻ hoặc adapter lỏng.
- Chọn lại Board và Port, rồi đóng Serial Monitor hoặc ứng dụng khác đang giữ cổng.
- Giảm Upload Speed nếu kết nối chập chờn.
- Vào download mode thủ công: giữ BOOT, nhấn rồi thả EN/RESET, sau đó thả BOOT; chọn lại Port nếu hệ điều hành tạo cổng mới và upload lại.
Nhiều DevKit có mạch tự điều khiển BOOT/RESET, nên bình thường bạn không cần bấm nút. Việc giữ BOOT chỉ là cách phục hồi khi auto-reset không làm việc, firmware USB hiện tại bị lỗi hoặc board clone có mạch reset chưa tốt.
| Hiện tượng | Kiểm tra đầu tiên |
|---|---|
| Không có Port mới | Cáp data, cổng USB, USB bridge và driver đúng hãng |
Failed to connect | Đúng Port, tháo mạch ngoài, thao tác BOOT/RESET |
| Báo sai chip | Chọn lại đúng ESP32, ESP32C3 hoặc ESP32S3 Dev Module |
| Upload xong nhưng không có log | Baud 115200, đúng Port, nhấn RESET, kiểm tra USB CDC |
| Port biến mất sau khi nạp native USB | Vào download mode, chọn cổng mới, bật USB CDC On Boot |
Nếu vẫn lỗi, ghi lại toàn bộ output thay vì chỉ chụp dòng cuối. Tên chip, port, boot mode và vị trí quá trình dừng thường đủ để phân biệt lỗi cấu hình với lỗi nguồn/cáp. Bài các lỗi ESP32 thường gặp – P1 có checklist sâu hơn cho flash, boot loop và brownout.
Checklist trước khi chuyển sang P3
- Arduino IDE đã cài
esp32 by Espressif Systemstừ stable URL. - IDE nhận đúng họ chip và port của board.
- Sketch Serial upload không báo lỗi.
- Serial Monitor đọc đúng nội dung ở 115200 baud.
- Bạn biết board đang dùng USB-to-UART hay USB native.
- Nếu Blink không chạy, bạn kiểm tra loại LED và pinout thay vì đổi GPIO ngẫu nhiên.
Khi sáu mục này đều ổn, môi trường của bạn đã sẵn sàng. Ở P3, mình sẽ đi vào GPIO, input/output, pull-up, mức logic 3,3 V và cách đọc pinout mà không làm hỏng board.
Tham khảo
Chia sẻ
Tiếp tục khám phá
Đọc tiếp
Bài viết liên quan
18 lỗi ESP32 thường gặp – Phần 2: Các lỗi nghiêm trọng
Cách mình đọc backtrace và xử lý crash, watchdog, heap, stack, FreeRTOS, Wi-Fi, ADC, deep sleep và OTA trên ESP32 theo một checklist runtime dễ áp dụng.
Chạy Linux trên ESP32-S31: MMU thay đổi điều gì?
ESP32-S31 đã có Linux BSP chính thức ở dạng Developer Preview. Mình cùng xem MMU, Buildroot, U-Boot, Linux 6.18 và những giới hạn thực tế trước khi chọn board để thử.
TinyML trên ESP32: Chạy AI ngay tại thiết bị
Cách mình chạy một model nhận diện người ngay trên ESP32 bằng TensorFlow Lite Micro và ESP-NN, từ giới hạn bộ nhớ đến cách thử ví dụ person_detection.