Dự án STEM THPT với cảm biến và màn hình: gợi ý theo môn, dự án mẫu đo gia tốc g bằng con lắc đơn
Gợi ý dự án STEM THPT theo môn với cảm biến và màn hình; dự án mẫu Vật lý đo gia tốc trọng trường bằng con lắc đơn, cổng quang, ESP32, OLED, tính sai số và viết báo cáo.
Ở THPT, học sinh đã đủ kiến thức để làm những dự án STEM có số đo thật, có xử lý sai số và có báo cáo, chứ không chỉ lắp cho chạy. Bài này dành cho giáo viên THPT: gợi ý dự án theo từng môn với cảm biến và màn hình, rồi đi trọn một dự án mẫu môn Vật lý là đo gia tốc trọng trường g bằng con lắc đơn: ESP32 đo chu kỳ bằng cổng quang chính xác tới micro giây, hiện kết quả trên màn hình OLED, xuất số liệu cho bảng tính và tự tính sai số.
1. Ba hình thức giáo dục STEM ở trường trung học
Công văn 3089/BGDĐT-GDTrH ngày 14/8/2020 của Bộ GD&ĐT nêu ba hình thức tổ chức giáo dục STEM:
- Dạy học các môn khoa học theo bài học STEM: hình thức chủ yếu, gắn với nội dung chương trình, thường vài tiết và một khoảng thời gian làm ở nhà.
- Tổ chức hoạt động trải nghiệm STEM: ngày hội, câu lạc bộ, tham quan, tìm hiểu ứng dụng khoa học kỹ thuật.
- Tổ chức hoạt động nghiên cứu khoa học, kỹ thuật: học sinh làm dự án dài, có thể dự cuộc thi khoa học kỹ thuật dành cho học sinh trung học.
Dự án mẫu trong bài dùng được cho hình thức thứ nhất (2–3 tiết thực hành) và mở rộng thành đề tài nghiên cứu nhỏ cho hình thức thứ ba.
2. Gợi ý dự án theo môn

Điểm chung của các dự án tốt: có câu hỏi đo được (bao nhiêu, nhanh hay chậm, phụ thuộc vào gì), có số liệu lặp lại nhiều lần để tính trung bình và sai số, và có so sánh với lý thuyết hoặc giá trị tham khảo.
3. Dự án mẫu: đo gia tốc trọng trường bằng con lắc đơn
Với góc lệch nhỏ, chu kỳ con lắc đơn là T = 2π√(L/g), nên đo được chiều dài L và chu kỳ T thì tính được g = 4π²L/T². Bấm đồng hồ bằng tay sai số khoảng 0,1–0,2 giây mỗi lần bấm; cổng quang và ESP32 ghi thời điểm chính xác tới micro giây, học sinh có thể tập trung vào phần quan trọng hơn: sai số đến từ đâu, làm sao giảm.
Kiến thức liên quan: dao động điều hòa, con lắc đơn (Vật lý 11), sai số phép đo (Vật lý 10). Giá trị g ở Việt Nam khoảng 9,78 m/s², thay đổi theo vĩ độ và độ cao.
Bố trí thí nghiệm

Chuẩn bị cho mỗi nhóm
- ESP32 DevKit V1 và dây USB
- Màn hình OLED 0.96 inch I2C
- Module cảm biến khe quang hoặc hồng ngoại vật cản (có chân OUT số)
- Breadboard, dây cắm
- Giá treo, dây mảnh không giãn, quả nặng nhỏ (bi thép, quả dọi), thước dài

