Bỏ qua

Bài 6: Đọc tín hiệu cảm biến siêu âm HC-SR04 bằng ESP32

1. Giới thiệu

Trong bài học trước, chúng ta đã tìm hiểu cách sử dụng ESP32 và module TB6612FNG để điều khiển hai động cơ DC, giúp robot thực hiện các chuyển động tiến, lùi, rẽ trái, rẽ phải và dừng.

Tuy nhiên, để robot có thể di chuyển trong môi trường thực tế, ngoài khả năng điều khiển động cơ, robot còn cần phát hiện các vật cản trên đường di chuyển.

Một trong những cảm biến thường được sử dụng để thực hiện chức năng này là cảm biến siêu âm HC-SR04.

HC-SR04 cho phép đo khoảng cách đến vật thể bằng cách phát sóng siêu âm và đo thời gian sóng phản xạ quay trở lại.

Trong bài học này, chúng ta sẽ tìm hiểu nguyên lý hoạt động, cách kết nối và lập trình đọc dữ liệu từ HC-SR04 bằng ESP32.

Đặc biệt, bài học sẽ phân biệt hai trường hợp cấp nguồn cho cảm biến:

  • Trường hợp thông thường: HC-SR04 được cấp nguồn 5 V, cần xử lý mức điện áp của chân Echo trước khi kết nối với ESP32.
  • Trường hợp sử dụng trên bộ robot thực hành: HC-SR04 được cấp nguồn 3,3 V từ chân V trên board mở rộng ESP32, chân Echo được kết nối trực tiếp với GPIO19 sau khi xác nhận mức tín hiệu phù hợp.

2. Mục tiêu bài học

Sau bài học này, bạn có thể:

  • Hiểu nguyên lý đo khoảng cách bằng sóng siêu âm.
  • Nhận biết chức năng các chân VCC, Trig, Echo và GND.
  • Hiểu cách ESP32 kích hoạt HC-SR04 bằng xung Trig.
  • Sử dụng pulseIn() để đo thời gian phản hồi Echo.
  • Tính khoảng cách từ thời gian truyền sóng.
  • Kết nối HC-SR04 với board mở rộng ESP32.
  • Phân biệt cách kết nối khi cảm biến được cấp nguồn 5 V và 3,3 V.
  • Hiển thị khoảng cách trên Serial Monitor.
  • Phát hiện vật cản dựa trên ngưỡng khoảng cách.
  • Xử lý trường hợp không nhận được tín hiệu Echo hợp lệ.

3. Tìm hiểu cảm biến siêu âm HC-SR04

3.1. HC-SR04 là gì?

HC-SR04 là module cảm biến sử dụng sóng siêu âm để đo khoảng cách từ cảm biến đến vật thể phía trước.

Cảm biến có hai đầu dò hình tròn:

  • Đầu phát (Transmitter): Phát sóng siêu âm ra môi trường.
  • Đầu thu (Receiver): Nhận sóng siêu âm phản xạ từ vật thể.

Sóng siêu âm là sóng âm có tần số cao hơn giới hạn nghe thông thường của con người.

HC-SR04 sử dụng sóng siêu âm có tần số danh định khoảng 40 kHz.

Khi hoạt động, cảm biến phát một chùm sóng siêu âm về phía trước. Nếu gặp vật cản có khả năng phản xạ âm, một phần sóng sẽ quay trở lại đầu thu.

Bằng cách đo thời gian truyền sóng, cảm biến cho phép ESP32 tính toán khoảng cách đến vật cản.

3.2. Ứng dụng của HC-SR04

HC-SR04 được sử dụng trong nhiều ứng dụng:

  • Robot tránh vật cản.
  • Robot tự hành cơ bản.
  • Đo khoảng cách.
  • Hệ thống cảnh báo vật cản.
  • Phát hiện vật thể phía trước.
  • Các mô hình điều khiển tự động.

Trong bộ xe robot ESP32, HC-SR04 được sử dụng để hỗ trợ nhận biết vật cản phía trước robot.

3.3. Thông số cơ bản

Một số thông số tham khảo của HC-SR04 tiêu chuẩn:

Thông số Giá trị tham khảo
Điện áp hoạt động danh định 5 V DC
Tần số siêu âm Khoảng 40 kHz
Khoảng đo danh định Khoảng 2–400 cm
Góc phát hiện hiệu quả Phụ thuộc vật thể, thường khoảng 15°
Chân kích hoạt Trig
Chân phản hồi Echo
Tín hiệu đầu ra Digital

Lưu ý: Các thông số trên áp dụng cho HC-SR04 tiêu chuẩn trong điều kiện hoạt động được nhà sản xuất quy định. Khi sử dụng nguồn 3,3 V, khả năng hoạt động và phạm vi đo có thể khác.

Tài liệu tham khảo: Datasheet HC-SR04.


4. Nguyên lý hoạt động của HC-SR04

4.1. Nguyên lý phát và nhận sóng siêu âm

