raspberryPiModuleExpansionT.../tutorial/5.hc_sr04_ultrasonic.py

71 lines
2.4 KiB
Python

import RPi.GPIO as GPIO
import time
# GPIO 핀 설정 (BCM 모드 사용)
# 실제 연결한 핀 번호에 맞게 수정하세요.
GPIO_TRIGGER = 23 # TRIG 핀
GPIO_ECHO = 24 # ECHO 핀 (전압 분배 회로를 거쳐 라즈베리 파이에 연결)
# GPIO 모드 설정: BCM 모드는 GPIO 번호를 사용합니다.
GPIO.setmode(GPIO.BCM)
# TRIG 핀을 출력으로, ECHO 핀을 입력으로 설정합니다.
GPIO.setup(GPIO_TRIGGER, GPIO.OUT)
GPIO.setup(GPIO_ECHO, GPIO.IN)
print("HC-SR04 초음파 센서 테스트 시작")
print("Ctrl+C를 눌러 종료하세요.")
def measure_distance():
# TRIG 핀을 LOW로 설정하여 센서 안정화
GPIO.output(GPIO_TRIGGER, False)
time.sleep(0.000002) # 2 마이크로초 대기 (안정화)
# TRIG 핀을 HIGH로 설정하여 10 마이크로초 동안 펄스 발생
GPIO.output(GPIO_TRIGGER, True)
time.sleep(0.00001)
GPIO.output(GPIO_TRIGGER, False)
# ECHO 핀이 HIGH가 될 때까지 기다립니다 (펄스 수신 시작 시간)
pulse_start = time.time()
while GPIO.input(GPIO_ECHO) == 0:
pulse_start = time.time()
# 타임아웃 방지: 너무 오래 기다리지 않도록
if time.time() - pulse_start > 0.04: # 약 4미터까지 측정, 0.04초면 충분
return 999 # 측정 실패 또는 너무 멀리 있음
# ECHO 핀이 LOW가 될 때까지 기다립니다 (펄스 수신 종료 시간)
pulse_end = time.time()
while GPIO.input(GPIO_ECHO) == 1:
pulse_end = time.time()
# 타임아웃 방지
if time.time() - pulse_end > 0.04:
return 999
# 펄스 지속 시간 계산
pulse_duration = pulse_end - pulse_start
# 거리 계산 (소리의 속도: 343m/s 또는 34300 cm/s)
# 왕복 거리이므로 2로 나눔
# cm 단위로 변환: (시간 * 34300) / 2
distance = (pulse_duration * 34300) / 2
# 거리를 소수점 둘째 자리까지 반올림
distance = round(distance, 2)
return distance
try:
while True:
dist = measure_distance()
if dist == 999:
print("측정 실패 또는 범위 밖")
else:
print(f"거리: {dist} cm")
time.sleep(1) # 1초마다 측정
except KeyboardInterrupt:
# Ctrl+C가 눌리면 GPIO 설정을 정리합니다.
print("\n프로그램 종료 및 GPIO 정리.")
GPIO.cleanup()