[아두이노 강좌] 21. 초음파 거리센서 HC-SR04 사용하기 / pulseIn()
개요
이번글에서는 초음파를 출력할 수 있는 센서를 통해 거리를 측정해보도록 하겠습니다. 초음파 거리센서 HC-SR04
HC-SR04 센서는 초음파를 이용하여 거리를 측정할 수 있는 센서입니다. 초음파는 귀에 들리지 않을 정도의 높은 주파수(약 20MHz이상)의 소리를 말하며, 초당 340m의 속도를 갖습니다. 이러한 초음파의 속도를 바탕으로 시간관련 함수를 응용하면 초음파를 활용하여 거리나 수위, 적설 등을 측정할 수 있습니다. 그림1. 초음파 거리센서 HC-SR04
초음파 거리센서의 구조는 생각보다 간단합니다. 총 4개의 핀으로 구성되어있으며 양끝의 VCC와 Gnd를 통해 전원(5V)을 입력받고, Trig핀을 통해 신호를 입력 받으면 초음파를 발신, 초음파가 다시 수신되면 Echo핀을 통해 신호를 출력합니다. 센서는 5V에서 작동하며 약 15mA의 전류를 사용합니다. 측정 범위는 최소 2cm에서 4m이지만 주변 환경에 의해 오차가 발생할 수 있습니다.
초음파로 거리 측정하기
이제 본격적으로 아두이노와 초음파 거리센서를 연결하여 거리를 측정해봅시다!
준비물
회로도 연결 초음파 거리센서의 VCC와 GND는 전원(5V,GND)에 연결을 해주며 Trig는 초음파를 쏘기 위해 디지털 핀 출력 설정을, Echo는 초음파를 받기 위해 디지털 핀 입력을 설정해줍니다.
프로그램 코드 (10) int trig = 2; // 변수 trig를 생성하고 2를 대입한다 int echo = 3; // 변수 echo를 생성하고 3을 대입한다 void setup() { Serial.begin(9600); pinMode(trig, OUTPUT); // trig(2)핀을 출력모드로 설정한다 pinMode(echo, INPUT); // echo(3)핀을 입력모드로 설정한다 } void loop() { digitalWrite(trig, HIGH); // trig(2)핀에 HIGH신호를 보낸다 delayMicroseconds(10); // 10마이크로초(1/100,000초) 동안 digitalWrite(trig, LOW); // trig(2)핀에 LOW신호를 보낸다 int distance = pulseIn(echo, HIGH) * 17 / 1000; // 변수 distance = echo핀이 다시 HIGH신호를 받기까지의 시간 * 17/1000 Serial.print(distance); // 변수 distance를 출력한다 Serial.println("cm"); // 문자열 cm을 출력하고 줄바꿈 delay(100); // 딜레이 0.1초 }
프로그램 해석
거리 = 시간 x 속도
거리를 구하기 위해서는 시간과 속도를 구해야하며, 시간과 속도는 다음과 같습니다. 속도 : 초음파의 속도는 초당 340m입니다. 시간을 구하기 위해 pulseIn()이라는 함수가 등장했습니다. 위에서 사용한 pulseIn(echo,HIGH)를 해석해보자면, echo핀이 HIGH상태에서 LOW신호를 받고, 다시 HIGH를 받기까지의 시간, 즉 다시 HIGH가 되기까지의 시간을 반환합니다. 즉, 10 마이크로초동안 쏜 초음파를 받기까지의 시간을 구하게되는겁니다.
시간: pulseIn(echo, HIGH); // 초음파가 돌아오는 시간
자, 근데 왜 *17/1000을 했을까요? *17을 한 이유는 pulseln()함수로 구한 시간이 왕복 시간이기 때문입니다. 그렇기에 식에 나누기2를 합니다. /1000을 한 이유는 그냥 보기 좋게 cm로 단위를 맞추기 위함입니다. ㅎㅎ;
관렴함수 정리 ■pulseIn(핀번호,신호) 또는 pulseIn(핀번호, 신호, 시간제한)
설정 신호를 다시 입력 받을 때까지 걸리는 시간을 측정하기 위한 함수입니다. 매개변수 핀번호 - 함수를 사용할 핀을 설정합니다. 신호 - HIGH 또는 LOW 시간제한 - 제한 시간을 설정합니다. 지정한 시간만큼 기다려도 신호 변화가 없을 경우 0을 반환하며, 마이크로 초 단위로 지정할 수 있습니다. 지정하지 않을경우 1초(1000000)로 자동 설정됩니다. 반환값 설정 신호가 입력될 때까지의 시간을 반환합니다. 지정된 시간동안 신호 변화가 없을 경우 0을 반환합니다.
■delayMicroseconds(시간)
다음 명령어(코드)까지 입력 시간만큼 동작을 딜레이합니다. 매개변수 시간 - 마이크로초 단위로 숫자를 입력하비다.(1,000,000 = 1초)
응용하기
앞에서 배운 내용을 바탕으로 아래의 예제를 진행해봅시다. LED로 거리 나타내기 (회로도 연결) 감지되는 거리를 각각의 LED로 출력하려면 어떻게 해야할까요? 아래의 코드를 보기전에 직접 프로그램을 만들어보세요~ ^^.
LED로 거리 나타내기 (프로그램 코드 (11_2)) int trig = 2; int echo = 3; int RED = 8; int YELLOW = 9; int GREEN = 10; void setup() { Serial.begin(9600); pinMode(trig, OUTPUT); pinMode(echo, INPUT); pinMode(RED, OUTPUT); pinMode(YELLOW, OUTPUT); pinMode(GREEN, OUTPUT); } void loop() { digitalWrite(trig, HIGH); delayMicroseconds(10); digitalWrite(trig, LOW); int distance = pulseIn(echo, HIGH) * 17 / 1000; Serial.print(distance); Serial.println("cm"); delay(100); if (distance > 20) // distance(거리) 가 20보다 크면 { digitalWrite(GREEN, HIGH); // GREEN이 연결된 핀에 HIGH 신호(5V)를, digitalWrite(YELLOW, LOW); // YELLOW가 연결된 핀에 LOW 신호(0V)를, digitalWrite(RED, LOW); // RED가 연결된 핀에 LOW신호(0V)를. } if (distance > 10 & distance <= 20) // distance(거리)가 10초과~20이하 일때 { digitalWrite(GREEN, LOW); // 같은내용이므로 여기부턴 생략.. digitalWrite(YELLOW, HIGH); digitalWrite(RED, LOW); } if (distance > 0 & distance <= 10) { digitalWrite(GREEN, LOW); digitalWrite(YELLOW, LOW); digitalWrite(RED, HIGH); }
}
링크바로가기: https://smartstore.naver.com/mechasolution_com/products/2855891646
|