Quá trình đo khoảng cách được thực hiện như sau:

  1. ESP32 gửi một xung kích hoạt đến chân Trig.
  2. HC-SR04 phát một chùm sóng siêu âm.
  3. Sóng siêu âm truyền trong không khí.
  4. Khi gặp vật cản, sóng bị phản xạ.
  5. Đầu thu của cảm biến nhận tín hiệu phản hồi.
  6. HC-SR04 tạo xung Echo có độ rộng tương ứng với thời gian truyền sóng.
  7. ESP32 đo độ rộng xung Echo và tính khoảng cách.

Sơ đồ nguyên lý:

                   Sóng siêu âm
HC-SR04  ---------------------------->  Vật cản
         <----------------------------
                   Sóng phản xạ

                 Khoảng cách d

Do sóng siêu âm phải di chuyển từ cảm biến đến vật cản rồi quay trở lại, tổng quãng đường truyền sóng bằng hai lần khoảng cách cần đo.

4.2. Chức năng chân Trig

Chân Trig (Trigger) được sử dụng để kích hoạt quá trình đo.

Để bắt đầu một phép đo, ESP32 tạo một xung HIGH có độ rộng ít nhất 10 micro giây.

Ví dụ:

digitalWrite(TRIG_PIN, LOW);
delayMicroseconds(2);

digitalWrite(TRIG_PIN, HIGH);
delayMicroseconds(10);

digitalWrite(TRIG_PIN, LOW);

Sau khi nhận xung kích hoạt, cảm biến bắt đầu chu trình phát sóng siêu âm.

4.3. Chức năng chân Echo

Chân Echo được sử dụng để trả về tín hiệu thời gian.

Trong một phép đo hợp lệ, HC-SR04 tạo xung HIGH có độ rộng tương ứng với thời gian truyền sóng siêu âm đi và về.

ESP32 sử dụng hàm:

pulseIn(ECHO_PIN, HIGH);

Để đo độ rộng xung HIGH.

Giá trị trả về được tính bằng micro giây (µs).

4.4. Công thức tính khoảng cách

Khoảng cách được xác định theo công thức:

[ d = \frac{v \times t}{2} ]

Trong đó:

  • (d): Khoảng cách từ cảm biến đến vật cản.
  • (v): Vận tốc truyền âm trong không khí.
  • (t): Thời gian sóng truyền đi và quay trở lại.

Ở nhiệt độ phòng, vận tốc âm thanh trong không khí xấp xỉ 343 m/s.

Đổi sang đơn vị cm/µs:

[ v \approx 0{,}0343\ \text{cm}/\mu s ]

Vì vậy:

[ d(\text{cm}) \approx \frac{t(\mu s)\times 0{,}0343}{2} ]

Có thể viết gần đúng:

[ \boxed{d(\text{cm}) \approx \frac{t(\mu s)}{58}} ]

Đây là công thức thường được sử dụng khi lập trình HC-SR04.

4.5. Ví dụ tính khoảng cách

Giả sử ESP32 đo được thời gian Echo:

Thoi gian Echo: 1740 us

Khoảng cách:

[ d = \frac{1740}{58}=30\ \text{cm} ]

Như vậy, vật cản cách cảm biến khoảng 30 cm.

Một số ví dụ:

Thời gian Echo Khoảng cách gần đúng
580 µs 10 cm
1160 µs 20 cm
1740 µs 30 cm
2900 µs 50 cm
5800 µs 100 cm

Các giá trị trên là kết quả tính toán gần đúng trong điều kiện thông thường.


5. Chuẩn bị thiết bị

5.1. Thiết bị cần thiết

STT Thiết bị Số lượng
1 ESP32 30P CH340 Type-C 1
2 Board mở rộng ESP32 30P 1
3 Cảm biến siêu âm HC-SR04 1
4 Dây kết nối Theo nhu cầu
5 Máy tính đã cài Arduino IDE 1
6 Cáp USB Type-C có truyền dữ liệu 1

Trong bộ robot thực hành, cảm biến HC-SR04 được kết nối với board mở rộng ESP32.

Chúng ta không cần sử dụng mạch cắm thử hoặc lắp thêm mạch chia áp nếu đã xác nhận chân Echo của cảm biến hoạt động ở mức điện áp an toàn cho ESP32.

5.2. Kiểm tra nguồn trước khi thực hành

Trước khi kết nối cảm biến, cần xác định điện áp tại chân cấp nguồn V trên board mở rộng.

Trong cấu hình bộ robot đang sử dụng:

Chân V trên board mở rộng cấp điện áp khoảng 3,3 V.

Do đó, cảm biến HC-SR04 được cấp nguồn từ đường 3,3 V này thay vì nguồn 5 V thông thường.

Tuy nhiên, cần lưu ý rằng một số module HC-SR04 tiêu chuẩn được thiết kế cho nguồn 5 V và không bảo đảm hoạt động đúng ở 3,3 V.

Vì vậy, cấu hình 3,3 V chỉ nên sử dụng với module đã được kiểm tra hoạt động thực tế.


6. Kết nối HC-SR04 với ESP32

6.1. Các chân của HC-SR04

HC-SR04 tiêu chuẩn có bốn chân:

Chân Chức năng
VCC Cấp nguồn cảm biến
Trig Nhận xung kích hoạt từ ESP32
Echo Xuất tín hiệu phản hồi
GND Cực âm nguồn

6.2. Sơ đồ kết nối thực tế trên bộ robot