Chương trình
Cần thư viện Adafruit SSD1306 (cài qua Library Manager) cho màn hình. Phần đo thời gian chỉ dùng ngắt và micros() của ESP32.
// PYWORLD.VN - Dự án STEM Vật lý: đo gia tốc trọng trường g bằng con lắc đơn, cổng quang hồng ngoại và ESP32, hiện kết quả trên OLED
// PYWORLD.VN - Cảm biến OUT vào GPIO27 (xuống mức thấp khi quả nặng che tia); OLED SDA D21, SCL D22; bấm BOOT để đo lại từ đầu
// PYWORLD.VN - Gõ L0.800 trên Serial Monitor để nhập chiều dài con lắc (m); mỗi chu kỳ in một dòng CSV, đủ 20 chu kỳ thì in tổng kết
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
const int CHAN_CONG = 27, CHAN_NUT = 0;
const int SO_CHU_KY = 20;
const uint32_t BO_QUA_US = 100000; // 0,1 s sau mỗi lần qua cổng: bỏ các cạnh dội của tín hiệu
const float SAI_SO_L = 0.002; // m: sai số khi đo chiều dài bằng thước (tùy thước và cách đo)
Adafruit_SSD1306 oled(128, 64, &Wire, -1);
float chieuDai = 0.800; // m, từ điểm treo tới tâm quả nặng
volatile uint32_t lucQua[2 * SO_CHU_KY + 1];
volatile int soLanQua = 0;
volatile uint32_t lanQuaCuoi = 0;
int daXuLy = 0; // số chu kỳ đã tính
double tbT = 0, m2 = 0; // trung bình và tổng bình phương độ lệch (cách Welford)
float tCuoi = NAN;
// Mỗi lần quả nặng che tia (cạnh xuống) ghi thời điểm, tính bằng micro giây.
void IRAM_ATTR ngatCong() {
uint32_t t = micros();
if (t - lanQuaCuoi < BO_QUA_US || soLanQua > 2 * SO_CHU_KY) return;
lanQuaCuoi = t;
lucQua[soLanQua] = t;
soLanQua = soLanQua + 1;
}
float gTu(float t) { // T = 2π√(L/g) → g = 4π²L/T²
return 4 * PI * PI * chieuDai / (t * t);
}
void batDauLai() {
noInterrupts();
soLanQua = 0;
lanQuaCuoi = micros();
interrupts();
daXuLy = 0;
tbT = m2 = 0;
tCuoi = NAN;
Serial.printf("# Do moi: L = %.3f m, %d chu ky. Keo con lac lech khoang 5-10 do roi tha\n", chieuDai, SO_CHU_KY);
Serial.println("chu_ky,T_s,g_m_s2");
}
void veOled() {
oled.clearDisplay();
oled.setTextColor(SSD1306_WHITE);
oled.setTextSize(1);
oled.setCursor(0, 0);
oled.printf("L=%.3f m %d/%d", chieuDai, daXuLy, SO_CHU_KY);
oled.setCursor(0, 14);
if (isnan(tCuoi)) oled.print("Cho con lac qua cong");
else oled.printf("T vua do: %.4f s", tCuoi);
if (daXuLy > 0) {
oled.setCursor(0, 28);
oled.printf("T tb: %.4f s", tbT);
oled.setTextSize(2);
oled.setCursor(0, 44);
oled.printf("g=%.3f", gTu(tbT));
}
oled.display();
}
void tongKet() {
double doLech = sqrt(m2 / (daXuLy - 1)); // độ lệch chuẩn của T
double saiSoT = doLech / sqrt((double)daXuLy); // sai số ngẫu nhiên của giá trị trung bình
float g = gTu(tbT);
float saiSoG = g * (SAI_SO_L / chieuDai + 2 * saiSoT / tbT);
Serial.printf("# T trung binh = %.5f s, do lech chuan = %.5f s, sai so cua trung binh = %.5f s\n", tbT, doLech, saiSoT);
Serial.printf("# g = %.3f +/- %.3f m/s2 (L = %.3f +/- %.3f m)\n", g, saiSoG, chieuDai, SAI_SO_L);
}
void setup() {
Serial.begin(115200);
pinMode(CHAN_CONG, INPUT_PULLUP);
pinMode(CHAN_NUT, INPUT_PULLUP);
Wire.begin(21, 22);
if (!oled.begin(SSD1306_SWITCHCAPVCC, 0x3C)) Serial.println("# Khong thay OLED 0x3C (van do, xem tren Serial)");
attachInterrupt(digitalPinToInterrupt(CHAN_CONG), ngatCong, FALLING);
batDauLai();
}
void loop() {
if (Serial.available()) {
String lenh = Serial.readStringUntil('\n');
lenh.trim();
if ((lenh[0] == 'L' || lenh[0] == 'l') && lenh.substring(1).toFloat() > 0.05f) {
chieuDai = lenh.substring(1).toFloat();
batDauLai();
}
}
if (digitalRead(CHAN_NUT) == LOW) {
delay(300);
batDauLai();
}
// Một chu kỳ = hai lần qua vị trí thấp nhất: T(k) = lúc qua lần 2k trừ lúc qua lần 2k−2.
while (daXuLy < SO_CHU_KY && soLanQua >= 2 * (daXuLy + 1) + 1) {
int k = daXuLy + 1;
tCuoi = (lucQua[2 * k] - lucQua[2 * k - 2]) / 1e6f;
daXuLy = k;
double lech = tCuoi - tbT;
tbT += lech / k;
m2 += lech * (tCuoi - tbT);
Serial.printf("%d,%.5f,%.3f\n", k, tCuoi, gTu(tCuoi));
if (k == SO_CHU_KY) tongKet();
}
static uint32_t lanVe = 0;
if (millis() - lanVe >= 200) {
lanVe = millis();
veOled();
}
}
ngatCong()chạy ngay khi chân OUT xuống thấp (quả nặng che tia) và ghi thời điểm. Trong 0,1 giây sau đó các cạnh dội bị bỏ qua.- Quả nặng qua vị trí thấp nhất hai lần mỗi chu kỳ, nên chu kỳ thứ
klà thời điểm lần qua thứ2ktrừ lần thứ2k−2. - Trung bình và độ lệch chuẩn tính dần theo cách Welford, không cần lưu hết số liệu. Đủ 20 chu kỳ, chương trình in sai số của chu kỳ trung bình và sai số của g theo công thức
Δg/g = ΔL/L + 2ΔT/T. - Gõ
L0.750trên Serial Monitor để đổi chiều dài; bấm BOOT để đo lại.

