Robot cơ bản

Robot tránh vật cản hoạt động như thế nào? Nguyên lý và cách làm

7 phút đọc05/07/2026HocLapTrinhRobot
Robot tránh vật cản hoạt động như thế nào? Nguyên lý và cách làm

Nguyên lý robot tránh vật cản dùng cảm biến siêu âm HC-SR04, sơ đồ đấu nối với ESP32, thuật toán né vật và code mẫu hoàn chỉnh cho người mới. Trong bài viết này, chúng ta sẽ cùng tìm hiểu chi tiết và ứng dụng thực tế trong robot.

Robot tránh vật cản là gì?

Robot tránh vật cản (obstacle avoiding robot) là robot di động tự phát hiện chướng ngại vật trên đường đi và tự đổi hướng để không va chạm. Đây là dự án robot tự hành đầu tiên mà hầu hết người học lập trình robot thực hiện, vì nó thể hiện trọn vẹn chu trình Cảm nhận - Suy nghĩ - Hành động chỉ với một cảm biến và hai động cơ.

Nguyên lý cốt lõi: cảm biến khoảng cách liên tục đo khoảng trống phía trước. Khi khoảng cách nhỏ hơn ngưỡng an toàn (thường 15-25 cm), robot dừng, lùi nhẹ, quay đầu tìm hướng thoáng rồi tiếp tục di chuyển.

Cảm biến nào dùng để phát hiện vật cản?

Cảm biếnTầm đoNguyên lýGiá tham khảoNhận xét
Siêu âm HC-SR042 - 400 cmĐo thời gian sóng âm dội lại15.000 - 25.000 đChuẩn nhập môn, rẻ, đủ chính xác
Hồng ngoại E18-D80NK3 - 80 cmPhản xạ tia hồng ngoại40.000 - 60.000 đChỉ báo có/không, phản hồi nhanh
Laser VL53L0X3 - 200 cmĐo thời gian bay của ánh sáng50.000 - 80.000 đChính xác mm, chùm hẹp, giao tiếp I2C
Công tắc hành trìnhTiếp xúcChạm mới biết3.000 - 5.000 đPhương án dự phòng khi cảm biến chính bỏ sót

HC-SR04 là lựa chọn phổ biến nhất: nó phát một chùm sóng siêu âm 40 kHz, sóng gặp vật cản dội ngược lại, cảm biến đo thời gian từ lúc phát đến lúc nhận. Khoảng cách tính bằng công thức: khoảng cách = thời gian x tốc độ âm thanh / 2 (chia 2 vì sóng đi và về). Chi tiết về cảm biến này có trong bài Cảm biến siêu âm HC-SR04 ở mục Kiến thức.

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

  • 1 bo ESP32 DevKit (hoặc Arduino Uno)
  • 1 khung xe 2 bánh + 2 động cơ TT + bánh mắt trâu
  • 1 driver L298N hoặc DRV8833
  • 1 cảm biến HC-SR04 (nên kèm giá đỡ hoặc servo SG90 để quay đầu cảm biến)
  • Nguồn: 2 pin 18650 kèm hộp pin có công tắc
  • Dây cắm đực-cái, băng dính 2 mặt hoặc ốc vít

Sơ đồ đấu nối với ESP32

Linh kiệnChân linh kiệnChân ESP32Ghi chú
HC-SR04VCCVIN (5V)HC-SR04 cần nguồn 5V
HC-SR04TRIGGPIO 5Chân phát xung
HC-SR04ECHOGPIO 18 qua chia ápEcho trả 5V, phải chia áp về 3.3V
L298NIN1, IN2GPIO 26, 27Chiều động cơ trái
L298NIN3, IN4GPIO 14, 12Chiều động cơ phải
L298NENA, ENBGPIO 25, 13PWM tốc độ (dùng LEDC)
L298N12V, GNDPin 7.4VNguồn động cơ riêng

Cảnh báo quan trọng: chân ECHO của HC-SR04 xuất tín hiệu 5V trong khi GPIO của ESP32 chỉ chịu được 3.3V. Phải dùng mạch chia áp bằng 2 điện trở (ví dụ 1kΩ và 2kΩ) để hạ 5V xuống khoảng 3.3V, nếu không có thể hỏng chân GPIO sau một thời gian sử dụng.

Thuật toán tránh vật cản

Logic cơ bản dạng luồng:

text
LẶP MÃI:
  đo khoảng cách phía trước
  NẾU khoảng cách > 20 cm:
    đi thẳng
  NGƯỢC LẠI:
    dừng lại
    lùi 300 ms
    quay phải 400 ms
    (nâng cao: quay đầu cảm biến trái/phải, chọn hướng thoáng hơn)

Phiên bản nâng cao gắn HC-SR04 lên servo SG90: khi gặp vật cản, robot dừng, servo quay cảm biến sang trái đo một lần, sang phải đo một lần, robot rẽ về hướng có khoảng cách lớn hơn. Cách này giúp robot thoát khỏi góc tường thay vì chỉ rẽ phải mù quáng.

Code mẫu ESP32 hoàn chỉnh

cpp
const int TRIG = 5;
const int ECHO = 18;
const int IN1 = 26, IN2 = 27, IN3 = 14, IN4 = 12;
const int ENA = 25, ENB = 13;

