Cách nạp code cho ESP-01 và ESP-01S bằng USB-TTL, đế nạp: sơ đồ chân và lỗi thường gặp

Cách nạp code cho ESP-01, ESP-01S: sơ đồ 8 chân, khác nhau giữa hai bản, nối USB-TTL đúng cách, cấp nguồn 3,3 V đủ dòng, chế độ nạp GPIO0, cài Arduino IDE, chương trình đầu tiên và lỗi hay gặp.

ESP-01 và ESP-01S là module Wi-Fi nhỏ nhất dùng chip ESP8266: chỉ bằng con tem, 8 chân, giá rẻ. Chúng hay dùng làm module Wi-Fi cho Arduino, công tắc thông minh nhỏ, cảm biến gửi dữ liệu. Nhưng module không có cổng USB, nên nạp code là chỗ người mới hay vướng: nối USB-TTL sao cho đúng, kéo GPIO0 xuống lúc nào, vì sao nạp mãi báo "Failed to connect". Bài này hướng dẫn cách nạp code cho ESP-01 bằng mạch USB-TTL hoặc đế nạp, sơ đồ chân, khác biệt giữa ESP-01 và ESP-01S, chương trình đầu tiên và các lỗi hay gặp.

1. Sơ đồ chân ESP-01

Module ESP-01 có anten răng cưa ở trên, chip ESP8266 và chip flash, hai hàng chân: hàng một GND, GPIO2, GPIO0, RXD; hàng hai TXD, CH_PD, RST, VCC; kèm ghi chú chức năng từng chân
Tám chân của ESP-01, ESP-01S (hình minh họa).

Module có hai hàng chân 2,54 mm. Chú ý ba chân quyết định module có chạy hay không:

  • VCC: chỉ nhận 3,3 V. Cấp 5 V là hỏng chip. Khi phát Wi-Fi, module kéo dòng đỉnh khoảng 300 mA.
  • CH_PD (còn ghi EN, CH_EN): phải ở mức cao. ESP-01 đời cũ không có điện trở kéo lên, để hở là chip không chạy.
  • GPIO0: ở mức thấp lúc khởi động thì chip vào chế độ nạp; ở mức cao (hoặc để hở với ESP-01S) thì chạy chương trình.

Chỉ có GPIO0, GPIO2, RXD (GPIO3), TXD (GPIO1) dùng được làm chân vào ra. GPIO0 và GPIO2 là chân khởi động nên không được nối thiết bị kéo chúng xuống thấp lúc cấp điện.

2. ESP-01 và ESP-01S khác nhau thế nào

Bảng so sánh ESP-01 và ESP-01S: flash 512 KB hoặc 1 MB với 1 MB; LED xanh nối TX hoặc GPIO2; điện trở kéo lên CH_PD RST không có hoặc có sẵn; LED đỏ báo nguồn có hoặc không; màu mạch xanh dương hoặc đen
So sánh nhanh hai phiên bản.

ESP-01S là bản cải tiến: có sẵn điện trở kéo lên cho CH_PD, RST, GPIO0, bỏ LED đỏ báo nguồn (tiết kiệm dòng), LED xanh nối GPIO2 nên điều khiển được trong chương trình. Mua mới thì nên chọn ESP-01S.

3. Nối ESP-01 với mạch USB-TTL

Sơ đồ nối: USB-TTL 3V3 vào VCC, TX vào RXD, RX vào TXD, GND vào GND; CH_PD nối lên VCC, GPIO0 nối GND khi nạp, RST chạm GND để reset
Nối ESP-01 với mạch USB-TTL để nạp code (hình minh họa).

Cần một mạch USB-TTL (CP2102, CH340, FT232) có chế độ 3,3 V:

  1. TX của USB-TTL nối RXD của ESP-01, RX nối TXD (nối chéo).
  2. GND nối GND.
  3. 3,3 V nối VCC; với ESP-01 đời cũ, nối thêm CH_PD lên 3,3 V.
  4. GPIO0 nối GND (qua dây cắm hoặc nút nhấn) khi muốn nạp.

Chân 3,3 V của nhiều mạch USB-TTL chỉ cấp được vài chục mA, không đủ cho ESP-01 khi phát Wi-Fi: module reset liên tục hoặc nạp lỗi giữa chừng. Cách chắc chắn là lấy 5 V từ USB-TTL qua một ổn áp AMS1117-3.3 hoặc mạch hạ áp như MP1584 chỉnh 3,3 V, thêm tụ 100 µF cạnh VCC, nối chung GND.

Đế nạp ESP-01 (mạch USB cắm thẳng module, có chip CH340 và ổn áp) tiện hơn nhiều. Loại có công tắc "PROG/UART" thì gạt sang PROG để nạp, gạt về UART để chạy. Loại không có công tắc thì phải hàn thêm nút nối GPIO0 xuống GND.

4. Chế độ nạp và chế độ chạy