Trong bộ robot ESP32 đang sử dụng, các chân được kết nối như sau:

HC-SR04 Board mở rộng ESP32 Chức năng
VCC V (3,3 V) Cấp nguồn cảm biến
Trig GPIO21 Kích hoạt phép đo
Echo GPIO19 Nhận tín hiệu phản hồi
GND GND Mass chung

Sơ đồ kết nối:

           BOARD MO RONG ESP32
           -------------------

           V (3.3V) -------- VCC
           GPIO21 ---------- TRIG
           GPIO19 ---------- ECHO
           GND ------------- GND

                            HC-SR04

Trong cấu hình này:

  • ESP32 cấp nguồn 3,3 V cho cảm biến qua chân V.
  • GPIO21 được sử dụng để kích hoạt phép đo.
  • GPIO19 nhận tín hiệu Echo.
  • GND của cảm biến và ESP32 được nối chung.

Không sử dụng điện trở chia áp trên đường Echo trong cấu hình thực hành này, với điều kiện mức HIGH thực tế tại Echo đã được xác nhận không vượt giới hạn điện áp của ESP32.

6.3. Trường hợp HC-SR04 được cấp nguồn 5 V

Đối với module HC-SR04 tiêu chuẩn, điện áp cấp nguồn thông thường là 5 V.

Khi đó:

  • VCC được nối với nguồn 5 V.
  • Trig nhận tín hiệu điều khiển từ ESP32.
  • Echo có thể xuất tín hiệu HIGH gần 5 V.
  • GND được nối chung với ESP32.

Trong khi đó, ESP32 sử dụng mức logic 3,3 V và GPIO thông thường không chịu được tín hiệu 5 V.

Vì vậy, không được nối trực tiếp Echo 5 V vào GPIO19.

Cần sử dụng mạch chuyển mức logic hoặc bộ chia điện áp để đưa tín hiệu Echo về mức phù hợp với ESP32.

Một phương án đơn giản là sử dụng hai điện trở:

  • R1 = 1 kΩ.
  • R2 = 2 kΩ.

Sơ đồ:

HC-SR04 Echo (5V)
        |
        |
      R1 = 1k
        |
        +---------------- GPIO19 (ESP32)
        |
      R2 = 2k
        |
       GND

Điện áp tại GPIO19 được tính gần đúng:

[ V_{GPIO}=V_{Echo}\times\frac{R2}{R1+R2} ]

Nếu Echo ở mức 5 V:

[ V_{GPIO}=5\times\frac{2}{1+2}\approx3{,}33\text{ V} ]

Mức điện áp này phù hợp với mục tiêu hạ tín hiệu 5 V xuống gần mức logic 3,3 V. Cần kiểm tra đúng giá trị điện trở và mức điện áp thực tế trước khi kết nối với ESP32.

6.4. So sánh hai phương án cấp nguồn

Nội dung Cấp nguồn 5 V Cấp nguồn 3,3 V trên bộ robot
VCC cảm biến 5 V V (3,3 V)
Trig GPIO21 GPIO21
Echo Qua mạch hạ mức GPIO19 trực tiếp nếu mức tín hiệu đã được kiểm tra
GND GND chung GND chung
Mạch chia áp Echo Cần với Echo 5 V Không cần nếu Echo không vượt mức an toàn
Khả năng hoạt động Theo cấu hình danh định của module tiêu chuẩn Phụ thuộc phiên bản module và kết quả thử nghiệm

Lưu ý quan trọng:

  • Việc cấp nguồn 3,3 V không bảo đảm mọi module HC-SR04 đều hoạt động ổn định.
  • Cần xác nhận điện áp HIGH thực tế của Echo trước khi nối trực tiếp với ESP32.
  • Nếu cảm biến không hoạt động ổn định ở 3,3 V, cần sử dụng phương án cấp nguồn phù hợp với module và xử lý mức Echo tương ứng.
  • Không đưa tín hiệu 5 V trực tiếp vào GPIO của ESP32.
  • Nếu chưa xác định được mức Echo, nên sử dụng mạch chuyển mức phù hợp để bảo vệ GPIO.

6.5. Kiểm tra trước khi cấp nguồn

Trước khi thực hành:

  1. Kiểm tra chân V trên board mở rộng đang cấp 3,3 V.
  2. Kiểm tra GPIO21 kết nối với Trig.
  3. Kiểm tra GPIO19 kết nối với Echo.
  4. Xác nhận mức tín hiệu Echo phù hợp với ESP32.
  5. Kiểm tra GND chung.
  6. Kiểm tra dây kết nối không bị lỏng hoặc chập.
  7. Ngắt nguồn động cơ để tập trung kiểm tra cảm biến.

7. Các câu lệnh sử dụng trong chương trình

7.1. Hàm pinMode()

Hàm pinMode() được sử dụng để cấu hình chế độ hoạt động của GPIO.

Ví dụ:

pinMode(TRIG_PIN, OUTPUT);
pinMode(ECHO_PIN, INPUT);

Trong đó:

  • Trig được cấu hình OUTPUT để ESP32 phát xung kích hoạt.
  • Echo được cấu hình INPUT để ESP32 đọc tín hiệu phản hồi.