const int SPEED = 180;        // 0-255
const int SAFE_CM = 20;       // ngưỡng an toàn

void setup() {
  Serial.begin(115200);
  pinMode(TRIG, OUTPUT);
  pinMode(ECHO, INPUT);
  pinMode(IN1, OUTPUT); pinMode(IN2, OUTPUT);
  pinMode(IN3, OUTPUT); pinMode(IN4, OUTPUT);
  // ESP32 dùng LEDC thay cho analogWrite
  ledcAttach(ENA, 1000, 8);   // 1 kHz, 8 bit
  ledcAttach(ENB, 1000, 8);
}

long readDistanceCm() {
  digitalWrite(TRIG, LOW);  delayMicroseconds(2);
  digitalWrite(TRIG, HIGH); delayMicroseconds(10);
  digitalWrite(TRIG, LOW);
  long duration = pulseIn(ECHO, HIGH, 30000); // timeout 30 ms
  if (duration == 0) return 400;              // không thấy vật
  return duration * 0.0343 / 2;
}

void forward() {
  digitalWrite(IN1, HIGH); digitalWrite(IN2, LOW);
  digitalWrite(IN3, HIGH); digitalWrite(IN4, LOW);
  ledcWrite(ENA, SPEED); ledcWrite(ENB, SPEED);
}

void backward() {
  digitalWrite(IN1, LOW); digitalWrite(IN2, HIGH);
  digitalWrite(IN3, LOW); digitalWrite(IN4, HIGH);
  ledcWrite(ENA, SPEED); ledcWrite(ENB, SPEED);
}

void turnRight() {
  digitalWrite(IN1, HIGH); digitalWrite(IN2, LOW);
  digitalWrite(IN3, LOW);  digitalWrite(IN4, HIGH);
  ledcWrite(ENA, SPEED); ledcWrite(ENB, SPEED);
}

void stopMotors() {
  ledcWrite(ENA, 0); ledcWrite(ENB, 0);
}

void loop() {
  long distance = readDistanceCm();
  Serial.println(distance);

  if (distance > SAFE_CM) {
    forward();
  } else {
    stopMotors();
    delay(200);
    backward();
    delay(300);
    turnRight();
    delay(400);
    stopMotors();
    delay(100);
  }
  delay(50); // đo khoảng 20 lần/giây
}

Lưu ý code: hàm ledcAttach dùng cho ESP32 Arduino core 3.x. Nếu dùng core 2.x, thay bằng bộ ba ledcSetup, ledcAttachPin và giữ nguyên ledcWrite với kênh tương ứng.

Tinh chỉnh để robot chạy tốt hơn

  • Ngưỡng an toàn theo tốc độ: robot chạy càng nhanh cần ngưỡng càng xa; tốc độ 255 nên đặt ngưỡng 30-35 cm
  • Lọc nhiễu phép đo: đo 3 lần lấy trung vị để loại giá trị bất thường do sóng âm dội từ mặt sàn
  • Vật cản mềm và nghiêng: sóng siêu âm bị hút bởi vải, mút xốp và trượt trên bề mặt nghiêng trên 45 độ — nên thêm công tắc hành trình phía trước làm lớp bảo vệ cuối
  • Tránh delay dài: các lệnh delay trong lúc rẽ làm robot mù tạm thời; phiên bản nâng cao dùng millis() để vừa rẽ vừa tiếp tục đo

Câu hỏi thường gặp

Vì sao robot của tôi cứ lao thẳng vào tường?

Kiểm tra theo thứ tự: cảm biến có trả số đo đúng không (in ra Serial Monitor); ngưỡng SAFE_CM có quá nhỏ so với tốc độ không; hai động cơ có đúng chiều không (đảo IN1/IN2 nếu bánh quay ngược); nguồn có đủ khỏe không (sụt áp làm ESP32 reset liên tục).

Vì sao khoảng cách đo được lúc đúng lúc sai?

Nguyên nhân phổ biến: nguồn yếu làm HC-SR04 hoạt động chập chờn; cảm biến gắn thấp quá nên sóng dội từ mặt sàn; nhiều robot chạy cùng phòng gây nhiễu chéo sóng siêu âm. Khắc phục bằng lọc trung vị 3-5 mẫu và gắn cảm biến cao hơn mặt sàn ít nhất 5 cm.

Có làm được robot tránh vật cản mà không cần code không?

Có thể dùng Blockly trong phòng lab HocLapTrinhRobot: kéo thả khối "đo khoảng cách", "nếu... thì", "di chuyển" là dựng được thuật toán tương đương, hệ thống tự sinh code C++ và nạp xuống ESP32 qua trình duyệt.

Robot tránh vật cản khác gì robot dò line?

Robot tránh vật cản phản ứng với vật thể phía trước còn robot dò line bám theo vạch kẻ trên sàn. Hai bài toán dùng cảm biến khác nhau nhưng chung nền tảng điều khiển động cơ, nên học xong bài này bạn chuyển sang dò line rất nhanh.

Tài nguyên tải về

Tải bản PDF của bài viết để in giáo án hoặc gửi trước cho học viên.

Tải PDF
Chia sẻ bài viết