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

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.

Thời lượng
1 tiết (45 phút)
Chi phí một nhóm
≈ 6 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

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.
Gắn với chương trình
  • 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.

Bắt buộc GPIO34 — không phải chân nào cũng được

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ệ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
Biến trở 10 kΩLoại 3 chân cắm breadboard, có núm vặn1 · 3k
LED 5 mm và điện trở 220 ΩĐèn báo khi vượt ngưỡng1 · 700đ
Đồng hồ vạn năngTuỳ chọn nhưng rất đáng có, để đối chiếu điện áp thậ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
Biến trởChân giữa → GPIO34 · hai chân ngoài → 3V3 và GNDLấy nguồn từ bo
LEDGPIO23 → điện trở 220 Ω → chân dài · chân ngắn → GNDLấy từ chính chân GPIO
B8.1 Ảnh thực

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ó
B8.2 Ảnh thự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ó
B8.3 Ảnh thự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

  1. Cắm biến trở lên breadboard, ba chân vào ba hàng khác nhau.
  2. Dây đỏ: một chân ngoài → 3V3.
  3. Dây đen: chân ngoài còn lại → GND.
  4. Dây trắng: chân giữa → GPIO34.
  5. LED giữ nguyên như Bài 1: GPIO23 → 220 Ω → LED → GND.
Đảo hai chân ngoài không hỏng gì, nhưng đảo chiều vặn

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.

Đừng nối biến trở vào 5V

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.

Biến thể — lọc nhiễu bằng trung bình
# 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.

  1. Đặt que đen của đồng hồ vào GND, que đỏ vào chân giữa biến trở.
  2. Vặn núm tới một vị trí bất kì, đọc số vôn trên đồng hồ.
  3. Đọc số vôn chương trình in ra cùng lúc.
  4. 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 NGUONG thì đè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

Con số không bao giờ đứng yên, và đó là bài học

Để 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.

Ba lỗi hay gặp
  • 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.
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í — 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ụ.

Bài học STEM 5 hoạt động — "Núm chỉnh cho đèn họ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.

Hướng mở rộng
  • 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.