Arduino Cảm biến siêu âm

Trong hướng dẫn này, chúng ta sẽ học:

Phần cứng cần chuẩn bị

1×Arduino Uno R3
1×USB 2.0 cable type A/B (for USB-A PC)
1×USB 2.0 cable type C/B (for USB-C PC)
1×cảm biến siêu âm
1×dây jumper
1×(Khuyến nghị) Screw Terminal Block Shield for Arduino Uno
1×(Khuyến nghị) Breadboard Shield for Arduino Uno
1×(Khuyến nghị) Enclosure for Arduino Uno
1×(Khuyến nghị) Prototyping Base Plate & Breadboard Kit for Arduino UNO

Or you can buy the following kits:

1×DIYables STEM V3 Starter Kit (Arduino included)
1×DIYables Sensor Kit (30 sensors/displays)
1×DIYables Sensor Kit (18 sensors/displays)

Về cảm biến siêu âm

Cảm biến siêu âm HC-SR04 được dùng để đo khoảng cách tới một vật thể bằng sóng siêu âm.

Sơ đồ chân

Cảm biến siêu âm HC-SR04 gồm bốn chân:

  • Chân VCC: cần được kết nối với VCC (5V)
  • Chân GND: cần được kết nối với GND (0V)
  • Chân TRIG: chân này nhận tín hiệu điều khiển (xung) từ Arduino.
  • Chân ECHO: chân này gửi một tín hiệu (xung) tới Arduino. Arduino đo thời lượng của xung để tính khoảng cách.
bảng nối chân của cảm biến siêu âm
image source: diyables.io

Cách hoạt động

