Bài 1 · Công nghệ · Tin học
LED nhấp nháy
một chân, hai trạng thái, và khái niệm thời gian
Bài mở đầu của cả lộ trình. Chỉ một con LED năm trăm đồng, nhưng nó dạy trọn ba thứ mà mọi dự án về sau đều dùng lại: chân ra số, vòng lặp, và thời gian.
01 Mục tiêu và yêu cầu cần đạt
LED nhấp nháy là thứ nhỏ nhất mà học sinh nhìn thấy được chương trình của mình đang chạy: một đốm sáng bật tắt đúng theo con số vừa gõ.
Sau bài này học sinh làm được
- Nối LED vào chân GPIO qua điện trở hạn dòng, đúng chiều.
- Giải thích vì sao phải có điện trở và chọn được giá trị hợp lí.
- Phân biệt
on()/off()là lệnh, cònsleep_ms()là khoảng dừng giữa hai lệnh. - Dự đoán nhịp sáng khi đổi con số, rồi kiểm chứng bằng mắt.
- Công nghệ 12 — Vi điều khiển: xuất tín hiệu số điều khiển thiết bị.
- Tin học 10–11 — cấu trúc lặp, biến, thứ tự thực hiện lệnh.
Trích nguyên văn yêu cầu cần đạt từ Phụ lục Thông tư 32/2018 trước khi đưa vào kế hoạch bài dạy.
02 Lí thuyết
Chân GPIO là một công tắc do chương trình gạt
Bật thì ESP32 nối chân 23 vào 3,3 V, tắt thì nối xuống 0 V. Chỉ hai mức, không có mức giữa — nên gọi là tín hiệu số.
Vì sao phải có điện trở
LED không phải điện trở mà là linh kiện có ngưỡng: dưới ~1,8 V gần như không dẫn, vượt ngưỡng thì dòng tăng vọt. Nối thẳng vào 3,3 V, dòng chỉ bị chặn bởi điện trở nội rất nhỏ — vượt xa mức an toàn.
Điện trở 220 Ω gánh phần điện áp thừa. LED đỏ sụt ~1,8 V, còn 3,3 − 1,8 = 1,5 V đặt lên điện trở, cho dòng 1,5 / 220 ≈ 6,8 mA. Chân GPIO chịu được ~12 mA, LED 5 mm sáng rõ từ 5 mA — 220 Ω nằm gọn trong vùng an toàn của cả hai.
Thay bằng 1 kΩ thì dòng còn 1,5 mA — LED sáng nhưng mờ hẳn. Thay bằng 100 Ω thì dòng lên 15 mA — sáng hơn nhưng đã vượt ngưỡng chân GPIO. Cho học sinh tính trước khi cắm, rồi cắm thử để đối chiếu.
Khoảng dừng mới làm nên nhấp nháy
Nếu chỉ "bật rồi tắt", máy chạy nhanh đến mức mắt người thấy LED sáng mờ liên tục. Thứ tạo ra nhấp nháy là khoảng dừng giữa hai lệnh, không phải bản thân lệnh bật tắt. Đây là ý học sinh hay bỏ qua nhất.
03 Linh kiện
| Linh kiện | Mô tả, lưu ý khi mua | Số lượng · giá |
|---|---|---|
| ESP32 DevKit V1 | Bo 30 chân, cổng micro-USB hoặc Type-C | 1 · 90–150k |
| LED 5 mm | Màu gì cũng được. Đỏ và vàng sáng rõ hơn xanh dương ở cùng dòng điện | 1 · 500đ |
| Điện trở 220 Ω | Vạch màu: đỏ – đỏ – nâu – vàng kim. Xem hộp an toàn bên dưới | 1 · 200đ |
| Breadboard và dây cắm | Loại 400 lỗ là đủ | 1 bộ · 30k |
04 Lắp mạch và sơ đồ nối dây
| Khối | Nối dây | Nguồn |
|---|---|---|
| LED | GPIO23 → điện trở 220 Ω → chân dài (+) · chân ngắn (−) → GND | Lấy từ chính chân GPIO |
Sơ đồ mạch: từ GPIO23 đi qua điện trở 220 Ω rồi vào chân dài của LED; chân ngắn về GND. Chiếu sơ đồ này lên bảng trong lúc cả lớp cắm mạch.
Chính mạch ấy khi đã cắm xong: dây vàng ở chân D23 chạy qua điện trở tới LED, dây còn lại đưa chân kia của LED về GND. Đèn nguồn đỏ trên bo đang sáng vì cáp USB đã cắm — nhưng LED vàng thì chưa, vì chưa nạp chương trình.
Bốn bước lắp
- Cắm LED lên breadboard. Chân dài là cực dương (+), chân ngắn là cực âm (−). Nếu hai chân đã bị cắt bằng nhau, nhìn vào vỏ nhựa: phía cực âm có một mặt vát phẳng.
- Cắm một đầu điện trở 220 Ω vào cùng hàng với chân dài của LED.
- Nối đầu còn lại của điện trở sang
GPIO23bằng dây trắng. - Nối chân ngắn của LED xuống
GNDbằng dây đen.
LED chỉ dẫn điện theo một chiều. Cắm ngược thì mạch coi như hở: LED không sáng, không nóng, không hỏng, và không báo lỗi gì hết. Học sinh sẽ ngồi soi lại chương trình trong mười phút trong khi lỗi nằm ở chỗ khác.
Cách chữa nhanh nhất khi cả nhóm bí: rút LED ra, xoay ngược 180°, cắm lại. Mất năm giây, và loại được ngay một nửa số nguyên nhân.
Nối thẳng LED vào GPIO vẫn sáng, sáng rất đẹp là đằng khác — nên học sinh rất dễ kết luận rằng con điện trở là thừa. Nhưng chân GPIO khi đó phải chịu dòng vượt mức thiết kế. Kiểu hỏng thường gặp không phải là cháy cả bo mà là chết đúng một chân: bo vẫn nạp được, chương trình vẫn chạy, chỉ mỗi chân đó không điều khiển được gì nữa.
Đó là kiểu hỏng khó chịu nhất vì nó không lộ ra ngay. Vài buổi sau, khi nhóm dùng lại đúng bo đó cho bài khác, cả nhóm sẽ đi tìm lỗi ở chỗ không có lỗi.
05 Mã nguồn
Toàn bộ mã trong bài chạy trên MicroPython 1.28 cho ESP32. Chép vào bo rồi đổi tên thành main.py là chạy mỗi lần cấp nguồn.
Bước 0 — kiểm tra mạch trước đã# ------------------------------------------------------------
# Bai 1 - Kiem tra mach truoc khi lam gi khac
# Chi bat LED va giu nguyen. Sang la mach dung.
# ------------------------------------------------------------
from machine import Pin
led = Pin(23, Pin.OUT)
led.on() Ba dòng, không có vòng lặp. Nạp vào và LED phải sáng liên tục. Nếu bước này chưa sáng thì đừng viết tiếp dòng nào — lỗi đang nằm ở mạch chứ không nằm ở chương trình.
Chương trình chính — LED nhấp nháy# ------------------------------------------------------------
# Bai 1 - LED nhap nhay
# Phan cung: GPIO23 -> dien tro 220 ohm -> chan dai LED
# chan ngan LED -> GND
# ------------------------------------------------------------
from machine import Pin
import time
# ===== CẤU HÌNH =====
CHAN_LED = 23 # LED cam o GPIO23
THOI_GIAN_SANG = 1000 # ms - LED sang bao lau
THOI_GIAN_TAT = 1000 # ms - LED tat bao lau
# ====================
led = Pin(CHAN_LED, Pin.OUT)
while True:
led.on()
time.sleep_ms(THOI_GIAN_SANG)
led.off()
time.sleep_ms(THOI_GIAN_TAT)
Hai dòng THOI_GIAN_SANG và THOI_GIAN_TAT tách riêng
ra đầu chương trình là có chủ ý. Học sinh sẽ sửa hai con số này rất nhiều lần
trong tiết, và chúng phải ở chỗ dễ tìm, không lẫn trong thân vòng lặp.
# Them mot bien dem de thay chuong trinh dang chay den vong thu may
from machine import Pin
import time
CHAN_LED = 23
led = Pin(CHAN_LED, Pin.OUT)
lan = 0
while True:
lan = lan + 1
led.on()
time.sleep_ms(1000)
led.off()
time.sleep_ms(1000)
print("Da nhay", lan, "lan") Cửa sổ dòng lệnh in ra:
Da nhay 1 lan Da nhay 2 lan Da nhay 3 lan Da nhay 4 lan
Bản này chuẩn bị sẵn cho Bài 4 "Đếm số lần nhấn nút": khái niệm biến đếm đã xuất hiện ở đây, trong một hoàn cảnh học sinh đã hiểu rõ.
Em mô tả bằng tiếng Việt, hệ thống dựng thuật toán và chương trình, rồi nạp thẳng xuống ESP32 qua Wi-Fi.
06 Hiệu chuẩn và kiểm thử
Đo lại xem máy có đếm thời gian đúng không
Bài này có một phép kiểm tra rất gọn mà học sinh làm được ngay bằng điện thoại.
- Đặt
THOI_GIAN_SANGvàTHOI_GIAN_TATcùng bằng 1000. - Bấm đồng hồ bấm giờ trên điện thoại, đếm đúng 30 lần nháy.
- Chia thời gian đo được cho 30. Kết quả phải rất gần 2 giây.
Sai lệch thường dưới 1%. Phần chênh đến từ thời gian chạy các lệnh khác trong vòng lặp — rất nhỏ so với một giây, nhưng có thật. Đây là lần đầu học sinh gặp ý niệm "chương trình cũng tốn thời gian để chạy", và nó sẽ quay lại ở mọi bài đo.
Danh sách kiểm trước khi coi là xong
- Bước 0 làm LED sáng liên tục.
- Chương trình chính cho nhịp nháy đều, sáng và tắt bằng nhau.
- Đổi
THOI_GIAN_SANGthành 200 thì thấy rõ sáng ngắn – tắt dài. - Đặt cả hai xuống 20 ms thì LED nhìn như sáng liên tục, và học sinh giải thích được vì sao.
- Rút dây GND ra thì LED tắt — hiểu rằng mạch phải kín mới có dòng.
07 Kinh nghiệm và cạm bẫy
Phần đáng giá nhất của tiết học này không nằm ở lúc LED nháy đúng, mà ở lúc cho học sinh giảm dần thời gian: 1000, rồi 500, 200, 100, 50, 20. Đến khoảng 20–30 ms thì mắt không còn tách được từng lần nháy nữa; LED trông như sáng liên tục nhưng mờ đi.
Hãy để các em tự tìm ra ngưỡng đó thay vì nói trước. Mỗi em một ngưỡng hơi khác nhau, và chính sự khác nhau ấy là cửa vào cho khái niệm hiện tượng lưu ảnh của mắt — thứ đứng sau màn hình, đèn LED chiếu sáng và cả phim ảnh.
- LED không sáng, chương trình không báo lỗi. Gần như luôn là cắm ngược LED, hoặc dây GND cắm nhầm hàng trên breadboard. Chạy lại Bước 0 để tách bạch mạch và chương trình.
- LED sáng mờ liên tục thay vì nháy. Thời gian chờ đang quá
nhỏ, hoặc học sinh quên hẳn dòng
sleep_ms. Đây là lỗi tốt — nó dẫn thẳng vào ý chính của bài. - Chương trình chạy một lần rồi thôi. Bốn dòng trong thân
vòng lặp bị thụt lề sai nên nằm ngoài
while True:. Trong Python, lề không phải để cho đẹp — nó là cú pháp.
Bài học thì xong nhanh, nhưng khâu nạp chương trình vào bo suýt làm hỏng cả
buổi. Bo DevKit cứ báo Invalid head of packet rồi dừng, trong khi
cũng trang đó nạp cho bo ESP32-C3 thì trơn tru. Chúng tôi đi tìm lỗi ở máy
chủ, ở gói chương trình, ở trình duyệt — sai chỗ hết.
Nguyên nhân thật nằm ở mạch tự khởi động lại của bo. Bo DevKit rẻ tiền dùng mạch hai transistor để tự đưa chip vào chế độ nạp, và mạch đó hay yếu. Bo C3 thì cắm thẳng USB vào chip nên không có khâu này để mà hỏng.
Bài học rút ra, xin thầy cô nhớ giúp: nếu bo DevKit không chịu nạp, hãy đưa nó vào chế độ nạp bằng tay — giữ nút BOOT, nhấn thả nút EN, rồi thả BOOT, đèn sẽ ngừng nháy, và bấm nạp ngay trong vài giây sau đó. Mẹo này cứu được gần như mọi bo bướng. Và với bài STEM, cả bộ chỉ phải làm việc đó đúng một lần: từ lần sau chương trình đi qua Wi-Fi.
Hộp trên viết từ quá trình dựng và chạy thử bài, chưa phải chuyện trên lớp. Sau buổi dạy đầu tiên, xin thầy cô thêm một tình huống đã thực sự xảy ra với học sinh mình — đó mới là thứ đồng nghiệp đọc để tránh.
08 Ứng dụng trong dạy học
Công nghệ — viên gạch đầu tiên của mạch điều khiển
Cả mạch nội dung Vi điều khiển đứng trên đúng một ý: chương trình đặt mức điện áp lên một chân, chân đó điều khiển một thiết bị. LED ở đây thay cho relay, quạt, bơm hay động cơ ở các bài sau. Đổi thiết bị thì đổi cách nối, còn dòng lệnh gần như giữ nguyên — hãy nói rõ điều đó với học sinh ngay từ bài này.
Tin học — vòng lặp có thật trước mắt
Trên giấy, while True: là một khái niệm trừu tượng. Ở đây nó là
một con đèn không chịu tắt. Cho học sinh xóa thử dòng while True:
và thụt lề lại cho đúng: LED nháy đúng một lần rồi thôi. Không có cách giải
thích nào về vòng lặp gọn hơn thế.
Hoạt động 1 — Xác định vấn đề. Góc học nhóm trong lớp cần một đèn báo ba trạng thái nhìn từ xa là hiểu: đang trống, đang họp, và sắp hết giờ.
Tiêu chí sản phẩm: ba nhịp nháy phân biệt được từ cuối lớp; chỉ dùng một LED; một bạn chưa được giải thích trước phải đoán đúng cả ba nhịp.
Hoạt động 2 — Kiến thức nền. Chân ra số; điện trở hạn dòng; vòng lặp và thời gian; ngưỡng mắt người nhận ra được nhấp nháy.
Hoạt động 3 — Đề xuất và chọn phương án. Mỗi nhóm vẽ ba nhịp lên giấy kẻ ô thời gian trước khi lập trình, và giải thích vì sao chọn nhịp đó cho trạng thái đó.
Hoạt động 4 — Chế tạo và thử. Lập trình, đứng ở cuối lớp nhìn lại, chỉnh thời gian cho tới khi phân biệt được.
Hoạt động 5 — Báo cáo và điều chỉnh. Mời nhóm khác đoán. Nhóm bị đoán sai phân tích nguyên nhân rồi sửa nhịp.
- Ghép nút nhấn của Bài 2 để đổi nhịp mà không cần nạp lại chương trình.
- Thêm hai LED nữa thành đèn giao thông ba màu của Bài 3.
- Thay
on()/off()bằng PWM của Bài 8 để đèn sáng dần và tối dần thay vì bật tắt dứt khoát. - Hướng thi Khoa học kĩ thuật: đèn báo hiệu cho người khiếm thính, quy ước nhịp nháy thay cho chuông báo trong nhà.