[실습] 초음파 센서 이용한 거리 측정
필기자
2026-04-01 14:20
17
1
본문
초음파 센서 이용한 거리 측정
목 적
1. 초음파 센서 모듈 설치
2. 초음파 센서 모듈 구동

목 적
- 라즈베리파이에 센서 측정 구현에 대해 이해한다.
- 라즈베리파이에 초음파 센서를 통해 거리 측정 구현에 대해 이해한다.
1. 초음파 센서 모듈 설치
2. 초음파 센서 모듈 구동
2. 초음파 센서 모듈 구동
1. 초음파 센서 모듈 설치
- HC-SRO4 초음파 모듈
- HC-SR04 초음파 센서 모듈은 거리를 측정하는 데 널리 사용되는 장치임.
- 초음파 파동을 발사하여 목표물에 부딪힌 후 반사되어 돌아오는 시간을 측정함으로써 거리를 산출함.
- 로봇, 장애물 회피 시스템, 자동 주차 시스템 등 다양한 어플리케이션에서 사용됨.
- 기본 사양
- 전원 공급: 5V DC
- 소비 전류: 15mA
- 작동 주파수: 40kHz
- 최대 범위: 약 4m
- 최소 범위: 2cm
- 측정 각도: 약 15도
- 인터페이스 및 구성
- VCC
- 5V 전원 입력
- 센서 내부 회로 및 송신(T)/수신(R) 동작에 필요한 전원 공급
- GND
- 접지 (0V 기준)
- 전체 회로 기준 전위 역할
- Trig (Trigger)
- 측정 시작 입력 핀
- 10µs 이상 HIGH 신호 입력 시 초음파 발사 시작
- Echo
- 거리 측정 결과 출력 핀
- 초음파 발사 시 HIGH (타이머 시작)
- 반사파가 수신부(R)에 도달하면 LOW (타이머 종료)
- VCC
- 초음파 송수신 구조
- T (Transmitter, 송신기)
- 40kHz 초음파를 공기 중으로 발사
- 내부 발진 신호를 물리적 진동으로 변환
- R (Receiver, 수신기)
- 물체에 반사된 초음파를 감지
- 수신 순간 Echo 신호를 LOW로 전환시키는 기준 역할
- T (Transmitter, 송신기)
- GND : Ground 접지(핀 14)
- Echo : GPIO 24(핀 18)
- Trig : GPIO 23(핀 16)
- Vcc : 5V Power(핀 2)
- 초음파 발사 및 수신 과정
- Trig 핀에 10µs 이상의 HIGH 신호 입력 시 측정 시작
- 초음파 발사 (T: Transmitter)
- 센서 내부에서 40kHz 초음파를 8사이클(약 200µs) 생성
- 이 신호가 송신부(T)를 통해 공기 중으로 방사됨
- 1초 / 40,000Hz = 0.000025sec = 25µs → 1사이클
- 25µs × 8 = 약 200µs 동안 초음파 발사, 즉 200µs 동안 8개 파동 발사
- 에코 수신 (R: Receiver)
- 초음파가 물체에 반사되어 수신부(R)로 돌아옴
- 초음파 발사 시작과 동시에 Echo 핀은 HIGH 상태로 전환됨
- 반사된 초음파가 수신부(R)에 도달하는 순간 Echo 핀이 LOW로 변경됨
- 시간 측정
- Echo 핀의 HIGH 유지 시간 = 초음파가 T에서 출발하여 물체를 거쳐 R로 돌아오는 왕복 시간
- 거리 계산
- 거리 = (시간 × 음속) / 2
- 거리(cm) = (시간(sec) × 34300) / 2
- 또는 거리(cm) = 시간(µs) / 58
- 거리 = (시간 × 음속) / 2
2. 초음파 센서 모듈 구동
- 라즈베리파이 가상환경에서 파이썬 코딩
- VSCode에서 ultrasonic_wave.py 파일 생성
- GPIO 17, 23 핀 → 출력 (LED 제어)
- GPIO 24 핀 → 입력 (Echo 신호 수신)
- Echo HIGH 유지 시간을 측정하여 거리 계산
- 측정된 거리에 따라 LED 밝기 또는 색상 제어

import RPi.GPIO as GPIO
import time
# GPIO 모드 설정
GPIO.setmode(GPIO.BCM)
# 핀 번호 할당
TRIG = 23
ECHO = 24
LED = 17
# 입출력 설정
GPIO.setup(TRIG, GPIO.OUT)
GPIO.setup(ECHO, GPIO.IN)
GPIO.setup(LED, GPIO.OUT)
# PWM 설정
pwm = GPIO.PWM(LED, 100) # 100Hz
pwm.start(0) # 초기 듀티 사이클 0
def get_distance():
GPIO.output(TRIG, GPIO.LOW)
time.sleep(0.5)
GPIO.output(TRIG, GPIO.HIGH)
time.sleep(0.00001) #신호 송신부에서 40kHz 신호 8개 송신(200µs)
GPIO.output(TRIG, GPIO.LOW)
while GPIO.input(ECHO) == GPIO.LOW:
pulse_start = time.time()
while GPIO.input(ECHO) == GPIO.HIGH:
pulse_end = time.time()
pulse_duration = pulse_end - pulse_start
distance = pulse_duration * (34300 / 2) # 소리속도 34300 cm/s
distance = round(distance, 2)
return distance
try:
while True:
dist = get_distance()
print("Distance:", dist, "cm")
if dist > 100:
dist = 99
pwm.ChangeDutyCycle(dist)
time.sleep(0.1)
except KeyboardInterrupt:
pwm.stop()
GPIO.cleanup()
- def get_distance() 함수
- def get_distance() : 초음파 센서를 이용하여 거리 값을 측정하고 반환하는 함수이다.
- GPIO.output(TRIG, GPIO.LOW) : TRIG 핀을 LOW(0V)로 설정하여 센서를 초기화한다.
- time.sleep(0.5) : 센서가 안정화될 수 있도록 대기한다.
- GPIO.output(TRIG, GPIO.HIGH) : TRIG 핀을 HIGH로 설정하여 측정을 시작한다.
- time.sleep(0.00001) : 10µs 동안 HIGH 상태 유지 (초음파 발사 트리거)
- GPIO.output(TRIG, GPIO.LOW) : TRIG 핀을 다시 LOW로 설정하여 트리거 신호 종료
- while GPIO.input(ECHO) == GPIO.LOW :
- Echo 핀이 HIGH로 전환될 때까지 대기 (측정 시작 지점)
- Echo 신호의 상승 시점(Rising Edge)을 의미
- pulse_start = time.time() : 이 시점의 시간을 기록
- while GPIO.input(ECHO) == GPIO.HIGH :
- Echo 핀이 LOW로 떨어질 때까지 대기 (측정 종료 지점)
- Echo 신호의 하강 시점(Falling Edge)을 의미
- pulse_end = time.time() : 이 시점의 시간을 기록
- pulse_duration = pulse_end - pulse_start :
- Echo 핀의 HIGH 유지 시간 계산
- 초음파가 송신(T)되어 물체에 반사된 후 수신(R)될 때까지의 왕복 시간
- distance = pulse_duration * 17150 :
- 거리 계산 (단위: cm)
- 음속 34300cm/s ÷ 2 = 17150
- distance = round(distance, 2) : 소수점 둘째 자리까지 반올림
- return distance : 계산된 거리 반환
- ultrasonic_wave.py 실행
- VSCode > 상단 ▷ 실행

댓글목록1
필기자님의 댓글