LED: tính điện trở hạn dòng, nối nhiều LED và trộn màu LED RGB bằng ESP32

Cấu tạo LED, cách nhận biết chân, điện áp thuận theo màu, cách tính điện trở hạn dòng, nối nhiều LED nối tiếp và song song, LED RGB cathode chung, anode chung, trộn màu bằng PWM của ESP32.

LED (diode phát quang) có lẽ là linh kiện người mới dùng sớm nhất và cũng làm hỏng nhiều nhất, vì quên điện trở hạn dòng. LED là một diode nên dòng tăng vọt khi điện áp vượt ngưỡng; muốn LED sáng ổn định và bền phải giới hạn dòng. Bài viết giải thích cấu tạo LED, điện áp thuận theo màu, cách tính điện trở hạn dòng, cách nối nhiều LED đúng, giới hạn dòng của chân GPIO, LED RGB cathode chung và anode chung, rồi làm thí nghiệm trộn màu LED RGB bằng PWM của ESP32.

1. Cấu tạo LED

Hình vẽ LED 5 mm cắt dọc: chip bán dẫn phát sáng nằm trong cốc phản xạ trên khung chân cathode ngắn, dây nối vàng nối chip với chân anode dài hơn, vành nhựa có mặt vát đánh dấu phía cathode, toàn bộ đúc trong nhựa trong
Cấu tạo LED 5 mm (hình tự vẽ, sơ lược).
  • LED là một tiếp giáp p-n làm từ vật liệu bán dẫn đặc biệt (GaAsP, InGaN…). Khi dòng chạy thuận, electron và lỗ trống gặp nhau ở tiếp giáp và giải phóng năng lượng dưới dạng ánh sáng. Màu ánh sáng do vật liệu quyết định; LED trắng thường là LED xanh dương phủ lớp bột huỳnh quang.
  • Chip LED rất nhỏ (khoảng 0,3 mm), nằm trong cốc phản xạ trên khung chân cathode; một dây vàng mảnh nối chip với chân anode. Vỏ nhựa đúc làm thấu kính.
  • Nhận biết chân: chân dài là anode (+); phía có mặt vát trên vành và khung kim loại lớn bên trong là cathode (−). Thử nhanh bằng thang diode của đồng hồ vạn năng: LED sáng mờ khi que đỏ ở anode.
Ảnh chụp cận cảnh bên trong một LED xanh lá đã bỏ vỏ nhựa: chip vàng nhỏ nằm trong cốc phản xạ bạc trên khung chân, dây vàng mảnh cong nối từ chip sang chân bên cạnh, nền xanh dương
Bên trong một LED 5 mm: chip nằm trong cốc phản xạ, dây vàng nối sang chân còn lại. Ảnh: Mister rf, CC BY-SA 4.0, Wikimedia Commons, đã thu nhỏ.

2. Tính điện trở hạn dòng

Mạch nguồn qua điện trở hạn dòng tới LED rồi xuống đất, công thức R bằng U trừ Uf chia I; bảng ví dụ: 5 V LED đỏ 10 mA tính 300 Ω chọn 330 Ω; 3,3 V LED đỏ 5 mA chọn 270 Ω; 5 V LED trắng 10 mA chọn 220 Ω; 3,3 V LED xanh dương 5 mA chọn 82 Ω; 12 V ba LED trắng nối tiếp 20 mA chọn 150 Ω; bảng Uf điển hình theo màu
Cách tính điện trở hạn dòng và Uf điển hình theo màu (hình tự vẽ).

Điện trở nối tiếp với LED nhận phần điện áp còn lại sau khi trừ điện áp thuận Uf của LED, nên theo định luật Ohm: R = (U − Uf) / I.

  • Uf lấy theo datasheet, hoặc theo bảng điển hình: đỏ, vàng khoảng 2 V; xanh dương, trắng khoảng 3 V.
  • Dòng I: LED 5 mm thông thường chịu tối đa khoảng 20 mA, nhưng 5–10 mA đã đủ sáng để làm đèn báo; LED hiện đại hiệu suất cao sáng rõ ngay ở 1–2 mA.
  • Chọn giá trị điện trở E12 lớn hơn gần nhất với số tính được, để dòng không vượt mức dự kiến. Kiểm tra công suất điện trở: P = I² × R, thường chỉ vài chục mW.
  • Không có điện trở, LED nối thẳng vào 5 V sẽ lấy dòng rất lớn (chỉ bị giới hạn bởi điện trở trong của nguồn và của dây), sáng chói rồi hỏng trong tích tắc.

Với nguồn 3,3 V của ESP32, LED xanh dương hay trắng (Uf khoảng 3 V) chỉ còn khoảng 0,3 V cho điện trở: dòng phụ thuộc nhiều vào Uf thật của từng con và LED có thể sáng mờ. Khi cần LED trắng sáng rõ, cấp từ 5 V qua transistor (bài 19).

