라즈베리 파이 초음파 센서

이 튜토리얼은 라즈베리 파이와 초음파 센서를 사용하여 장애물이나 물체까지의 거리를 측정하는 방법을 안내합니다. 구체적으로, 우리는 다음을 배울 것입니다:

Hardware Preparation

1×Raspberry Pi 4 Model B Amazon
1×Ultrasonic Sensor 쿠팡 | Amazon
1×Jumper Wires Amazon
1×(추천) Screw Terminal Block Shield for Raspberry Pi 쿠팡 | Amazon
1×(추천) USB-C Power Cable with On/Off Switch for Raspberry Pi 4B Amazon
1×(추천) Plastic Case and Cooling Fan for Raspberry Pi 4B Amazon
1×(추천) HDMI Touch Screen Monitor for Raspberry Pi Amazon
공개: 이 섹션에서 제공된 링크 중 일부는 제휴 링크입니다. 이 링크를 통해 구매한 경우 추가 비용없이 수수료를 받을 수 있습니다. 지원해 주셔서 감사합니다.

초음파 센서에 대하여

HC-SR04 초음파 센서는 초음파를 사용하여 물체까지의 거리를 계산하는 데 사용됩니다.

초음파 센서 핀아웃

HC-SR04 초음파 센서는 네 개의 핀이 있습니다:

  • VCC 핀: VCC (5V)에 연결해야 합니다.
  • GND 핀: GND (0V)에 연결해야 합니다.
  • TRIG 핀: 이 핀은 Raspberry Pi로부터 제어 신호(펄스)를 받습니다.
  • ECHO 핀: 이 핀은 Raspberry Pi로 신호(펄스)를 보냅니다. Raspberry Pi는 펄스의 길이를 측정하여 거리를 계산합니다.
초음파 센서 핀 배치

작동 방식

이 섹션에는 압도될 수 있는 고급 정보가 포함되어 있습니다. 내용에 대해 확신이 없다면 건너뛰어 다음 섹션으로 이동하십시오.
  • I. 마이크로컨트롤러는 TRIG 핀에 10마이크로초 펄스를 생성하여 초음파 센서가 자동으로 초음파를 방출하도록 합니다.
  • I. 파동이 장애물에 부딪히면 다시 센서로 반사됩니다.
  • I. 그 후 초음파 센서는 반사된 파동을 감지하고 이동 시간을 측정합니다.
  • I. 결과적으로, 초음파 센서는 ECHO 핀에 펄스를 생성하며, 이 펄스의 지속 시간은 초음파의 이동 시간과 동일합니다.
  • I. 마이크로컨트롤러는 ECHO 핀의 펄스 지속 시간을 측정하고 센서와 장애물 사이의 거리를 계산합니다.

초음파 센서로부터 거리 측정하는 방법

초음파 센서로부터의 거리를 계산하려면, "작동 원리" 섹션에 설명된 두 단계를 수행해야 합니다 (1단계 및 6단계):

  • TRIG 핀에서 10마이크로초 펄스를 생성합니다.
  • ECHO 핀에서 펄스 지속 시간을 측정합니다.
  • 측정된 펄스 지속 시간을 사용하여 센서와 장애물 사이의 거리를 계산합니다.

거리 계산

우리는 가지고 있습니다:

  • 초음파 파동의 이동 시간 (µs): travel_time = pulse_duration
  • 초음파 파동의 속도: speed = SPEED_OF_SOUND = 340 m/s = 0.034 cm/µs

그래서:

  • 초음파의 이동 거리(cm): 이동 거리 = 속도 × 이동 시간 = 0.034 × 펄스 지속 시간
  • 센서와 장애물 사이의 거리(cm): 거리 = 이동 거리 / 2 = 0.034 × 펄스 지속 시간 / 2 = 0.017 × 펄스 지속 시간

라즈베리 파이 - 초음파 센서

Raspberry Pi의 핀은 10마이크로초의 펄스를 생성하고 펄스의 길이를 측정할 수 있습니다. 이를 통해 두 개의 Raspberry Pi 핀을 사용하여 초음파 센서로부터의 거리를 계산할 수 있습니다. 따라서 두 개의 Raspberry Pi 핀만 사용하면 됩니다:

  • 하나의 핀은 초음파 센서의 TRIG 핀에 연결되어 10µs 펄스를 생성합니다.
  • 다른 핀은 초음파 센서의 ECHO 핀에 연결되어 센서로부터의 펄스를 측정합니다.

Wiring Diagram

라즈베리 파이 초음파 센서 배선도

이 이미지는 Fritzing을 사용하여 만들어졌습니다. 이미지를 확대하려면 클릭하세요.

