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

Hướng dẫn này chỉ cho bạn cách sử dụng ESP8266 và cảm biến siêu âm để đo khoảng cách đến các vật thể hoặc chướng ngại vật. Cụ thể, chúng ta sẽ tìm hiểu:

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

1×ESP8266 NodeMCU ESP-12E
1×Recommended: ESP8266 NodeMCU ESP-12E (Uno-form)
1×USB Cable Type-A to Type-C (for USB-A PC)
1×USB Cable Type-C to Type-C (for USB-C PC)
1×cảm biến siêu âm
1×dây jumper
1×(Khuyến nghị) Screw Terminal Expansion Board for ESP8266
1×(Khuyến nghị) Power Splitter for ESP8266 Type-C

Or you can buy the following kits:

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 sử dụng để xác định khoảng cách tới một vật thể bằng cách sử dụng sóng siêu âm.

Bố trí chân của cảm biến siêu âm

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

  • Chân VCC: phải được kết nối với VCC (5V)
  • Chân GND: phải đượ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ừ ESP8266.
  • Chân ECHO: chân này gửi tín hiệu (xung) tới ESP8266. ESP8266 đo độ dài của xung để tính khoảng cách.
sơ đồ chân cảm biến siêu âm

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 điều khiển tạo ra một xung dài 10 µs trên chân TRIG, xung này kích hoạt cảm biến siêu âm phát ra sóng siêu âm.
  2. Sóng siêu âm bị phản xạ sau khi va phải một vật cản.
  3. Cảm biến siêu âm sau đó phát hiện sóng siêu âm phản xạ và đo thời gian lan truyền của nó.
  4. Cảm biến siêu âm tạo ra một xung trên chân ECHO, với thời lượng xung bằng với thời gian lan truyền của sóng siêu âm.
  5. Vi điều khiển đo thời lượng xung trên chân ECHO và 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

  1. Để tính khoảng cách từ cảm biến siêu âm, hai bước phải được thực hiện (1 và 6 ở phần Cách nó hoạt động):
  2. Tạo một xung 10 microgiây trên chân TRIG.
  3. Đo thời lượng xung trên chân ECHO.
  4. 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

ESP8266 - Cảm biến siêu âm

Chúng ta có thể sử dụng hai chân GPIO của ESP8266 để đo khoảng cách từ cảm biến siêu âm: một chân được nối vào chân TRIG để phát ra xung 10µs, và chân kia được nối vào chân ECHO để đo xung từ cảm biến.

Sơ đồ đấu dây

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

This image is created using Fritzing. Click to enlarge image

Xem thêm Sơ đồ chân ESP8266Cách cấp nguồn cho ESP8266.

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

  • Tạo một xung 10 vi giây trên chân D5 của ESP8266 bằng cách sử dụng các hàm digitalWrite()delayMicroseconds(). Ví dụ:
  • Đặt chân ở mức HIGH bằng digitalWrite(), sau đó trì hoãn 10 vi giây bằng delayMicroseconds(), rồi đặt chân ở mức LOW bằng digitalWrite().
digitalWrite(D5, HIGH); delayMicroseconds(10); digitalWrite(D5, LOW);
  • Đo thời lượng xung (µs) trên chân D6 của Arduino bằng cách sử dụng hàm pulseIn(). Ví dụ:
duration_us = pulseIn(D6, HIGH);
  • Tính khoảng cách (cm):
distance_cm = 0.017 * duration_us;

Mã ESP8266

const int TRIG_PIN = D5; // The ESP8266 pin D5 connected to Ultrasonic Sensor's TRIG pin const int ECHO_PIN = D6; // The ESP8266 pin D6 connected to Ultrasonic Sensor's ECHO pin float duration_us, distance_cm; void setup() { // begin serial port Serial.begin (9600); // Configure the trigger pin to output mode pinMode(TRIG_PIN, OUTPUT); // Configure the echo pin to input mode pinMode(ECHO_PIN, INPUT); } void loop() { // Produce a 10-microsecond pulse to the TRIG pin. digitalWrite(TRIG_PIN, HIGH); delayMicroseconds(10); digitalWrite(TRIG_PIN, LOW); // Measure the pulse duration from the ECHO pin duration_us = pulseIn(ECHO_PIN, 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

Để bắt đầu với ESP8266 trên Arduino IDE, hãy làm theo các bước sau:

  • Hãy xem hướng dẫn ESP8266 - Cài đặt phần mềm nếu đây là lần đầu bạn sử dụng ESP8266.
  • Nối các linh kiện như được hiển thị trong sơ đồ.
  • Kết nối bo mạch ESP8266 với máy tính của bạn bằng cáp USB.
  • Mở Arduino IDE trên máy tính của bạn.
  • Chọn bo mạch ESP8266 phù hợp, chẳng hạn (ví dụ: NodeMCU 1.0 (ESP-12E Module)), và cổng COM tương ứng của nó.
  • Sao chép mã nguồn và mở nó trong Arduino IDE.
  • Nhấp vào nút Tải lên trên Arduino IDE để biên dịch và tải mã lên ESP8266.
cách nạp mã nguồn lên ESP8266 NodeMCU bằng Arduino ide
  • Mở Serial Monitor
  • Di chuyển tay bạn quanh cảm biến siêu âm
  • Xem khoảng cách giữa cảm biến và tay bạn được hiển thị 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

Hãy xem lời giải thích theo từng dòng được chứa trong các chú thích của mã nguồ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 có thể bị nhiễu, điều này có thể dẫn đến các thao tác không mong muốn trong một số ứng dụng. Để loại bỏ nhiễu, thuật toán sau có thể được sử dụng:

  1. Đo nhiều lần và lưu chúng vào một mảng
  2. Sắp xếp mảng theo thứ tự tăng dần
  3. Lọc bỏ nhiễu
    • Một số mẫu nhỏ nhất được xem là nhiễu → bỏ qua chúng
    • Một số mẫu lớn nhất được xem là nhiễu → bỏ qua chúng
    • Tính giá trị 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 nên được bỏ qua.
    • Năm mẫu lớn nhất nên được bỏ qua.
    • Trung bình của 10 mẫu ở giữa (từ mẫu thứ năm đến mẫu thứ mười bốn) nên được tính.
    /* * Mã ESP8266 NodeMCU này được phát triển bởi newbiely.vn * Mã ESP8266 NodeMCU 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/esp8266/esp8266-ultrasonic-sensor */ #define TRIG_PIN D5 // The ESP8266 pin connected to Ultrasonic Sensor's TRIG pin #define ECHO_PIN D6 // The ESP8266 pin connected to Ultrasonic Sensor's 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() { // Produce a 10-microsecond pulse to the TRIG pin. digitalWrite(TRIG_PIN, HIGH); delayMicroseconds(10); digitalWrite(TRIG_PIN, LOW); // Measure the pulse duration from the 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ử thách bản thân

Sử dụng cảm biến siêu âm cho bất kỳ dự án nào trong số các dự án sau đây:

  • Xây dựng một hệ thống tránh va chạm cho một chiếc xe ô tô điều khiển từ xa.
  • Ước lượng mức đầy của thùng rác.
  • Giám sát mức đầy của thùng rác.
  • Tự động mở và đóng thùng rác. Gợi ý: Xem ESP8266 - Động cơ servo.

Các ứng dụng của cảm biến siêu âm

  • Phòng ngừa va chạm
  • Ước tính dung lượng
  • Ước tính chiều cao
  • Nhận diện các vật thể ở gần