Bài 12 · Vật lí · Toán · Công nghệ
Đọc biến trở bằng ADC
từ thế giới liên tục sang thế giới đếm được
Đây là bài đầu tiên máy đọc được một đại lượng có vô số giá trị chứ không chỉ bật với tắt. Và cũng là bài đầu tiên học sinh chạm vào một sự thật khó chịu: mọi phép đo số đều làm tròn.
01 Mục tiêu và yêu cầu cần đạt
Tất cả các bài trước chỉ làm việc với hai mức: có và không, bật và tắt. Nhưng nhiệt độ, ánh sáng, lực, khoảng cách đều là những đại lượng biến thiên liên tục. Bài này là cây cầu bắc từ thế giới liên tục sang thế giới của những con số đếm được — và mọi bài cảm biến ở cấp độ 3 đều đi qua cây cầu đó.
Sau bài này học sinh làm được
- Nối biến trở làm một cầu chia điện áp và giải thích vai trò từng chân.
- Đọc giá trị ADC 12 bit và biết dải của nó là 0 đến 4095.
- Quy đổi số đọc ra điện áp và đối chiếu với đồng hồ vạn năng.
- Tính được độ phân giải: mỗi mức ADC ứng với bao nhiêu vôn.
- Nhận ra số đọc luôn nhảy nhẹ, và giải thích được vì sao.
- Vật lí 11 — mạch điện, hiệu điện thế, cầu phân áp.
- Toán 10 — ánh xạ tuyến tính giữa hai thang đo, làm tròn và sai số.
- Công nghệ 12 — tín hiệu tương tự và tín hiệu số.
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
Biến trở là một cầu chia điện áp
Dải điện trở dài nối ra hai chân ngoài, chân giữa là con trượt chạy dọc dải đó. Nối hai chân ngoài vào 3,3 V và 0 V thì dải trở thành cái thang điện áp, chân giữa lấy ra điện áp ở đúng vị trí con trượt — vô số giá trị, liên tục.
ADC chia vô số ấy thành 4096 nấc
Máy tính không lưu được vô số. Bộ chuyển đổi của ESP32 chia dải điện áp thành 4096 nấc (12 bit, vì 212 = 4096) rồi trả về số thứ tự của nấc gần nhất.
Mỗi nấc ứng 3,3 / 4095 ≈ 0,8 mV. Đó là độ phân giải: mọi thay đổi nhỏ hơn 0,8 mV đều bị làm tròn mất. Phép đo số nào cũng có một con số như vậy.
ESP32 có hai nhóm ADC. Nhóm ADC2 ngừng hoạt động khi Wi-Fi bật vì dùng chung phần cứng. Bộ runtime STEM giữ Wi-Fi bật suốt để nhận lệnh nạp, nên ADC2 coi như không dùng được.
Chỉ ADC1 — GPIO32 đến GPIO39 — đọc ổn định. Cắm nhầm
sang chân ADC2 như GPIO25 thì số đọc đứng im ở 0 hoặc nhảy loạn,
và không có thông báo lỗi nào.
Một dòng phải giải thích: attenuation
Mặc định ADC chỉ đo tốt trong 0–1,1 V. Dòng atten(ADC.ATTN_11DB)
bảo nó giảm bớt tín hiệu vào để đo tới ~3,3 V. Thiếu dòng này, vặn biến trở quá
một phần ba là số đọc kịch trần 4095 và không nhúc nhích nữa.
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 |
| Biến trở 10 kΩ | Loại 3 chân cắm breadboard, có núm vặn | 1 · 3k |
| LED 5 mm và điện trở 220 Ω | Đèn báo khi vượt ngưỡng | 1 · 700đ |
| Đồng hồ vạn năng | Tuỳ chọn nhưng rất đáng có, để đối chiếu điện áp thật | mỗi nhóm 1 |
04 Lắp mạch và sơ đồ nối dây
| Khối | Nối dây | Nguồn |
|---|---|---|
| Biến trở | Chân giữa → GPIO34 · hai chân ngoài → 3V3 và GND | Lấy nguồn từ bo |
| LED | GPIO23 → điện trở 220 Ω → chân dài · chân ngắn → GND | Lấy từ chính chân GPIO |
Biến trở 10 kΩ cắm breadboard, dây đỏ về 3V3, dây đen về GND, dây trắng từ chân giữa về GPIO34. Kèm LED và điện trở ở góc.
Khung giữ chỗ — thay bằng ảnh chụp thật khi cóCận cảnh ba chân biến trở nhìn từ trên xuống, có chú thích chỉ rõ chân giữa là chân lấy tín hiệu ra.
Khung giữ chỗ — thay bằng ảnh chụp thật khi cóQue đo đồng hồ vạn năng đặt giữa chân giữa biến trở và GND, màn hình đồng hồ hiện số vôn, đặt cạnh màn hình máy tính đang in số ADC để so.
Khung giữ chỗ — thay bằng ảnh chụp thật khi cóBa dây cho biến trở, hai dây cho đèn
- Cắm biến trở lên breadboard, ba chân vào ba hàng khác nhau.
- Dây đỏ: một chân ngoài →
3V3. - Dây đen: chân ngoài còn lại →
GND. - Dây trắng: chân giữa →
GPIO34. - LED giữ nguyên như Bài 1:
GPIO23→ 220 Ω → LED →GND.
Nếu nối nhầm chân ngoài nào vào 3V3 cũng không cháy gì cả, chỉ là chiều vặn bị ngược: vặn sang phải thì số giảm thay vì tăng. Học sinh hay tưởng mình lắp sai. Cứ đổi hai dây đỏ và đen cho nhau là xong.
Nhưng cắm nhầm chân giữa thì khác: nếu lấy tín hiệu ra từ một chân ngoài, số đọc sẽ dính chặt ở 0 hoặc 4095 và vặn thế nào cũng không đổi.
Bo có cả chân 5V. Nối biến trở vào đó thì chân giữa có thể lên tới 5 V, vượt
quá mức chân GPIO của ESP32 chịu được và làm hỏng chân vĩnh viễn. Luôn dùng
chân 3V3.
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 — nhìn con số thô trước đã# ------------------------------------------------------------
# Bai 12 - Buoc 0: doc so tho tu ADC, chua doi don vi gi ca
# ------------------------------------------------------------
from machine import ADC, Pin
import time
bien_tro = ADC(Pin(34))
bien_tro.atten(ADC.ATTN_11DB) # mo rong dai do len ~3,3 V
while True:
print(bien_tro.read())
time.sleep_ms(300) Vặn núm từ từ từ đầu này sang đầu kia, màn hình in ra:
12 845 2033 3110 4095
Trước khi bàn về đơn vị hay công thức, hãy để học sinh vặn núm và nhìn con số chạy. Cảm giác "vặn tay ở đây thì số nhảy trên kia" là thứ làm cho khái niệm cảm biến trở nên cụ thể.
Chương trình chính — đổi ra vôn và bật đèn theo ngưỡng# ------------------------------------------------------------
# Bai 12 - Doc bien tro bang ADC
# Phan cung: chan giua bien tro -> GPIO34
# hai chan ngoai -> 3V3 va GND
# GPIO23 -> dien tro 220 ohm -> LED -> GND
# ------------------------------------------------------------
from machine import ADC, Pin
import time
# ===== CẤU HÌNH =====
CHAN_BIEN_TRO = 34 # BAT BUOC thuoc nhom ADC1 (GPIO32-39)
CHAN_LED = 23
NGUONG = 2000 # tren muc nay thi bat den
THOI_GIAN_NGHI = 300 # ms
# ====================
bien_tro = ADC(Pin(CHAN_BIEN_TRO))
bien_tro.atten(ADC.ATTN_11DB)
led = Pin(CHAN_LED, Pin.OUT)
while True:
gia_tri = bien_tro.read() # 0 .. 4095
dien_ap = gia_tri * 3.3 / 4095 # doi ra von
print("ADC:", gia_tri, " ->", round(dien_ap, 2), "V")
if gia_tri > NGUONG:
led.on()
else:
led.off()
time.sleep_ms(THOI_GIAN_NGHI)
Dòng gia_tri * 3.3 / 4095 chính là bài toán ánh xạ tuyến tính học
sinh vừa gặp ở Bài 8 khi đổi phần trăm sang thang 1023. Cùng một dạng toán, hai
hoàn cảnh khác nhau — đây là chỗ đáng chỉ ra để các em thấy mình đang dùng lại
kiến thức chứ không học thêm cái mới.
# Bien the: doc 10 lan roi lay trung binh cho so bot nhay
from machine import ADC, Pin
import time
bien_tro = ADC(Pin(34))
bien_tro.atten(ADC.ATTN_11DB)
while True:
tong = 0
for _ in range(10):
tong = tong + bien_tro.read()
time.sleep_ms(5)
trung_binh = tong // 10
print("Trung binh 10 lan:", trung_binh)
time.sleep_ms(200) Đọc mười lần rồi lấy trung bình. Số in ra ổn định hơn hẳn. Đây là kĩ thuật lọc đơn giản nhất và cũng hiệu quả nhất, dùng lại được ở mọi bài cảm biến về sau.
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ử
Đối chiếu với đồng hồ vạn năng
Đây là phép hiệu chuẩn thật sự của bài, và nó biến một trò chơi thành một phép đo.
- Đặt que đen của đồng hồ vào
GND, que đỏ vào chân giữa biến trở. - Vặn núm tới một vị trí bất kì, đọc số vôn trên đồng hồ.
- Đọc số vôn chương trình in ra cùng lúc.
- Lặp lại ở năm vị trí trải đều, lập bảng so sánh.
Hai cột thường lệch dưới 0,05 V. Nếu lệch nhiều và có hệ thống, nguyên nhân thường là ADC của ESP32 vốn không tuyến tính hoàn hảo ở hai đầu dải — một hạn chế có thật của con chip, đáng nói thẳng với học sinh thay vì giấu đi.
Tìm hai đầu thang đo
Vặn hết cỡ hai phía và ghi lại. Thường không ra đúng 0 và 4095 mà là khoảng 10–20 và 4090–4095. Hỏi cả lớp vì sao — câu trả lời nằm ở điện trở tiếp xúc và ở chính đặc tính của ADC.
Danh sách kiểm trước khi coi là xong
- Vặn núm thì số đọc chạy mượt từ gần 0 tới gần 4095.
- Số vôn chương trình in ra khớp đồng hồ vạn năng trong khoảng 0,05 V.
- Học sinh tính đúng độ phân giải theo vôn của một mức ADC.
- Vượt
NGUONGthì đèn bật, xuống dưới thì tắt. - Bản lấy trung bình cho số ổn định hơn bản đọc một lần.
07 Kinh nghiệm và cạm bẫy
Để tay khỏi núm vặn, học sinh vẫn thấy số nhảy nhẹ: 2033, 2035, 2031, 2034… Phản ứng đầu tiên gần như luôn là "máy bị lỗi" hoặc "biến trở hỏng".
Không có gì hỏng cả. Đó là nhiễu — từ nguồn cấp, từ chính mạch đo bên trong chip, từ sóng điện từ xung quanh. Mọi phép đo thật đều có nhiễu; chỉ có phép đo trên giấy mới cho ra con số đứng im.
Đây là chỗ tôi thấy đáng dừng lại lâu nhất trong cả bài. Học sinh quen với việc một phép tính cho ra một đáp số duy nhất. Ở đây, một phép đo cho ra một khoảng. Từ nhận thức đó mới đi tiếp được sang trung bình, độ lệch, và toàn bộ cấp độ 9 của lộ trình.
- Số kịch trần 4095 ngay khi vặn nhẹ. Thiếu dòng
atten(ADC.ATTN_11DB). - Số đứng im ở 0 hoặc 4095 dù vặn hết cỡ. Lấy tín hiệu ra từ chân ngoài thay vì chân giữa.
- Số nhảy loạn không theo núm vặn. Cắm vào chân thuộc nhóm ADC2 — xem lại hộp kĩ thuật ở mục Lí thuyết. Đổi sang GPIO34 là hết.
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í — cầu phân áp không còn nằm trên giấy
Bài cầu phân áp trong sách thường dừng ở việc tính toán. Ở đây học sinh vặn tay và nhìn điện áp đổi theo, rồi đo lại bằng đồng hồ. Cho các em tính lí thuyết điện áp ở vị trí giữa núm rồi so với số đo — một bài kiểm chứng gọn và sạch.
Toán — làm tròn và sai số vào bài rất tự nhiên
Độ phân giải 0,8 mV là một con số cụ thể để nói về sai số làm tròn. Đặt câu hỏi: nếu điện áp thật là 1,65004 V thì ADC trả về mức nào, và ta mất bao nhiêu thông tin? Đây là cửa vào rất tốt cho khái niệm sai số dụng cụ.
Hoạt động 1 — Xác định vấn đề. Đèn học của Bài 8 chỉnh được độ sáng nhưng phải sửa chương trình mới đổi được. Cần một núm vặn để chỉnh trực tiếp bằng tay.
Tiêu chí sản phẩm: vặn núm thì độ sáng đổi mượt, không giật; vặn hết một phía thì tắt hẳn; vặn hết phía kia thì sáng nhất; và độ sáng không tự nhấp nháy khi để yên tay.
Hoạt động 2 — Kiến thức nền. Cầu phân áp; ADC và độ phân giải; nhiễu và cách lọc; PWM của Bài 8.
Hoạt động 3 — Đề xuất và chọn phương án. Bài toán chính là ánh xạ 0–4095 sang 0–100 phần trăm. Nhóm nào bỏ qua bước lọc nhiễu sẽ thấy đèn rung nhẹ — và đó là lúc kiến thức về nhiễu trở nên hữu dụng chứ không còn là lí thuyết.
Hoạt động 4 — Chế tạo và thử. Ghép mạch Bài 8 và Bài 12, lập trình, thử vặn.
Hoạt động 5 — Báo cáo và điều chỉnh. Nhóm khác vặn thử và chấm độ mượt. Nhóm nào bị chê giật thì tăng số lần lấy trung bình.
- Ghép ba biến trở làm ba núm pha màu cho LED RGB của Bài 9.
- Thay biến trở bằng quang trở để đo ánh sáng — mạch gần như y hệt.
- Ghi lại số đọc theo thời gian rồi vẽ đồ thị, mở sang cấp độ 9.
- Hướng thi Khoa học kĩ thuật: thước đo mực nước bằng biến trở trượt.