티스토리 뷰

Embedded/Arduino

아두이노 강좌 #38 HC-SR04 동작 방식과 사용법

좁고 얕은 지식 Yongmini 2020. 9. 19. 01:54

Arduino Uno HC-SR04Arduino Uno HC-SR04

Arduino Uno : UltraSonic Module HC-SR04

이번 포스트에서는

초음파 거리 센서 모듈 HC-SR04 동작 방식과 아두이노로 거리 측정 방법

을 소개합니다.

UltraSonic Module HC-SR04

초음파(Ultrasonic Wave)는 사람이 들을 수 있는 가청 주파수(20Hz ~ 20kHz)보다 높은 주파수 대역의 음파입니다. 산에서 '야호~'를 외치면 돌아오는 소리를 들을 수 있는 것처럼, 초음파도 음파이기 떄문에 물체를 만나면 반사되어 돌아옵니다. HC-SR04는 40kHz의 초음파 송신부(Speaker)와 수신부(MIC)로 구성되어 있어, 송신된 초음파가 물체에 반사되어 돌아오는 시간을 알려주는 모듈입니다. 공기 중 음파의 속도는 340m/s로, 초음파가 물체에 부딪혀 반사되는 시간을 알면 물체의 거리를 알 수 있습니다. 

모듈 스펙

HC-SR04의 기본적인 스펙은 아래와 같습니다.

  • 입력 전원 : 5V
  • 소모 전류 : 15mA
  • 측정 거리 : 2cm ~ 4m
  • 측정 각도 범위 : 15º
  • 트리거 입력 신호 : 10us Pulse

동작 방식

HC-SR04는 아래 그림과 같이 4핀으로 구성된 모듈입니다. 2번 Trig핀으로 10 us 동안 HIGH 펄스가 입력되면 HC-SR04의 스피커로 40kHz의 초음파 8 펄스 출력 후 3번 ECHO 핀으로 HIGH를 출력합니다. 마이크로 전송된 초음파가 물체를 만나 반사되어 HC-SR04로 돌아오면 3번 핀의 출력을 LOW로 변경합니다. 아두이노에서는 이 ECHO 핀의 HIGH 지속 시간을 이용하여 초음파 모듈과 물체의 거리를 계산 할 수 있습니다.

  • VCC : 5V 전원 입력
  • Trig : 거리 측정 시작 트리거 - 입력 단자
  • Echo : 초음파 송신 후 수신 되기 까지 HIGH 를 출력 - 출력 단자
  • GND : 그라운드

HC-SR04 동작 방법HC-SR04 동작 방법

거리 계산

초음파의 속도는 20℃에서 343m/s 입니다. 속도의 단위는 거리/시간이기 때문에, Echo 핀의 HIGH 지속 시간의 절반과 속도를 곱하면 물체의 거리를 측정 할 수 있습니다. Echo 핀의 HIGH 지속 시간에 1/2을 곱하는 이유는 소리가 가고, 돌아오는 왕복 시간이기 때문입니다. 거리의 단위별로 거리 계산 식은 아래와 같습니다.

👉 Distance [cm] = Echo High Pulse Time [us] / 58

👉 Distance [inch] = Echo High Pulse Time [us] / 148 


아두이노 우노로 HC-SR04로 거리 측정

Arduino Uno HC-SR04 회로 구성

HC-SR04를 사용하여 아래와 같이 회로를 구성하였습니다. 저는 HC-SR04의 Trigger핀과 Echo핀을 아두이노 우노의 D9, D8에 연결했지만, 다른 디지털 핀에 연결해도 무방합니다.

Arduino Uno 와 HC-SR04 연결 예시Arduino Uno 와 HC-SR04 연결 예시


거리 측정 코드 작성

HC-SR04 로 거리 측정한 결과를 시리얼 포트로 출력하는 코드입니다. 거리 단위는 mm 와 inch 두 가지를 출력합니다.

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
33
34
35
36
37
38
39
40
41
42
43
// triggerPin, EchoPin 지정
#define triggerPin 8
#define echoPin 9
 
void setup() {
    pinMode(triggerPin, OUTPUT); 
    pinMode(echoPin, INPUT); 
    Serial.begin(9600); 
    delay(2000);
    Serial.println("Comport Connected..!");
    delay(500);
}
 
void loop() {
    double Duration;
    // Trigger High 지속 시간 10us
    digitalWrite(triggerPin, LOW);
    delayMicroseconds(2);
    digitalWrite(triggerPin, HIGH);
    delayMicroseconds(10); 
    digitalWrite(triggerPin, LOW); 
 
    //echoPin High 유지 시간 측정
    Duration = pulseIn(echoPin, HIGH); 
    
    double Distance_mm = Duration / 5.8;
    double Distance_inch = Duration / 148;
 
    // 거리 측정 값이 유효할 때(2~400cm) 시리얼 포트로 거리를 출력
    if ((Distance_mm < 4000&& (Distance_mm > 2)){
        Serial.print("Distance = "); 
        Serial.print(Distance_mm);
        Serial.println(" mm");
        Serial.print("Distance = "); 
        Serial.print(Distance_inch);
        Serial.println(" inch");
        Serial.println("=================");
    }
    else{
        Serial.println("Error");
    }
    delay(1000); // Wait to do next measurement
}
cs

코드 설명

  • 24 Line의 pulseIn(echoPin, HIGH) 함수 : echoPin 이 HIGH가 되기 시작해서 LOW로 전환 되기까지의 시간을 microseconds 단위로 반환합니다. 다시 말해서, echoPin 의 HIGH 유지 시간을 측정하는 함수입니다. 
  • 30~40 Line if()문 : HC-SR04의 최대 측정 범위 4m를 넘어가는 경우 Error 처리합니다. 

📌 pulseIn() 함수의 설명입니다.

Syntax

  • pulseIn(Pin, value)
  • pulseIn(Pin, value, timeout)

Parameters

  • Pin : 아두이노 핀 번호
  • value : HIGH or LOW
  • timeout : (optional) 펄스가 시작될때까지 대기하는 시간 (데이터 타입 : unsigned long)

Returns

  • Pulse 지속 시간 : microseconds 단위의 unsigned long
  • 0 : timeout 시간 내에 펄스가 없는 경우

Example

  • time = pulseIn(3, HIGH); : 3번 핀이 HIGH가 되고 나서 LOW로 되는 시간을 변수 time에 저장


실행 결과

아래 영상은 위의 코드를 실행한 결과입니다. 시리얼 모니터로 물체의 거리를 확인 할 수 있습니다.


마무리

Arduino Uno 보드에서 HC-SR04를 사용하여 거리를 측정하는 방법에 대해 소개하였습니다. 이번 코드에서 사용한 pulseIn() 함수는 다양한 곳에서 사용되는 함수이니 사용법을 확인하시면 좋을 것 같습니다.

끝까지 읽어 주셔서 감사합니다.😊



댓글
댓글쓰기 폼
최근에 올라온 글
«   2020/10   »
        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
Total
21,940
Today
165
Yesterday
595