초급 예제

누구나 쉽게 따라해볼 수 있는 쉬운 예제들입니다. 가볍게 도전~!

초음파센서로 거리 측정하기

2015-01-16 15:02:29

[이전 학습가이드] 가변저항으로 LED 밝기 조절하기

 

초음파센서란 무엇인가?


 

인간의 들을 수 있는 소리의 영역(가청영역)은 약 20~20000Hz 사이 이며, 이 가청영역의 주파수보다 더 높은 음을 초음파(Ultrasonic)라고 합니다.
강아지의 가청영역은 15~50000Hz이며, 돌고래의 경우 150~150,000Hz이니 인간이 듣지 못하는 소리를 동물들은 들을 수 있습니다.
 

초음파의 속도는 일반 공기중에서 약 340m/s이며, 파동의 성질인 확산, 흡수, 산란 등에 의해 감쇠하는 성질을 가지고 있습니다. 

초음파 센서는 이미 로봇 청소기 같은 가전제품에서부터 자동차의 감지 센서, 초음파 탐지기 등 의료용, 산업용에 이르기까지 매우 다양한 분야에서 활용되고 있습니다.
 

 

이 예제에서 사용된 초음파 센서는 약 40KHz 정도의 주파수를 생성하며, 최대 4~5m정도까지의 거리를 측정할 수 있습니다.
 

거리측정을 위한 초음파 센서는 송신부와 수신부로 나뉘어져 있으며, 송신부에서 일정한 시간의 간격을 둔 짧은, 초음파 펄스를 방사하고, 대상물에 부딪혀 돌아온 에코 신호를 수신부에서 받아, 이에 대한 시간차를 기반으로 거리를 산출합니다.
이를 통해 장애물의 유무, 물체의 거리 또는 속도 등을 측정할 수 있습니다.
 

초음파를 발생시키는 원리는 피에조 부저가 소리나는 원리인 피에조효과(압전효과)와 같습니다. 

 

 

 

 

 

 

 

 

 

초음파센서 사용방법



초음파 센서의 송신부(Trig)에서 일정한 시간의 간격을 둔 짧은, 초음파 펄스를 방사하고, 대상물에 부딪혀 돌아온 에코 신호를 수신부(Echo)에서 받아, 이에 대한 시간차를 기반으로 거리를 산출합니다.

1cm를 이동하는데 걸리는 시간은 다음과 같이 구할 수 있습니다.



따라서, t = 2 * 0.01 / 340 = 58.824µs 로, 초음파가 1cm를 이동하는데 걸리는 시간은 약 29µs가 걸리며, 초음파가 반사된 물체와의 거리는 다음과 같이 구할 수 있습니다.


거리(cm) = duration (왕복에 걸린시간) / 29 / 2 (왕복)


 

 

 

 

 

 

 

 

 

부품 목록

NO 부품명 수량 상세설명
1 오렌지 보드 1  
2 초음파 센서 1 HC-SR04
3 LED 1 LED(RED)
4 330Ω 저항 1  
5 브레드 보드 1  
6 점퍼 케이블 8  

 

부품명 오렌지 보드 초음파 센서 LED
파트

 

 

부품명 330Ω 저항 브레드 보드 점퍼 케이블
파트

 

 

 

 

 

 

 

 

하드웨어 making

브레드 보드


1. 오렌지보드의  5V핀을 브레드보드의 +버스에 연결합니다.

2. 오렌지보드의 GND핀을 브레드보드의 -버스에 연결합니다.

3. 초음파센서를 그림과 같이 세로로 꽂습니다.

4. LED를 애노드(긴 단자)가 아래쪽으로 향하게하여 꽂습니다.

5. LED의 애노드에 330Ω 저항을 연결합니다.

6. 초음파센서의 Vcc단자를 +버스에 연결합니다.

7. 초음파센서의 Trig단자를 오렌지보드 8번핀에 연결합니다.

8. 초음파센서의 Echo단자를 오렌지보드 9번핀에 연결합니다. 

9. 초음파센서의 Gnd단자를 -버스에 연결합니다.

10. LED 애노드와 연결된 저항을 오렌지보드 A0번에 연결합니다.

11. LED 캐소드(짧은)를 -버스에 연결합니다.


 

 

 

 

 

 

 

