2019.04.10(pm): How do I use ultrasonic sensors with Raspberry Pi?

Raspberry Pi pin map

GPIO Setup

  1. gpio를 다루기전에 먼저 필요한 툴과 라이브러리를 다운
    sudo apt-get install git-core     
    ->쉘에서 위의 명령어를 실행(소스관리툴)
    git clone git://git.drogon.net/wiringPi
    ->소스관리툴이 설치가 다 되면 wiringPi프로젝트를 다운 (gpio를 다루는 라이브러리)
    cd wiringPi // wiringPi 디렉터리에 들어가기
    ./build // wiringPi를 설치
    gpio -v gpio readall // 설치가 잘되었는지 확인
    Gpio readall // 자신의 라즈베리파이의 gpio확인

Code Writing Process

mkdir python // Python 폴더를 하나 만들고
cd python // python 폴더로 이동
sudo nano test.py // test라는 이름의 파이썬 파일을 나노편집기에서 열기
코드 작성
Ctrl X 눌러서 나오기
sudo python test.py // test파일 실행

Circuit

Code

# -*- coding: utf-8 -*-
import RPi.GPIO as GPIO
import time
import sys
import signal

#GPIO 핀
TRIG = 23 # 트리거
ECHO = 24 # 에코

#거리 타임 아웃 용
MAX_DISTANCE_CM = 300
MAX_DURATION_TIMEOUT = (MAX_DISTANCE_CM * 2 * 29.1) #17460 # 17460us = 300cm

# 키보드 CTRL + C 누르면 종료 되게 처리
def signal_handler(signal, frame):
        print('You pressed Ctrl+C!')
        GPIO.cleanup()
        sys.exit(0)
signal.signal(signal.SIGINT, signal_handler)

# cm 환산 함수
# 아두이노 UltraDistSensor 코드에서 가져옴
def distanceInCm(duration):
    # 물체에 도착후 돌아오는 시간 계산
    # 시간 = cm / 음속 * 왕복
    # t   = 0.01/340 * 2= 0.000058824초 (58.824us)

    # 인식까지의 시간
    # t = 0.01/340 = 0.000029412초 (29.412us)

    # duration은 왕복 시간이니 인식까지의 시간에서 2로 나눔
    return (duration/2)/29.1


# 거리 표시
def print_distance(distance):
    if distance == 0:
        distanceMsg = 'Distance : out of range                   \r'
    else:
        distanceMsg = 'Distance : ' + str(distance) + 'cm' + '        \r'
    sys.stdout.write(distanceMsg)
    sys.stdout.flush()


def main():
    # 파이썬 GPIO 모드
    GPIO.setmode(GPIO.BCM)

    # 핀 설정
    GPIO.setup(TRIG, GPIO.OUT) # 트리거 출력
    GPIO.setup(ECHO, GPIO.IN)  # 에코 입력

    print('To Exit, Press the CTRL+C Keys')

    # HC-SR04 시작 전 잠시 대기
    GPIO.output(TRIG, False)
    print('Waiting For Sensor To Ready')
    time.sleep(1) # 1초

    #시작
    print('Start!!')
    while True:
        #171206 중간에 통신 안되는 문제 개선용      
        fail = False
        time.sleep(0.1)
        # 트리거를 10us 동안 High 했다가 Low로 함.
        # sleep 0.00001 = 10us
        GPIO.output(TRIG, True)
        time.sleep(0.00001)
        GPIO.output(TRIG, False)

        # ECHO로 신호가 들어 올때까지 대기
        timeout = time.time()
        while GPIO.input(ECHO) == 0:
            #들어왔으면 시작 시간을 변수에 저장
            pulse_start = time.time()
            if ((pulse_start - timeout)*1000000) >= MAX_DURATION_TIMEOUT:
                #171206 중간에 통신 안되는 문제 개선용        
                #continue
                fail = True
                break
                
        #171206 중간에 통신 안되는 문제 개선용        
        if fail:
            continue
        #ECHO로 인식 종료 시점까지 대기
        timeout = time.time()
        while GPIO.input(ECHO) == 1:
            #종료 시간 변수에 저장
            pulse_end = time.time()
            if ((pulse_end - pulse_start)*1000000) >= MAX_DURATION_TIMEOUT:
                print_distance(0) 
                #171206 중간에 통신 안되는 문제 개선용        
                #continue
                fail = True
                break

        #171206 중간에 통신 안되는 문제 개선용        
        if fail:
            continue

        #인식 시작부터 종료까지의 차가 바로 거리 인식 시간
        pulse_duration = (pulse_end - pulse_start) * 1000000

        # 시간을 cm로 환산
        distance = distanceInCm(pulse_duration)
        #print(pulse_duration)
        #print('')
        # 자리수 반올림
        distance = round(distance, 2)

        #표시
        print_distance(distance)

    GPIO.cleanup()



if __name__ == '__main__':
    main()

2019 04 10 Raspberry Pi LED Sonar Sensor


Comments

One response to “2019.04.10(pm): How do I use ultrasonic sensors with Raspberry Pi?”

  1. I just want to mention I am newbie to blogs and honestly loved this web page. Likely I’m want to bookmark your site . You actually come with awesome article content. With thanks for revealing your blog site.

Leave a Reply