배선 구성을 간단하고 체계적으로 만들기 위해, Raspberry Pi용 스크루 터미널 블록 실드 사용을 권장합니다. 이 실드는 아래와 같이 더욱 안정적이고 관리하기 쉬운 연결을 제공합니다:

Raspberry Pi Screw Terminal Block Shield

초음파 센서를 위한 프로그래밍 방법

  • GPIO.output()time.sleep() 함수를 이용하여 Raspberry Pi의 핀 9에서 10마이크로초 펄스를 생성합니다.
  • 예를 들어:
  • DigitalWrite()로 핀 9를 HIGH로 설정하고 delayMicroseconds()로 10마이크로초 지연합니다.
GPIO.output(TRIG_PIN, GPIO.HIGH) # GPIO 핀을 HIGH로 설정 time.sleep(0.00001) # 짧은 시간 대기 GPIO.output(TRIG_PIN, GPIO.LOW) # GPIO 핀을 LOW로 설정
  • pulseIn() 함수를 사용하여 Raspberry Pi의 핀 8에서 펄스 지속 시간 (µs)을 결정합니다. 예를 들어:
while GPIO.input(ECHO_PIN) == 0: pulse_start = time.time() # 초음파 신호가 발사된 시간 기록 while GPIO.input(ECHO_PIN) == 1: pulse_end = time.time() # 초음파 신호가 수신된 시간 기록 pulse_duration = pulse_end - pulse_start # 초음파 신호가 이동한 시간 계산
  • 거리를 측정하십시오 (cm):
distance = pulse_duration * 34300 / 2 # 거리 = 맥박 지속 시간 * 34300 / 2

라즈베리 파이 코드

Detailed Instructions

  • 라즈비안 또는 다른 라즈베리 파이 호환 운영 체제가 Pi에 설치되어 있는지 확인하세요.
  • 라즈베리 파이가 PC와 동일한 로컬 네트워크에 연결되어 있는지 확인하세요.
  • 라이브러리를 설치해야 할 경우 라즈베리 파이가 인터넷에 연결되어 있는지 확인하세요.
  • 처음으로 라즈베리 파이를 사용하는 경우 라즈베리 파이 설정 방법을 참조하세요.
  • Linux 및 macOS의 기본 SSH 클라이언트 또는 Windows의 PuTTY를 사용하여 SSH를 통해 PC를 라즈베리 파이에 연결하세요. PC를 SSH를 통해 라즈베리 파이에 연결하는 방법을 참조하세요.
  • RPi.GPIO 라이브러리가 설치되어 있는지 확인하세요. 설치되어 있지 않다면 다음 명령어를 사용하여 설치하세요:
sudo apt-get update sudo apt-get install python3-rpi.gpio
  • Python 스크립트 파일 ultrasonic_sensor.py을(를) 생성하고 다음 코드를 추가하세요:
# 이 Raspberry Pi 코드는 newbiely.kr 에서 개발되었습니다 # 이 Raspberry Pi 코드는 어떠한 제한 없이 공개 사용을 위해 제공됩니다. # 상세한 지침 및 연결도에 대해서는 다음을 방문하세요: # https://newbiely.kr/tutorials/raspberry-pi/raspberry-pi-ultrasonic-sensor import RPi.GPIO as GPIO import time # Set the GPIO mode (BCM or BOARD) GPIO.setmode(GPIO.BCM) # Define GPIO pins for the ultrasonic sensor TRIG_PIN = 23 ECHO_PIN = 24 # Set the trigger and echo pins GPIO.setup(TRIG_PIN, GPIO.OUT) GPIO.setup(ECHO_PIN, GPIO.IN) def get_distance(): # Send a short pulse to the trigger pin GPIO.output(TRIG_PIN, GPIO.HIGH) time.sleep(0.00001) GPIO.output(TRIG_PIN, GPIO.LOW) # Measure the duration for the echo pulse while GPIO.input(ECHO_PIN) == 0: pulse_start = time.time() while GPIO.input(ECHO_PIN) == 1: pulse_end = time.time() pulse_duration = pulse_end - pulse_start # Calculate the distance based on the speed of sound (34300 cm/s) distance = pulse_duration * 34300 / 2 return distance try: while True: distance = get_distance() print(f"Distance: {distance:.2f} cm") time.sleep(1) except KeyboardInterrupt: # If the user presses Ctrl+C, clean up the GPIO configuration GPIO.cleanup()
  • 파일을 저장하고 터미널에서 다음 명령어를 실행하여 Python 스크립트를 실행하세요:
python3 ultrasonic_sensor.py
  • 초음파 센서 앞에 손을 놓으세요.
  • 터미널에 표시된 센서와 손 사이의 거리를 확인하세요.
PuTTY - Raspberry Pi
distance: 29.4 cm distance: 27.6 cm distance: 26.9 cm distance: 17.4 cm distance: 16.9 cm distance: 14.3 cm distance: 15.6 cm distance: 13.1 cm

스크립트는 터미널에서 Ctrl + C를 누를 때까지 무한 루프로 계속 실행됩니다.

코드 설명

소스 코드의 주석에 포함된 줄별 설명을 확인하세요!

초음파 센서 거리 측정의 잡음 필터링 방법

초음파 센서의 측정 결과는 잡음을 포함할 수 있으며, 이는 일부 애플리케이션에서 원치 않는 작동을 초래할 수 있습니다. 이 잡음을 제거하기 위해 다음 알고리즘을 사용할 수 있습니다:

  1. 여러 번 측정하여 배열에 저장하십시오.
  2. 배열을 오름차순으로 정렬하십시오.
  3. 노이즈를 필터링하십시오:
    • 가장 작은 샘플은 노이즈로 간주되어 무시해야 합니다.
    • 가장 큰 샘플은 노이즈로 간주되어 무시해야 합니다.
    • 중간 샘플의 평균을 측정 값으로 사용해야 합니다.

    다음 예제 코드는 20번 측정합니다:

    • 가장 작은 다섯 개의 샘플은 잡음으로 간주하므로 무시하세요.
    • 가장 큰 다섯 개의 샘플도 잡음으로 간주하므로 무시하세요.
    • 10개의 중간 샘플(5번째부터 14번째까지)의 평균을 구하세요.
    # 이 Raspberry Pi 코드는 newbiely.kr 에서 개발되었습니다 # 이 Raspberry Pi 코드는 어떠한 제한 없이 공개 사용을 위해 제공됩니다. # 상세한 지침 및 연결도에 대해서는 다음을 방문하세요: # https://newbiely.kr/tutorials/raspberry-pi/raspberry-pi-ultrasonic-sensor import RPi.GPIO as GPIO import time TRIG_PIN = 23 # Raspberry Pi GPIO pin connected to TRIG pin of ultrasonic sensor ECHO_PIN = 24 # Raspberry Pi GPIO pin connected to ECHO pin of ultrasonic sensor GPIO.setmode(GPIO.BCM) GPIO.setup(TRIG_PIN, GPIO.OUT) GPIO.setup(ECHO_PIN, GPIO.IN) def get_distance(): filter_array = [] num_samples = 20 # Taking multiple measurements and store in an array for _ in range(num_samples): filter_array.append(ultrasonic_measure()) time.sleep(0.03) # To avoid ultrasonic interference (30 milliseconds delay) # Sorting the array in ascending order filter_array.sort() # Filtering noise # Discard the five smallest and five largest samples filtered_samples = filter_array[5:-5] # Calculate the average of the remaining samples distance = sum(filtered_samples) / len(filtered_samples) return distance def ultrasonic_measure(): GPIO.output(TRIG_PIN, True) time.sleep(0.00001) GPIO.output(TRIG_PIN, False) while GPIO.input(ECHO_PIN) == 0: pulse_start = time.time() while GPIO.input(ECHO_PIN) == 1: pulse_end = time.time() pulse_duration = pulse_end - pulse_start distance_cm = 0.017 * pulse_duration return distance_cm try: while True: distance = get_distance() print("Distance: {:.2f} cm".format(distance)) time.sleep(1) # Wait for 1 second before taking the next measurement except KeyboardInterrupt: print("Measurement stopped by the user.") finally: GPIO.cleanup()

Video Tutorial

비디오 제작은 시간이 많이 걸리는 작업입니다. 비디오 튜토리얼이 학습에 도움이 되었다면, YouTube 채널 을 구독하여 알려 주시기 바랍니다. 비디오에 대한 높은 수요가 있다면, 비디오를 만들기 위해 노력하겠습니다.

스스로에게 도전하세요

초음파 센서를 활용하여 다음 프로젝트 중 하나를 완성하십시오.

  • 원격 조종 자동차의 충돌 방지 시스템을 구축합니다.
  • 쓰레기통의 재료 양을 측정합니다.
  • 쓰레기통의 레벨을 모니터링합니다.
  • 쓰레기통을 자동으로 열고 닫습니다. 힌트: 라즈베리 파이 - 서보 모터를 참조하십시오.

초음파 센서 응용 분야

  • 충돌 방지
  • 만재 감지
  • 레벨 측정
  • 근접 감지