Đo chuyển vị bằng cảm biến laser khoảng cách: chọn loại, lắp đặt, sai số, theo dõi nâng hạ kết cấu
Dùng cảm biến laser đo khoảng cách để đo chuyển vị khi nâng hạ kết cấu: chọn loại tam giác, đo pha, ToF; lắp trên khung chuẩn; sai số nhiệt, cosin; ESP32 đọc 4–20 mA qua ADS1115, ngưỡng dừng nâng.
Cảm biến laser đo khoảng cách đo chuyển vị không cần chạm vào vật: chiếu tia laser lên một tấm đích gắn trên kết cấu và cho ra khoảng cách, đổi khoảng cách đó thành chuyển vị. Khi nâng, hạ dầm, sàn, bể chứa bằng kích thủy lực, cảm biến laser cho biết từng điểm đã lên bao nhiêu milimét, hai đầu có lên đều không, để dừng kích trước khi kết cấu bị vặn. Bài này hướng dẫn chọn loại cảm biến laser, lắp đặt trên khung chuẩn, các nguồn sai số đáng kể, và chương trình ESP32 đọc hai cảm biến ngõ ra 4–20 mA qua ADS1115 có ngưỡng cảnh báo, ngưỡng dừng nâng.
1. Chọn loại cảm biến

- Laser tam giác: chiếu tia lên đích, đo vị trí điểm sáng phản xạ trên cảm biến ảnh; dải ngắn (vài chục tới vài trăm mm) nhưng phân giải tới micromét, có ngõ ra 4–20 mA, 0–10 V hoặc RS-485. Đúng loại cho nâng hạ, thí nghiệm kết cấu.
- Máy đo xa đo pha: dải tới hàng chục mét, sai số khoảng 1 mm, dùng cho lún, nghiêng đo từ xa.
- Cảm biến ToF nhỏ (loại VL53L0X, VL53L1X): rẻ, giao tiếp I2C, sai số vài milimét; hợp với mô hình, thử nghiệm, không đủ cho theo dõi kết cấu thật.
Cấu tạo, nguyên lý của các loại cảm biến chuyển vị (biến trở, LVDT, điện dung, laser) có ở bài cảm biến chuyển vị.
2. Lắp đặt

- Khung chuẩn: cột thép ngắn, chân đặt trên nền ổn định, không chạm kích, không nối với kết cấu được nâng. Mọi chuyển động của khung đều vào thẳng số đo.
- Tấm đích: tấm nhôm hoặc nhựa sáng màu, mặt nhám, dán chắc dưới dầm, vuông góc với tia laser. Mặt bóng, sơn đen, bê tông ướt làm tín hiệu yếu hoặc nhảy.
- Đặt cảm biến ở giữa dải đo lúc bắt đầu, chừa dải cho cả chiều lên và chiều xuống; dải 100 mm thì đặt khoảng giữa.
- Hai điểm trở lên ở hai đầu dầm (hoặc mỗi kích một điểm) để biết nâng có đều không.
- Che nắng trực tiếp cho cảm biến và giá đỡ; nắng chiếu vào đích cũng làm cảm biến khó đọc.
3. Nguồn sai số

Với chuyển vị 10 mm, lệch góc vài độ chỉ gây sai số vài phần trăm milimét; còn giá đỡ nhôm cao 200 mm khi nắng chiếu làm nóng thêm 10 °C đã dài ra 0,046 mm. Giá đỡ ngắn, bằng thép, che nắng, và ghi nhiệt độ kèm số đo khi theo dõi qua nhiều giờ. Cách tính sai số cosin, Abbe, giãn nở nhiệt có ở bài sai số Abbe, cosin và giãn nở nhiệt; cách hiệu chuẩn cảm biến laser có ở bài hiệu chuẩn cảm biến laser theo ISO 9513.
4. Đọc ngõ ra 4–20 mA bằng ESP32