7.2. Hàm digitalWrite()

Hàm digitalWrite() được sử dụng để xuất tín hiệu HIGH hoặc LOW.

Ví dụ:

digitalWrite(TRIG_PIN, HIGH);

Đưa chân Trig lên mức logic cao.

digitalWrite(TRIG_PIN, LOW);

Đưa chân Trig về mức logic thấp.

7.3. Hàm delayMicroseconds()

Hàm delayMicroseconds() tạo khoảng thời gian chờ tính bằng micro giây.

Ví dụ:

delayMicroseconds(10);

Chờ khoảng 10 µs.

Đây là khoảng thời gian được sử dụng để tạo xung kích hoạt HC-SR04.

7.4. Hàm pulseIn()

Hàm pulseIn() được sử dụng để đo độ rộng xung Digital.

Cú pháp:

pulseIn(pin, value, timeout);

Trong đó:

  • pin: Chân cần đo.
  • value: Mức tín hiệu cần đo, HIGH hoặc LOW.
  • timeout: Thời gian chờ tối đa, tính bằng micro giây.

Ví dụ:

unsigned long duration = pulseIn(ECHO_PIN, HIGH, 25000UL);

Lệnh trên đo độ rộng xung HIGH tại chân Echo với thời gian chờ tối đa được cấu hình là 25.000 µs, tương đương 25 ms.

Nếu không đo được xung hợp lệ trong thời gian chờ, hàm trả về 0.

Lưu ý: Giá trị 0 không có nghĩa vật cản cách cảm biến 0 cm. Nó cho biết chương trình không đo được xung Echo hợp lệ.


8. Thực hành đo khoảng cách bằng HC-SR04

8.1. Mục tiêu thực hành

Chúng ta sẽ viết chương trình để:

  1. Khởi tạo HC-SR04.
  2. Phát xung Trig.
  3. Đọc thời gian Echo.
  4. Tính khoảng cách.
  5. Hiển thị khoảng cách lên Serial Monitor.
  6. Thông báo nếu không nhận được Echo hợp lệ.
  7. Lặp lại phép đo sau mỗi khoảng thời gian.

8.2. Tạo chương trình mới

Mở Arduino IDE.

Chọn File → New Sketch.

Lưu chương trình với tên:

ESP32_HCSR04

Cấu trúc thư mục:

ESP32_HCSR04/
└── ESP32_HCSR04.ino

8.3. Chương trình hoàn chỉnh

// ================= HC-SR04 =================

const int TRIG_PIN = 21;
const int ECHO_PIN = 19;

// Thoi gian cho Echo toi da (micro giay)
const unsigned long ECHO_TIMEOUT = 25000UL;

// ================= SETUP =================

void setup() {

  Serial.begin(115200);

  pinMode(TRIG_PIN, OUTPUT);
  pinMode(ECHO_PIN, INPUT);

  digitalWrite(TRIG_PIN, LOW);

  Serial.println("Bat dau do khoang cach HC-SR04");
}

// ================= LOOP =================

void loop() {

  // Tao xung kich hoat Trig
  digitalWrite(TRIG_PIN, LOW);
  delayMicroseconds(2);

  digitalWrite(TRIG_PIN, HIGH);
  delayMicroseconds(10);

  digitalWrite(TRIG_PIN, LOW);

  // Do thoi gian Echo
  unsigned long duration = pulseIn(
    ECHO_PIN,
    HIGH,
    ECHO_TIMEOUT
  );

  // Kiem tra ket qua do
  if (duration == 0) {

    Serial.println("Khong nhan duoc Echo hop le");

  } else {

    // Tinh khoang cach (cm)
    float distance = duration / 58.0f;

    Serial.print("Khoang cach: ");
    Serial.print(distance);
    Serial.println(" cm");
  }

  // Cho truoc khi do lan tiep theo
  delay(100);
}

Chương trình không cần cài thêm thư viện ngoài.

Lưu ý: Chương trình sử dụng GPIO21 cho Trig và GPIO19 cho Echo, phù hợp với sơ đồ chân robot đang sử dụng. Mã nguồn không thay đổi giữa hai phương án cấp nguồn 3,3 V và 5 V; điểm khác biệt nằm ở cách cấp nguồn và bảo đảm mức điện áp Echo an toàn.


9. Giải thích chương trình

9.1. Khai báo chân cảm biến

const int TRIG_PIN = 21;
const int ECHO_PIN = 19;

Hai hằng số xác định chân ESP32 kết nối với cảm biến.

Trong đó:

  • TRIG_PIN: Chân gửi tín hiệu kích hoạt.
  • ECHO_PIN: Chân nhận tín hiệu phản hồi.

9.2. Thiết lập thời gian chờ

const unsigned long ECHO_TIMEOUT = 25000UL;

Hằng số này xác định thời gian chờ tối đa của hàm pulseIn() là 25.000 µs.

Nếu không đo được xung Echo hợp lệ trong thời gian chờ, chương trình không tiếp tục chờ vô hạn.

Việc giới hạn thời gian chờ giúp tránh trường hợp chương trình bị giữ quá lâu khi cảm biến không nhận được tín hiệu phản hồi.

