Sử dụng cảm biến khoảng cách HC SR04 với ESP32 và Arduino
Trong bài này, mình sẽ hướng dẫn bạn chi tiết cách sử dụng cảm biến khoảng cách HC SR04 để đo khoảng cách đến vật thể, dựa trên mạch ESP32 và phần mềm Arduino IDE.
Giới thiệu cảm biến siêu âm HC SR04
HC SR04 sử dụng sóng siêu âm để đo khoảng cách từ nó tới vật thể phía trước, theo nguyên lý gửi sóng siêu âm và chờ sóng siêu âm phản xạ lại khi gặp vật thể, để xác định vật thể ở xa hay gần.
Cảm biến siêu âm HC SR04 có thể đo được khoảng cách từ 2cm đến 400cm, với độ chính xác là 0,3cm. Đây là một module ESP32 phổ biến thường dùng trong các dự án điện tử, IoT,… của dân Makers.
Dưới đây là hình ảnh minh họa 2 mặt của cảm biến siêu âm HC SR04:
Cách hoạt động
Cảm biến siêu âm HC SR04 hoạt động theo cách thức như sau:
- Máy phát siêu âm (chân Trig) phát ra một dạng sóng siêu âm ở tần số cao (40kHz)
- Sóng siêu âm này truyền qua không khí. Khi gặp vật thể, chúng sẽ bị phản xạ trở lại cảm biến
- Máy thu siêu âm (chân Echo) nhận lại lượng sóng siêu âm phản xạ trở về
Dưới đây là sơ đồ minh họa cách hoạt động, để bạn hiểu rõ hơn trong khi sử dụng cảm biến khoảng cách HC SR04:
Dựa vào tốc độ và thời gian mà sóng siêu âm truyền đi, cảm biến HC SR04 có thể tính được khoảng cách đến vật thể, theo công thức sau:
Khoảng cách = (tốc độ âm thanh truyền đi trong không khí x thời gian) / 2
Lưu ý: Tốc độ truyền âm thanh trong không khí ở nhiệt độ 20°C là 343m/s.
Thông số kỹ thuật
- Nguồn: 5V
- Dòng điện: 15mA
- Tần số hoạt động: 40kHz
- Khoảng cách đo được xa nhất: 400cm
- Khoảng cách đo được gần nhất: 2cm
- Góc đo: 15 độ
- Sai số: 0,3cm
- Kích cỡ: 45 x 20 x 15mm
Trên cảm biến siêu âm HC SR04 có 4 chân như sau:
- VCC: Nguồn cấp điện cho cảm biến (5V)
- Trig: Chân đầu vào kích hoạt
- Echo: Chân đầu ra
- GND: Nối đất
Chuẩn bị phần cứng
- Cảm biến đo khoảng cách HC SR04
- ESP32
- Breadboard
- Dây Jumper
Sơ đồ kết nối
Để sử dụng cảm biến khoảng cách HC SR04 với ESP32, mình sẽ kết nối như hình bên dưới:
- Chân Trig cảm biến – GPIO 5
- Chân Echo cảm biến – GPIO 18
- Chân VCC cảm biến – VIN
- Chân GND cảm biến – GND
Khi sử dụng cảm biến khoảng cách HC SR04 với ESP32 và Arduino, mình thường dùng chân GPIO 5 và GPIO 18, nhưng bạn có thể đổi thành bất kỳ chân GPIO phù hợp nào khác mà bạn muốn nhé!
Nạp chương trình vào Arduino IDE để sử dụng cảm biến khoảng cách HC SR04 với ESP32 và Arduino
Trước khi nạp chương trình vào Arduino IDE, phần mềm này của bạn cần cài tiện ích ESP32. IoTZone đã viết một bài hướng dẫn chi tiết về phần này, nếu chưa cài thì bạn có thể tham khảo làm thêm tại bài viết sau.
Dưới đây là một đoạn code đơn giản để bạn sử dụng cảm biến khoảng cách HC SR04 để đo khoảng cách:
const int trigPin = 5; const int echoPin = 18; //define sound speed in cm/uS #define SOUND_SPEED 0.034 #define CM_TO_INCH 0.393701 long duration; float distanceCm; float distanceInch; void setup() { Serial.begin(115200); // Starts the serial communication pinMode(trigPin, OUTPUT); // Sets the trigPin as an Output pinMode(echoPin, INPUT); // Sets the echoPin as an Input } void loop() { // Clears the trigPin digitalWrite(trigPin, LOW); delayMicroseconds(2); // Sets the trigPin on HIGH state for 10 micro seconds digitalWrite(trigPin, HIGH); delayMicroseconds(10); digitalWrite(trigPin, LOW); // Reads the echoPin, returns the sound wave travel time in microseconds duration = pulseIn(echoPin, HIGH); // Calculate the distance distanceCm = duration * SOUND_SPEED/2; // Convert to inches distanceInch = distanceCm * CM_TO_INCH; // Prints the distance in the Serial Monitor Serial.print("Distance (cm): "); Serial.println(distanceCm); Serial.print("Distance (inch): "); Serial.println(distanceInch); delay(1000); }
Bạn hãy upload đoạn code trên vào mạch ESP32 và quan sát kết quả nhé! Dưới đây mình sẽ giải thích chi tiết về từng dòng code để bạn hiểu hơn về cách sử dụng cảm biến khoảng cách HC SR04 với ESP32 và Arduino.
Giải thích chương trình
Khai báo chân Trig và chân Echo:
const int trigPin = 5; const int echoPin = 18;
Khai báo vận tốc âm thanh của sóng siêu âm trong không khí là 334m/s (vì code đo khoảng cách bằng cảm biến siêu âm này đang dùng đơn vị cm/uS => chúng ta cần quy đổi 334m/s thành 0,034 cm/uS):
#define SOUND_SPEED 0.034
Đổi khoảng cách đo được từ cm thành inch:
#define CM_TO_INCH 0.393701
Khởi tạo các biến:
- Duration: Lưu khoảng thời gian từ khi sóng siêu âm được gửi đi đến khi phản xạ lại
- DistanceCm và DistanceInch giúp lưu khoảng cách ở đơn vị cm và đơn vị inch
long duration; float distanceCm; float distanceInch;
Setup()
Tạo Serial Monitor ở tốc độ 115200 để in giá trị khoảng cách đo được:
Serial.begin(115200); // Starts the serial communication
Cấu hình Trig là đầu ra (Trig gửi sóng siêu âm đi) và Echo là đầu vào (nhận sóng siêu âm phản hồi và gửi tín hiệu đến mạch ESP32 để đo khoảng cách bằng cảm biến siêu âm):
pinMode(trigPin, OUTPUT); // Sets the trigPin as an Output pinMode(echoPin, INPUT); // Sets the echoPin as an Input
Loop()
Phát ra sóng siêu âm khi cho chân Trig ở mức HIGH. Lưu ý rằng trước đó chúng ta cần để chân Trig ở mức LOW (không phát sóng siêu âm):
// Clears the trigPin digitalWrite(trigPin, LOW); delayMicroseconds(2); // Sets the trigPin on HIGH state for 10 micro seconds digitalWrite(trigPin, HIGH); delayMicroseconds(10); digitalWrite(trigPin, LOW);
Chúng ta sử dụng câu lệnh sau để đo thời gian truyền sóng siêu âm:
duration = pulseIn(echoPin, HIGH);
Lưu ý: Hàm pulseI() sẽ đọc tín hiệu xung HIGH hoặc LOW trên chân, chúng cần thông tin là chân nào và trạng thái của xung để trả về kết quả là thời gian, tính bằng đơn vị micro giây. Độ dài xung tương ứng với thời gian sóng siêu âm đi tới vật thể cộng với thời gian sóng siêu âm phản xạ về
Khi đã có thời gian, chúng ta chỉ cần tính khoảng cách đến vật thể, bằng công thức sau:
distanceCm = duration * SOUND_SPEED/2;
Đổi khoảng cách từ cm sang inch:
distanceInch = distanceCm * CM_TO_INCH;
In khoảng cách đo được ra màn hình Serial:
Serial.print("Distance (cm): "); Serial.println(distanceCm); Serial.print("Distance (inch): "); Serial.println(distanceInch);
Kết quả dự án đo khoảng cách bằng cảm biến siêu âm
Nạp chương trình vào board và bắt đầu sử dụng cảm biến khoảng cách HC SR04 để đo khoảng cách nhé!
Bạn hãy mở Serial Monitor (tốc độ truyền 115200), khởi động lại board mạch. Lúc đó, mạch sẽ bắt đầu đo khoảng cách bằng cảm biến siêu âm và in kết quả ra màn hình cho bạn quan sát, ví dụ:
Lời kết
Trên đây, IoTZone đã hướng dẫn cách sử dụng cảm biến khoảng cách HC SR04 để đo khoảng cách với mạch ESP32 và Arduino IDE. Đây chỉ là hướng dẫn cơ bản nhất, bạn hãy kết hợp thêm với các phần cứng khác như màn hình OLED, LCD, loa phát âm thanh,… để làm các dự án sinh động hơn nhé! Chúc các bạn thành công.