3. Nối nhiều LED

Ba cách nối: đúng là ba LED nối tiếp với một điện trở 150 Ω từ 12 V, cùng một dòng 20 mA; đúng là ba nhánh song song mỗi nhánh một điện trở 330 Ω và một LED từ 5 V; sai là ba LED song song dùng chung một điện trở 110 Ω, LED có Uf thấp nhất ăn gần hết dòng
Cách nối nhiều LED đúng và sai (hình tự vẽ).
  • Nối tiếp: các LED cùng một dòng, Uf cộng lại. Nguồn phải lớn hơn tổng Uf: ba LED trắng (khoảng 9 V) dùng được với nguồn 12 V, không dùng được với 5 V. Ít tốn điện nhất vì chỉ một điện trở.
  • Song song: mỗi LED (hoặc mỗi chuỗi nối tiếp) phải có điện trở riêng. Hai LED cùng loại vẫn có Uf lệch nhau vài chục mV; dùng chung một điện trở thì LED Uf thấp hơn nhận phần lớn dòng, sáng không đều và hỏng trước.
  • Dải LED 12 V bán sẵn đã có điện trở trên dải (mỗi cụm 3 LED nối tiếp một điện trở); chỉ cần cấp đúng 12 V.

4. LED nối với chân GPIO và chỉnh độ sáng

  • Chân GPIO của ESP32 nên chỉ cấp khoảng 10–20 mA mỗi chân và tổng các chân cũng có giới hạn. Một LED báo 5 mA cắm thẳng vào GPIO qua điện trở là ổn; nhiều LED hoặc LED công suất phải dùng transistor, MOSFET (bài 19, 20).
  • Muốn chỉnh độ sáng, không đổi điện áp mà dùng PWM: bật tắt LED rất nhanh (vài kHz), độ rộng xung càng lớn LED càng sáng; mắt thấy độ sáng trung bình. ESP32 có bộ LEDC tạo PWM trên hầu hết các chân.

5. LED RGB

Hai sơ đồ LED RGB: cathode chung với ba chân màu R, G, B qua ba điện trở nối GPIO, chân chung xuống GND, GPIO mức cao thì sáng; anode chung với chân chung lên 3V3, ba chân màu qua điện trở nối GPIO, GPIO mức thấp thì sáng
LED RGB cathode chung và anode chung (hình tự vẽ).
  • LED RGB là ba LED đỏ, xanh lá, xanh dương chung một vỏ, có 4 chân. Chân dài nhất là chân chung: loại cathode chung nối chân chung xuống GND, loại anode chung nối chân chung lên nguồn.
  • Mỗi màu cần một điện trở riêng; màu đỏ có Uf thấp hơn nên thường dùng điện trở lớn hơn hai màu còn lại để độ sáng cân hơn.
  • Trộn ba màu với độ sáng khác nhau ra hầu hết các màu: đỏ + xanh lá = vàng, đỏ + xanh dương = tím, cả ba = trắng (gần đúng, vì mắt nhạy với ba màu không bằng nhau).

6. Thí nghiệm: trộn màu LED RGB bằng ESP32

Chuẩn bị

  • ESP32 DevKit V1, breadboard, dây cắm.
  • Một LED RGB 5 mm cathode chung (loại anode chung cũng được, sửa một hằng số trong chương trình), điện trở 150 Ω và hai điện trở 100 Ω.
Sơ đồ: chân R của LED RGB qua điện trở 150 Ω vào GPIO25, chân G qua 100 Ω vào GPIO26, chân B qua 100 Ω vào GPIO27, chân chung cathode nối GND của ESP32
Sơ đồ nối LED RGB cathode chung (hình tự vẽ).

Với dòng khoảng 5–9 mA mỗi màu ở 3,3 V, ba chân GPIO nằm trong mức an toàn. Thứ tự chân LED RGB phổ biến: R, chung (dài nhất), G, B; nếu màu không đúng thì hoán đổi dây theo màu quan sát được.

Chương trình

/*
  PYWORLD.VN - Trộn màu LED RGB bằng PWM của ESP32: tự đổi qua 7 màu, hoặc gõ "r,g,b" (0-255) để chọn màu
  LED RGB cathode chung: chân chung -> GND; R qua 150 Ω vào GPIO25, G qua 100 Ω vào GPIO26, B qua 100 Ω vào GPIO27
  LED anode chung: chân chung -> 3V3 và đặt ANODE_CHUNG = true
*/

#define CHAN_R 25
#define CHAN_G 26
#define CHAN_B 27

const bool ANODE_CHUNG = false;   // LED anode chung: mức thấp mới sáng nên phải đảo độ rộng xung
const uint32_t TAN_SO_PWM = 5000;  // Hz, đủ cao để mắt không thấy nhấp nháy
const uint8_t DO_PHAN_GIAI = 8;    // 8 bit: độ rộng xung từ 0 đến 255

