프로젝트 대표사진

라즈베리파이 초음파 센서 ( HC-SR04 ) 제어

라즈베리파이에서 초음파 센서의 초음파가 물체에 부딪쳐 반사되어 돌아오는데 까지 걸리는 시간을 측정하여 물체의 거리를 계산한다.
라즈베리파이 초음파 센서 ( HC-SR04 ) 제어 작성자 : 네오즈

1. 초음파센서 테스트 회로 구성

                            ( HC-SR04 초음파 센서 1EA, , 1KΩ 저항 1EA Echo연결, 2KΩ 저항 1EA GND 연결 )

                                          Trig: GPIO 17번 연결, Echo: GPIO 18번 연결

 

주의사항 : echo 핀에 High level 신호 발생시 5V를 전송 하게 된다. 그러나 라즈베리파이는 3.3V로

작동되므로 라즈베리파이 손상을 방지하기 위해 1KΩ, 2KΩ 저항으로 3.3V로 낮춰줘야 한다.

 

코드 작성 및 실행 방법은 " 라즈베리파이 GPIO 포트 ( LED, 버튼 ) 제어 " 가이드 참조

 

2. 초음파센서 테스트 Python 코드

 

초음파가 물체에 부딪쳐 반사되어 돌아오는데 까지 걸리는 시간을 측정하여 물체의 거리를 계산한다.

 

import RPi.GPIO as GPIO                    # RPi.GPIO에 정의된 기능을 GPIO라는 명칭으로 사용
import time                                # time 모듈

GPIO.setmode(GPIO.BCM)                     # GPIO 이름은 BCM 명칭 사용
GPIO.setup(17, GPIO.OUT)                   # Trig=17 초음파 신호 전송핀 번호 지정 및 출력지정
GPIO.setup(18, GPIO.IN)                    # Echo=18 초음파 수신하는 수신 핀 번호 지정 및 입력지정

print “Press SW or input Ctrl+C to quit”   # 메세지 화면 출력

try:
    while True:
            GPIO.output(17, False)         
            time.sleep(0.5)

            GPIO.output(17, True)          # 10us 펄스를 내보낸다.
            time.sleep(0.00001)            # Python에서 이 펄스는 실제 100us 근처가 될 것이다
            GPIO.output(17, False)         # 하지만 HC-SR04 센서는 이 오차를 받아준다

            while GPIO.input(18) == 0:     # 18번 핀이 OFF 되는 시점을 시작 시간으로 잡는다
               start = time.time()

            while GPIO.input(18) == 1:     # 18번 핀이 다시 ON 되는 시점을 반사파 수신시간으로 잡는다
               stop = time.time()

            time_interval = stop – start      # 초음파가 수신되는 시간으로 거리를 계산한다
            distance = time_interval * 17000
            distance = round(distance, 2)

            print “Distance => “, distance, “cm”

except KeyboardInterrupt:                  # Ctrl-C 입력 시
    GPIO.cleanup()                         # GPIO 관련설정 Clear
    Print "bye~"

 

3. 초음파센서 테스트 C코드

#include <stdio.h>                              // stdio.h 파일 포함( printf() 사용하기 위해 )
#include <wiringPi.h>                           // wiringPi.h 파일 포함

int main(void )
{
   Float distance, start, stop;

   wiringPiSetup();
                                                // wiringPi 기준으로 PIN 번호 매김
   pinMode(0, OUTPUT);                          // wiringPi GPIO 0번  = Python(BCM) 17번 
   pinMode(1, INPUT);                           // wiringPi GPIO 1번  = Python(BCM) 18번

  while(1)
  {
      digitalWrite(0,0);                        // wiringPi 0번핀을 Low로 출력
      digitalWrite(0,1);                        // wiringPi 0번핀을 High로 출력
      delayMicroseconds(10);                    // 10마이크로초 동안 멈춘다
      digitalWrite(0,0);
    
      while(digitalRead(1) == 0)                // wiringPi 1번핀을 Low일 경우
         start = micros();                      // 마이크로초 저장
      while(digitalRead(1) == 1)                // wiringPi 1번핀을 High일 경우
         stop = micros();                       // 마이크로초 저장

      distance = (stop – start) / 58;           // 시간의 차이를 이용하여 거리를 도출한다
      printf(“Distance=> %2f cm \n”,distance);  
      delay(1000);
  }

  return 0;
}

 

※ e4ds make에 등록된 자료는 e4ds와 지식 제공자(기업포함) 이외에는 상업화 용도로 사용할 수 없습니다. 영리 목적 이외의 사용 시 출처를 밝혀야 합니다.