NodeMCU를 이용한 초음파센서( HC-SR04 ) 동작

HC-SR04 사용해보기
in 보기님과 전화 통화를 하던 중, 이렇게 늙어갈 순 없다며 무엇인가 도전해보는 삶을 살아보자며 의미 있는 대화를 나눴습니다. 몇 개의 아이디어들을 서로 공유하였고, 그 중 하나의 아이디어에 대해 뭔가 시작이라도 해보기로 했어요.
말 나온 김에 바로 실행으로 옮겨보기로 했습니다. 칼 뽑았으니까 무까지 썰어보진 못하더라도 허공에 휘둘러라도 봐야 뭔가 진전이 있을 것 같아서 말이에요. 그렇게 우리는 NodeMCU와 통성명 해보기로 했습니다.
그렇게 In 보기님과의 첫 워크샵이 진행되었습니다.

  1. 목적
    – 초음파 센서 이해 및 NodeMCU를 이용한 초음파 센서(HC-SR04) 동작
  2. 프로젝트 명
    – 신세계, 신세계 프로젝트…가 아니라 일단 HC-SR04 동작해보기 프로젝트
  3. 준비물
    – NodeMCU V1.0 와이파이 보드(NodeMCU Lua WiFi ESP8266-12E)
    – HC-SR04 (초음파 센서)
    – 그리고 노트북 및 기타 잡자재

1. HC-SR04(Ultrasonic Sensor / 초음파 센서)

일단은 거리를 측정해서 무언가를 해보는 아이디어였기 때문에(아이디어는 비밀입니다 ㅋㅋㅋ) 거리 측정하는 초음파센서를 하나 구입했어요. 거리를 측정하기 위한 저렴한 초음파 센서를 구매하긴 했지만, 이 제품이 어떻게 동작하는지, 얼마나 먼 거리까지 측정이 가능한지 또 선 연결은 어떻게 해야 하는지 등을 알아야 제대로 사용해볼 수 가 있겠죠?

제품의 기본 정보는 그럼 어디서 얻을 수 있을까요? 인터넷에 검색하면 많은 글들이 있겠지만, 작성자의 개인적인 의견 또는 의역으로 인해 오해의 소지가 있는 부분이 있을 수 있으니, 가장 먼저 HC-SR04의 데이터시트를 확인해보록 하죠!

http://www.alldatasheet.com
에 접속하여 HC-SR04 를 검색하면 쉽게 찾을 수 있습니다.

< HC-SR04 외형 >

초음파센서(Ultrasonic Sensor)는 소리를 이용하여 센서와 어떤 물체와의 거리를 측정하는데 사용하는 센서입니다. 자, 상세한 내용은 아래의 데이터시트 에서 발췌한 내용을 확인해보도록 해요!

1.1 데이터시트 들여다보기

< 출처 : 데이터시트 >

The sensor sends out a sound wave at a specific frequency. It then listens for that specific sound wave to bounce off of an object and come back. The sensor keeps track of the time between sending the sound wave and the sound wave returning. If you know how fast something is going and how long it is traveling you can find the distance traveled with equation 1.

Equation 1. d = v × t

The speed of sound can be calculated based on the a variety of atmospheric conditions, including temperature, humidity and pressure. It should be noted that ultrasonic sensors have a cone of detection, the angle of this cone varies with distance, Figure 2 show this relation. The ability of a sensor to detect an object also depends on the objects orientation to the sensor. If an object doesn’t present a flat surface to the sensor then it is possible the sound wave will bounce off the object in a way that it does not return to the sensor.

< 출처 : 데이터시트 >
< HC-SR04 Spec. >

인터넷에서 검색해보면 몇몇 글들에서는 5m까지 측정 가능하다고 설명해 둔 곳이 있었는데, 데이터시트를 확인해보니 4m까지 측정 가능한 제품이었네요.

  • 핀 기능
    – VCC, GND pins : HC-SR04의 전원(5V와 그라운드)
    – TRIG pin : 초음파를 발생 시키는 것과 연관된 핀, 10us 동안 High 상태를 유지시키면, HC-SR04에서 40kHz & 8 cycle 음파를 내보냄
    – 음파가 발생된 후에 ECHO Pin은 High 상태가 되는데, 이 High 상태를 유지하는 것은 음파가 반사되어 돌아올 때가지 지속된다.
< HC-SR-04 Timing Diagram >

무슨 말일지 잘 모르겠다면, 데이터시트에 나와있는 Timing Diagram을 한번 보도록 합시다. 첫 번째 그림(Trigger Input to Module)의 신호가 10us 동안 High 상태를 유지한 다음 Low 상태로 바뀌면, HC-SR04에서 두 번째 그림(Sonic Burst from Module)과 같이 8 cycle의 음파가 측정하고자 하는 대상물체를 향해 출력이 됩니다.
이 음파가 출력이 되면 Echo 핀은 High 상태로 바뀌어 유지하게 됩니다. 그러다가 음파가 되돌아오면 High 상태를 유지하던 Echo가 Low 상태로 바뀌게 되는 것이죠. 즉, 음파가 발생되어 대상 물체에 도달 후 부딪혀 돌아올 때까지 Echo는 High 상태를 유지하는 것이죠.
그렇다면 우리는 Echo 핀이 High가 된 순간동안의 시간을 알게 되면, 계산식을 통해 센서와 대상물체 간의 거리를 알 수 있게 되는 것입니다.

만약 대상물체와의 거리가 짧다면 Echo가 High 상태를 유지하는 시간이 짧을 것이고, 대상물체와의 거리가 멀다면 그만큼 Echo가 High 상태를 유지하는 시간이 길어지겠죠.
물론, 거리가 짧건 길건 그 시간은 굉장히 짧은 시간이라 사람이 인지하는 것은 거의 불가능 하니까 우리는 MCU를 이용하여 보다 정밀하게 측정할 수 가 있는 것입니다.