소프트웨어 coding


 

  1. /*
  2.  제목    : 초음파센서로 거리 측정하기
  3.  내용   : 초음파센서로부터 10cm 이내로 물체가 감지되었을때 LED가 켜지도록 만들어 봅시다.
  4.  */
  5.  
  6. // 초음파센서의 송신부를 8번핀으로 선언하고 수신부는 9번핀으로 선언합니다.
  7. int trig = 8;
  8. int echo = 9;
  9.  
  10. // LED를 A0핀으로 설정합니다.
  11. int led = 3;
  12.  
  13. // 실행시 가장 먼저 호출되는 함수이며, 최초 1회만 실행됩니다.
  14. // 변수를 선언하거나 초기화를 위한 코드를 포함합니다.
  15. void setup() {
  16.   // 초음파센서의 동작 상태를 확인하기 위하여 시리얼 통신을 설정합니다. (전송속도 9600bps)
  17.   Serial.begin(9600);
  18.   //초음파 송신부-> OUTPUT, 초음파 수신부 -> INPUT,  LED핀 -> OUTPUT
  19.   pinMode(trig, OUTPUT);
  20.   pinMode(echo, INPUT);
  21.   pinMode(led, OUTPUT);
  22. }
  23.  
  24. // setup() 함수가 호출된 이후, loop() 함수가 호출되며,
  25. // 블록 안의 코드를 무한히 반복 실행됩니다.
  26. void loop() {
  27.   digitalWrite(trig, LOW);
  28.   digitalWrite(echo, LOW);
  29.   delayMicroseconds(2);
  30.   digitalWrite(trig, HIGH);
  31.   delayMicroseconds(10);
  32.   digitalWrite(trig, LOW);
  33.  
  34.   unsigned long duration = pulseIn(echo, HIGH);
  35.  
  36.   // 초음파의 속도는 초당 340미터를 이동하거나, 29마이크로초 당 1센치를 이동합니다.
  37.   // 따라서, 초음파의 이동 거리 = duration(왕복에 걸린시간) / 29 / 2 입니다.
  38.   float distance = duration / 29.0 / 2.0;
  39.  
  40.   // 측정된 거리 값를 시리얼 모니터에 출력합니다.
  41.   Serial.print(distance);
  42.   Serial.println("cm");
  43.  
  44.   // 측정된 거리가 10cm 이하라면, 아래의 블록을 실행합니다.
  45.   if (distance < 10) {
  46.     // LED가 연결된 핀의 로직레벨을 HIGH (5V)로 설정하여, LED가 켜지도록 합니다.
  47.     digitalWrite(led, HIGH);
  48.   }
  49.   // 측정된 거리가 10cm 이상이라면, 아래의 블록을 실행합니다.
  50.   else {
  51.     // LED가 연결된 핀의 로직레벨을 LOW (0V)로 설정하여, LED가 꺼지도록 합니다.
  52.     digitalWrite(led, LOW);
  53.   }
  54.   // 0.2초 동안 대기합니다.
  55.   delay(200);
  56. }

 

TIP pulseIn에서 In은 LN이 아닌 IN입니다.

 

 

 

 

 

 

 

trig핀과 echo핀

 

초음파센서에서는 2가지의 신호 제어핀이 있습니다. 바로 trig핀과 echo핀인데요.

두 역할을 확실히 이해한다면 코드를 읽기 좀 더 수월합니다.

 

trig핀은 초음파를 쏘는 역할을 하기 때문에 아두이노 입장에서는 출력의 역할을 하는 핀이고 그렇기 때문에 pinMode(trig,OUTPUT);을 선언합니다.

반대로 echo핀은 초음파를 받아들이는 역할이므로 pinMode(echo,INPUT);이 됩니다.

 

 

loop()에서는 처음에 trig, echo핀 모두 LOW신호를 줌으로써 아무 동작도 하지않는 초기화상태를 만듭니다.

 

  1.   digitalWrite(trig, LOW);
  2.   digitalWrite(echo, LOW);
  3.   delayMicroseconds(2);

 

 

 

 

그 후에 trig핀에 신호를 10us만큼 주게 되는데 이 신호는 초음파를 발사하는 신호가 아닙니다.

 

  1.   digitalWrite(trig, HIGH);
  2.   delayMicroseconds(10);
  3.   digitalWrite(trig, LOW);

 

 

 

