[실습] 초음파 센서 이용한 거리 측정
필기자
2024-02-27 16:58
3,861
1
본문
초음파 센서 이용한 거리 측정
목 적
1. 초음파 센서 모듈 설치


2. 초음파 센서 모듈 구동

목 적
- 라즈베리파이에 센서 측정 구현에 대해 이해한다.
- 라즈베리파이에 초음파 센서를 통해 거리 측정 구현에 대해 이해한다.
1. 초음파 센서 모듈 설치
2. 초음파 센서 모듈 구동
2. 초음파 센서 모듈 구동
1. 초음파 센서 모듈 설치
- HC-SRO4 초음파 모듈
- HC-SR04 초음파 센서 모듈은 거리를 측정하는 데 널리 사용되는 장치임.
- 초음파 파동을 발사하여 목표물에 부딪힌 후 반사되어 돌아오는 시간을 측정함으로써 거리를 산출함.
- 로봇, 장애물 회피 시스템, 자동 주차 시스템 등 다양한 어플리케이션에서 사용됨.
- 기본 사양
- 전원 공급: 5V DC
- 소비 전류: 15mA
- 작동 주파수: 40kHz
- 최대 범위: 약 4m
- 최소 범위: 2cm
- 측정 각도: 약 15도
- 인터페이스: VCC, Trig(Trigger), Echo, GND
- GPIO 연결
- GND : Ground 접지(핀 14)
- Echo : GPIO 24(핀 18)
- Trig : GPIO 23(핀 16)
- Vcc : 5V Power(핀 2)


- HC-SRO4 초음파 모듈 작동원리
- 트리거 신호: 사용자가 트리거 핀에 10µs 이상의 고주파 신호를 보냄으로써 초음파 파동 발사를 시작함.
- 초음파 발사: 센서는 40kHz의 초음파 파동을 8개 연속으로 발사함.
- 에코 신호: 초음파 파동이 목표물에 반사되어 센서로 돌아오면, 에코 핀이 HIGH 상태가 됨.
- 이 상태의 지속 시간은 초음파가 목표물에 도달하는 데 걸린 왕복 시간과 직접적으로 관련이 있음.
- 거리 계산: 거리는 에코 핀이 HIGH 상태를 유지한 시간을 측정하여 계산됨.
- 소리의 속도(대략 초당 343m)를 알고 있으므로, 다음 공식을 사용하여 거리를 계산할 수 있음.
- 거리 = (시간 × 소리의 속도) / 2.

2. 초음파 센서 모듈 구동
- 라즈베리파이 가상환경에서 파이썬 코딩
- VSCode에서 ultrasonic_wave.py 파일 생성
- GPIO 17, 23 핀을 출력 모드로 설정, GPIO 24 핀을 입력 모드로 설정
- GPIO 24 핀의 감지되는 초음파(거리) 측정에 따라 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, False)
time.sleep(0.5)
GPIO.output(TRIG, True)
time.sleep(0.00001)
GPIO.output(TRIG, False)
while GPIO.input(ECHO) == 0:
pulse_start = time.time()
while GPIO.input(ECHO) == 1:
pulse_end = time.time()
pulse_duration = pulse_end - pulse_start
distance = pulse_duration * 17150
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() : 함수는 센서로부터 거리 정보를 측정하고 그 값을 반환하는 역할을 한다.
- time.sleep(0.5) : 센서가 안정 대기 시간
- time.sleep(0.00001) : 트리거 신호의 정확한 길이를 제어
- GPIO.output(TRIG, False) : TRIG 핀을 False(0V)로 설정해 초음파 센서의 트리거 핀을 초기화한다. 측정 전에 트리거 핀을 정리해 신호가 없는 상태로 만든다.
- time.sleep(0.5) : 센서가 이전 측정의 잔여 신호로 인해 올바른 측정값을 제공하지 못할 수 있다. 이전 측정에서 완전히 안정화되기 위해 대기시간을 준다.
- GPIO.output(TRIG, True) : TRIG 핀을 True(3.3V 또는 5V)로 설정해 초음파 센서의 트리거 핀에 10μs(0.00001초) 동안의 고전압 신호를 보낸다. 초음파 파동을 발생한다.
- time.sleep(0.00001) : 초음파 펄스를 발생시키기 위한 대기시간, 10μs시간 동안의 펄스는 센서로 하여금 충분한 에너지를 가진 초음파 파동을 발생시키도록 한다.
- GPIO.output(TRIG, False) : TRIG 핀을 다시 False로 설정해 트리거 신호를 종료한다.
- while GPIO.input(ECHO) == 0: : ECHO 핀이 1(True)로 바뀔 때까지 초음파 파동이 발사되고 반사되어 돌아 온 첫 신호 시간 측정한다.
- 루프는 ECHO 핀이 HIGH 상태로 전환되기를 기다림
- 초음파 펄스가 ECHO에 처음 도착한 시간
- pulse_start = time.time()는 이 시점의 시간을 기록
- while GPIO.input(ECHO) == 1: : ECHO 핀이 다시 0(False)로 바뀔 때까지 초음파 파동이 센서에 도달하여 신호가 종료될 시간을 측정한다.
- 루프는 ECHO 핀이 LOW 상태로 돌아갈 때까지 기다림.
- 초음파 펄스 ECHO에 마지막 도착한 시간
- pulse_end = time.time()는 이 시점의 시간을 기록
- pulse_duration = pulse_end - pulse_start : 초음파 파동이 발사되어 돌아오는 데 걸린 전체 시간을 계산한다.
- distance = pulse_duration * 17150 : 거리를 계산한다.
- 소리의 속도는 공기 중에서 약 343m/s(34,300cm/s)
- 왕복 거리로 나누기 위해 2로 나눈 값인 17,150을 곱함
- distance = round(distance, 2) : 거리를 소수점 둘째 자리까지 반올림한다.
- def get_distance() : 함수는 센서로부터 거리 정보를 측정하고 그 값을 반환하는 역할을 한다.
- ultrasonic_wave.py 실행
- VSCode > 상단 ▷ 실행


댓글목록1
필기자님의 댓글
대신, 첫 번째 반사 신호가 수신부에 도착하는 시점부터 마지막 반사 신호가 끝나는 시점까지의 시간을 측정합니다.
이런 방식으로 측정해도 거리가 정확한 이유는:
이 센서는 단순히 "첫 반사파 도착부터 마지막 반사파 종료까지의 시간"과 "실제 거리" 사이의 관계를 실험적으로 보정(calibration)하여 설계되었기 때문입니다.
센서 내부 회로는 이러한 시간 측정값을 적절한 계수를 사용하여 정확한 거리로 변환하도록 설계되었습니다.
즉, 센서는 초음파 발사 시점부터 첫 반사파 도착까지의 시간을 직접 측정하지 않지만, 첫 반사파 도착부터 마지막 반사파 종료까지의 시간을 측정하여 이를 통해 간접적으로 거리를 계산합니다.
이러한 설계는 하드웨어 구현의 단순화와 비용 효율성을 위한 것입니다.