9.3. Khởi tạo cảm biến

pinMode(TRIG_PIN, OUTPUT);
pinMode(ECHO_PIN, INPUT);

Cấu hình:

  • Trig là đầu ra.
  • Echo là đầu vào.

Sau đó:

digitalWrite(TRIG_PIN, LOW);

Đưa Trig về mức LOW trước khi bắt đầu đo.

9.4. Phát xung kích hoạt

digitalWrite(TRIG_PIN, LOW);
delayMicroseconds(2);

digitalWrite(TRIG_PIN, HIGH);
delayMicroseconds(10);

digitalWrite(TRIG_PIN, LOW);

Đoạn chương trình thực hiện:

  1. Giữ Trig ở mức LOW trong 2 µs.
  2. Đưa Trig lên HIGH trong 10 µs.
  3. Đưa Trig về LOW.

Sau xung này, HC-SR04 thực hiện chu trình đo.

9.5. Đọc thời gian Echo

unsigned long duration = pulseIn(
  ECHO_PIN,
  HIGH,
  ECHO_TIMEOUT
);

Hàm pulseIn() đo độ rộng xung HIGH tại chân Echo.

Kết quả được lưu trong biến duration.

Ví dụ:

duration = 1740

Nghĩa là độ rộng xung đo được khoảng 1740 µs.

9.6. Kiểm tra phép đo hợp lệ

if (duration == 0) {
  Serial.println("Khong nhan duoc Echo hop le");
}

Nếu duration bằng 0, chương trình thông báo không nhận được xung Echo hợp lệ.

Điều này có thể xảy ra khi:

  • Không có vật phản xạ phù hợp.
  • Vật nằm ngoài vùng đo.
  • Bề mặt vật phản xạ âm kém.
  • Cảm biến hoạt động không ổn định.
  • Kết nối cảm biến không đúng.

Đặc biệt, nếu HC-SR04 tiêu chuẩn đang được cấp nguồn 3,3 V, cần kiểm tra khả năng hoạt động ở điện áp này khi liên tục không nhận được Echo.

Không được sử dụng giá trị 0 như một phép đo khoảng cách bằng 0 cm.

9.7. Tính khoảng cách

float distance = duration / 58.0f;

Lệnh trên sử dụng công thức gần đúng:

[ d(\text{cm})=\frac{t(\mu s)}{58} ]

Kết quả được lưu vào biến distance.

Kiểu float cho phép lưu khoảng cách có phần thập phân.

9.8. Hiển thị kết quả

Serial.print("Khoang cach: ");
Serial.print(distance);
Serial.println(" cm");

Các lệnh trên gửi kết quả về Serial Monitor.

Ví dụ:

Khoang cach: 30.00 cm

9.9. Thời gian giữa các lần đo

delay(100);

Sau mỗi phép đo, chương trình chờ 100 ms trước khi thực hiện phép đo tiếp theo.

Khoảng thời gian này giúp tránh kích hoạt cảm biến quá liên tục và hạn chế ảnh hưởng từ các tín hiệu phản xạ còn tồn tại.

Chu kỳ thực tế giữa các phép đo sẽ lớn hơn 100 ms vì còn bao gồm thời gian đo Echo và thời gian xử lý chương trình.


10. Biên dịch và chạy thử

10.1. Kiểm tra cấu hình

Trước khi nạp chương trình:

  1. Kết nối ESP32 với máy tính.
  2. Mở Arduino IDE.
  3. Chọn ESP32 Dev Module.
  4. Chọn đúng cổng COM.
  5. Kiểm tra kết nối HC-SR04.
  6. Kiểm tra điện áp cấp nguồn tại chân V.
  7. Xác nhận mức Echo an toàn cho ESP32.
  8. Đảm bảo nguồn động cơ đã được ngắt.

10.2. Biên dịch chương trình

Nhấn Verify.

Nếu chương trình không có lỗi, Arduino IDE sẽ biên dịch thành công.

10.3. Nạp chương trình

Nhấn Upload.

Chờ Arduino IDE nạp chương trình vào ESP32.

Sau khi hoàn thành, ESP32 sẽ chạy chương trình mới.

10.4. Mở Serial Monitor

Mở Serial Monitor.

Chọn tốc độ:

115200 baud

Nếu cần, nhấn nút EN/RESET để khởi động lại chương trình.

Kết quả có thể hiển thị:

Bat dau do khoang cach HC-SR04
Khoang cach: 30.17 cm
Khoang cach: 30.05 cm
Khoang cach: 29.98 cm
Khoang cach: 30.12 cm
...

Các giá trị trên chỉ là ví dụ minh họa.

10.5. Thử nghiệm với các khoảng cách khác nhau

Đặt một tấm vật liệu phẳng phía trước cảm biến.

Thử lần lượt các khoảng cách:

  • 15 cm.
  • 30 cm.
  • 50 cm.
  • 100 cm.

Sử dụng thước để xác định khoảng cách thực tế.

Ghi kết quả vào bảng:

Khoảng cách thực tế Khoảng cách đo được Sai lệch
15 cm … cm … cm
30 cm … cm … cm
50 cm … cm … cm
100 cm … cm … cm

Sai lệch có thể được tính bằng:

