Dùng transistor làm công tắc: tính điện trở base, bật tải 5 V, 12 V từ ESP32
Mạch transistor NPN đóng cắt phía thấp, bốn bước tính điện trở base, diode dập cho relay và động cơ, cách biết transistor bão hòa, thí nghiệm ESP32 so sánh đủ và thiếu dòng base.
Chân GPIO của ESP32 chỉ cho ra 3,3 V và khoảng 10–20 mA: đủ cho một LED báo, nhưng không đủ cho cuộn relay, quạt mini, dải LED 12 V hay còi. Cách đơn giản nhất để "khuếch đại" chân GPIO là dùng một transistor NPN làm công tắc. Bài viết hướng dẫn mạch NPN đóng cắt phía thấp, bốn bước tính điện trở base, diode dập cho tải cuộn dây, cách biết transistor đã bão hòa hay chưa, rồi làm thí nghiệm với ESP32 so sánh ba trạng thái: tắt, đủ dòng base và thiếu dòng base, đo điện áp UCE để thấy sự khác nhau.
1. Vì sao cần transistor giữa GPIO và tải
| Tải | Điện áp, dòng điển hình | Cắm thẳng vào GPIO được không |
|---|---|---|
| LED báo qua điện trở | 3,3 V, 2–10 mA | Được |
| Cuộn relay 5 V | 5 V, 70–90 mA | Không: sai điện áp, quá dòng, có điện áp cảm ứng |
| Quạt mini, động cơ nhỏ 5 V | 5 V, 100–300 mA | Không |
| Dải LED 12 V | 12 V, vài trăm mA trở lên | Không: chân chỉ chịu 3,3 V |
Transistor cho phép dòng nhỏ từ chân GPIO (vài mA) điều khiển dòng lớn hơn nhiều ở mạch tải, và mạch tải có thể dùng nguồn riêng, điện áp cao hơn (5 V, 12 V), miễn là chung GND với ESP32.
2. Mạch NPN đóng cắt phía thấp

- Tải nối giữa nguồn dương và collector; transistor nằm ở phía GND ("phía thấp"). Khi transistor dẫn, collector bị kéo gần xuống 0 V và tải có gần đủ điện áp nguồn.
- RB giới hạn dòng base, đồng thời giới hạn dòng ra của chân GPIO. Không có RB, tiếp giáp B–E như một diode nối thẳng vào chân GPIO, dòng sẽ quá lớn.
- Điện trở 10 kΩ từ base xuống GND giữ transistor tắt chắc chắn khi chân GPIO chưa được cấu hình (lúc ESP32 khởi động, đang nạp chương trình).
- Emitter nối thẳng GND, và GND của nguồn tải phải nối chung với GND của ESP32; thiếu dây GND chung thì dòng base không có đường về.
3. Tính điện trở base

- Dòng tải IC: lấy theo thông số tải hoặc tính U / R; tốt nhất đo bằng đồng hồ vạn năng.
- Dòng base tối thiểu: IB = IC / βmin. Lấy β nhỏ nhất trong datasheet ở dòng tương ứng (β giảm khi dòng lớn).
- Nhân thêm 2–5 lần để transistor chắc chắn bão hòa dù β thật thấp hơn hay tải lấy nhiều dòng hơn.
- RB = (UGPIO − UBE) / IB = (3,3 − 0,7) / IB, chọn giá trị E12 nhỏ hơn gần nhất.
Ví dụ relay 5 V lấy 70 mA, dùng S8050 với βmin = 100: IB tối thiểu 0,7 mA, nhân 3 được 2,1 mA, RB = 2,6 V / 2,1 mA ≈ 1238 Ω, chọn 1,2 kΩ (hoặc 1 kΩ). Giá trị 1 kΩ dùng được cho phần lớn tải dưới khoảng 150 mA với transistor tín hiệu. Khi tính ra dòng base trên khoảng 10 mA (tải vài trăm mA), chân GPIO sẽ quá tải: chuyển sang MOSFET logic-level (bài 20) hoặc transistor Darlington.
4. Tải là cuộn dây: bắt buộc có diode dập

