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 được. Tuy nhiên, ta 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. Ta có 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.
Dựa trên việc quan sát các quan sát hoạt động của chúng, ta thấy được 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 âm này va 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 được tính ra.
Việc tính toán khoảng cách cũng còn 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í. Lưu ý là 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, ta đã thấy được ứ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 như 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, ta tiến hành lắp mạch cảm biến siêu âm.
Lắp đặt cảm biến
Ta tiến hành lắp đặt cảm biến khoảng cách SRF05 theo sơ đồ sau:
- 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 việc lắp đặt
Lập trình điều khiển
Với cảm biến SRF05, ta sẽ minh hoạ việc sử dụng qua việc lập trình cho cảm biến cứ mỗi chu kì 1s ta tiến hành 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àm digitalWrite.
- 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.
- Ta giả định nếu khoảng cách trả về < 0.5m thì sẽ in ra thông báo có vật cản.
- Lặp lại chu 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);
- }
Dòng 1, 2, 3: cung cấp các tham số cần thiết cho chương trình
Dòng 5 - 21: hàm GetDistance, hàm này 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.
Dòng 24: 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.
Dòng 26: khai báo sử dụng trigger pin (PIN 8) để xuất tín hiệu.
Dòng 27: khai báo sử dụng echo pin (PIN 7) để nhận tín hiệu.
Dòng 31: gọi hàm GetDistance để lấy khoảng cách.
Dòng 33 - 41: tuỳ thuộc vào khoảng cách trả về mà ta có xử lý tương ứng. Trong trường hợp này ta chỉ đơn giản in ra khoảng cách thu được.
Dòng 43: chờ trong 1s sau đó lặp lại chu kỳ này với hàm delay.
Hàm GetDistance
Nhiệm vụ của hàm GetDistance là 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 dụng được cảm biến, đầu tiên ta phải 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);
Và ta chờ tín hiệu phản hồi lại qua PIN 7 - echo. Arduino cung cấp cho ta 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, ta tính toán khoảng cách bằng công thức:
- distanceCm = duration / 29.1 / 2;
Ta biết 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 đơn giản ta có thể dễ dàng 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 ta chia đôi sẽ ra được quãng đường mà sóng âm đã đi.
Cuối cùng ta trả về khoảng cách thu được.
Kết quả thực thi