4. Kết quả và sai số


Những điểm đáng thảo luận với học sinh, nhìn từ kết quả:
- Sai số chủ yếu từ chiều dài: chu kỳ đo chính xác tới phần mười mili giây, còn chiều dài đo bằng thước sai vài mi-li-mét. Muốn kết quả tốt hơn thì đo L kỹ hơn (đo nhiều lần, xác định tâm quả nặng), đo thêm chu kỳ gần như không giúp gì.
- Sai số hệ thống do biên độ: công thức chỉ đúng với góc nhỏ. Ở 7–8°, chu kỳ dài hơn khoảng 0,1 % nên g tính ra nhỏ hơn khoảng 0,2 %. Học sinh có thể kiểm chứng bằng cách đo ở 5°, 10°, 20° và so sánh.
- Đường thẳng T² theo L: đo ở 4–5 chiều dài khác nhau, vẽ T² theo L, độ dốc bằng
4π²/g. Cách này ít phụ thuộc vào việc xác định đúng tâm quả nặng hơn.
5. Từ số đo tới báo cáo
Một báo cáo dự án ngắn gọn nên có: câu hỏi nghiên cứu; cơ sở lý thuyết; dụng cụ và cách bố trí (kèm ảnh chụp); cách đo (bao nhiêu lần, điều kiện); bảng số liệu và đồ thị; kết quả kèm sai số; thảo luận nguồn sai số và cách cải tiến; kết luận. Các tiêu chí chấm điểm cụ thể ở bài chấm điểm dự án STEM trong cùng nhóm bài cho giáo viên.
6. Lỗi hay gặp
| Hiện tượng | Nguyên nhân thường gặp | Cách xử lý |
|---|---|---|
| Chu kỳ đo được gấp đôi giá trị mong đợi | Cổng quang đặt lệch về một bên, quả nặng chỉ qua cổng một lần mỗi chu kỳ | Dời cổng quang về đúng vị trí cân bằng |
| Chu kỳ dao động thất thường | Tín hiệu dội, quả nặng chỉ che nửa tia | Chỉnh biến trở module, hạ cổng quang cho quả nặng che hẳn |
| g lệch nhiều (sai 1–3 %) | Đo L tới mép quả nặng thay vì tâm, dây giãn, giá treo rung | Đo L tới tâm; giá treo chắc; dây không giãn |
| Quả nặng dao động thành hình elip | Thả có lực đẩy ngang | Thả nhẹ từ tay, chờ ổn định rồi bấm BOOT đo lại |
7. Xem thêm
- Quy trình thiết kế kỹ thuật trong dự án STEM: 5 hoạt động
- Đồng hồ Internet với ESP32, NTP và màn hình OLED 0.96 inch
- Các bài cùng nhóm cho giáo viên: chủ đề STEM môn KHTN THCS, câu lạc bộ STEM, phòng STEM, chấm điểm dự án STEM.
Xem thêm