struct Mau {
  const char *ten;
  uint8_t r, g, b;
};

// Bảng màu mẫu; xanh lá và xanh dương thường sáng hơn đỏ nên giá trị nhỏ hơn cho màu trộn cân
const Mau BANG_MAU[] = {
  {"DO", 255, 0, 0},     {"CAM", 255, 60, 0},   {"VANG", 255, 150, 0}, {"LUC", 0, 255, 0},
  {"LAM", 0, 0, 255},    {"TIM", 180, 0, 255},  {"TRANG", 255, 200, 170},
};
const int SO_MAU = sizeof(BANG_MAU) / sizeof(BANG_MAU[0]);

bool tuDoiMau = true;
int chiSo = 0;
uint32_t lanDoiCuoi = 0;
String dongNhan = "";

void datMau(uint8_t r, uint8_t g, uint8_t b) {
  if (ANODE_CHUNG) {
    r = 255 - r;
    g = 255 - g;
    b = 255 - b;
  }
  ledcWrite(CHAN_R, r);
  ledcWrite(CHAN_G, g);
  ledcWrite(CHAN_B, b);
}

// Xử lý một dòng lệnh: "r,g,b" chọn màu cố định, "c" quay lại tự đổi màu
void xuLyLenh(const String &lenh) {
  int r, g, b;
  if (lenh == "c") {
    tuDoiMau = true;
    Serial.println("Quay lai che do tu doi mau");
  } else if (sscanf(lenh.c_str(), "%d,%d,%d", &r, &g, &b) == 3) {
    tuDoiMau = false;
    r = constrain(r, 0, 255);
    g = constrain(g, 0, 255);
    b = constrain(b, 0, 255);
    datMau(r, g, b);
    Serial.printf("Mau tu chon: R=%d G=%d B=%d\n", r, g, b);
  } else {
    Serial.println("Lenh khong hop le. Vi du: 255,80,0 hoac c");
  }
}

void setup() {
  Serial.begin(115200);
  ledcAttach(CHAN_R, TAN_SO_PWM, DO_PHAN_GIAI);
  ledcAttach(CHAN_G, TAN_SO_PWM, DO_PHAN_GIAI);
  ledcAttach(CHAN_B, TAN_SO_PWM, DO_PHAN_GIAI);
  datMau(0, 0, 0);
  delay(300);
  Serial.println("LED RGB: tu doi 7 mau. Go r,g,b (0-255) de chon mau, go c de tu doi lai");
}

void loop() {
  while (Serial.available()) {
    char c = Serial.read();
    if (c == '\n' || c == '\r') {
      if (dongNhan.length() > 0) {
        xuLyLenh(dongNhan);
        dongNhan = "";
      }
    } else {
      dongNhan += c;
    }
  }
  if (tuDoiMau && millis() - lanDoiCuoi > 1500) {
    lanDoiCuoi = millis();
    const Mau &m = BANG_MAU[chiSo];
    datMau(m.r, m.g, m.b);
    Serial.printf("Mau %-5s R=%3u G=%3u B=%3u\n", m.ten, m.r, m.g, m.b);
    chiSo = (chiSo + 1) % SO_MAU;
  }
}
  • ledcAttach(chân, 5000, 8) gắn một kênh PWM 5 kHz, độ phân giải 8 bit cho mỗi chân; ledcWrite(chân, 0…255) đặt độ rộng xung, tức độ sáng của màu đó.
  • Bảng BANG_MAU chứa 7 màu mẫu; chương trình đổi màu mỗi 1,5 giây. Màu vàng, cam dùng ít xanh lá hơn đỏ vì xanh lá trông sáng hơn với mắt.
  • Gõ một dòng dạng 255,80,120 vào Serial Monitor (chọn chế độ gửi kèm xuống dòng) để đặt màu tùy ý; gõ c để quay lại tự đổi màu.
  • LED anode chung: đặt ANODE_CHUNG = true, chương trình đảo độ rộng xung vì chân GPIO ở mức thấp thì màu đó mới sáng.

Kết quả mong đợi

Hình minh họa Serial Monitor: dòng giới thiệu, sau đó lần lượt các màu DO, CAM, VANG, LUC, LAM, TIM, TRANG với giá trị R, G, B tương ứng, dòng Mau tu chon R=255 G=80 B=120 sau khi gõ lệnh và dòng Quay lai che do tu doi mau sau khi gõ c
Kết quả mong đợi trên Serial Monitor (hình minh họa theo bảng màu và định dạng của chương trình).

LED đổi màu theo bảng; nhìn qua một tờ giấy mỏng sẽ thấy màu trộn đều hơn vì ba chip nằm cách nhau một chút. Màu trắng có thể ngả xanh hoặc hồng tùy LED; chỉnh lại giá trị của màu TRANG trong bảng cho vừa mắt.

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