[ \text{Sai lệch} = |\text{Khoảng cách đo} - \text{Khoảng cách thực tế}| ]

Đối với cấu hình cấp nguồn 3,3 V trên bộ robot: Cần đặc biệt kiểm tra độ ổn định ở nhiều khoảng cách để xác nhận module đang sử dụng hoạt động phù hợp.


11. Phát hiện vật cản ở khoảng cách gần

Sau khi đã đọc được khoảng cách, chúng ta có thể sử dụng câu lệnh if để xác định vật cản có nằm trong vùng cần cảnh báo hay không.

Ví dụ, đặt ngưỡng phát hiện vật cản là 20 cm.

11.1. Nguyên lý

Nếu khoảng cách đo hợp lệ và nhỏ hơn 20 cm:

Phat hien vat can gan

Nếu khoảng cách hợp lệ và lớn hơn hoặc bằng 20 cm:

Khoang cach lon hon nguong

Nếu không nhận được Echo hợp lệ, chương trình cần thông báo riêng thay vì kết luận không có vật cản.

11.2. Chương trình hoàn chỉnh

// ================= HC-SR04 =================

const int TRIG_PIN = 21;
const int ECHO_PIN = 19;

const float DISTANCE_LIMIT = 20.0f;
const unsigned long ECHO_TIMEOUT = 25000UL;

// ================= SETUP =================

void setup() {

  Serial.begin(115200);

  pinMode(TRIG_PIN, OUTPUT);
  pinMode(ECHO_PIN, INPUT);

  digitalWrite(TRIG_PIN, LOW);
}

// ================= LOOP =================

void loop() {

  digitalWrite(TRIG_PIN, LOW);
  delayMicroseconds(2);

  digitalWrite(TRIG_PIN, HIGH);
  delayMicroseconds(10);

  digitalWrite(TRIG_PIN, LOW);

  unsigned long duration = pulseIn(
    ECHO_PIN,
    HIGH,
    ECHO_TIMEOUT
  );

  if (duration == 0) {

    Serial.println("Loi: Khong co Echo hop le");

  } else {

    float distance = duration / 58.0f;

    Serial.print("Khoang cach: ");
    Serial.print(distance);
    Serial.println(" cm");

    if (distance < DISTANCE_LIMIT) {

      Serial.println("Phat hien vat can gan");

    } else {

      Serial.println("Khoang cach lon hon nguong");
    }
  }

  delay(100);
}

11.3. Kết quả mong đợi

Khi vật cách cảm biến khoảng 15 cm:

Khoang cach: 15.12 cm
Phat hien vat can gan

Khi vật cách cảm biến khoảng 35 cm:

Khoang cach: 35.08 cm
Khoang cach lon hon nguong

Khi không nhận được Echo:

Loi: Khong co Echo hop le

Lưu ý: Khoảng cách lớn hơn ngưỡng không có nghĩa toàn bộ đường di chuyển của robot đều an toàn. Cảm biến chỉ đo trong vùng phát hiện của nó.


12. Các yếu tố ảnh hưởng đến kết quả đo

12.1. Điện áp cấp nguồn

Đây là yếu tố cần chú ý khi sử dụng HC-SR04 với board mở rộng ESP32.

HC-SR04 tiêu chuẩn thường được thiết kế để hoạt động ở 5 V.

Khi cấp nguồn 3,3 V, tùy phiên bản module, cảm biến có thể:

  • Hoạt động bình thường trong một phạm vi nhất định.
  • Có tín hiệu phản hồi yếu hơn.
  • Giảm khoảng cách đo hiệu quả.
  • Không nhận được Echo ở một số khoảng cách.
  • Hoạt động không ổn định.

Vì vậy, cần kiểm tra thực tế thay vì mặc định tất cả HC-SR04 đều hoạt động tốt ở 3,3 V.

12.2. Góc đặt của vật cản

HC-SR04 hoạt động tốt hơn khi sóng siêu âm được phản xạ trở lại đầu thu.

Nếu vật cản nghiêng quá nhiều, sóng có thể phản xạ sang hướng khác.

Khi đó, cảm biến có thể:

  • Không nhận được Echo.
  • Đo được khoảng cách không ổn định.
  • Trả về kết quả sai lệch.

12.3. Bề mặt vật cản

Các bề mặt cứng và tương đối phẳng thường phản xạ sóng siêu âm tốt.

Các vật liệu mềm, xốp hoặc hấp thụ âm có thể làm tín hiệu phản xạ yếu đi.

Vì vậy, cùng một khoảng cách nhưng các loại vật liệu khác nhau có thể cho kết quả khác nhau.

12.4. Nhiệt độ môi trường

Vận tốc âm thanh trong không khí thay đổi theo nhiệt độ.

Công thức chia cho 58 là giá trị gần đúng trong điều kiện thông thường.

Nếu cần độ chính xác cao hơn, có thể tính vận tốc âm thanh theo nhiệt độ môi trường.

12.5. Nhiễu nguồn điện

Khi robot sử dụng động cơ DC, quá trình đóng/ngắt dòng điện có thể gây nhiễu nguồn và tín hiệu.