- Ngõ ra dòng 4–20 mA ít bị ảnh hưởng bởi dây dài và nhiễu, hợp công trường. 4 mA là đầu dải, 20 mA là cuối dải; dòng dưới khoảng 3,8 mA nghĩa là đứt dây hoặc cảm biến lỗi.
- Điện trở 150 Ω (sai số 0,1 %) đổi 4–20 mA thành 0,6–3,0 V, nằm trong dải đo ±4,096 V của ADS1115 khi ADS1115 chạy 3,3 V.
- 0 V của nguồn 24 V nuôi cảm biến nối chung với GND của ADS1115 và ESP32.
Đo ngõ ra 4–20 mA và sơ đồ vòng dòng có thêm ở bài hiệu chuẩn transmitter 4–20 mA.
// PYWORLD.VN - Theo dõi chuyển vị khi nâng hạ kết cấu bằng 2 cảm biến laser ngõ ra 4–20 mA: ESP32 đọc qua ADS1115 16 bit
// PYWORLD.VN - Dòng 4–20 mA qua điện trở 150 Ω thành 0,6–3,0 V; đổi ra mm theo dải đo, lấy điểm 0 bằng lệnh "z", báo vượt ngưỡng và chênh lệch 2 điểm
// PYWORLD.VN - ADS1115: SDA -> D21, SCL -> D22, VDD -> 3V3; cảm biến A vào kênh A0, cảm biến B vào kênh A1; còi báo GPIO25
#include <Wire.h>
#include <Adafruit_ADS1X15.h>
Adafruit_ADS1115 ads;
const float R_SHUNT = 150.0f; // Ω, loại sai số 0,1 %
const float DAI_DO_MM = 100.0f; // 4 mA = 0 mm, 20 mA = 100 mm (sửa theo cảm biến)
const float NGUONG_CANH_BAO = 5.0f, NGUONG_DUNG = 8.0f; // mm so với điểm 0
const float NGUONG_LECH = 3.0f; // mm: chênh lệch giữa hai điểm (nâng không đều)
const int CHAN_COI = 25, SO_MAU = 16;
float diemKhong[2] = {0, 0};
// Trả về mm của một kênh, NAN nếu dòng ngoài 3,8–20,5 mA (đứt dây, cảm biến lỗi, ngoài dải)
float docMm(uint8_t kenh) {
float tong = 0;
for (int i = 0; i < SO_MAU; i++) tong += ads.computeVolts(ads.readADC_SingleEnded(kenh));
float mA = tong / SO_MAU / R_SHUNT * 1000.0f;
if (mA < 3.8f || mA > 20.5f) return NAN;
return (mA - 4.0f) / 16.0f * DAI_DO_MM;
}
void setup() {
Serial.begin(115200);
pinMode(CHAN_COI, OUTPUT);
Wire.begin(21, 22);
if (!ads.begin(0x48)) {
Serial.println("Khong thay ADS1115 o 0x48");
while (true) delay(1000);
}
ads.setGain(GAIN_ONE); // ±4,096 V, 0,125 mV mỗi bước
ads.setDataRate(RATE_ADS1115_128SPS);
Serial.println("Go z de lay diem 0 truoc khi bat dau nang");
}
void loop() {
if (Serial.available() && Serial.read() == 'z') {
for (int k = 0; k < 2; k++) diemKhong[k] = docMm(k);
Serial.printf("Diem 0: A %.3f mm, B %.3f mm\n", diemKhong[0], diemKhong[1]);
}
float a = docMm(0) - diemKhong[0], b = docMm(1) - diemKhong[1];
const char *muc = "OK";
if (isnan(a) || isnan(b)) {
muc = "LOI CAM BIEN"; // dòng ngoài dải: coi như nguy hiểm, dừng nâng
} else if (fabsf(a) >= NGUONG_DUNG || fabsf(b) >= NGUONG_DUNG || fabsf(a - b) >= NGUONG_LECH) {
muc = "DUNG NANG";
} else if (fabsf(a) >= NGUONG_CANH_BAO || fabsf(b) >= NGUONG_CANH_BAO) {
muc = "CANH BAO";
}
digitalWrite(CHAN_COI, strcmp(muc, "OK") != 0 ? HIGH : LOW);
Serial.printf("A %+7.3f mm | B %+7.3f mm | lech %+6.3f mm | %s\n", a, b, a - b, muc);
delay(500);
}
- Gõ
ztrong Serial Monitor trước khi bắt đầu nâng để lấy điểm 0 cho cả hai cảm biến. - Ba mức: CANH BAO khi một điểm đã chuyển vị từ 5 mm; DUNG NANG khi một điểm từ 8 mm hoặc hai điểm lệch nhau từ 3 mm; LOI CAM BIEN khi dòng ngoài dải. Còi kêu ở mọi mức khác OK. Các ngưỡng là ví dụ: lấy theo biện pháp thi công và tính toán kết cấu của từng công trình.
- Sửa
DAI_DO_MMđúng dải của cảm biến (ghi trong datasheet: 4 mA ứng với bao nhiêu, 20 mA ứng với bao nhiêu).

Hệ thống này là công cụ hỗ trợ theo dõi; quyết định dừng nâng vẫn do người chỉ huy thi công. Cần lưu số liệu lâu dài, gửi lên điện thoại thì ghép thêm phần ghi thẻ nhớ hoặc gửi MQTT.
5. Lỗi hay gặp
| Hiện tượng | Nguyên nhân | Cách xử lý |
|---|---|---|
| Báo LOI CAM BIEN dù cảm biến sáng đèn | Đích ngoài dải đo, đứt dây tín hiệu, thiếu dây 0 V chung | Dời cảm biến về giữa dải; kiểm tra dây, nối chung 0 V |
| Số nhảy vài phần mười mm khi đứng yên | Mặt đích bóng, tối, nắng chiếu, rung | Đổi tấm đích nhám sáng, che nắng; tăng số mẫu trung bình |
| Số trôi chậm theo giờ trong ngày | Giá đỡ, khung chuẩn giãn nở theo nhiệt | Giá đỡ thép ngắn, che nắng; ghi nhiệt độ để hiệu chỉnh |
| Hai điểm báo lệch nhưng nhìn thấy nâng đều | Một khung chuẩn bị chạm, bị kéo theo kết cấu | Kiểm tra khung chuẩn đứng độc lập |
| Chuyển vị đúng chiều nhưng sai độ lớn | Sai DAI_DO_MM hoặc sai giá trị điện trở | Đối chiếu datasheet; đo lại điện trở |
Sản phẩm dùng trong bài: mạch ADC ADS1115 16 bit, ESP32 DevKit V1 30 chân.
Bài cùng cụm chủ đề: quan trắc lún công trình bằng hệ thủy lực; đo dao động công trình bằng gia tốc kế.
Xem thêm