(Khóa học: Lập trình & Điều khiển Động Cơ từ Cơ Bản tới Nâng Cao)
📘 Giới thiệu
Trong các bài học trước, bạn đã học cách điều khiển xe robot hai bánh tiến, lùi và rẽ.
Bài học này sẽ giúp robot phát hiện vật cản phía trước bằng cảm biến siêu âm HC-SR04 và tự động dừng lại để tránh va chạm.
Đây là bước đầu tiên để bạn lập trình xe tránh vật cản thông minh (Obstacle Avoidance Robot).
⚙️ 1. Nguyên lý hoạt động của cảm biến siêu âm HC-SR04
Cảm biến siêu âm hoạt động dựa trên việc phát và nhận sóng âm phản xạ:
- Chân Trig phát xung siêu âm.
- Chân Echo nhận tín hiệu phản xạ trở lại từ vật cản.
- Khoảng cách được tính theo công thức:

(Vì sóng đi và về, chia đôi thời gian tổng.)
📡 2. Sơ đồ kết nối ESP32 + HC-SR04 + L298N

| Thiết bị | ESP32 Pin | Ghi chú |
|---|---|---|
| HC-SR04 Trig | GPIO4 | Phát sóng siêu âm |
| HC-SR04 Echo | GPIO5 | Nhận tín hiệu phản hồi |
| L298N IN1 | GPIO26 | Motor trái |
| L298N IN2 | GPIO27 | Motor trái |
| L298N IN3 | GPIO25 | Motor phải |
| L298N IN4 | GPIO33 | Motor phải |
| L298N ENA | GPIO14 | PWM trái |
| L298N ENB | GPIO32 | PWM phải |
⚠️ Đảm bảo GND của cảm biến và L298N được nối chung với GND ESP32.
💻 3. Code mẫu: Xe robot dừng khi gặp vật cản
/*
* Bài 5 - IoTLabs Motor Course
* Xe robot dừng khi phát hiện vật cản bằng cảm biến siêu âm HC-SR04
*/
#define TRIG_PIN 4
#define ECHO_PIN 5
#define IN1 26
#define IN2 27
#define ENA 14
#define IN3 25
#define IN4 33
#define ENB 32
#define PWM_FREQ 5000
#define PWM_RES 8
long duration;
int distance;
void setup() {
Serial.begin(115200);
pinMode(TRIG_PIN, OUTPUT);
pinMode(ECHO_PIN, INPUT);
pinMode(IN1, OUTPUT); pinMode(IN2, OUTPUT);
pinMode(IN3, OUTPUT); pinMode(IN4, OUTPUT);
ledcSetup(0, PWM_FREQ, PWM_RES);
ledcSetup(1, PWM_FREQ, PWM_RES);
ledcAttachPin(ENA, 0);
ledcAttachPin(ENB, 1);
}
int getDistance() {
digitalWrite(TRIG_PIN, LOW);
delayMicroseconds(2);
digitalWrite(TRIG_PIN, HIGH);
delayMicroseconds(10);
digitalWrite(TRIG_PIN, LOW);
duration = pulseIn(ECHO_PIN, HIGH);
distance = duration * 0.034 / 2; // cm
return distance;
}
void goForward(int speed = 200) {
digitalWrite(IN1, HIGH); digitalWrite(IN2, LOW);
digitalWrite(IN3, HIGH); digitalWrite(IN4, LOW);
ledcWrite(0, speed); ledcWrite(1, speed);
}
void stopMotor() {
digitalWrite(IN1, LOW); digitalWrite(IN2, LOW);
digitalWrite(IN3, LOW); digitalWrite(IN4, LOW);
ledcWrite(0, 0); ledcWrite(1, 0);
}
void loop() {
int dist = getDistance();
Serial.print("Khoảng cách: "); Serial.print(dist); Serial.println(" cm");
if (dist < 15) {
stopMotor();
Serial.println("Vật cản phía trước! Dừng lại!");
delay(1000);
} else {
goForward(200);
}
delay(100);
}
✅ Kết quả: Xe robot tự động dừng khi cách vật cản khoảng 15 cm và tiếp tục di chuyển khi đường trống.
🧠 4. Giải thích nhanh
- HC-SR04 gửi xung siêu âm, đo thời gian phản hồi để tính khoảng cách.
- Khi
distance < 15, xe dừng bằngstopMotor(). - Có thể thay đổi khoảng cách dừng tuỳ môi trường thực tế.
🎯 5. Mục tiêu học tập
- Hiểu nguyên lý cảm biến siêu âm.
- Biết cách đo khoảng cách và xử lý điều kiện dừng.
- Tạo nền tảng cho xe tránh vật cản thông minh (bài sau).
🧩 6. Hoạt động mở rộng
- Kết hợp LED cảnh báo khi xe dừng.
- Gắn thêm buzzer hoặc DFPlayer Mini để phát âm thanh cảnh báo.
- Dùng Serial Plotter để vẽ biểu đồ khoảng cách khi robot di chuyển.
📦 7. Linh kiện cần thiết
| Linh kiện | Số lượng | Ghi chú |
|---|---|---|
| ESP32 DevKit 38 Pin | 1 | Bộ điều khiển |
| Cảm biến siêu âm HC-SR04 | 1 | Phát hiện vật cản |
| L298N Motor Driver | 1 | Điều khiển 2 motor |
| Motor DC 3–6V | 2 | Bánh xe trái/phải |
| Nguồn pin 7.4V hoặc 9V | 1 | Nguồn cấp |
| Dây nối + Breadboard | – |
🚀 8. Kết luận
Cảm biến siêu âm giúp robot “nhìn thấy” thế giới xung quanh. Với vài dòng code, bạn đã giúp xe biết phát hiện vật cản và phản ứng tự động — nền tảng cho các ứng dụng robot thông minh hơn như tránh vật cản, dò đường hoặc giao tiếp bằng âm thanh.


Để lại một bình luận