Nhiễu có thể làm:

  • Kết quả đo dao động.
  • Xuất hiện phép đo không hợp lệ.
  • ESP32 hoạt động không ổn định nếu nguồn bị sụt áp.

Cần đảm bảo hệ thống nguồn và kết nối tín hiệu phù hợp.

12.6. Rung động của robot

Khi robot di chuyển, cảm biến có thể rung hoặc thay đổi hướng.

Điều này làm thay đổi góc phản xạ và vị trí đo.

Vì vậy, kết quả đo khi robot đứng yên có thể ổn định hơn so với khi robot đang di chuyển.


13. Các lỗi thường gặp

13.1. Không nhận được Echo

Hiện tượng:

Serial Monitor liên tục hiển thị:

Khong nhan duoc Echo hop le

Nguyên nhân có thể:

  • Kết nối Trig hoặc Echo không đúng.
  • Cảm biến chưa được cấp nguồn.
  • GND chưa được nối chung.
  • Vật cản nằm ngoài vùng đo.
  • Bề mặt vật phản xạ kém.
  • Module HC-SR04 không hoạt động ổn định ở nguồn 3,3 V.

Cách xử lý:

  1. Kiểm tra VCC và GND.
  2. Kiểm tra GPIO21 và GPIO19.
  3. Kiểm tra điện áp cấp nguồn.
  4. Đặt vật phẳng trước cảm biến ở khoảng cách khoảng 20–30 cm.
  5. Thử đo lại.
  6. Nếu đang cấp nguồn 3,3 V, kiểm tra module có hỗ trợ điện áp này hay không.

Nếu cần chuyển sang nguồn 5 V, phải xử lý mức điện áp Echo trước khi kết nối với ESP32.

13.2. Khoảng cách đo được không chính xác

Nguyên nhân có thể:

  • Vật cản đặt nghiêng.
  • Vật có bề mặt phản xạ kém.
  • Cảm biến bị rung.
  • Nhiệt độ môi trường khác điều kiện giả định.
  • Có nhiều bề mặt phản xạ trong vùng đo.
  • Điện áp cấp nguồn không phù hợp với module.

Cách xử lý:

  • Sử dụng vật phẳng để kiểm tra.
  • Giữ cảm biến cố định.
  • Đo nhiều lần.
  • So sánh kết quả với thước đo.
  • Kiểm tra điện áp cấp nguồn.

13.3. Giá trị khoảng cách dao động liên tục

Ví dụ:

Khoang cach: 30.12 cm
Khoang cach: 29.85 cm
Khoang cach: 31.04 cm
Khoang cach: 30.21 cm

Dao động nhỏ là hiện tượng có thể xảy ra khi đo bằng cảm biến siêu âm.

Nếu dao động quá lớn, cần kiểm tra:

  • Nguồn điện.
  • Dây kết nối.
  • Độ ổn định của vật cản.
  • Rung động.
  • Khoảng thời gian giữa các lần đo.

Trong các ứng dụng nâng cao, có thể sử dụng bộ lọc trung bình hoặc trung vị để làm ổn định dữ liệu.

13.4. ESP32 hoạt động không ổn định

Một nguyên nhân cần kiểm tra là mức điện áp Echo.

Nếu Echo xuất mức gần 5 V và được nối trực tiếp vào ESP32, GPIO có nguy cơ bị hư hỏng.

Đối với cấu hình thực hành cấp nguồn 3,3 V, cần xác nhận mức HIGH của Echo thực tế không vượt giới hạn cho phép.

Đồng thời kiểm tra nguồn cấp, GND và các kết nối khác.

13.5. Chương trình phản hồi chậm

Hàm pulseIn() là hàm đo theo cơ chế chờ.

Khi không có Echo hợp lệ, chương trình có thể phải chờ đến thời gian timeout.

Trong ví dụ này, thời gian chờ được giới hạn ở 25 ms.

Khi kết hợp với điều khiển động cơ, PID hoặc Wi-Fi, việc chờ trong quá trình đo có thể ảnh hưởng đến tốc độ phản hồi của hệ thống.

Đối với các chương trình robot nâng cao, có thể cần tách quá trình đo cảm biến khỏi vòng điều khiển hoặc sử dụng phương pháp đo không chặn.


14. Bài tập thực hành

Bài tập 1: Đo khoảng cách

Thực hiện đo khoảng cách đến một tấm vật phẳng tại:

  • 10 cm.
  • 20 cm.
  • 30 cm.
  • 50 cm.

Ghi lại kết quả và so sánh với thước đo.

Bài tập 2: Phát hiện vật cản gần

Sửa chương trình để:

  • Nếu khoảng cách hợp lệ nhỏ hơn 20 cm, in Vat gan.
  • Nếu khoảng cách hợp lệ từ 20 cm trở lên, in Vat xa.
  • Nếu không có Echo hợp lệ, in Loi cam bien.

Bài tập 3: Thay đổi ngưỡng phát hiện

Thay đổi ngưỡng phát hiện vật cản lần lượt thành:

const float DISTANCE_LIMIT = 15.0f;
const float DISTANCE_LIMIT = 25.0f;
const float DISTANCE_LIMIT = 40.0f;

Quan sát sự thay đổi trạng thái phát hiện vật cản.

