라즈베리파이 초음파센서 파이썬 - lajeubelipai cho-eumpasenseo paisseon

라즈베리파이에 초음파 센서를 연결해서 작동시켜보자.

[HC-SR04]

왠지 외계인이 떠오를 거 같은 모양의 초음파 센서.

눈 같은 둥근 부분 두 개 중 한 곳에서 초음파를 내보내고(송신부) 다른 한 쪽이 그 초음파가 돌아오는 것은 감지(수신부)하는 방식이다.

대략 2cm ~ 4m 정도의 거리를 감지할 수 있다고 한다.

라즈베리파이 초음파센서 파이썬 - lajeubelipai cho-eumpasenseo paisseon

음....

정밀도가 한 3mm 내외라는데, 막 정확하고 그런 것 같지는 않지만, 가격 생각하면 좋은 센서이다.

센서 가운데 아랫 부분에 보면 Vcc, Trig, Echo, Gnd라고 쓰여 있고 뾰족뾰족한 것이 4개 있다.

이걸 라즈베리파이의 GPIO 부분과 연결할 거다.

[라즈베리파이와 연결하기]

대략 위와 같은 식으로 연결할 거다.

GPIO 2번과 Trig를, 3번과 Echo를 연결하고 Gnd는 6번과 연결한다.

Vcc는 2번과 연결하는데, 지난번에 다른 짓하다 연결 잘못해서 쇼트먹고 사망한 적이 있어서 많이 불안하다.

지금 사용하는 초음파 센서의 전압은 5v니 문제는 없겠지만, 자라보고 놀란 가슴 솥뚜껑보고 놀란다고...

라즈베리파이 초음파센서 파이썬 - lajeubelipai cho-eumpasenseo paisseon
 

윽윽...

암튼 대충 연결하면 이런 식이다.

센서를 바로 라즈베리파이와 연결해도 되지만 일단 브레드보드를 한번 거쳐서 연결했다.

이래야 나중에 센서 테스트하기가 쉽다.

브레드보드에 연결하고 각 연결 순서에 맞춰 연결한다.

노란 선이 Vcc5v와 연결되었고, 하얀선은 TrigGPIO 2번에, 파란 선은 EchoGPIO 3 번, 그리고 주황색 선은 GndGND를 연결한다.

[소스 작성]

인터넷 보면 많이 있으니 참고해서 소스를 작성해보자.

먼저 파이썬의 GPIO 모듈과, time 모듈을 불러온다.

 import RPi.GPIO as GPIO

 import time 

그 다음 GPIOsetmodeBCM으로 설정(설정하는 걸 이거 밖에 모른다.)하고 TrigEcho가 라즈베리파이 GPIO의 어디와 연결되어 있는지 설정한다.

 GPIO.setmode(GPIO.BCM)

 trig = 2

 echo = 3

 GPIO.setup(trig, GPIO.OUT)

 GPIO.setup(echo, GPIO.IN)

그 다음은 지정한 TrigEcho의 작동에 대한 소스를 작성한다.

 try :

     while True :

         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 = pulst_duration * 17000

         distance = round(distance, 2)

         print("거리 : ", distance, "cm")

 except Keyboardinterrupt :

     GPIO.cleanup()

try 내에 반복문을 이용해서 송신부와 수신부에 대한 설정을 해준다.

trig에서 작동(초음파 내보내는)이 실패하면 0.5초 정도 시간을 정지시키고 다시 작동하고,

성공하면 찰나의 틈 뒤에 정지시키는 것이라고 해석하면 되겠다.

정확한 의미는 아니지만 일단 송신부에서 초음파를 내보내야 수신을 해서

거리를 측정하든 할 것이기 때문에 일단 이렇게 이해하면 될 것 같다.

그 다음에는 echo에 대한 설정을 하는데, 즉 수신이 안 되면 pulse_start 변수에 시간을 입력하고

수신이 되면 pulse_end 변수에 시간을 입력한다.

pulse_duration 변수에는 pulse_end의 값에서 pulse_start값을 뺀 값이 저장된다.

즉, pulse_start는 수신부가 처음 초음파를 수신하지 못했던 값이고, pulse_end는 수신한 값이니

이것을 수신한 값에서 처음 값을 빼면 실제 초음파가 송신부에서 나갔다가 수신부로 돌아오는 시간이 된다.

그 다음으로, distance 변수는 pulse_duration 값에 17,000을 곱한 값을 저장한다.

거리 = 시간 × 속도이고, 소리의 속도는 일정한 온도, 습도라고 가정했을 때340m/s = 34,000cm/s인데,

초음파 센서는 송신부에서 나갔다가 수신부로 돌아오기 때문에 34000으로 계산하면 실제 거리의 2배를 구하게 된다.

원래 계산식이라면 pulse_duration × 34,000 / 2인 것을 34000/2를 미리 계산해서 17,000이라고 한 것이다.

그 다음에 distance = round(distance, 2)는 값이 소수점 이하로 무한정 나오면

지저분(?)하니까 쿨하게 2자리까지만 구하고 반올림하라는 의미이다.

위와 같이 작성하고 저장한 뒤 실행하면 초음파 센서가 작동한다.

라즈베리파이 초음파센서 파이썬 - lajeubelipai cho-eumpasenseo paisseon