[아두이노] 초음파 센서 HC-SR04 사용해보기


안녕하세요 대짜이찐입니다.
이번시간에는 아두이노로 초음파센서(Ultra Sonic Sensor)를 
사용해보는 시간을 가져보겠습니다.


초음파란 사람이 들을 수 있는 가청 범위를 넘어서는 주파수를 가진 소리입니다.
건강한 성인의 경우 20kHz까지의 소리를 들을 수 있으므로,
사람이 들을 수 없는 20kHz이상의 주파수를 가진 소리를 초음파라고 합니다.


HC-SR04 초음파 센서는 수신부와 송신부로 이루어져 있습니다.
송신부에서 초음파를 쏘아 올리고 벽 혹은 물체에 반사되어 오는 
초음파를 수신부에서 인식합니다. 이 때 보낸 시간과 반사되어 돌아온 시간을 
측정하여 거리를 계산할 수 있습니다.

위의 이미지는 데이터시트에서 HC-SR04의 스펙 부분입니다.
+5V를 사용하고 2~400cm까지 측정이 가능하네요 
스펙에 적혀있는대로 측정 각도가 30도 정도 입니다.
15도 이하에서 효과적인 각도인걸 확인 가능합니다.

다만 직선이 아닌관계로 측정범위에 오차가 발생 할 수는 있습니다.
이 경우 여러번 측정하여 평균값을 내면 오차를 줄일 수 있습니다.


아두이노
HC-SR04
비고
5V
Vcc
Power
GND
GND
Ground
D8
Trig
Trigger
D9
Echo
Echo



/*
HC-SR04 초음파 센서
http://www.devicemart.co.kr/
*/
#define trig 8    // 트리거 핀 선언
#define echo 9    // 에코 핀 선언
void setup()
{
  Serial.begin(9600);      // 통신속도 9600bps로 시리얼 통신 시작
  Serial.println("초음파 센서 시작");
  pinMode(trig, OUTPUT);    // 트리거 핀 출력으로 선언
  pinMode(echo, INPUT);     // 에코 핀 입력으로 선언
}
void loop()
{
  long duration, distance;    // 거리 측정을 위한 변수 선언
  // 트리거 핀으로 10us 동안 펄스 출력
  digitalWrite(trig, LOW);        // Trig 핀 Low
  delayMicroseconds(2);            // 2us 딜레이
  digitalWrite(trig, HIGH);    // Trig 핀 High
  delayMicroseconds(10);            // 10us 딜레이
  digitalWrite(trig, LOW);        // Trig 핀 Low
   /*
       에코핀에서 받은 펄스 값을 pulseIn함수를 호출하여
       펄스가 입력될 때까지의 시간을 us단위로 duration에 저장
       pulseln() 함수는 핀에서 펄스(HIGH or LOW)를 읽어서 마이크로초 단위로 반환
  */
  duration = pulseIn(echo, HIGH); 
  /*
       음파의 속도는 초당 340m, 왕복하였으니 나누기 2를하면 170m이고,
       mm단위로 바꾸면 170,000mm.
       duration에 저장된 값은 us단위이므로 1,000,000으로 나누어 주고,
       정리해서 distance에 저장
  */
  distance = duration * 170 / 1000;
  Serial.print("거리: ");
  Serial.print(distance); // 거리를 시리얼 모니터에 출력
  Serial.println("mm");
  delay(100);
}

-dealyMicroseconds()함수는 매개변수에 지정된시간(마이크로 초)동안 프로그램을 멈추는 함수입니다. delayMicroseconds(멈출 마이크로 초)로 사용가능합니다.

-pulseIn()함수는 지정된 핀에서 펄스(HIGH 또는 LOW)를 읽습니다.
예를 들어 value가 HIGH이면, pulseIn()은 핀이 HIGH가 될 때까지 기다리고,
타이머를 시작하며 핀이 LOW가 될 때 까지 기다리고 타이머를 멈춥니다.
펄스의 길이를 마이크로초 단위로 반환합니다.
정해진 timeout 안에 펄스가 시작되지 않으면 0을 반환합니다.
10마이크로 초부터 3분까지 길이의 펄스에 대해 동작합니다.
문법은 pulseIn(pin,value) 혹은 pulseIn(pin,value,timeout)으로 동작합니다.
아래링크에서 구입하실 수 있습니다.
http://www.devicemart.co.kr/goods/catalog?code=0004000400050001
감사합니다.


댓글 쓰기

0 댓글