* 여기서 잠깐
– “저기요! 잠깐만요! 음파를 쏜다는데, 음파는 어쨌거나 소리 아닙니까? 왜 제 귀에는 아무런 소리가 들리지 않나요?”

데이터시트를 보면, 40kHz의 음파라고 나와 있습니다. 주파수가 40kHz입니다.
가청주파수라고 들어보셨나요? 사람이 들을 수 있는 음파의 주파수 영역을 ‘가청주파수’ 라고 합니다.
보통 가청주파수는 20Hz ~ 20,000Hz 라고 알려져 있어요. 그런데 HC-SR04에서 발생한 음파는 40kHz(=40,000Hz)입니다.
우리가 들을 수 있는 영역 밖의 소리이기 때문에 우리는 들을 수 가 없죠.
우리는 돌고래의 초음파 소리를 들을 수 가 없잖아요! 같은 이유입니다.
돌고래의 가처주파수는 150 ~ 150,000Hz 라고 알려져 있으니, 돌고래는 HC-SR04에서 출력된 음파를 들을 수 있겠네요! 정말인지 궁금하시다면 돌고래에게 한 번 물어보세요.

‘돌고래야~ 너 이 소리 들리니?’ 라구요!

2. 거리측정용 소스코드 작성과 결과 확인

#define trig 5    // Trig   //NodeMCU D1 : GPIO5
#define echo 4    // Echo   //NodeMCU D2 : GPIO4

void setup()
{
   delay(5000);

   pinMode(trig, OUTPUT);    // trig 와 연결된 핀(D1)을 출력핀으로 사용
   pinMode(echo, INPUT);     // echo 와 연결된 핀(D2)을 입력핀으로 사용
   
   Serial.begin(9600);      // 시리얼 통신 시작 _ 통신속도 9600bps
   Serial.println("HC-SR04(초음파 센서)를 이용한 거리측정 테스트");
   Serial.println("HC-SR04 측정 가능 범위 : 2 ~ 400cm");
   Serial.println("측정 시작!!!");
}
void loop()
{
   int distance, measure;
   // 트리거 핀으로 10us 동안 펄스 출력
   
   digitalWrite(trig, LOW);   // Trig 핀 강제 Low 상태 셋팅
   delayMicroseconds(2);      // 2us 동안 Low 상태 유지
   
   digitalWrite(trig, HIGH);  // High 상태로 셋팅
   delayMicroseconds(10);     // 10us 동안 High 상태 유지
   digitalWrite(trig, LOW);   // Low 상태로 셋팅
 
   measure = pulseIn(echo, HIGH);  // pulseIn은 지정된 포트에서 펄스를 읽음 (High / Low)

/*
   Equation 1. d = v * t
   Equation 2. Distance = (Speed/170.15m) * (Meters/100cm) * (1e6us/170.15m) * (58.772us/cm)
   Equation 3. Distance = time/58 = (us)/(us/cm)=cm

   To use equation 1 the speed of sound needs to determined, 
   which is 343 meters per second at standard temperature and pressure.

   If you want to know Equations, check datasheet of HC-SR04
*/ 
   distance = measure / 58;
 
   Serial.print("측정된 거리: ");
   Serial.print(distance);
   Serial.println("cm");      // cm단위로 측정 후 계산된 값을 시리얼 통신으로 전송
   
   delay(1000);
}

간략히 이렇게 구성해보았습니다.
사실, HC-SR04에 대한 오픈소스는 많이 있어요. 그대로 가져다가 사용해도 괜찮겠지만, 저희는 위의 소스처럼 구성해서 사용해 보았습니다.
우선 NodeMCU에 있는 D1, D2를 각각 HC-SR04의 Trig 핀과 Echo 핀으로 사용하기로 하죠. D1과 D2는 각각 GPIO5와 GPIO4입니다.

NodeMCU 실크에 D1, D2, D3 … 이렇게 적힌 것을 보고, pinMode() 함수 셋팅 할 때,
그대로 실크값을 적어 넣고는 왜 안되지 하며 한참 헤매는 경우가 있는데 그런 오류를 범하지 않도록 주의하시길!

아무튼 이렇게 구성을 했으니, 결과창에서 확인해 보도록 하죠!

< 시리얼 모니터 출력 결과 >

위의 캡쳐화면과 같이 출력되는 것을 확인할 수 있었어요.
중간에 손바닥을 이용해 센서에 가깝게 가져다 댔더니 그에 반응해서 6, 12, 9 ,2cm 이렇게 나오는 것까지 확인 되었어요. 그리고는 손바닥을 치우니까 다시 원래 거리만큼 출력되네요.

참고로, HC-SR04 센서는 책상위에 둔 상태로 천장을 향하고 있는 상태입니다. 즉, 책상위의 센서위치부터 천장까지의 거리가 약 165cm 정도 된다는 얘기겠죠? (계산식만 정확히 맞다면 말이에요!)

이것 말고도 첫 워크샵에서 추가적으로 다른 것들도 진행하였지만, 이번 포스팅은 여기까지만 쓰도록 합니다.
뭔가 생산적인 시간을 보낸 것 같아 in보기 님도 그렇고 저도 그렇고 나름 의미있던 시간이었던 것 같아요.
또 다른, 아이디어도 생각 나기도 했구요.

아무튼, 한 발 한 발 꾸준히 내딛다 보면 언젠가 기똥찬 풍경이 펼쳐진 곳에 도달하지 않겠어요?

덧글 삭제

이메일은 공개되지 않습니다. 필수 입력창은 * 로 표시되어 있습니다