Học

Measure distance with an HC-SR04 ultrasonic sensor

Trung bình

Hoặc xem mọi bài học.

  • 503linh kiện trên bàn làm mạch
  • 44bo mạch đang chạy
  • 1.00xthời gian thực, trên mọi bo mạch
Arduino Uno: cảm biến lùi xelive0.000 s 0.00x
Nhấp để mở trong trình soạn thảo
Ví dụ parking: một HC-SR04 ở chân 7 và 6, một còi buzzer ở chân 9 và một đèn ở chân 8. Mở trong trình soạn thảo và kéo thanh trượt của cảm biến để di chuyển bức tường.

HC-SR04 là cảm biến mà lớp học nào cũng bắt đầu, vì chẳng có gì bị giấu trong nó: không bus, không địa chỉ, không thư viện nào bạn phải tin. Bạn gửi cho nó một xung, nó gửi lại một xung, và độ dài của xung thứ hai chính là khoảng cách. Mạch ở trên nối nó với một Arduino Uno và biến giá trị đọc thành một cảm biến lùi xe, với còi buzzer kêu nhanh dần khi lại gần tường và một đèn đỏ khi đã vào trong vạch dừng.

Mở mạch trong trình soạn thảo và kéo thanh trượt trên cảm biến để di chuyển bức tường. Serial Monitor in ra khoảng cách theo centimet và khoảng nghỉ giữa các tiếng bíp.

What you need

  • Một Arduino Uno
  • Một cảm biến siêu âm HC-SR04
  • Một còi buzzer
  • Một LED đỏ và một điện trở 220 ohm
  • Một breadboard và dây cắm

Wiring

Linh kiện và chânNối tớiGhi chú
VCC của HC-SR045 VModule cần 4.5 V trở lên
GND của HC-SR04GND
TRIG của HC-SR04Chân 7Bo mạch phát xung đo trên chân này
ECHO của HC-SR04Chân 6Ở mức cao suốt thời gian âm thanh đi và quay về
Còi buzzerChân 9Chân còn lại nối GND
LED đỏ, qua điện trở 220 ohmChân 8Sáng khi vào trong vạch dừng

Cảm biến đo như thế nào

Giữ TRIG ở mức cao ít nhất mười micro giây thì module phát ra một loạt sóng âm 40 kHz ngắn, rồi đưa ECHO lên mức cao đúng bằng thời gian âm thanh đi tới vật và quay lại. Ở nhiệt độ phòng, âm thanh đi khoảng 343 mét mỗi giây, tức 0.0343 centimet mỗi micro giây, và nó đi quãng đường đó hai lần. Vậy khoảng cách tính bằng centimet là thời gian tiếng vọng tính bằng micro giây chia cho khoảng 58, con số mà sketch HC-SR04 nào cũng chia.

Linh kiện của Mokxi giữ đúng thời gian trong datasheet: ECHO lên mức cao 460 micro giây sau xung kích, giữ mức cao 58 micro giây cho mỗi centimet, và khi không có gì trong tầm đo thì giữ mức cao suốt thời gian chờ tối đa 38 mili giây. Tốc độ âm thanh được tính từ nhiệt độ không khí mà bạn đặt được trên linh kiện, nên một sketch chia cho 58 sẽ đọc bức tường cách một mét thành 104 centimet ở nhiệt độ đóng băng, đúng như module thật.

Giải thích code

Ví dụ đọc cảm biến qua một hàm phụ nhỏ lo việc phát xung kích, đo thời gian tiếng vọng và trả về milimet, hoặc không nếu không có gì quay về. Viết tay bằng pulseIn(), cách mà phần lớn bài hướng dẫn làm, phép đo chỉ có năm dòng.

Phần cảm biến lùi xe là một hàm. Trong vòng 15 centimet, nó kêu một nốt dài liên tục và bật LED. Từ đó đến hai mét, khoảng nghỉ giữa các tiếng bíp tăng tuyến tính từ 90 mili giây đến 900. Quá hai mét thì im lặng. Mỗi vòng lặp kết thúc bằng một lần chờ 60 mili giây, và con số đó quan trọng: datasheet yêu cầu cách nhau 60 mili giây giữa các lần đo, vì tiếng vọng của lần trước vẫn còn dội quanh phòng.

Phép đo, theo cách phần lớn bài hướng dẫn viết
const int TRIG = 7;
const int ECHO = 6;

