[아두이노 강좌] 21. 초음파 거리센서 HC-SR04 사용하기 / pulseIn()

4657d577cad8c8644ff0a165489a9b94_1462798
 

 

4657d577cad8c8644ff0a165489a9b94_1462798 개요 

 

이번글에서는 초음파를 출력할 수 있는 센서를 통해 거리를 측정해보도록 하겠습니다.


4657d577cad8c8644ff0a165489a9b94_1462798

4657d577cad8c8644ff0a165489a9b94_1462798  초음파 거리센서 HC-SR04

 

HC-SR04 센서는 초음파를 이용하여 거리를 측정할 수 있는 센서입니다. 초음파는 귀에 

들리지 않을 정도의 높은 주파수(약 20MHz이상)의 소리를 말하며, 초당 340m의 속도를

갖습니다. 이러한 초음파의 속도를 바탕으로 시간관련 함수를 응용하면 초음파를 활용하여

거리나 수위, 적설 등을 측정할 수 있습니다.


4657d577cad8c8644ff0a165489a9b94_1462798

그림1. 초음파 거리센서 HC-SR04

 

초음파 거리센서의 구조는 생각보다 간단합니다. 총 4개의 핀으로 구성되어있으며 양끝의

VCC와 Gnd를 통해 전원(5V)을 입력받고, Trig핀을 통해 신호를 입력 받으면 초음파를 

발신, 초음파가 다시 수신되면 Echo핀을 통해 신호를 출력합니다. 센서는 5V에서 작동하며

약 15mA의 전류를 사용합니다. 측정 범위는 최소 2cm에서 4m이지만 주변 환경에 의해

오차가 발생할 수 있습니다.

  

4657d577cad8c8644ff0a165489a9b94_1462799

 

4657d577cad8c8644ff0a165489a9b94_1462799 초음파로 거리 측정하기

 

이제 본격적으로 아두이노와 초음파 거리센서를 연결하여 거리를 측정해봅시다! 

 

4657d577cad8c8644ff0a165489a9b94_1462799 준비물 

4657d577cad8c8644ff0a165489a9b94_1462799
 

4657d577cad8c8644ff0a165489a9b94_1462799

 

4657d577cad8c8644ff0a165489a9b94_1462799 회로도 연결
4657d577cad8c8644ff0a165489a9b94_1462799
 

초음파 거리센서의 VCC와 GND는 전원(5V,GND)에 연결을 해주며 Trig는 초음파를 쏘기

위해 디지털 핀 출력 설정을, Echo는 초음파를 받기 위해 디지털 핀 입력을 설정해줍니다.

 

 4657d577cad8c8644ff0a165489a9b94_1462799 

 

4657d577cad8c8644ff0a165489a9b94_1462799 프로그램 코드 (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초

} 

 

4657d577cad8c8644ff0a165489a9b94_1462800 

 

4657d577cad8c8644ff0a165489a9b94_1462800 프로그램 해석
약간의 계산식이 들어갑니다. 거리를 구하기 위한 식은 다음과 같습니다 

 

거리 = 시간 x 속도

 

거리를 구하기 위해서는 시간과 속도를 구해야하며, 시간과 속도는 다음과 같습니다.


속도 : 초음파의 속도는 초당 340m입니다.


시간을 구하기 위해 pulseIn()이라는 함수가 등장했습니다. 위에서 사용한 pulseIn(echo,HIGH)를 

해석해보자면, echo핀이 HIGH상태에서 LOW신호를 받고, 다시 HIGH를 받기까지의 시간, 즉 다시 

HIGH가 되기까지의 시간을 반환합니다. 즉, 10 마이크로초동안 쏜 초음파를 받기까지의 시간을 

구하게되는겁니다.

 

시간: pulseIn(echo, HIGH);  // 초음파가 돌아오는 시간

 

자, 근데 왜 *17/1000을 했을까요? *17을 한 이유는 pulseln()함수로 구한 시간이 왕복 시간이기

때문입니다. 그렇기에 식에 나누기2를 합니다. /1000을 한 이유는 그냥 보기 좋게 cm로 단위를

맞추기 위함입니다. ㅎㅎ;

 

4657d577cad8c8644ff0a165489a9b94_1462801


4657d577cad8c8644ff0a165489a9b94_1462801 관렴함수 정리


■pulseIn(핀번호,신호) 또는 pulseIn(핀번호, 신호, 시간제한)

 

설정 신호를 다시 입력 받을 때까지 걸리는 시간을 측정하기 위한 함수입니다.

매개변수

핀번호 - 함수를 사용할 핀을 설정합니다.

신호 - HIGH 또는 LOW

시간제한 - 제한 시간을 설정합니다. 지정한 시간만큼 기다려도 신호 변화가 없을 경우

0을 반환하며, 마이크로 초 단위로 지정할 수 있습니다. 지정하지 않을경우 1초(1000000)로 

자동 설정됩니다.


반환값

설정 신호가 입력될 때까지의 시간을 반환합니다. 지정된 시간동안 신호 변화가 없을 

경우 0을 반환합니다.

 

■delayMicroseconds(시간)

 

다음 명령어(코드)까지 입력 시간만큼 동작을 딜레이합니다.

매개변수

시간 - 마이크로초 단위로 숫자를 입력하비다.(1,000,000 = 1초)

 

4657d577cad8c8644ff0a165489a9b94_1462806

4657d577cad8c8644ff0a165489a9b94_1462806 응용하기

 

앞에서 배운 내용을 바탕으로 아래의 예제를 진행해봅시다.


LED로 거리 나타내기 (회로도 연결) 


4657d577cad8c8644ff0a165489a9b94_1462807

감지되는 거리를 각각의 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);

  }

 

}


 

▶아래 플러스 친구 버튼을 통해 다양한 정보와 교제 자료 및 이벤트등의 소식을 받아보실 수 있습니다.



swab 쪽지보내기 메일보내기 자기소개 아이디로 검색 전체게시물 2016-08-20 (토) 09:39 3년전
프로그램 코드 (10)에 void setup() 에 Serial.begin(9600); 해주어야 하지요?
주소
     
     
라임 쪽지보내기 메일보내기 자기소개 아이디로 검색 전체게시물 2016-08-26 (금) 15:48 3년전
네. 해주셔야합니다!
주소

모바일 버전으로 보기