Cuộn relay, động cơ, van điện từ tạo ra điện áp cảm ứng rất cao khi bị ngắt dòng đột ngột (bài 13). Nối một diode ngược song song với tải, cathode về phía nguồn dương: 1N4007 cho relay, 1N5819 hoặc diode nhanh cho động cơ đóng cắt bằng PWM. Thiếu diode, transistor có thể chết sau vài lần đóng cắt, hoặc ESP32 bị khởi động lại do nhiễu.
5. Biết transistor đã bão hòa chưa
- Đo điện áp giữa collector và emitter khi đang bật. UCE khoảng 0,1–0,3 V: transistor bão hòa, công tắc đóng tốt.
- UCE từ vài phần mười vôn tới vài vôn: transistor đang ở vùng khuếch đại vì thiếu dòng base. Tải không đủ điện áp, còn transistor tỏa nhiệt P = UCE × IC, có thể nóng tới mức hỏng.
- Ví dụ tải 50 mA: bão hòa với UCE = 0,1 V, transistor chỉ tỏa 5 mW; nếu thiếu dòng base để UCE = 3 V, transistor tỏa 150 mW, gấp 30 lần.
6. Thí nghiệm: tắt, đủ dòng base và thiếu dòng base
Thí nghiệm dùng hai đường vào base: GPIO26 qua 1 kΩ (dòng base khoảng 2,6 mA, đủ để bão hòa) và GPIO27 qua 47 kΩ (dòng base chỉ khoảng 55 µA, thiếu). ESP32 lần lượt chuyển qua ba trạng thái và đo UCE qua một cầu phân áp, tính dòng tải và công suất transistor tỏa ra.
Chuẩn bị
- ESP32 DevKit V1, breadboard, dây cắm.
- Transistor NPN 2N2222A (hoặc S8050), điện trở 1 kΩ, 47 kΩ, hai điện trở 10 kΩ, một điện trở 100 Ω loại 1/2 W làm tải (dòng khoảng 50 mA ở 5 V).

| Linh kiện | Nối |
|---|---|
| Điện trở tải 100 Ω | Từ VIN (5 V) tới collector |
| Transistor 2N2222A | Emitter vào GND (kiểm tra thứ tự chân theo datasheet, bài 18) |
| Điện trở 1 kΩ | Từ GPIO26 tới base |
| Điện trở 47 kΩ | Từ GPIO27 tới base |
| Hai điện trở 10 kΩ nối tiếp | Từ collector xuống GND; điểm giữa vào GPIO34 |
Chương trình
/*
PYWORLD.VN - Transistor NPN làm công tắc với ESP32: so sánh tắt, đủ dòng base (bão hòa) và thiếu dòng base
Tải 100 Ω nối từ VIN (5 V) xuống collector; emitter xuống GND. GPIO26 qua 1 kΩ và GPIO27 qua 47 kΩ cùng vào base
Đo UCE qua cầu phân áp 10 kΩ / 10 kΩ từ collector vào GPIO34
*/
#define CHAN_RB_NHO 26 // qua 1 kΩ: dòng base đủ lớn
#define CHAN_RB_LON 27 // qua 47 kΩ: dòng base quá nhỏ
#define CHAN_DO_UCE 34
const float U_NGUON_MV = 5000.0; // Điện áp chân VIN; đo bằng đồng hồ vạn năng rồi sửa (thường 4,7–5,0 V)
const float R_TAI = 100.0; // Ôm, điện trở tải
const float HE_SO_CAU = 2.0; // Cầu 10 kΩ / 10 kΩ chia đôi điện áp collector
const int SO_LAN_DOC = 32;
int trangThai = 0; // 0: tắt, 1: đủ dòng base, 2: thiếu dòng base
float docUceMv() {
uint32_t tong = 0;
for (int i = 0; i < SO_LAN_DOC; i++) {
tong += analogReadMilliVolts(CHAN_DO_UCE);
}
return (float)tong / SO_LAN_DOC * HE_SO_CAU;
}
void datTrangThai(int tt) {
if (tt == 0) { // Cả hai chân ở mức thấp: không có dòng base, transistor tắt
pinMode(CHAN_RB_NHO, OUTPUT);
digitalWrite(CHAN_RB_NHO, LOW);
digitalWrite(CHAN_RB_LON, LOW);
} else if (tt == 1) { // Base qua 1 kΩ: IB ≈ (3,3 − 0,7) / 1000 ≈ 2,6 mA
pinMode(CHAN_RB_NHO, OUTPUT);
digitalWrite(CHAN_RB_NHO, HIGH);
digitalWrite(CHAN_RB_LON, LOW);
} else { // Chỉ qua 47 kΩ: IB ≈ 55 µA; GPIO26 để hở để không kéo base xuống
pinMode(CHAN_RB_NHO, INPUT);
digitalWrite(CHAN_RB_LON, HIGH);
}
}
void setup() {
Serial.begin(115200);
analogReadResolution(12);
pinMode(CHAN_RB_LON, OUTPUT);
datTrangThai(0);
delay(300);
Serial.println("Transistor lam cong tac: tat / du dong base / thieu dong base");
}
void loop() {
datTrangThai(trangThai);
delay(300); // Chờ ổn định rồi mới đo
float uce = docUceMv();
float dongTaiMa = (U_NGUON_MV - uce) / R_TAI; // Dòng qua tải = điện áp trên tải / R tải
float congSuatMw = uce * dongTaiMa / 1000.0; // Công suất transistor tỏa ra = UCE × IC
const char *ten[] = {"TAT ", "DU DONG BASE ", "THIEU DONG B."};
Serial.printf("%s | UCE = %5.2f V | IC ~ %5.1f mA | P transistor ~ %5.1f mW\n", ten[trangThai], uce / 1000.0,
dongTaiMa < 0 ? 0.0 : dongTaiMa, congSuatMw < 0 ? 0.0 : congSuatMw);
trangThai = (trangThai + 1) % 3;
delay(1700);
}
- Trạng thái tắt: cả hai chân ở mức thấp, không có dòng base.
- Trạng thái đủ dòng base: GPIO26 lên 3,3 V, dòng qua 1 kΩ khoảng (3,3 − 0,7) / 1000 ≈ 2,6 mA, gấp khoảng 5 lần mức cần cho tải 50 mA.
- Trạng thái thiếu dòng base: chỉ GPIO27 lên 3,3 V, dòng qua 47 kΩ khoảng 55 µA. GPIO26 được chuyển sang chế độ đầu vào (hở) để không kéo base xuống qua 1 kΩ.
- Chương trình đo UCE (nhân đôi số đọc của cầu phân áp), tính dòng tải IC = (U nguồn − UCE) / R tải và công suất transistor P = UCE × IC.
Kết quả mong đợi

