Lab.Vatli365
← Cấp độ 2 · Tín hiệu tương tự và PWM

Bài 8 · Vật lí · Toán · Công nghệ

Điều chỉnh độ sáng LED bằng PWM
vẫn chỉ bật và tắt, nhưng nhanh đến mức mắt bị đánh lừa

Chân GPIO chỉ có hai mức, không có mức giữa. Vậy làm sao đèn sáng được 30 phần trăm? Câu trả lời là một mẹo rất đẹp, và nó đứng sau độ sáng màn hình, tốc độ quạt, và cả bộ điều tốc xe điện.

Thời lượng
1 tiết (45 phút)
Chi phí một nhóm
≈ 2 nghìn đồng (chưa tính bo)
Cấp độ
2 / 12
Trạng thái
Đã có phần cứng, đang hoàn thiện
01

Mục tiêu và yêu cầu cần đạt

Hãy mở đầu bằng một câu hỏi có vẻ vô lí. Chân GPIO chỉ xuất ra được 0 V hoặc 3,3 V, không có gì ở giữa. Vậy mà đèn bàn có núm vặn sáng tối, màn hình điện thoại chỉnh được độ sáng, quạt có ba số. Người ta làm thế nào?

Sau bài này học sinh làm được

  • Giải thích được nguyên lí điều chế độ rộng xung bằng lời của mình.
  • Tính công suất trung bình từ tỉ lệ thời gian bật trong một chu kì.
  • Dùng PWM và duty() để đặt độ sáng theo phần trăm.
  • Đổi qua lại giữa phần trăm và thang 0–1023 của phần cứng.
  • Nhận ra mắt người cảm nhận độ sáng không tuyến tính.
Gắn với chương trình
  • Vật lí 11 — công và công suất của dòng điện; giá trị trung bình của một đại lượng biến thiên tuần hoàn.
  • Toán 10–11 — tỉ lệ phần trăm, ánh xạ tuyến tính giữa hai thang đo.
  • Công nghệ 12 — điều khiển công suất thiết bị bằng vi điều khiển.

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

Mẹo nằm ở tốc độ

Chân GPIO chỉ bật hoặc tắt. Nhưng bật tắt một nghìn lần mỗi giây thì mắt người không kịp thấy từng lần, chỉ thấy giá trị trung bình. Bật 3 phần tắt 7 phần → trung bình 30% của 3,3 V → đèn trông như sáng 30%.

Tỉ lệ thời gian bật trong mỗi chu kì gọi là duty — con số duy nhất ta cần điều khiển.

Công suất trung bình

LED ở 3,3 V qua 220 Ω: dòng khi bật ~6,8 mA, công suất tức thời ~0,022 W. Duty 30% thì mỗi giây đèn chỉ bật 0,3 giây, công suất trung bình là 0,3 × 0,022 ≈ 0,0067 W.

Đây là chỗ bài này gặp mạch nội dung công suất điện của Vật lí 11: một đại lượng biến thiên tuần hoàn, và ta quan tâm giá trị trung bình trong một chu kì.

Hai thang đo, một phép quy đổi

Phần cứng nhận duty theo thang nguyên 0–1023, không nhận phần trăm:

led.duty(DO_SANG * 1023 // 100)

// là chia lấy phần nguyên. Đây là ánh xạ tuyến tính giữa hai thang đo, đúng dạng học sinh gặp khi đổi thang nhiệt độ hay đổi đơn vị.

Mắt người không tuyến tính

Đặt duty 50% rồi 100%, học sinh sẽ nói đèn "chỉ sáng hơn một chút" chứ không gấp đôi. Không phải lỗi chương trình: cảm nhận độ sáng gần hàm luỹ thừa hơn hàm bậc nhất, nên từ 5% lên 20% thấy rõ hơn hẳn từ 80% lên 100%.

03

Linh kiện

Linh kiệnMô tả, lưu ý khi muaSố lượng · giá
ESP32 DevKit V1Bo 30 chân, cổng micro-USB hoặc Type-C1 · 90–150k
LED 5 mmDùng lại LED của Bài 1. Màu đỏ hoặc vàng dễ quan sát nhất1 · 500đ
Điện trở 220 ΩVẫn bắt buộc, PWM không thay được điện trở1 · 200đ
Điện thoại quay chậmTuỳ chọn, để quay 240 hình/giây thấy được nhịp bật tắtmỗi nhóm 1
04

Lắp mạch và sơ đồ nối dây

Đỏ · nguồn dương Đen · GND Vàng · SCL Xanh dương · SDA Trắng · tín hiệu Xanh lá · 1-Wire
KhốiNối dâyNguồn
LEDGPIO23 → điện trở 220 Ω → chân dài (+) · chân ngắn (−) → GNDLấy từ chính chân GPIO
B6.1 Ảnh thực

Mạch y hệt Bài 1: ESP32, điện trở 220 Ω, LED. Ảnh này nhấn mạnh mạch không đổi, chỉ chương trình đổi.

Khung giữ chỗ — thay bằng ảnh chụp thật khi có
B6.2 Hình vẽ

Đồ thị điện áp theo thời gian ở ba mức duty 10%, 50% và 90%, vẽ rõ phần bật và phần tắt trong mỗi chu kì, kèm đường nét đứt chỉ giá trị trung bình.

Khung giữ chỗ — thay bằng ảnh chụp thật khi có
B6.3 Ảnh thực

Hai ảnh chụp cùng một LED ở duty 10% và 90%, chụp cùng chế độ máy ảnh để so được độ sáng.

Khung giữ chỗ — thay bằng ảnh chụp thật khi có

Không phải lắp gì mới

Mạch của bài này giống hệt Bài 1. Nếu bo còn nguyên mạch cũ thì vào thẳng phần chương trình. Đây là chỗ đáng nói với học sinh: cùng một mạch, đổi chương trình là đổi hẳn hành vi.

  1. GPIO23 → điện trở 220 Ω → chân dài LED.
  2. Chân ngắn LED → GND.
PWM không thay được điện trở

Có em sẽ lập luận: đằng nào đèn cũng chỉ bật 30% thời gian, vậy bỏ điện trở đi cũng được. Sai. Trong khoảng thời gian bật, dòng vẫn là dòng đỉnh chứ không phải dòng trung bình, và chính dòng đỉnh mới làm hỏng chân GPIO. Điện trở vẫn bắt buộc.

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 — tự tay làm ra PWM
# ------------------------------------------------------------
#  Bai 8 - Buoc 0: tu tay lam ra PWM de nhin thay ban chat
#  Bat 1ms, tat 9ms  ->  chi sang 10% thoi gian  ->  mat thay den mo
# ------------------------------------------------------------
from machine import Pin
import time

led = Pin(23, Pin.OUT)

while True:
    led.on()
    time.sleep_ms(1)      # sang 1 phan
    led.off()
    time.sleep_ms(9)      # tat 9 phan

Chương trình này không dùng PWM gì cả, chỉ bật tắt bằng tay theo tỉ lệ 1 phần bật, 9 phần tắt. Nhưng đèn trông y hệt như đang sáng 10%. Cho học sinh chạy bước này trước, rồi đổi hai con số thành 5 và 5 để thấy đèn sáng lên rõ rệt. Sau khi đã tự làm ra hiệu ứng, khái niệm PWM không còn trừu tượng nữa.

Chương trình chính — dùng PWM có sẵn của chip
# ------------------------------------------------------------
#  Bai 8 - Dieu chinh do sang LED bang PWM
#  Phan cung: GPIO23 -> dien tro 220 ohm -> chan dai LED -> GND
# ------------------------------------------------------------
from machine import Pin, PWM
import time

# ===== CẤU HÌNH =====
CHAN_LED = 23             # LED cam o GPIO23
TAN_SO = 1000             # Hz - so nhip bat tat moi giay
DO_SANG = 30              # % - muc sang muon dat
# ====================

led = PWM(Pin(CHAN_LED), freq=TAN_SO)

# duty cua ESP32 chay tu 0 den 1023, doi tu phan tram sang
led.duty(DO_SANG * 1023 // 100)

while True:
    time.sleep_ms(500)

Bản này nhường việc bật tắt cho phần cứng chuyên dụng bên trong ESP32. Chương trình chỉ nói "duty bằng bao nhiêu" rồi rảnh tay — vòng lặp chẳng làm gì cả, mà đèn vẫn sáng đúng mức. Đó là khác biệt lớn so với Bước 0, nơi bộ xử lí phải ngồi bật tắt suốt.

Biến thể — đèn "thở"
# Bien the: den "tho" - sang dan roi toi dan
from machine import Pin, PWM
import time

led = PWM(Pin(23), freq=1000)

while True:
    for phan_tram in range(0, 101):        # 0 -> 100
        led.duty(phan_tram * 1023 // 100)
        time.sleep_ms(20)

    for phan_tram in range(100, -1, -1):   # 100 -> 0
        led.duty(phan_tram * 1023 // 100)
        time.sleep_ms(20)

Hai vòng for chạy duty từ 0 lên 100 rồi từ 100 về 0. Hiệu ứng này quen thuộc trên đèn báo nguồn của máy tính xách tay, và học sinh rất thích. Nó cũng là ví dụ đầu tiên trong lộ trình về việc dùng biến chạy trong vòng lặp để tạo ra một quá trình liên tục.

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ử

Bảng đo bằng mắt

Cho học sinh đặt lần lượt các mức duty rồi tự chấm độ sáng cảm nhận theo thang 0–10, sau đó vẽ đồ thị. Đường thu được sẽ cong chứ không thẳng.

Duty đặtGiá trị gửi phần cứngĐộ sáng cảm nhận (0–10)
5 %51…
20 %204…
50 %511…
100 %1023…

Nhìn thấy nhịp bật tắt bằng điện thoại

Hạ TAN_SO xuống 5 Hz: mắt thường sẽ thấy đèn nháy chứ không còn thấy độ sáng. Nâng lại lên 50 Hz thì đèn liền lại. Nếu điện thoại có chế độ quay chậm 240 hình/giây, quay ở tần số 100 Hz sẽ thấy rõ đèn thực sự đang nhấp nháy.

Danh sách kiểm trước khi coi là xong

  • Bước 0 làm đèn sáng mờ mà không dùng lệnh PWM nào.
  • Đổi DO_SANG từ 10 lên 90 thì đèn sáng hơn rõ rệt.
  • Học sinh tính đúng giá trị gửi phần cứng cho một mức phần trăm bất kì.
  • Hạ tần số xuống 5 Hz thì mắt thấy nháy, học sinh giải thích được vì sao.
  • Bản "thở" chạy mượt, không giật cục.
07

Kinh nghiệm và cạm bẫy

Đừng nói "PWM" trước khi các em tự làm ra nó

Nếu mở bài bằng định nghĩa "PWM là điều chế độ rộng xung", học sinh sẽ chép vào vở và không hiểu gì. Nhưng nếu bắt đầu bằng Bước 0 — bật 1 ms, tắt 9 ms — thì các em tự tay tạo ra hiệu ứng trước, và cái tên chỉ là nhãn dán cho thứ đã hiểu.

Thứ tự này quan trọng đến mức tôi để hẳn bản làm tay lên trước bản dùng PWM trong mục Mã nguồn, dù bản làm tay không phải là bản dùng thật.

Ba lỗi hay gặp
  • Đèn sáng hết cỡ dù đặt duty thấp. Thường là gọi duty() với số phần trăm mà quên quy đổi — đặt 100 thì phần cứng hiểu là 100 trên 1023, tức chưa tới 10%. Ngược lại đặt 1023 thì sáng hết. Kiểm lại phép nhân chia.
  • Đèn nháy thấy rõ. Tần số đặt quá thấp. Từ 200 Hz trở lên là mắt liền được.
  • Bản "thở" giật cục. Thời gian nghỉ mỗi bước quá lớn. Với 101 bước thì 20 ms mỗi bước cho một chiều khoảng 2 giây là mượt.
Chỗ này cần một chuyện thật của chính thầy cô

Hai hộp trên viết từ quá trình dựng và chạy thử bài. Sau buổi dạy đầu tiên, xin thầy cô thay bằng tình huống đã thực sự xảy ra ở lớp mình.

08

Ứng dụng trong dạy học

Vật lí 11Toán 10Công nghệ 12STEM

Vật lí — giá trị trung bình của đại lượng tuần hoàn

Đây là một trong số ít chỗ học sinh phổ thông nhìn thấy được khái niệm giá trị trung bình của một đại lượng biến thiên. Điện áp trên đèn nhảy giữa 0 và 3,3 V một nghìn lần mỗi giây, nhưng thứ mắt cảm nhận là trung bình của nó. Từ đây mở sang giá trị hiệu dụng của dòng xoay chiều rất thuận.

Toán — ánh xạ giữa hai thang đo

Phần trăm 0–100 và duty 0–1023 là hai thang đo cùng mô tả một đại lượng. Bài toán đổi qua lại là ánh xạ tuyến tính, và học sinh sẽ gặp lại nguyên dạng ở Bài 8 khi đổi số đọc ADC 0–4095 sang điện áp 0–3,3 V.

Bài học STEM 5 hoạt động — "Đèn ngủ dịu mắt"

Hoạt động 1 — Xác định vấn đề. Đèn ngủ bật hết cỡ thì chói, tắt hẳn thì tối. Cần một đèn sáng vừa đủ để đi lại trong phòng ban đêm mà không làm người khác thức giấc.

Tiêu chí sản phẩm: đủ sáng để thấy lối đi cách 2 m; không chói khi nhìn thẳng; bật lên phải sáng dần trong ít nhất 2 giây chứ không loé đột ngột.

Hoạt động 2 — Kiến thức nền. PWM; công suất trung bình; cảm nhận độ sáng phi tuyến của mắt.

Hoạt động 3 — Đề xuất và chọn phương án. Mỗi nhóm chọn một mức duty và giải thích vì sao, dựa trên bảng đo bằng mắt đã lập ở mục Hiệu chuẩn.

Hoạt động 4 — Chế tạo và thử. Lập trình, thử trong phòng tối, chỉnh lại mức sáng.

Hoạt động 5 — Báo cáo và điều chỉnh. Mời nhóm khác đứng cách 2 m đánh giá. Nhóm nào bị chê chói thì hạ duty và giải thích con số mới.

Hướng mở rộng
  • Bài 9 dùng đúng kĩ thuật này cho ba kênh màu để trộn ra mọi màu.
  • Ghép với Bài 12: vặn biến trở để chỉnh độ sáng bằng tay.
  • Thay LED bằng quạt thấp áp để thấy PWM điều khiển được cả tốc độ quay.
  • Hướng thi Khoa học kĩ thuật: đèn học tự chỉnh sáng theo ánh sáng phòng.