초음파 센서 이용한 거리 측정 > IoT 사물인터넷 유무선제어

본문 바로가기

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

필기자
2024-02-27 16:58 2,201 0

본문

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

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


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


2. 초음파 센서 모듈 구동
  • 라즈베리파이 가상환경에서 파이썬 코딩
    • VSCode에서 ultrasonic_wave.py 파일 생성
    • GPIO 17, 23 핀을 출력 모드로 설정, GPIO 24 핀을 입력 모드로 설정
    • GPIO 24 핀의 감지되는 초음파(거리) 측정에 따라 LED 색상 밝기 변경
20240325182114_858e8d22dfac7332e13309ca09d8cc38_tzmf.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, 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) : 거리를 소수점 둘째 자리까지 반올림한다.
 
  • ultrasonic_wave.py 실행
    • VSCode > 상단 ▷ 실행
20240325182649_858e8d22dfac7332e13309ca09d8cc38_hke4.png

20240325183628_858e8d22dfac7332e13309ca09d8cc38_m60b.gif

댓글목록0

등록된 댓글이 없습니다.
게시판 전체검색