- Khi đủ dòng base, UCE chỉ khoảng 0,1 V: gần như toàn bộ 5 V đặt lên tải, transistor gần như không nóng. ADC của ESP32 đọc kém ở vùng gần 0 V nên số này chỉ gần đúng; đo bằng đồng hồ vạn năng để so.
- Khi thiếu dòng base, dòng tải chỉ khoảng β × 55 µA (với β khoảng 200 là 11 mA), UCE lên gần 4 V, transistor tỏa nhiệt gấp nhiều lần dù tải nhận ít điện hơn. Con số này đổi theo β thật của từng con transistor: đó chính là lý do khi làm công tắc phải dư dòng base, không dựa vào β.
7. PNP, Darlington, MOSFET: khi nào dùng
- PNP phía cao (giữa nguồn và tải) khi tải phải nối GND cố định. Với nguồn tải cao hơn 3,3 V, base PNP cần một transistor NPN điều khiển thêm, vì chân 3,3 V không kéo base lên tới nguồn tải được.
- Darlington (TIP120, mảng ULN2003) có β hàng nghìn nên dòng base rất nhỏ; đổi lại UCE bão hòa khoảng 0,8–1 V, tỏa nhiệt nhiều hơn.
- MOSFET logic-level điều khiển bằng điện áp, gần như không lấy dòng ở cổng, điện trở dẫn rất nhỏ: lựa chọn tốt nhất cho tải vài trăm mA tới vài ampe và cho PWM (bài 20).
- Muốn bật tắt tải 220 V thì dùng relay hoặc module relay (bài 14), không dùng transistor trực tiếp.
8. Xử lý lỗi thường gặp
| Hiện tượng | Nguyên nhân thường gặp | Cách xử lý |
|---|---|---|
| Tải không chạy, UCE luôn gần 5 V | Sai thứ tự chân transistor; thiếu dây GND chung | Tra datasheet đúng mã; nối GND chung |
| Tải chạy yếu, transistor nóng | Thiếu dòng base (RB quá lớn) hoặc tải vượt khả năng transistor | Giảm RB; dùng transistor lớn hơn hoặc MOSFET |
| Tải luôn chạy, không tắt | Transistor bị chập; nhầm C và E | Đo transistor bằng thang diode (bài 18) |
| ESP32 khởi động lại khi tải bật | Sụt nguồn USB, nhiễu từ tải cuộn dây, thiếu diode dập | Thêm diode dập, tụ 100–470 µF ở nguồn tải; dùng nguồn tải riêng |
9. Xem thêm
- Động cơ bước với ULN2003: mảng transistor Darlington điều khiển cuộn dây.
- ESP32 điều khiển module relay: module đã có transistor, diode, LED báo.
- Chủ đề relay và điều khiển tải trong Góc kỹ thuật.
- Bài tiếp theo của loạt điện tử căn bản: MOSFET logic-level và điều khiển tải dòng lớn bằng PWM.
Xem thêm