Nội dung bài viết
Vũ Quang Huy Đố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 ... Và tiến hành phân tích các dữ liệu đó, cuối cùng ra quyết định phù hợp. Ví dụ như robot tự tìm đường đi thì nó phải tính được xem 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. Bài viết này sẽ hướng dẫn bạn đọc hiểu và sử dụng được một trong những cảm biến khoảng cách phổ biến - SRF05.

Giới thiệu

Đố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 ... Và tiến hành phân tích các dữ liệu đó, cuối cùng ra quyết định phù hợp. Ví dụ như robot tự tìm đường đi thì nó phải tính được xem 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.

Bài viết này sẽ hướng dẫn bạn đọc hiểu và sử dụng được một trong những cảm biến khoảng cách phổ biến - cảm biến khoảng cách bằng sóng âm SRF05.

Tiền đề bài viết

Bài viết nằm trong chuỗi hướng dẫn xây dựng AI Robot. Tôi gọi dự án này là Cheryl Project.

Các bài viết khác về Arduino tại Chuyên Mục Arduino.

Đối tượng hướng đến

Bài viết dành cho các bạn đã có kiến thức về lập trình C++ và nắm được cơ bản về cách sử dụng Arduino.

Bạn đọc có thể tham khảo thêm.

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

Bài viết này để thực hiện được, bạn đọc cần chuẩn bị các thiết bị sau:

  • 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 đượ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:

  1. Vật chủ phát ra sóng âm
  2. Sóng âm này 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 / 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 ...

ss_1

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.

ss_2

Chức năng của các chân này như sau:

  1. Vcc: cấp nguồn cho cảm biến.
  2. 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.
  3. 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.
  4. Gnd: nối với cực âm của mạch
  5. 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:

  1. Vcc: nối với nguồn 5V của Adruino
  2. Gnd: nối với PIN GND.
  3. Trigger: nối với PIN 8
  4. Echo: nối với PIN 7

ss_3

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

ss_5

ss_6

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.

  1. Thực hiện mỗi chu kì 1s
  2. 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.
  3. 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.
  4. 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.
  5. 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

ss_7

THẢO LUẬN
ĐÓNG