본문 바로가기
장인으로의 여정/라즈베리파이

[라즈베리파이3] 초음파 사용기(HC-SR04)

by 유기농프로그래밍 2016. 6. 15.
반응형

초음파 사용기(HC-SR04)

 

초음파라하여 굉장히 있어보이지만, 사실 별게 아니었다.

 

 

제품 이름은 "HC-SRO4"로 2000원 정도에 하나를 구매할 수 있다.

 

거리를 return 하는 함수이다.

 

선행 작업으로는 GPIO 핀연결을 잘 확인해서 연결해놔야한다.

 

나는 아래 두개를 이용했다.

 

import RPi.GPIO as GPIO
import time

GPIO.setmode(GPIO.BCM)

TRIG=26
ECHO=6

GPIO.setup(TRIG, GPIO.OUT)
GPIO.setup(ECHO, GPIO.IN)

def reading_distance():
    global signal_off
    GPIO.output(TRIG, GPIO.LOW)

    GPIO.output(TRIG, True)
    time.sleep(0.00001)
    GPIO.output(TRIG, False)

    while GPIO.input(ECHO)==0:
        signal_off = time.time()

    while GPIO.input(ECHO)==1:
        signal_on = time.time()
        if ((signal_on - signal_off) * 170) > 0.7:
            return 70

    timepassed = signal_on - signal_off

    distance = timepassed * 17000

    return distance

대략적으로 분석한 바는 0.00001초 사이에 TRIG 를 ON/OFF 하면서 밖으로 초음파를 날리는 것 같다.

 

그 다음 ECHO에서 받아주는 걸 계산하는 것이다.

 

return 200으로 뺀 것은 70cm 이상이라 판단한 것은 빠른 return을 위해 그냥 200으로 준 것이다.

(이렇게 한 이유는 초음파 측정거리가 최대 4m인데 농구게임에서는 최대 70cm면 충분해서 MAX 70cm로 놓은 것이다)

 

 

아래는 예제코드로 올라와 있는 소스이다.

(이걸 응용해서 하면 위의 코드보다 좀 더 잘할 수 있을것 같다)

 

#Libraries
import RPi.GPIO as GPIO
import time

#GPIO Mode (BOARD / BCM)
GPIO.setmode(GPIO.BCM)

#set GPIO Pins
GPIO_TRIGGER = 18
GPIO_ECHO = 24

#set GPIO direction (IN / OUT)
GPIO.setup(GPIO_TRIGGER, GPIO.OUT)
GPIO.setup(GPIO_ECHO, GPIO.IN)

def distance():
    # set Trigger to HIGH
    GPIO.output(GPIO_TRIGGER, True)

    # set Trigger after 0.01ms to LOW
    time.sleep(0.00001)
    GPIO.output(GPIO_TRIGGER, False)

    StartTime = time.time()
    StopTime = time.time()

    # save StartTime
    while GPIO.input(GPIO_ECHO) == 0:
        StartTime = time.time()

    # save time of arrival
    while GPIO.input(GPIO_ECHO) == 1:
        StopTime = time.time()

    # time difference between start and arrival
    TimeElapsed = StopTime - StartTime
    # multiply with the sonic speed (34300 cm/s)
    # and divide by 2, because there and back
    distance = (TimeElapsed * 34300) / 2

    return distance

if __name__ == '__main__':
    try:
        while True:
            dist = distance()
            print ("Measured Distance = %.1f cm" % dist)
            time.sleep(1)

        # Reset by pressing CTRL + C
    except KeyboardInterrupt:
        print("Measurement stopped by User")
        GPIO.cleanup()

 

반응형

댓글