Lập trình & Điều khiển Động Cơ – Bài 5: Cảm biến vật cản cho xe robot (Tự dừng khi gặp chướng ngại vật)

(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-SR04tự độ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 PinGhi chú
HC-SR04 TrigGPIO4Phát sóng siêu âm
HC-SR04 EchoGPIO5Nhận tín hiệu phản hồi
L298N IN1GPIO26Motor trái
L298N IN2GPIO27Motor trái
L298N IN3GPIO25Motor phải
L298N IN4GPIO33Motor phải
L298N ENAGPIO14PWM trái
L298N ENBGPIO32PWM 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ằng stopMotor().
  • 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ệnSố lượngGhi chú
ESP32 DevKit 38 Pin1Bộ điều khiển
Cảm biến siêu âm HC-SR041Phát hiện vật cản
L298N Motor Driver1Điều khiển 2 motor
Motor DC 3–6V2Bánh xe trái/phải
Nguồn pin 7.4V hoặc 9V1Nguồ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.

Comments

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

Email của bạn sẽ không được hiển thị công khai. Các trường bắt buộc được đánh dấu *