Đối với robot, khi ở chế độ tự động, nó phải lấy thông tin của môi trường xung quanh như: khoảng cách, nhiệt độ, độ ẩm, ánh sáng, ... sau đó tiến hành phân tích các dữ liệu, cuối cùng ra quyết định. Ví dụ như robot hút bụi tự động tìm đường đi thì nó phải tính được phía trước có vật cản hay không, và tiến hành đi tới hay rẽ sang một hướng khác.
Để lấy được thông tin các vật cản phía trước có thể sử dụng nhiều loại cảm biến, trong đó có thể ứng dụng có thể dùng cảm biến khoảng cách bằng sóng âm SRF05.
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 (sonar) là một loại sóng cao tầng mà con người không thể nghe thấy. Tuy nhiên, có thể thấy được sự hiện diện của sóng siêu âm ở khắp mọi nơi trong tự nhiên. Các loài động vật như dơi, cá heo, ... dùng sóng siêu âm để liên lạc với nhau, để săn mồi hay định vị trong không gian.
Nguyên tắc mà các loài vật sử dụng sóng âm để định vị rất đơn giản, có thể tóm gọn trong 3 bước sau:
- Vật chủ phát ra sóng âm.
- Sóng âmva chạm với môi trường xung quanh và phản xạ lại.
- Dựa vào thời gian phát/thu, khoảng cách giữa vật chủ và môi trường xung quanh tính ra.
Tính toán khoảng cách cũng phụ thuộc rất nhiều vào môi trường truyền dẫn, ví dụ như sóng âm truyền trong môi trường nước hay kim loại sẽ nhanh hơn rất nhiều so với sóng âm được truyền trong môi trường không khí. Sóng âm không thể truyền được trong môi trường chân không.
Theo nguyên tắc này, dựa vào sự tiến bộ của khoa học công nghệ hiện đại, ứng dụng của sóng âm trong cuộc sống rất nhiều, có thể kể đến như thiết bị định vị dưới biển của tàu ngầm, thiết bị radar, các thiết bị đo khoảng cách môi trường như đo độ sâu của đại dương, ...
Cảm biến siêu âm SRF05 cũng hoạt động theo nguyên tắc trên, thiết bị gồm có 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 của nhà sản xuất thì tầm hoạt động tối đa của cảm biến này nằm trong khoảng 5m.
Chức năng của các chân này 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, quá trình kích hoạt khi một chu kì điện cao / thấp diễn ra.
- Echo: bình thường sẽ ở trạng thái 0V, được kích hoạt lên 5V ngay khi có tín hiệu trả về, sau đó trở về 0V.
- Gnd: nối với cực âm của mạch.
- OUT: không sử dụng.
Dựa theo 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:
- Vcc: nối với nguồn 5V của Adruino.
- 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
Lập trình cho cảm biến mỗi chu kì 1s kích hoạt cảm biến và kiểm tra xem có vật cản ở xung quanh hay không.
- Thực hiện mỗi chu kì 1s.
- Kích hoạt cảm biến bằng việc bật PIN Trigger theo thứ tự
LOW
-HIGH
-LOW
qua hàmdigitalWrite
. - Tính toán khoảng cách thu được bằng việc sử dụng hàm
pulseIn
và các công thức tính. - Nếu khoảng cách trả về < 0.5m thì in ra thông báo có vật cản.
- Lặp lại quy trình này.
Đ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 các vật thể gần nó - sẽ được đề cập chi tiết ở 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 Adruino IDE, để bật cửa sổ output ta dùng menu Tools > Serial Monitor hay 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ạiloop()
.
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ó) hay trả về 0 nếu xung quanh cảm biến không có bất kỳ vật thể nào. Để sử dụng được 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 lại qua PIN 7 - echo. Arduino cung cấp hàm pulseIn
có tác dụng trả về thời gian (tính bằng milisec) kể từ khi hàm này được gọi cho đến khi có tín hiệu tại PIN chỉ định trước, hay trả về 0 nếu không nhận được tín hiệu / quá thời gian timeout.
Cú pháp của hàm này như sau:
pulseIn(pin, value) pulseIn(pin, value, timeout)
Với các tham số:
- PIN chờ
- Giá trị chờ
- Thời gian chờ tín hiệu, mặc định là 1s.
Sau khi có thời gian, tính toán khoảng cách 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. Bằng quy tắc tam suất tính được sóng âm di chuyển 1 cm trong không khí sẽ mất 1000 / 344 * 100 ~= 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, vì vậy chia đôi sẽ ra được quãng đường mà sóng âm đã đi, cuối cùng có được khoảng cách.