Bảng chế độ khởi động: chạy chương trình khi GPIO0 cao, GPIO2 cao, GPIO15 thấp; chế độ nạp khi GPIO0 thấp, GPIO2 cao, GPIO15 thấp; quy trình nạp tay
Mức các chân lúc khởi động quyết định chế độ.

ESP8266 chỉ đọc GPIO0 lúc vừa cấp điện hoặc vừa reset. Vì vậy quy trình nạp tay là: nối GPIO0 xuống GND → reset (chạm RST xuống GND hoặc rút cắm điện) → bấm Upload → nạp xong, bỏ nối GPIO0 → reset để chạy chương trình mới.

5. Cài đặt Arduino IDE và nạp chương trình

  1. Cài gói ESP8266 (thêm https://arduino.esp8266.com/stable/package_esp8266com_index.json vào File → Preferences → Additional boards manager URLs, rồi cài esp8266 trong Boards Manager). Bài dùng gói 3.1.2.
  2. Tools → Board → esp8266 → Generic ESP8266 Module.
  3. Flash Size: 1MB (FS: 64KB, OTA: ~470KB). Builtin Led: 2. Reset Method: "no dtr (aka ck)" khi nạp tay; "dtr (aka nodemcu)" khi đế nạp có mạch tự reset.
  4. Chọn cổng COM, đưa module vào chế độ nạp, bấm Upload.

Chương trình mẫu nháy LED xanh của ESP-01S và quét các mạng Wi-Fi xung quanh, không cần linh kiện nào khác:

// PYWORLD.VN - Chương trình đầu tiên cho ESP-01 / ESP-01S: nháy LED và quét mạng Wi-Fi xung quanh
// PYWORLD.VN - Chọn bo "Generic ESP8266 Module", Flash Size 1MB; ESP-01S có LED xanh ở GPIO2 (sáng mức thấp)
// PYWORLD.VN - ESP-01 đời cũ: LED xanh nối chân TX nên chỉ nháy khi có dữ liệu Serial, không điều khiển riêng được

#include <ESP8266WiFi.h>

const uint8_t CHAN_LED = 2;              // GPIO2 trên ESP-01S
const uint32_t CHU_KY_QUET_MS = 15000;

uint32_t lanQuet = 0;
uint32_t lanNhay = 0;
bool ledSang = false;

void quetWifi() {
  Serial.println("Dang quet Wi-Fi...");
  int n = WiFi.scanNetworks();
  if (n <= 0) {
    Serial.println("Khong thay mang nao");
    return;
  }
  for (int i = 0; i < n; i++) {
    Serial.printf("%2d. %-24s %4d dBm  kenh %2d  %s\n", i + 1, WiFi.SSID(i).c_str(), WiFi.RSSI(i), WiFi.channel(i),
                  WiFi.encryptionType(i) == ENC_TYPE_NONE ? "mo" : "co mat khau");
  }
  WiFi.scanDelete();
}

void setup() {
  Serial.begin(115200);
  delay(100);
  Serial.println();
  Serial.printf("ESP-01: chip ID %06X, flash %u KB\n", (unsigned)ESP.getChipId(), (unsigned)(ESP.getFlashChipRealSize() / 1024));
  pinMode(CHAN_LED, OUTPUT);
  WiFi.mode(WIFI_STA);
  WiFi.disconnect();
  quetWifi();
  lanQuet = millis();
}

void loop() {
  if (millis() - lanNhay >= 500) {
    lanNhay = millis();
    ledSang = !ledSang;
    digitalWrite(CHAN_LED, ledSang ? LOW : HIGH);
  }
  if (millis() - lanQuet >= CHU_KY_QUET_MS) {
    lanQuet = millis();
    quetWifi();
  }
}
Serial Monitor in chip ID và flash 1024 KB, dòng đang quét Wi-Fi và bốn mạng kèm mức sóng dBm, kênh, có mật khẩu hay mở
Kết quả quét Wi-Fi; tên mạng là ví dụ (hình minh họa).

Mức sóng càng gần 0 càng mạnh: từ −50 dBm trở lên là rất tốt, khoảng −70 dBm vẫn dùng được, dưới −80 dBm dễ mất kết nối. ESP-01 có anten mạch in nhỏ nên đặt module xa vỏ kim loại, xa nguồn nhiễu.

6. Lỗi hay gặp

Hiện tượngNguyên nhânCách xử lý
Failed to connect to ESP8266: Timed out waiting for packet headerChưa vào chế độ nạp; nối TX/RX không chéoNối GPIO0 xuống GND rồi reset; đảo TX, RX
Nạp được một phần rồi lỗiNguồn 3,3 V yếuDùng ổn áp riêng, tụ 100 µF
Nạp xong không chạy, LED không nháyGPIO0 vẫn nối GND; CH_PD để hở (ESP-01)Bỏ nối GPIO0, kéo CH_PD lên 3,3 V, reset
Chữ lạ trên Serial MonitorLog khởi động 74880 baudBình thường; chương trình in ở 115200
Module nóng, không nhậnĐã cấp 5 V vào VCC hoặc mức 5 V ở RXKiểm tra jumper 3,3 V của USB-TTL; module có thể đã hỏng

Cần nhiều chân hơn, có sẵn cổng USB và tự nạp thì dùng mạch ESP8266 lớn hơn như Wemos D1 R2 hoặc mạch ESP8266 có màn hình OLED.

7. Xem thêm


Tin tức liên quan

Ghi dữ liệu ESP32 lên Google Sheets bằng Apps Script: điện áp pin, Wi-Fi, không cần máy chủ riêng
Ghi dữ liệu ESP32 lên Google Sheets bằng Apps Script: điện áp pin, Wi-Fi, không cần máy chủ riêng

Tạo bảng tính, triển khai Apps Script thành web app, đo pin 18650 qua cầu phân áp và chương trình ESP32 gửi JSON lên Google Sheets mỗi phút, kèm bảng xử lý lỗi.

Vẽ đồ thị dữ liệu ESP32 trên ThingSpeak: theo dõi pin 18650, ngủ sâu và ước tính thời gian chạy pin
Vẽ đồ thị dữ liệu ESP32 trên ThingSpeak: theo dõi pin 18650, ngủ sâu và ước tính thời gian chạy pin

ESP32 chạy pin 18650 thức dậy mỗi 10 phút, đo điện áp pin, gửi lên ThingSpeak rồi ngủ sâu; cách tạo kênh, ước tính thời gian chạy pin và giảm dòng lúc ngủ.

LCD I2C không hiện chữ, chỉ hiện ô vuông, sai địa chỉ 0x27/0x3F: tìm lỗi từng bước
LCD I2C không hiện chữ, chỉ hiện ô vuông, sai địa chỉ 0x27/0x3F: tìm lỗi từng bước

LCD 1602, LCD 2004 I2C không hiện chữ, chỉ hiện hàng ô vuông đen hoặc sai địa chỉ 0x27/0x3F: tìm lỗi nguồn, tương phản, dây I2C, địa chỉ và chương trình kiểm tra tự động.

Module thời gian thực DS3231 với ESP32: đọc giờ, đặt giờ, báo thức hằng ngày, giữ giờ khi mất điện
Module thời gian thực DS3231 với ESP32: đọc giờ, đặt giờ, báo thức hằng ngày, giữ giờ khi mất điện

DS3231 khác DS1307 thế nào, nối với ESP32 qua I2C, thanh ghi và mã BCD, chương trình đọc giờ, nhiệt độ, đặt giờ qua Serial và báo thức hằng ngày qua chân SQW, kèm bảng lỗi.

Giữ tốc độ động cơ DC ổn định bằng PID trên ESP32: encoder, chỉnh Kp Ki Kd, Serial Plotter
Giữ tốc độ động cơ DC ổn định bằng PID trên ESP32: encoder, chỉnh Kp Ki Kd, Serial Plotter

Hướng dẫn điều khiển vòng kín tốc độ động cơ DC bằng PID trên ESP32: đo tốc độ bằng encoder và PCNT, chu kỳ 20 ms, chống tích phân bão hòa, chỉnh Kp Ki Kd và thí nghiệm STEM.

Web điều khiển ESP32 cập nhật tức thời trên nhiều điện thoại: hỏi định kỳ bằng fetch hay WebSocket
Web điều khiển ESP32 cập nhật tức thời trên nhiều điện thoại: hỏi định kỳ bằng fetch hay WebSocket

Làm trang web trên ESP32 tự cập nhật trạng thái relay trên mọi điện thoại đang mở bằng fetch() và JSON, chỉ dùng WebServer có sẵn, so sánh với WebSocket.

ESP32 điều khiển servo SG90 bằng PWM, không cần thư viện: quét góc, biến trở, hiệu chỉnh
ESP32 điều khiển servo SG90 bằng PWM, không cần thư viện: quét góc, biến trở, hiệu chỉnh

Hướng dẫn điều khiển servo SG90 bằng ESP32 với bộ PWM LEDC 50 Hz có sẵn: xung 0,5–2,4 ms, sơ đồ nối, quét góc, vặn biến trở, hiệu chỉnh hai đầu hành trình và thí nghiệm STEM.

Cấu hình LoRa trên ESP32: SF, băng thông, tỉ lệ mã, công suất và cách thử tầm xa
Cấu hình LoRa trên ESP32: SF, băng thông, tỉ lệ mã, công suất và cách thử tầm xa

Giải thích bốn tham số cấu hình LoRa (SF, băng thông, tỉ lệ mã, công suất), cách tính thời gian phát một gói và hướng dẫn làm bộ thử tầm xa bằng ESP32, SX1278 và màn hình OLED.


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