Phần này chứa thông tin nâng cao có thể gây quá tải. Nếu bạn chưa chắc về nội dung, hãy bỏ qua và chuyển sang phần tiếp theo.
  1. Vi xử lý: tạo một xung 10 microgiây trên chân TRIG.
  2. Cảm biến siêu âm tự động phát ra sóng siêu âm.
  3. Sóng siêu âm được phản xạ sau khi va chạm với một vật cản.
  4. Cảm biến siêu âm:
    • Phát hiện sóng siêu âm phản xạ.
    • đo thời gian truyền của sóng siêu âm.
  • Cảm biến siêu âm: phát ra một xung tới chân ECHO. Thời lượng của xung bằng với thời gian truyền của sóng siêu âm.
  • Vi xử lý đo thời lượng xung ở chân ECHO, và sau đó tính khoảng cách giữa cảm biến và vật cản.
  • Cách đo khoảng cách từ cảm biến siêu âm

    Để lấy khoảng cách từ cảm biến siêu âm, chúng ta chỉ cần thực hiện hai bước (1 và 6 trong phần How It Works)

    • Tạo một xung 10 microgiây trên chân TRIG
    • Đo thời lượng của xung trên chân ECHO, và sau đó tính khoảng cách giữa cảm biến và vật cản

    Tính toán khoảng cách

    Chúng tôi có:

    • Thời gian truyền của sóng siêu âm (µs): travel_time = pulse_duration
    • Tốc độ của sóng siêu âm: speed = SPEED_OF_SOUND = 340 m/s = 0.034 cm/µs

    Vậy:

    • Khoảng cách lan truyền của sóng siêu âm (cm): travel_distance = speed × travel_time = 0.034 × pulse_duration
    • Khoảng cách giữa cảm biến và vật cản (cm): distance = travel_distance / 2 = 0.034 × pulse_duration / 2 = 0.017 × pulse_duration

    Arduino - Cảm biến Siêu âm

    Các chân của Arduino có thể tạo ra một xung dài 10 micro giây và đo thời lượng của xung. Do đó, chúng ta có thể xác định khoảng cách từ cảm biến siêu âm bằng cách sử dụng hai chân của Arduino:

    • Một chân được nối tới TRIG PIN để tạo xung 10µs cho chân TRIG của cảm biến
    • Một chân khác được nối tới ECHO PIN để đo xung từ cảm biến

    Sơ đồ đấu dây

    sơ đồ nối dây cảm biến siêu âm Arduino

    This image is created using Fritzing. Click to enlarge image

    Cách Lập Trình Cho Cảm Biến Siêu Âm

    • Tạo một xung dài 10 microgiây trên một chân của Arduino bằng cách sử dụng các hàm digitalWrite()delayMicroseconds(). Ví dụ, chân số 9:
    digitalWrite(9, HIGH); delayMicroseconds(10); digitalWrite(9, LOW);
    • Đo thời gian xung (µs) trên chân của Arduino bằng cách sử dụng hàm pulseIn(). Ví dụ, chân 8:
    duration_us = pulseIn(8, HIGH);
    • Tính khoảng cách (cm):
    distance_cm = 0.017 * duration_us;

    Mã Arduino

    /* * Created by ArduinoGetStarted, https://arduinogetstarted.com * * Arduino - Ultrasonic Sensor HC-SR04 * * Wiring: Ultrasonic Sensor -> Arduino: * - VCC -> 5VDC * - TRIG -> Pin 9 * - ECHO -> Pin 8 * - GND -> GND * * Tutorial is available here: https://arduinogetstarted.com/tutorials/arduino-ultrasonic-sensor */ int trigPin = 9; // TRIG pin int echoPin = 8; // ECHO pin float duration_us, distance_cm; void setup() { // begin serial port Serial.begin (9600); // configure the trigger pin to output mode pinMode(trigPin, OUTPUT); // configure the echo pin to input mode pinMode(echoPin, INPUT); } void loop() { // generate 10-microsecond pulse to TRIG pin digitalWrite(trigPin, HIGH); delayMicroseconds(10); digitalWrite(trigPin, LOW); // measure duration of pulse from ECHO pin duration_us = pulseIn(echoPin, HIGH); // calculate the distance distance_cm = 0.017 * duration_us; // print the value to Serial Monitor Serial.print("distance: "); Serial.print(distance_cm); Serial.println(" cm"); delay(500); }

    Hướng dẫn từng bước

    • Sao chép mã ở trên và mở bằng Arduino IDE
    • Nhấn nút Tải lên trên Arduino IDE để tải mã lên Arduino
    Arduino ide - cách tải mã lên
    • Mở Serial Monitor
    • Di chuyển tay của bạn trước cảm biến siêu âm
    • Xem khoảng cách từ cảm biến đến tay bạn trên Serial Monitor
    COM6
    Send
    distance: 29.4 cm distance: 27.6 cm distance: 26.9 cm distance: 17.4 cm distance: 16.9 cm distance: 14.3 cm distance: 15.6 cm distance: 13.1 cm
    Autoscroll Show timestamp
    Clear output
    9600 baud  
    Newline  

    Giải thích mã nguồn

    Bạn có thể tìm lời giải thích trong các dòng chú thích của mã Arduino ở trên.

    Cách lọc nhiễu từ các phép đo khoảng cách của cảm biến siêu âm

    Kết quả đo từ cảm biến siêu âm chứa nhiễu. Trong một số ứng dụng, kết quả bị nhiễu gây ra thao tác không mong muốn. Chúng ta có thể loại bỏ nhiễu bằng cách sử dụng thuật toán sau:

    1. Lấy nhiều lần đo và lưu vào một mảng
    2. Sắp xếp mảng theo thứ tự tăng dần
    3. Lọc nhiễu
      • Những mẫu nhỏ nhất được xem là nhiễu → bỏ qua
      • Những mẫu lớn nhất được xem là nhiễu → bỏ qua
      • ⇒ lấy trung bình của các mẫu ở giữa

      Đoạn mã ví dụ dưới đây thực hiện 20 phép đo.

      • Năm mẫu nhỏ nhất được xem là nhiễu → bỏ qua chúng
      • Năm mẫu lớn nhất được xem là nhiễu → bỏ qua chúng
      • ⇒ lấy trung bình của 10 mẫu ở giữa (từ mẫu thứ 5 đến mẫu thứ 14)
      /* * Mã Arduino này được phát triển bởi newbiely.vn * Mã Arduino này được cung cấp để sử dụng công khai, không có ràng buộc. * Để xem hướng dẫn chi tiết và sơ đồ kết nối, vui lòng truy cập: * https://newbiely.vn/tutorials/arduino/arduino-ultrasonic-sensor */ #define TRIG_PIN 9 // TRIG pin #define ECHO_PIN 8 // ECHO pin float filterArray[20]; // array to store data samples from sensor float distance; // store the distance from sensor void setup() { // begin serial port Serial.begin (9600); // configure the trigger and echo pins to output mode pinMode(TRIG_PIN, OUTPUT); pinMode(ECHO_PIN, INPUT); } void loop() { // 1. TAKING MULTIPLE MEASUREMENTS AND STORE IN AN ARRAY for (int sample = 0; sample < 20; sample++) { filterArray[sample] = ultrasonicMeasure(); delay(30); // to avoid untrasonic interfering } // 2. SORTING THE ARRAY IN ASCENDING ORDER for (int i = 0; i < 19; i++) { for (int j = i + 1; j < 20; j++) { if (filterArray[i] > filterArray[j]) { float swap = filterArray[i]; filterArray[i] = filterArray[j]; filterArray[j] = swap; } } } // 3. FILTERING NOISE // + the five smallest samples are considered as noise -> ignore it // + the five biggest samples are considered as noise -> ignore it // ---------------------------------------------------------------- // => get average of the 10 middle samples (from 5th to 14th) double sum = 0; for (int sample = 5; sample < 15; sample++) { sum += filterArray[sample]; } distance = sum / 10; // print the value to Serial Monitor Serial.print("distance: "); Serial.print(distance); Serial.println(" cm"); } float ultrasonicMeasure() { // generate 10-microsecond pulse to TRIG pin digitalWrite(TRIG_PIN, HIGH); delayMicroseconds(10); digitalWrite(TRIG_PIN, LOW); // measure duration of pulse from ECHO pin float duration_us = pulseIn(ECHO_PIN, HIGH); // calculate the distance float distance_cm = 0.017 * duration_us; return distance_cm; }

    Video Tutorial

    Việc sản xuất video tốn rất nhiều thời gian. Nếu video hướng dẫn hữu ích cho việc học của bạn, hãy đăng ký kênh YouTube để ủng hộ. Nếu nhu cầu đủ cao, chúng tôi sẽ cố gắng làm thêm nhiều video.

    Thách thức bản thân

    Sử dụng cảm biến siêu âm để thực hiện một trong các dự án sau:

    • Phòng tránh va chạm cho xe điều khiển từ xa.
    • Phát hiện mức đầy của thùng rác.
    • Giám sát mức độ của thùng rác.
    • Mở và đóng thùng rác tự động. Gợi ý: Tham khảo Arduino - Động cơ servo.

    Kiến thức bổ sung

    Một số nhà sản xuất cung cấp cảm biến siêu âm có 3 chân. Tín hiệu TRIG và tín hiệu ECHO ở chung một chân. Trong trường hợp này, chúng ta chỉ cần dùng một chân của Arduino cho cả hai mục đích: phát xung tới cảm biến và đo xung từ cảm biến.

    Ứng dụng của cảm biến siêu âm

    • Phòng tránh va chạm
    • Phát hiện mức đầy
    • Đo mức
    • Phát hiện gần