Copy code lên đây đi, ảnh mờ quá, lại còn chụp màn hình bằng điện thoại, đến ảnh chụp màn hình cũng không phải…
Còn cách đấu dây nữa, nói rõ hết ra.
(Bài viết đã bị tác giả xóa)
Trước tiên hãy sửa một lỗi rõ ràng: bạn đang dùng bộ ULD API VL53L1X_..., tham số của VL53L1X_SetDistanceMode() chỉ có 1=Short, 2=Long, không có 3. Muốn đặt chế độ khoảng cách dài thì nên viết:
status = VL53L1X_SetDistanceMode(dev, 2);
Ngoài ra, 5633 không nhất thiết có nghĩa là cảm biến bị “kẹt”. Code của bạn chỉ kiểm tra xem khoảng cách có nhỏ hơn 4000 hay không, nhưng lại không đọc RangeStatus. Khi không có mục tiêu, tín hiệu phản xạ quá yếu hoặc phép đo không hợp lệ, thanh ghi khoảng cách cũng có thể trả về một con số, và con số đó không thể dùng trực tiếp như khoảng cách thật.
Đề nghị trước hết đừng thêm các logic như hiệu chuẩn hay khởi động lại, mà mỗi khung hình hãy in ra tất cả các mục sau:
-
Giá trị trả về của
CheckForDataReady()vàdataReady -
Giá trị trả về của
GetDistance() -
Kết quả của
GetRangeStatus() -
distgốc
Chỉ dùng khoảng cách khi RangeStatus==0; nếu khác 0 thì xử lý như phép đo không hợp lệ. Ngoài ra, giá trị trả về của SetDistanceMode(), StartRanging(), ClearInterrupt() hiện đều bị bỏ qua, hãy in từng mục trước, cơ bản là có thể xác định vấn đề nằm ở tham số, giao tiếp I2C hay trạng thái đo.
Đoạn code này làm vấn đề phức tạp hơn. VL53L1X sau khi khởi động sẽ đo liên tục, không phải mỗi lần đọc được giá trị bất thường là phải gọi lại StartRanging(), càng không có quy trình chuẩn nào kiểu “khởi động liên tục 300 lần để hỗ trợ thoát hiệu chuẩn”. Trước hết hãy xóa caliCount và cả đoạn logic khởi động lại dài đó đi.
Hiện tại bạn có ít nhất hai vấn đề rõ ràng:
-
Chế độ đo xa của ULD là
SetDistanceMode(dev, 2), không phải 3. -
Chỉ xem
dist, không xemRangeStatus, nên 5633 rốt cuộc là phép đo hợp lệ hay kết quả không hợp lệ thì bản thân code cũng không biết.
Còn một điểm nữa: OLED chỉ cập nhật khi dataReady bằng 1. Nếu sau đó dataReady cứ là 0, màn hình đương nhiên sẽ dừng ở giá trị cũ, trông như “chết” vậy. Hiển thị cả dataReady và giá trị trả về của các hàm thì sẽ phân biệt được “không có dữ liệu mới” với “liên tục nhận được khoảng cách không hợp lệ”.
Quy trình tối thiểu nên là: khởi tạo một lần → khởi động một lần → đợi ready → đọc RangeStatus và Distance → ClearInterrupt → tiếp tục đợi khung tiếp theo. Hãy chạy được theo quy trình này trước đã, rồi mới bàn đến lọc và hiệu chuẩn.
Trước khi thay đổi firmware thêm, tôi sẽ đặt module lên một bàn thử đã được xác nhận là tốt: dây ngắn, một mục tiêu trắng cố định cách khoảng 300–500 mm, không có ánh nắng mạnh và không có gì che quang học. Nếu cảm biến vẫn còn lớp phim bảo vệ, hãy bóc ra.
Sau đó kiểm tra phần cứng theo thứ tự sau:
-
Đọc ID cảm biến. Với API ULD của VL53L1X, giá trị phải là
0xEACC; đừng suy ra chip từ ký hiệu bo mạch chungVL53LXX-V2. -
Đo SDA và SCL bằng máy hiện sóng trong lúc đọc thanh ghi 16-bit. Kiểm tra thứ tự byte địa chỉ thanh ghi, thứ tự byte dữ liệu, tín hiệu ACK và điều kiện repeated-start. Một lần khởi tạo thành công không nhất thiết chứng minh mọi giao dịch nhiều byte đều đúng.
-
Xác nhận nguồn cấp tại module trong lúc đo khoảng cách, không chỉ khi cảm biến đang rảnh.
-
Chỉ sau đó mới xem xét XSHUT. Nhiều bo mạch breakout loại này đã kéo lên sẵn, và không cần GPIO1 khi thăm dò
CheckForDataReady().
Và đúng, cũng hãy sửa SetDistanceMode(dev, 3) — trong API ULD này, chế độ Long là 2. In thêm RangeStatus cùng với khoảng cách; nếu không, một giá trị 5633 vô nghĩa có thể trông y hệt như cảm biến bị treo.