Bài tập 4: Tính trung bình ba phép đo

Viết chương trình thực hiện ba phép đo liên tiếp.

Chỉ sử dụng những phép đo hợp lệ để tính giá trị trung bình.

Ví dụ:

Lan 1: 30.1 cm
Lan 2: 29.8 cm
Lan 3: 30.2 cm

Trung binh: 30.03 cm

Nếu một phép đo không có Echo hợp lệ, không được đưa giá trị 0 vào phép tính trung bình.

Nếu cả ba phép đo đều không hợp lệ, chương trình cần thông báo không có dữ liệu đo đáng tin cậy.

Bài tập 5: Kiểm tra hoạt động ở nguồn 3,3 V

Đối với bộ robot thực hành đang sử dụng:

  1. Xác nhận cảm biến được cấp nguồn từ chân V (3,3 V).
  2. Đặt vật cản lần lượt ở 15, 30, 50 và 100 cm.
  3. Ghi nhận kết quả đo.
  4. Xác định khoảng cách lớn nhất mà cảm biến vẫn đo ổn định trong điều kiện thử nghiệm.
  5. Giải thích vì sao không thể mặc định phạm vi đo ở nguồn 3,3 V giống thông số danh định khi cấp nguồn 5 V.

Bài tập 6: Tìm hiểu ứng dụng tránh vật cản

Giả sử robot đang di chuyển tiến.

Hãy đề xuất logic điều khiển:

  1. Nếu khoảng cách hợp lệ lớn hơn 30 cm, cho phép robot tiếp tục di chuyển.
  2. Nếu khoảng cách hợp lệ nhỏ hơn hoặc bằng 30 cm, yêu cầu robot dừng.
  3. Nếu không nhận được Echo hợp lệ, robot cũng phải dừng để đảm bảo an toàn trong bài thực hành.

Chưa cần điều khiển động cơ trong bài này.

Khi kết hợp với TB6612FNG ở bài nâng cao, cần thử nghiệm với bánh xe được kê khỏi mặt đất trước khi chạy thực tế.


15. Kiểm tra trước khi bắt đầu bài tiếp theo

Trước khi chuyển sang bài học tiếp theo, hãy đảm bảo:

  • [ ] Đã hiểu nguyên lý hoạt động của HC-SR04.
  • [ ] Đã phân biệt chức năng Trig và Echo.
  • [ ] Đã biết cách kết nối cảm biến với ESP32.
  • [ ] Đã hiểu sự khác biệt giữa cấp nguồn 5 V và 3,3 V.
  • [ ] Đã biết vì sao Echo 5 V cần được hạ mức trước khi vào ESP32.
  • [ ] Đã biết cấu hình thực tế của bộ robot sử dụng chân V (3,3 V).
  • [ ] Đã hiểu điều kiện để nối Echo trực tiếp với GPIO19.
  • [ ] Đã biết tạo xung Trig 10 µs.
  • [ ] Đã biết sử dụng pulseIn().
  • [ ] Đã hiểu công thức tính khoảng cách.
  • [ ] Đã đo và hiển thị được khoảng cách trên Serial Monitor.
  • [ ] Đã phân biệt phép đo không hợp lệ và khoảng cách 0 cm.
  • [ ] Đã viết được điều kiện phát hiện vật cản gần.
  • [ ] Đã biết một số yếu tố ảnh hưởng đến độ chính xác của phép đo.

16. Tổng kết

Qua bài học này, chúng ta đã tìm hiểu cách sử dụng cảm biến siêu âm HC-SR04 với ESP32 để đo khoảng cách.

Những nội dung quan trọng bao gồm:

  • Hiểu nguyên lý phát và nhận sóng siêu âm.
  • Tìm hiểu chức năng các chân VCC, Trig, Echo và GND.
  • Kết nối HC-SR04 với ESP32 theo sơ đồ chân của robot.
  • Phân biệt cách sử dụng cảm biến khi cấp nguồn 5 V và 3,3 V.
  • Hiểu vì sao Echo 5 V không được nối trực tiếp vào GPIO của ESP32.
  • Sử dụng chân V (3,3 V) trên board mở rộng trong cấu hình thực hành.
  • Sử dụng xung Trig để kích hoạt phép đo.
  • Sử dụng pulseIn() để đo thời gian Echo.
  • Tính khoảng cách dựa trên thời gian truyền sóng.
  • Hiển thị dữ liệu bằng Serial Monitor.
  • Phát hiện vật cản dựa trên ngưỡng khoảng cách.
  • Xử lý trường hợp không có tín hiệu Echo hợp lệ.
  • Tìm hiểu các yếu tố ảnh hưởng đến kết quả đo.

Đây là kiến thức nền tảng để xây dựng chức năng phát hiện và tránh vật cản cho robot.

Ở bài tiếp theo, chúng ta sẽ tìm hiểu cảm biến dò line TCRT5000, cách đọc tín hiệu từ năm mắt cảm biến và xác định vị trí vạch line để điều khiển robot di chuyển theo đường dẫn.


Bài trước: Điều khiển động cơ DC bằng TB6612FNG · Lộ trình bài học · Bài tiếp: Cảm biến dò line TCRT5000