ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Raspberry Pi] 초음파 센서 동작 + LED 센서
    Raspberry Pi/Build with Pi 2026. 4. 4. 14:19

    오늘은 초음파 센서 동작과 초음파 센서 값을 활용해 LED를 켰다 껐다 해보겠다.

     

    1. 초음파 센서 동작

    먼저 초음파 센서는 다음과 같이 생겼다.

    초음파센서

    먼저 이 녀석을 또 라즈베리 파이와 연결을 해야한다.

    초음파 센서 핀을 보면, VCC, GND, Trig, Echo라고 적혀 있는데 각각 어디에 연결해야하는지 봐보자.

    먼저 초음파센서의 VCC는 5V Power(2번)에 연결해주고, Gnd는 Ground(6번), Trig는 GPIO24, Echo는 GPIO23에 연결해준다. 연결하면 다음과 같이 연결하면된다.

    초음파센서 연결

    이제 연결을 했으니 초음파 센서가 동작하는지 먼저 확인을 해보자.

    라즈베리파이를 켜고 연결을 해준다음 아래 코드를 작성해 준다.

    import RPi.GPIO as GPIO
    import time
    
    TRIG = 23
    ECHO = 24
    
    GPIO.setmode(GPIO.BCM)
    GPIO.setup(TRIG, GPIO.OUT)
    GPIO.setup(ECHO, GPIO.IN)
    
    GPIO.output(TRIG, False)
    time.sleep(2)
    
    def measure_once():
        GPIO.output(TRIG, False)
        time.sleep(0.0002)
    
        GPIO.output(TRIG, True)
        time.sleep(0.00001)
        GPIO.output(TRIG, False)
    
        timeout = time.time()
    
        pulse_start = time.time()  # 초기화
        pulse_end = time.time()    # 초기화
    
        # Echo LOW → HIGH 기다림
        while GPIO.input(ECHO) == 0:
            pulse_start = time.time()
            if pulse_start - timeout > 0.05:
                return None
    
        timeout = time.time()
    
        # Echo HIGH → LOW 기다림
        while GPIO.input(ECHO) == 1:
            pulse_end = time.time()
            if pulse_end - timeout > 0.05:
                return None
    
        pulse_duration = pulse_end - pulse_start
        distance = pulse_duration * 17150
    
        if distance < 2 or distance > 400:
            return None
    
        return round(distance, 2)
    
    def get_distance():
        values = []
    
        for _ in range(5):
            d = measure_once()
            if d is not None:
                values.append(d)
            time.sleep(0.05)
    
        if not values:
            return None
    
        values.sort()
        return values[len(values)//2]
    
    try:
        while True:
            dist = get_distance()
            if dist is None:
                print("측정 실패")
            else:
                print(f"Distance: {dist} cm")
            time.sleep(0.5)
    
    except KeyboardInterrupt:
        print("종료")
    finally:
        GPIO.cleanup()

    코드를 작성하고 실행을 하면 초음파 센서가 측정하는 거리가 뜰 것이다. 손이나 물체를 가까이 가져가면 Distance가 줄어드는것이 정상적으로 작동하고 있다는 의미이다.

     

    2. 센서 + LED 제어

    이제 초음파 센서의 거리값에 임계값을 지정해주고, 임계값 이하이면 LED를 켜고, 이상이면 LED를 끄도록 설계를 해보자

    먼저 기존 상태에서 LED를 연결을 해주고 약간의 코드를 수정만 해주면 된다. LED 센서 제어는 이전 포스팅에 올려두었다.

    https://yeontachi.tistory.com/18

     

    [Raspberry Pi] 라즈베리 파이 LED 제어하기

    오늘은 LED ON/OFF를 실습했다.두 가지 방식으로 진행을 했는데,먼저 프로그램 없이 명령어로 LED 제어하기, 그 다음은 프로그램을 이용한 LED 제어이다.(Python을 사용했다.)먼저 LED 제어를 위해서는 G

    yeontachi.tistory.com

    이제 센서와 LED를 같이 연결해서 동작 테스트를 해보자.

    먼저 연결은 아래 이미지를 참고하면 된다.

    초음파센서 + LED 회로 구성

    이 상태로 연결해두고, 다시 아래 코드를 작성해서, 실제로 손을 가까이 가져다대면, LED불이 켜지는지 확인을 해보자. 

    (내가 실습할 때는, 초음파 센서 거리감각이 똥망이라 센서에 손을 정말 가까이 가져다 놓아야 LED 불이 켜졌다...)

    import RPi.GPIO as GPIO
    import time
    
    TRIG = 23
    ECHO = 24
    LED = 17
    
    GPIO.setmode(GPIO.BCM)
    
    GPIO.setup(TRIG, GPIO.OUT)
    GPIO.setup(ECHO, GPIO.IN)
    GPIO.setup(LED, GPIO.OUT)
    
    GPIO.output(TRIG, False)
    GPIO.output(LED, False)
    
    time.sleep(2)
    
    def distance():
        # TRIG 초기화
        GPIO.output(TRIG, False)
        time.sleep(0.0002)
    
        # 10us 펄스
        GPIO.output(TRIG, True)
        time.sleep(0.00001)
        GPIO.output(TRIG, False)
    
        pulse_start = time.time()
        pulse_end = time.time()
        timeout = time.time()
    
        # LOW → HIGH 기다림
        while GPIO.input(ECHO) == 0:
            pulse_start = time.time()
            if pulse_start - timeout > 0.05:
                return None
    
        timeout = time.time()
    
        # HIGH → LOW 기다림
        while GPIO.input(ECHO) == 1:
            pulse_end = time.time()
            if pulse_end - timeout > 0.05:
                return None
    
        pulse_duration = pulse_end - pulse_start
        dist = pulse_duration * 17150
    
        if dist < 2 or dist > 400:
            return None
    
        return dist
    
    try:
        while True:
            d = distance()
    
            if d is None:
                print("측정 실패")
                GPIO.output(LED, False)
    
            else:
                print(f"Distance: {d:.1f} cm")
    
                if d <= 150:
                    GPIO.output(LED, True)   # LED ON
                else:
                    GPIO.output(LED, False)  # LED OFF
    
            time.sleep(0.3)
    
    except KeyboardInterrupt:
        print("종료")
    
    finally:
        GPIO.cleanup()

    이제 코드를 실행하고, 손을 가져다 대면 LED가 켜질 것이다....!

    https://youtube.com/shorts/3hOs6GszZp4?feature=share

     

     

    다음은, 온도 습도 센서 동작으로 돌아오도록 하겠다:)

Designed by Tistory.