아두이노2015. 8. 31. 17:07

초음파 센서인 HC-SR04를 이용하여 거리를 측정해보자.

이 센서는 나의 테스트 결과 1m 안의 물체에 대해서는 상당히 정확한 거리값을 구해 준다.

하지만 1m를 넘어가면 값이 별로 정확하지는 않은 것 같다.


초음파로 거리를 계산하는 원리는 다음과 같다.

초음파의 속도는 340m/s 이다.(일반적인 소리의 속도와 같다.) 초음파가 발생되어 대상물체에 부딪히게 되면 반사되어 돌아오게 된다. 이의 시간차를 계산하면 거리를 계산할 수 있다. 박쥐가 동굴에서 빛 없이도 장애물을 파악하고 피해가는 원리와 비슷하며, 번개가 치고 1초뒤 천둥소리가 들렸다면 번개가 친 곳과의 거리가 340m 인 것을 파악하는 원리와 같다고 생각하면 된다.

초음파 센서를 보면 스피커 같은 것이 2개가 달려 있는데 한 쪽은 초음파를 발생시키고 다른 한 쪽은 물체에 반사되는 초음파를 감지하는 역할을 한다. 즉, 초음파 발생 시간과 물체에 부딪혀 반사되어 오는 시간의 차를 이용하여 거리를 측정하게 되는 것이다.


위의 단자에서 Trig 가 초음파를 발생하는 신호이며, Echo가 반사되어 오는 초음파를 받는 역할을 한다. 데이터시트와 매뉴얼은 다음과 같다.


HC-SR04 데이터시트:

HCSR04.pdf


HC-SR04 매뉴얼:

HC-SR04Users_Manual.pdf



연결:

Vcc  ----  아두이노 5V

GND ----  아두이노 GND

Trig  ----  아두이노 디지털 9번핀

Echo ----  아두이노 디지털 8번핀


##소스##

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
//출력핀(trig)과 입력핀(echo) 연결 설정, 다른 핀을 연결해도 됨.
int trigPin = 9;
int echoPin = 8;
 
//시리얼 속도설정, trigPin을 출력, echoPin을 입력으로 설정
void setup(){
  Serial.begin(9600);
  pinMode(trigPin, OUTPUT);
  pinMode(echoPin, INPUT);
}
 
//초음파를 보낸다. 다 보내면 echo가 HIGH(신호받기) 상태로 대기
void loop(){
  float duration, distance;
  digitalWrite(trigPin, HIGH);
  delay(10);
  digitalWrite(trigPin, LOW);
 
  // echoPin 이 HIGH를 유지한 시간을 저장 한다.
  duration = pulseIn(echoPin, HIGH);
  // HIGH 였을 때 시간(초음파가 보냈다가 다시 들어온 시간)을 가지고 거리를 계산 한다.
  // 340은 초당 초음파(소리)의 속도, 10000은 밀리세컨드를 세컨드로, 왕복거리이므로 2로 나눠준다.
  distance = ((float)(340 * duration) / 10000/ 2;
 
  //시리얼모니터에 Echo가 HIGH인 시간 및 거리를 표시해준다.
  Serial.print("Duration:");
  Serial.print(duration);
  Serial.print("\nDIstance:");
  Serial.print(distance);
  Serial.println("cm\n");
  delay(500);
}

cs



##결과##


위의 소스를 업로드 후 초음파 센서에서 7cm 거리에 물체를 두었다.

약간의 오차가 있지만 시리얼모니터상에서 거의 근접한 거리를 보여준다.



반응형
Posted by 대네브 (deneb)

댓글을 달아 주세요

  1. 시리얼모니터에 나타난값을 저장할수는없나요?

    2015.11.11 16:27 [ ADDR : EDIT/ DEL : REPLY ]
    • 저의 포스팅 중에서 시리얼모니터의 내용을 텍스트파일로 저장하는 방법에 대한 포스팅이 있습니다. 참고하세요. http://deneb21.tistory.com/230

      2015.11.11 16:40 신고 [ ADDR : EDIT/ DEL ]
    • 감사합니다!! 혹시 더 궁금한거 있으면 한번더 여쭤볼께요

      2015.11.11 16:48 [ ADDR : EDIT/ DEL ]
  2. King

    센서 앞에 아무런 매질 없이 실험을 진행하신 건가요??

    2016.07.05 16:40 [ ADDR : EDIT/ DEL : REPLY ]
    • 사진 센서 앞에 자세히 보시면 허연 판때기 같은게 있는걸 볼 수 있슴다. ^^

      2016.07.05 16:43 신고 [ ADDR : EDIT/ DEL ]
  3. 키디야

    저상태에서 일정거리가 넘어가면
    진동이나 램프가 동작하는 스케치 알수있을가요?

    2016.11.21 10:28 [ ADDR : EDIT/ DEL : REPLY ]
    • 코딩은 직접 연구해서 짜야죠. 다만 질문에 힌트를 드리자면 진동이나 램프가 동작하는 소스를 loop() 에 if 문 안에 넣고 if문의 조건을 거리를 감지하다가 원하는 거리 이상의 값이 나올 경우로 지정한다면 간단하게 구현이 될 것 같네요.

      2016.11.21 13:07 신고 [ ADDR : EDIT/ DEL ]
  4. 익명

    비밀댓글입니다

    2017.09.02 18:18 [ ADDR : EDIT/ DEL : REPLY ]