long readCm() {
  digitalWrite(TRIG, LOW);
  delayMicroseconds(2);
  digitalWrite(TRIG, HIGH);
  delayMicroseconds(10);
  digitalWrite(TRIG, LOW);
  long us = pulseIn(ECHO, HIGH, 38000);
  return us / 58;
}

Thử trong trình soạn thảo

Mở mạch trong trình soạn thảo và chọn cảm biến. Thuộc tính temperature của nó là nhiệt độ không khí, mặc định 20 độ. Đặt thành 0 thì cùng bức tường đó đọc ra xa hơn vài centimet, vì âm thanh đi chậm hơn trong không khí lạnh; đặt thành 40 thì đọc ra gần hơn. Sketch không thay đổi, và với mạch thật cũng vậy.

Tiếp theo, đổi delay(60) ở cuối mỗi nhánh của loop() thành delay(20). Giờ nhiều lần đo không được trả lời, vì module vẫn đang chờ tiếng vọng lần trước tắt hẳn và bỏ qua xung kích đến quá sớm, nên Serial Monitor bắt đầu trộn lẫn kết quả không có gì trong tầm đo với các khoảng cách thật. Đặt lại thành 60 thì mọi giá trị đọc lại là thật.

Để làm một dự án khác trên cùng cách nối dây, hãy xóa code còi buzzer và in khoảng cách ra Serial Plotter, thế là bạn có một máy đo khoảng cách đơn giản.

Common mistakes

Đo nhanh hơn 60 mili giây một lần. Giá trị đọc đầu tiên quay về và các lần sau bị bỏ qua, vì module từ chối phát xung trong lúc vẫn đang nghe. Linh kiện mô phỏng cũng làm vậy, nên lỗi này hiện ra ở đây trước khi hiện ra trên bàn của bạn.

Nối nhầm TRIG và ECHO. Không có gì hỏng, nhưng bo mạch chờ một xung không bao giờ tới, và mọi giá trị đọc đều là không hoặc bằng thời gian chờ tối đa.

Quên đặt thời gian chờ. Khi không có gì trong tầm đo, tiếng vọng kéo dài 38 mili giây, và pulseIn() không có thời gian chờ sẽ đợi cả một giây rồi mới bỏ cuộc, khiến phần còn lại của sketch có cảm giác bị treo.

Tin vào milimet cuối cùng. Một HC-SR04 thật tốt nhất cũng chỉ chính xác tới vài milimet, và bị rối bởi bề mặt mềm hoặc nghiêng. Giá trị đọc mô phỏng thì chính xác tuyệt đối, có ích để học code nhưng dễ dãi hơn ngoài đời.

Nối ECHO thẳng vào bo mạch 3.3 volt. Module xuất ECHO ở 5 volt. Với Uno thì không sao; với ESP32 hay Pico, mạch thật cần một mạch chia áp bằng điện trở trên đường đó.

Câu hỏi

Tầm đo của HC-SR04 là bao nhiêu?

Khoảng 2 centimet đến 4 mét. Linh kiện mô phỏng báo mọi thứ gần hơn 20 milimet hoặc xa hơn 4000 là không có gì trong tầm đo.

Vì sao chia cho 58?

Ở nhiệt độ phòng, âm thanh mất khoảng 29 micro giây để đi một centimet, và tiếng vọng đi quãng đường đó hai lần, đi và về. 29 nhân 2 là 58.

Có dùng HC-SR04 với ESP32 được không?

Được, dùng cùng code. Trên phần cứng thật, chân ESP32 không chịu được 5 volt, nên hãy đặt một mạch chia áp trên ECHO, ví dụ 1 k và 2 k, để hạ xuống khoảng 3.3 volt.

Trình mô phỏng có mô phỏng chính âm thanh không?

Không. Không có góc phát sóng và không có phản xạ từ cảnh vật. Linh kiện này là một chiếc đồng hồ bấm giờ giữ ECHO ở mức cao trong thời gian đi và về với tốc độ âm thanh, còn khoảng cách đặt bằng một thanh trượt. Như vậy là đủ để viết và gỡ lỗi code đúng như khi chạy trên phần cứng.

Lắp mạch này ngoài đời

Mở trình soạn thảo, đổi một giá trị và xem con số thay đổi theo. Không cần cài gì, không cần tài khoản.