HC-SR04는 2cm~400cm(약 1인치~13피트) 범위의 저렴하고 사용하기 쉬운 거리 측정 센서입니다.
센서는 두 개의 초음파 트랜스듀서로 구성됩니다. 하나는 초음파 펄스를 송신하는 송신기이고, 다른 하나는 반사파를 수신하는 수신기입니다. 기본적으로 잠수함에서 수중 물체를 탐지하는 데 사용되는 소나(SONAR)와 같은 원리입니다.
주요 사양
동작 전압
5V DC
동작 전류
15mA
동작 주파수
40kHz
최소 측정 거리
2cm / 1인치
최대 측정 거리
400cm / 13피트
정확도
3mm
측정 각도
15° 미만
크기
45 x 20 x 15mm
HC-SR04 초음파 센서 핀아웃
센서 핀아웃은 다음과 같습니다:
센서에는 4개의 핀이 있습니다. VCC와 GND는 아두이노의 5V와 GND 핀에 연결하고, Trig와 Echo는 아두이노의 아무 디지털 핀에 연결합니다. Trig 핀으로 송신기에서 초음파를 보내고, Echo 핀으로 반사된 신호를 수신합니다.
HC-SR04 초음파 거리 센서 작동 원리
40,000Hz의 초음파를 방출하며, 이는 공기를 통해 이동하다가 경로에 물체나 장애물이 있으면 모듈로 다시 반사됩니다. 이동 시간과 음속을 알면 거리를 계산할 수 있습니다.
초음파를 발생시키려면 Trig 핀을 10µs 동안 하이(High) 상태로 설정해야 합니다. 그러면 8주기의 초음파 버스트가 음속으로 발사됩니다. Echo 핀은 8주기 초음파 버스트가 발송된 직후 하이 상태가 되어 반사파를 대기하거나 수신하기 시작합니다.
물체나 반사 펄스가 없으면 Echo 핀은 38ms 후 타임아웃되어 로우 상태가 됩니다.
반사 펄스를 수신하면 Echo 핀이 38ms보다 빨리 로우 상태가 됩니다. Echo 핀이 하이 상태였던 시간 길이에 따라 음파가 이동한 거리, 즉 센서에서 물체까지의 거리를 알 수 있습니다.
이를 위해 다음 기본 공식을 사용합니다:
거리 = 속도 × 시간
속도와 시간 값을 모두 알고 있습니다. 시간은 Echo 핀이 하이 상태였던 시간이고, 속도는 음속인 340m/s입니다. 추가로 결과를 2로 나누어야 하는데, 음파가 물체까지 가서 다시 돌아오는 왕복 거리를 측정하기 때문입니다.
예를 들어 Echo 핀이 2ms 동안 하이 상태였다고 가정해 보겠습니다. 결과를 cm 단위로 얻기 위해 음속을 340m/s에서 34cm/ms로 변환합니다.
거리 = (속도 × 시간) / 2 = (34cm/ms × 2ms) / 2 = 34cm.
따라서 Echo 핀이 2ms 동안 하이 상태였다면(pulseIn() 함수로 측정), 센서에서 물체까지의 거리는 34cm입니다.
HC-SR04 초음파 센서를 아두이노에 연결하기
HC-SR04 센서를 아두이노 보드에 연결하는 방법은 다음과 같습니다.
모듈의 그라운드와 VCC 핀을 아두이노 보드의 그라운드와 5V 핀에 각각 연결하고, trig와 echo 핀을 아두이노 보드의 아무 디지털 I/O 핀에 연결합니다.
필요한 부품
초음파 센서 HC-SR04
아두이노 보드
브레드보드와 점퍼 와이어
HC-SR04 초음파 센서 아두이노 코드
HC-SR04 초음파 센서와 아두이노로 거리를 측정하는 코드입니다.
/*
초음파 센서 HC-SR04와 아두이노 튜토리얼
by Dejan Nedelkovski, www.HowToMechatronics.com
*/
// 핀 번호 정의
const int trigPin = 9;
const int echoPin = 10;
// 변수 정의
long duration;
int distance;
void setup() {
pinMode(trigPin, OUTPUT); // trigPin을 출력으로 설정
pinMode(echoPin, INPUT); // echoPin을 입력으로 설정
Serial.begin(9600); // 시리얼 통신 시작
}
void loop() {
// trigPin 클리어
digitalWrite(trigPin, LOW);
delayMicroseconds(2);
// trigPin을 10마이크로초 동안 HIGH 상태로 설정
digitalWrite(trigPin, HIGH);
delayMicroseconds(10);
digitalWrite(trigPin, LOW);
// echoPin 읽기, 음파 이동 시간을 마이크로초 단위로 반환
duration = pulseIn(echoPin, HIGH);
// 거리 계산
distance = duration * 0.034 / 2;
// 시리얼 모니터에 거리 출력
Serial.print("Distance: ");
Serial.println(distance);
}
코드 설명
먼저 Trig와 Echo 핀을 정의합니다. 여기서는 아두이노 보드의 9번과 10번 핀을 사용하며 trigPin과 echoPin으로 명명합니다. 센서에서 얻을 이동 시간을 저장할 long 타입 변수 "duration"과 거리를 저장할 정수 변수가 필요합니다.
// 핀 번호 정의
const int trigPin = 9;
const int echoPin = 10;
// 변수 정의
long duration;
int distance;
setup에서 trigPin을 출력, echoPin을 입력으로 정의하고 결과를 시리얼 모니터에 표시하기 위해 시리얼 통신을 시작합니다.
loop에서 먼저 trigPin이 클리어되었는지 확인하기 위해 2µs 동안 로우 상태로 설정합니다. 초음파를 생성하려면 trigPin을 10µs 동안 하이 상태로 설정합니다.
// trigPin 클리어
digitalWrite(trigPin, LOW);
delayMicroseconds(2);
// trigPin을 10마이크로초 동안 HIGH 상태로
digitalWrite(trigPin, HIGH);
delayMicroseconds(10);
digitalWrite(trigPin, LOW);
pulseIn() 함수를 사용하여 이동 시간을 읽고 "duration" 변수에 저장합니다. 이 함수는 두 매개변수를 가지는데, 첫 번째는 Echo 핀 이름, 두 번째는 읽을 펄스 상태(High 또는 Low)입니다.
// echoPin 읽기, 음파 이동 시간을 마이크로초 단위로 반환
duration = pulseIn(echoPin, HIGH);
HC-SR04 센서는 송신기에서 8주기 초음파 버스트를 보낸 후 Echo 핀을 하이 상태로 설정하므로 HIGH로 설정합니다. 이것이 타이밍을 시작하고, 반사된 음파를 수신하면 Echo 핀이 로우가 되어 타이밍이 멈춥니다. 함수는 펄스 길이를 마이크로초 단위로 반환합니다.
앞서 설명한 공식대로 duration에 0.034를 곱하고 2로 나누어 거리를 구합니다.
// 거리 계산
distance = duration * 0.034 / 2;
// 시리얼 모니터에 거리 출력
Serial.print("Distance: ");
Serial.println(distance);
마지막으로 거리 값을 시리얼 모니터에 출력합니다.
아두이노 초음파 센서와 LCD 디스플레이 예제
초음파 센서를 아두이노와 함께 사용하고 결과를 LCD에 표시하는 또 다른 예제입니다.
초음파 센서와 LCD를 다음과 같이 연결합니다:
거리 측정 코드는 기본 예제와 거의 동일합니다. 여기서는 시리얼 모니터 대신 LCD에 결과를 출력합니다. LCD를 아두이노에 연결하고 사용하는 방법은 별도 튜토리얼을 참조하세요.
HC-SR04 초음파 센서로 아두이노를 프로그래밍하여 거리를 측정하는 더 간단하고 좋은 방법이 있는데, 바로 NewPing 라이브러리를 사용하는 것입니다.
앞서 설명한 코드에서는 센서를 수동으로 트리거하고 수신 신호 펄스 지속 시간을 측정한 뒤 결과를 바탕으로 거리를 계산했습니다. NewPing 라이브러리를 사용하면 단 한 줄의 코드로 거리를 구할 수 있습니다.
예제 코드:
#include <NewPing.h>
#define TRIGGER_PIN 9
#define ECHO_PIN 10
#define MAX_DISTANCE 400 // 측정하고자 하는 최대 거리 (cm)
NewPing sonar(TRIGGER_PIN, ECHO_PIN, MAX_DISTANCE);
void setup() {
Serial.begin(9600);
}
void loop() {
delay(50); // 핑 사이에 50ms 대기 (초당 약 20회). 핑 사이의 최소 지연은 29ms.
int distance = sonar.ping_cm(); // 핑 전송, cm 단위 거리 반환 및 결과 출력 (0 = 설정 거리 범위 밖)
Serial.print("Distance: ");
Serial.print(distance);
Serial.println("cm");
}
이전 예제보다 훨씬 간단합니다. NewPing sonar 객체의 ping_cm() 메서드를 호출하기만 하면 센티미터 단위 거리를 얻습니다. 인치 단위가 필요하면 ping_in()을 사용하면 됩니다.
라이브러리에는 다른 유용한 기능도 있습니다. 예를 들어 ping_median(iterations [, max_cm_distance]) 메서드를 사용하면 여러 측정값의 중간값(median)을 반환하여 더 정확한 결과를 얻을 수 있습니다. iterations 매개변수로 중간값 계산을 위한 샘플 수를 설정합니다. 기본값은 5회입니다. ping_median()은 수신 펄스 지속 시간을 마이크로초 단위로 반환합니다.
자세한 내용은 NewPing 위키 페이지를 참조하세요.
DHT22 온도 센서로 HC-SR04 거리 센서 정확도 향상시키기
HC-SR04 센서는 꽤 정확하지만, 작동 원리가 음속에 의존하므로 더 정확한 결과를 위해 공기 온도도 고려해야 합니다. 음속은 공기 온도 변화에 따라 크게 달라질 수 있습니다. 예를 들어 20°C에서 음속은 약 340m/s이지만, -20°C에서는 약 315m/s입니다. 상대 습도도 음속에 영향을 줍니다.
따라서 이 센서를 다양한 온도에서 거리 측정에 사용한다면 온도 보정을 구현해야 하며, 다음 공식으로 할 수 있습니다:
속도 = 331.4 + 0.6 × 온도 + 0.0124 × 상대습도
예제:
HC-SR04 초음파 센서와 함께 DHT11/DHT22 센서로 환경의 온도와 습도를 측정하고, 그에 따라 음속 값을 조정합니다.