데이터시트를 확인하게 되면 trig핀에 10us만큼 신호가 들어가게 되면 그 다음에 8번의 초음파가 발사됩니다.

초음파를 쏘기 위한 사전 신호로 보시면 됩니다.

 

 

 

 

 

 

 

그 후에는 pulseIn()함수를 통해 초음파가 장애물에 부딪혀서 돌아온 왕복 시간을 측정하게 됩니다.

 

 

 

 

 

 

 

 

pulseIn()함수

 

pulseIn()함수특정 시간을 측정하기 위해 사용하는 함수 입니다.

 

pulseIn(3,HIGH)라면 3번핀이 HIGH신호를 유지하고 있는 동안의 시간을 측정하게됩니다.

LOW->HIGH로 바뀔때 시간측정을 시작하고 HIGH->LOW로 바뀌는 순간 시간 측정을 중지합니다.

 

위 코드에서는  unsigned long duration = pulseIn(echo, HIGH); 이기 때문에

 

echo핀이 HIGH신호를 유지하고 있는 동안의 시간을 측정하게 됩니다.

 

 

 

 

 

 

 

 

코드 실행

 

위 코드를 실행시키면 초음파로 거리를 측정하고 측정된 거리에 따라 10cm를 기준으로 10cm보다 적을 경우 LED를 켜고

10cm보다 멀면 LED를 끕니다.

 

 

 

 

 

 

 

 

초음파센서를 활용한 프로젝트


 

자동으로 열리는 스마트 휴지통 만들기

 

초음파센서는 전방에 있는 장애물을 감지하여 거리값을 반환하는데 이 특성을 이용하여

손을 인식하면 자동으로 열리는 스마트 휴지통을 만들었습니다.

 

휴지통에 만지면서 열고 닫고가 찜찜할 때 초음파센서를 부착하면 자동으로 열리게 됩니다.

 

 

 

 

 

[이전 학습가이드] 토양 수분센서로 수분량 측정하기

kocoafabeditor

항상 진취적이고, 새로운 것을 추구하는 코코아팹 에디터입니다!

오렌지 보드, 초음파 센서, LED

신재용 2015-11-13 14:18:21

초음파센서로 만드는게 재밌내요

4시55분 2017-07-25 19:20:04

초음파 센서 사용 시 항상 시리얼 통신이 필요한 것은 아니죠?

한치밥 2018-08-14 01:09:37

제가 아직 잘 몰라서 그러는데 스케치 컴파일을 눌렀는데 이게 떠요

C:\Users\USER\AppData\Local\Temp\arduino_modified_sketch_351843\sketch_aug14a.ino: In function 'void loop()':

sketch_aug14a:16: error: 'trig' was not declared in this scope

digitalWrite(trig, LOW);

^

sketch_aug14a:17: error: 'echo' was not declared in this scope

digitalWrite(echo, LOW);

^

exit status 1
'trig' was not declared in this scope

어떻게 해야 하나요?
도와주세요.....

참고로 제 보드는 UNO R3입니다

두둥 2018-09-01 22:27:06

초음파의 ECHO핀을 디지털핀에 꽂거나, 아날로그핀에 꽂는 경우의 예제를 보았습니다. 그 차이점이 정확이 무엇인지 알수 있을까요? 제가 가지고 있는 초음파센서의 ECHO핀은 꼭 아날로그핀에 꽂아야 정상작동을 하더라구요...어떤 이유가 있는것 같기도해서요~^^ 답변부탁합니다.

kocoafabeditor 2018-10-12 13:45:00

두둥//만약 위 예제와 똑같은 초음파 센서를 사용하신다면 디지털은 안되고 아날로그는 되고 하는 일은 없습니다.
위 코드를 보시면 아시겠지만 Echo핀의 역할은 단순히 Trig핀에 의해 발사된 초음파가 장애물에 부딪혀서 들어올때의 신호를 받는 역할만 합니다. 상태가 안들어왔거나 들어왔거나 둘 중 하나이기 때문에 아날로그, 디지털 구분하지 않습니다.

여러 초음파를 사용해봤지만 아직까지는 아날로그에서만 작동되는 초음파센서는 본 적이 없네요^^;