Đo Khoảng Cách Trong Không Gian Với Cảm Biến SRF05 Và Arduino

Trong lĩnh vực robot, việc thu thập thông tin về môi trường xung quanh là rất quan trọng. Robot cần biết khoảng cách, nhiệt độ, độ ẩm, ánh sáng,… để từ đó phân tích dữ liệu và đưa ra quyết định. Ví dụ, robot hút bụi tự động cần phải biết có vật cản phía trước hay không, và dựa vào đó để điều hướng hướng đi.

Để lấy thông tin về vật cản phía trước, có thể sử dụng nhiều loại cảm biến khác nhau. Trong đó, cảm biến khoảng cách bằng sóng âm SRF05 là một trong những lựa chọn phổ biến.

Thiết bị cần chuẩn bị

  • 1 x Arduino Uno R3.
  • 1 x cảm biến siêu âm SRF05.
  • 1 x breadboard để cắm mạch test.
  • Dây cắm các loại.

Cảm biến siêu âm SRF05

Sóng siêu âm là loại sóng cao tần không thể nghe thấy bởi con người. Tuy nhiên, sóng siêu âm tồn tại khắp nơi trong tự nhiên. Các loài động vật như dơi và cá heo sử dụng sóng siêu âm để giao tiếp, săn mồi và định vị trong không gian.

Nguyên tắc hoạt động của sóng âm rất đơn giản:

  1. Vật chủ phát sóng âm.
  2. Sóng âm va chạm với môi trường xung quanh và phản xạ lại.
  3. Dựa vào thời gian phát và thu sóng, tính toán khoảng cách giữa vật chủ và môi trường xung quanh.

Việc tính toán khoảng cách còn phụ thuộc vào môi trường truyền dẫn. Chẳng hạn, sóng âm truyền qua nước hay kim loại nhanh hơn rất nhiều so với sóng âm truyền qua không khí. Sóng âm không thể truyền qua không gian hút chân không.

Công nghệ sóng âm đã được ứng dụng rộng rãi trong cuộc sống. Ví dụ như các thiết bị định vị dưới biển của tàu ngầm, thiết bị radar, đo đạc khoảng cách trong môi trường như đo độ sâu của đại dương,…

Cảm biến siêu âm SRF05 hoạt động theo nguyên tắc trên. Thiết bị gồm 2 loa-thu và phát, cùng với 5 chân kết nối với Arduino. Theo tài liệu từ nhà sản xuất, cảm biến này có tầm hoạt động tối đa khoảng 5m.

Chức năng của các chân trên cảm biến như sau:

  • Vcc: cấp nguồn cho cảm biến.
  • Trigger: kích hoạt quá trình phát sóng âm, sử dụng chu kỳ điện cao/thấp.
  • Echo: ban đầu đang ở mức 0V, được kích hoạt lên 5V khi nhận được tín hiệu phản xạ, sau đó trở lại 0V.
  • Gnd: nối với cực âm của mạch.
  • OUT: không sử dụng.

Dựa trên mô tả trên, tiến hành lắp mạch cảm biến siêu âm.

Lắp đặt cảm biến

Sơ đồ lắp đặt:

  • Vcc: nối với nguồn 5V của Arduino.
  • Gnd: nối với PIN GND.
  • Trigger: nối với PIN 8.
  • Echo: nối với PIN 7.

Mạch sau khi hoàn tất lắp đặt

Lập trình điều khiển

Chương trình được lập trình để mỗi chu kỳ 1s, cảm biến sẽ được kích hoạt và kiểm tra xem có vật cản xung quanh hay không.

Các bước lập trình như sau:

  1. Thực hiện mỗi chu kỳ 1s.
  2. Kích hoạt cảm biến bằng cách bật PIN Trigger theo thứ tự LOW – HIGH – LOW thông qua hàm digitalWrite.
  3. Tính toán khoảng cách thu được bằng cách sử dụng hàm pulseIn và các công thức tính toán.
  4. Nếu khoảng cách trả về <= 0.5m, in ra thông báo có vật cản.
  5. Lặp lại quy trình.

Đoạn code thực hiện công việc này như sau:

#define TRIG_PIN 8
#define ECHO_PIN 7
#define TIME_OUT 5000

float getDistance() {
  long duration, distanceCm;

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

  duration = pulseIn(ECHO_PIN, HIGH, TIME_OUT);

  // convert to distance
  distanceCm = duration / 29.1 / 2;

  return distanceCm;
}

void setup() {
  Serial.begin(9600);

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

void loop() {
  long distance = getDistance();

  if (distance <= 0) {
    Serial.println("Echo time out !!");
  } else {
    Serial.print("Distance to nearest obstacle (cm): ");
    Serial.println(distance);
  }

  delay(1000);
}
  • Hàm getDistance: trả về khoảng cách từ cảm biến đến vật thể gần nhất (nếu có). Hàm này được mô tả chi tiết bên dưới.
  • Hàm setup: cung cấp các tham số cần thiết cho chương trình.
    • Serial.begin(9600): khai báo sử dụng Output của Arduino IDE, để bật cửa sổ output ta dùng menu Tools > Serial Monitor hoặc tổ hợp phím Ctrl + Shift + M.
    • pinMode(TRIG_PIN, OUTPUT): khai báo sử dụng trigger pin (PIN 8) để xuất tín hiệu.
    • pinMode(ECHO_PIN, INPUT): khai báo sử dụng echo pin (PIN 7) để nhận tín hiệu.
  • Hàm loop:
    • if (distance <= 0) ... else ...: tuỳ thuộc vào khoảng cách trả về mà có xử lý tương ứng.
    • Sau đó delay(1000): dừng 1 giây, trước khi Arduino gọi lại loop.

Hàm getDistance()

Hàm getDistance() trả về khoảng cách từ cảm biến siêu âm đến vật thể gần nhất (nếu có) hoặc trả về 0 nếu không có vật thể xung quanh cảm biến. Để sử dụng cảm biến, cần truyền tín hiệu cho PIN trigger theo chu kỳ LOW – HIGH – LOW.

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

Chờ tín hiệu phản hồi từ PIN echo. Arduino cung cấp hàm pulseIn để lấy thời gian (tính bằng milisec) từ khi hàm được gọi cho đến khi có tín hiệu tại PIN được chỉ định trước. Nếu không nhận được tín hiệu hoặc vượt quá thời gian timeout, hàm sẽ trả về 0.

Cú pháp của hàm pulseIn như sau:

pulseIn(pin, value)
pulseIn(pin, value, timeout)

Với các tham số:

  • pin: PIN chờ.
  • value: giá trị chờ.
  • timeout: thời gian chờ tín hiệu, mặc định là 1s.

Sau khi có thời gian, khoảng cách được tính bằng công thức:

distanceCm = duration / 29.1 / 2;

Thời gian âm thanh truyền trong không khí ở 20°C là 344 m/s. Sử dụng quy tắc tam suất, ta tính được sóng âm di chuyển 1cm trong không khí mất khoảng 29.1 ms. Do thời gian được tính từ lúc phát tín hiệu tới khi sóng âm phản xạ lại, nên chia đôi sẽ được quãng đường mà sóng âm đã đi, từ đó tính được khoảng cách.

Kết quả thực thi

FEATURED TOPIC

hihi