Hiện tượngNguyên nhân thường gặpCách xử lý
LED không sángCắm ngược chân; LED RGB loại anode chung nhưng nối chân chung xuống GNDĐảo chiều LED; xác định loại LED bằng thang diode
Màu saiNhầm thứ tự chân màuHoán đổi dây theo màu quan sát được
Màu xanh dương rất mờUf của LED xanh gần 3,3 VGiảm điện trở màu xanh (tối thiểu khoảng 47 Ω) hoặc cấp 5 V qua transistor
Gõ lệnh không có phản ứngSerial Monitor không gửi ký tự xuống dòngChọn "New Line" hoặc "Both NL & CR" ở ô cuối dòng

8. Xem thêm


Tin tức liên quan

HX711 với load cell và LCD 1602 bằng MicroPython
HX711 với load cell và LCD 1602 bằng MicroPython

Hướng dẫn ESP32 đọc load cell qua HX711 và hiển thị LCD 1602 bằng MicroPython, gồm đấu dây, hiệu chuẩn và xử lý lỗi.

Đặt gia công xốp chống sốc theo yêu cầu: cần chuẩn bị gì, quy trình ra sao
Đặt gia công xốp chống sốc theo yêu cầu: cần chuẩn bị gì, quy trình ra sao

Hướng dẫn đặt gia công xốp chống sốc theo yêu cầu tại PYWORLD: lập bảng kê thiết bị, đo kích thước, đọc bản bố trí khoang, chọn vali và năm bước từ gửi thông tin đến lắp thử.

Chuẩn chiều dài: căn mẫu song phẳng ISO 3650, giao thoa laser và nhiệt độ tham chiếu 20 °C
Chuẩn chiều dài: căn mẫu song phẳng ISO 3650, giao thoa laser và nhiệt độ tham chiếu 20 °C

Mét được hiện thực ra sao, căn mẫu song phẳng và các cấp K, 0, 1, 2 theo ISO 3650, hiệu chuẩn căn mẫu bằng giao thoa và so sánh, giao thoa laser cho máy CNC và vì sao đo ở 20 °C.

Hiệu chuẩn cảm biến laser đo khoảng cách và extensometer theo ISO 9513: bề mặt, cấp và sai số lệch
Hiệu chuẩn cảm biến laser đo khoảng cách và extensometer theo ISO 9513: bề mặt, cấp và sai số lệch

Hiệu chuẩn cảm biến laser tam giác lượng và extensometer: ảnh hưởng của bề mặt, trình tự trên bàn trượt, bảng cấp ISO 9513 với giới hạn tương đối và tuyệt đối, ví dụ extensometer 50 mm.

RS-485 là gì: cặp dây vi sai, điện trở đầu cuối và cách dùng module MAX485 với ESP32
RS-485 là gì: cặp dây vi sai, điện trở đầu cuối và cách dùng module MAX485 với ESP32

Giải thích chuẩn RS-485: tín hiệu vi sai trên hai dây A, B, điện trở đầu cuối 120 Ω, truyền bán song công với chân DE, RE. Kèm sơ đồ nối module MAX485 và chương trình hỏi đáp giữa hai mạch ESP32.

Tự lắp máy khắc laser diode mini: khung nhôm, dây đai, tiêu cự và cài GRBL
Tự lắp máy khắc laser diode mini: khung nhôm, dây đai, tiêu cự và cài GRBL

Các bước tự lắp máy khắc laser diode khung hở vùng khắc 400 × 400 mm: tính thanh nhôm, vật tư, lắp khung và hai trục, luồn đai GT2, đi dây, tìm tiêu cự, cài GRBL, chạy thử.

Tư duy máy tính (tư duy lập trình) là gì? 4 kỹ năng với ví dụ đời thường cho trẻ
Tư duy máy tính (tư duy lập trình) là gì? 4 kỹ năng với ví dụ đời thường cho trẻ

Tư duy máy tính, hay tư duy lập trình, gồm bốn kỹ năng: phân rã, nhận dạng mẫu, trừu tượng hóa và thuật toán. Bài giải thích bằng ví dụ đời thường và gợi ý hoạt động cho trẻ.

Op-amp: so sánh, khuếch đại không đảo, mạch đệm và đo hệ số khuếch đại bằng ESP32
Op-amp: so sánh, khuếch đại không đảo, mạch đệm và đo hệ số khuếch đại bằng ESP32

Op-amp là gì, hai quy tắc tính mạch, mạch so sánh với quang trở, mạch đệm, khuếch đại không đảo và đảo, giới hạn của LM358 ở 3,3 V và thí nghiệm đo hệ số khuếch đại, bão hòa bằng ESP32.


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