초음파 센서 이용한 거리 측정 > 스마트기기시스템

본문 바로가기

[실습] 초음파 센서 이용한 거리 측정

필기자
2025-04-08 09:06 481 1

본문

초음파 센서 이용한 거리 측정

목 적
  • 라즈베리파이에 센서 측정 구현에 대해 이해한다.
  • 라즈베리파이에 초음파 센서를 통해 거리 측정 구현에 대해 이해한다.
목 차
1. 초음파 센서 모듈 설치
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)  
1850084887_LcCZIK0O_c054c1727a5b6beebb5a035b1482b0ce7a872381.png


1850084887_SwGXB7Ii_c810074dd6ff99998ef3628eb9af1977e3faaf88.png
  • HC-SRO4 초음파 모듈 작동원리
    • 사용자가 트리거 핀에 10µs(0.00001초) 이상 HIGH 상태의 펄스 신호를 입력하면 초음파 파동 발사 준비(지금 초음파를 쏴라 명령).
    • 초음파 발사: 센서는 40kHz의 초음파 파동을 8개 연속 200µs(0.0002초)동안 발사함.
      • 1초 / 40,000(Hz) = 0.000025초(25µs), 즉 0.000025초(25µs) 동안 1번 진동 하는 파동은 40kHz의 초음파
      • 25µs(0.000025초) * 8
    • 에코 신호: 초음파 파동이 목표물에 반사되어 센서로 돌아오면, 에코 핀이 HIGH 상태가 됨.
    • 이 상태의 지속 시간은 초음파가 목표물에 도달하는 데 걸린 왕복 시간과 직접적으로 관련이 있음.
    • 거리 계산: 거리는 에코 핀이 HIGH 상태를 유지한 시간을 측정하여 계산됨.
    • 소리의 속도(대략 초당 343m)를 알고 있으므로, 다음 공식을 사용하여 거리를 계산할 수 있음.
      • 거리 = (시간 × 소리의 속도) / 2.
※ 처음 도달한 반사 신호부터, 마지막 반사 신호가 끝나는 순간까지의 시간

1850084887_bBwp93Ya_552768a10f13a2458501af1bdd6188ef682f7613.png


2. 초음파 센서 모듈 구동
  • 라즈베리파이 가상환경에서 파이썬 코딩
    • VSCode에서 ultrasonic_wave.py 파일 생성
    • GPIO 17, 23 핀을 출력 모드로 설정, GPIO 24 핀을 입력 모드로 설정
    • GPIO 24 핀의 감지되는 초음파(거리) 측정에 따라 LED 색상 밝기 변경
1850084887_sVSZKhYH_1e1e3c8140655d8e921bd0882c395e20f5842fb0.png

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() : 함수는 센서로부터 거리 정보를 측정하고 그 값을 반환하는 역할을 한다.
      • time.sleep(0.5) : 센서가 안정 대기 시간
      • time.sleep(0.00001) : 트리거 신호의 정확한 길이를 제어
    • GPIO.output(TRIG, GPIO.LOW) : TRIG 핀을 False(0V)로 설정해 초음파 센서의 트리거 핀을 초기화한다. 측정 전에 트리거 핀을 정리해 신호가 없는 상태로 만든다.
    • time.sleep(0.5) : 센서가 이전 측정의 잔여 신호로 인해 올바른 측정값을 제공하지 못할 수 있다. 이전 측정에서 완전히 안정화되기 위해 대기시간을 준다.
    • GPIO.output(TRIG, GPIO.HIGH) : TRIG 핀을 True(3.3V 또는 5V)로 설정해 초음파 센서의 트리거 핀에 10μs(0.00001초) 동안의 고전압 신호를 보낸다. 초음파 파동을 발생한다.
    • time.sleep(0.00001) : 초음파 펄스를 발생시키기 위한 대기시간, 10μs시간 동안의 펄스는 센서로 하여금 충분한 에너지를 가진 초음파 파동을 발생시키도록 한다. 
    • GPIO.output(TRIG, GPIO.LOW) : TRIG 핀을 다시 False로 설정해 트리거 신호를 종료한다.
    • while GPIO.input(ECHO) == GPIO.LOW: : ECHO 핀이 1(GPIO.HIGH)로 바뀔 때까지 초음파 파동이 발사되고 반사되어 돌아 온 첫 신호 시간 측정한다.
      • 루프는 ECHO 핀이 HIGH 상태로 전환되기를 기다림
      • 초음파 펄스가 ECHO에 처음 도착한 시간
      • pulse_start = time.time()는 이 시점의 시간을 기록
    • while GPIO.input(ECHO) == GPIO.HIGH: : ECHO 핀이 다시 0(GPIO.LOW)로 바뀔 때까지 초음파 파동이 센서에 도달하여 신호가 종료될 시간을 측정한다.
      • 루프는 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) : 거리를 소수점 둘째 자리까지 반올림한다.
 
  • ultrasonic_wave.py 실행
    • VSCode > 상단 ▷ 실행
1850084887_GFw41bk7_bb86961005172c9b269edc4fc466203c4436ad01.png

1850084887_vgTl8JUS_9c391d4c4e500ac768be841021db600cf7aaf9ea.gif

댓글목록1

필기자님의 댓글

필기자
2025-04-09 13:23
- 첨부파일 : HC-SR04Users_Manual.pdf (561.0K) - 다운로드
데이터시트
게시판 전체검색