초음파 센서로 거리재기 예제

1. 초음파 센서?

음파를 쏘아서 반향되어 수집되는 음파까지의 시간차로 거리를 계산해 내는데 사용되는 센서입니다. 음속이 340m/s 정도 되니까 센서를 통해 응답이 오는 시간만 알면 초음파 센서 앞에 있는 사물까지의 거리를 잴 수 있습니다.

측정거리 : 2cm ~ 5m, 측정각도 : 15', 측정 해상도 : 3mm

30b8a9072b356d8d

 

2. 연결방법

초음파 센서를 보시면 4개의 핀이 있습니다. VCC, Trig, Echo, GND 입니다. 아두이노에 다음과 같이 연결합니다.

초음파 센서 아두이노
VCC 5V
Trig D2
Echo D3
GND GND

uwave_bb

 

3. 동작방법

아두이노에서 Trig(트리거) 핀으로 HIGH를 입력하면 초음파 모듈에서 40KHz 음파를 발사합니다.(10us 이상 HIGH 유지를 권장) 이때부터 Echo 핀은 High 상태가 되고, 음파가 되돌아와 수신되면 echo 핀이 다시 Low 상태가 됩니다. 이 간격에서 거리를 구하고 다시 2로 나누면 됩니다. (왕복이므로)

음파속도가 340m/s 이고 1cm 가는데 29us 가 걸립니다. 거리를 구하는 공식은

Distance = time / 29 / 2;

 

4. 코드 (스케치)

void setup()
{
  Serial.begin(9600);
  pinMode(2,OUTPUT); // 센서 Trig 핀
  pinMode(3,INPUT); // 센서 Echo 핀
}

void loop()
{
  long duration, cm;

  digitalWrite(2,HIGH); // 센서에 Trig 신호 입력
  delayMicroseconds(10); // 10us 정도 유지
  digitalWrite(2,LOW); // Trig 신호 off

  duration = pulseIn(3,HIGH); // Echo pin: HIGH->Low 간격을 측정
  cm = microsecondsToCentimeters(duration); // 거리(cm)로 변환

  Serial.print(cm);
  Serial.print("cm");
  Serial.println();

  delay(300); // 0.3초 대기 후 다시 측정
}

long microsecondsToInches(long microseconds)
{
  // According to Parallax's datasheet for the PING))), there are
  // 73.746 microseconds per inch (i.e. sound travels at 1130 feet per
  // second).  This gives the distance travelled by the ping, outbound
  // and return, so we divide by 2 to get the distance of the obstacle.
  // See: http://www.parallax.com/dl/docs/prod/acc/28015-PING-v1.3.pdf
  return microseconds / 74 / 2;
}

 

long microsecondsToCentimeters(long microseconds)
{
  // The speed of sound is 340 m/s or 29 microseconds per centimeter.
  // The ping travels out and back, so to find the distance of the
  // object we take half of the distance travelled.
  return microseconds / 29 / 2;
}

예제에 사용된 스케치는 아래에서 받으세요.메뉴 > 도구 > 시리얼 모니터 : 실행하셔서 측정된 거리 확인해보세요.

 

Post Author: TORTUGA

TORTUGA
궁금하신 점은 새로 개편한 홈페이지의 QnA 게시판을 이용해주세요!!!!!!! http://www.hardcopyworld.com/gnuboard5/bbs/board.php?bo_table=qna

31 thoughts on “초음파 센서로 거리재기 예제

    박연용

    (2014년 5월 21일 - 2:43 오후)

    귀한 자료 잘 모았습니다.
    덕분에 센서로 거리의 값을 찾는데까지 성공을해서 기쁘기 그지 없습니다.
    궁금한 점이 하나 생겼는데, 만약 2개 이상의 센서를 하나의 아듀이노에서 작동을 시킬 경우에는 코드를 어떻게 해야하는지 궁금합니다.

      TORTUGA

      TORTUGA

      (2014년 5월 22일 - 10:07 오전)

      테스트 해보지는 않았는데 아마도 아래처럼 될 것입니다.

      void setup()
      {
      Serial.begin(9600);
      pinMode(2,OUTPUT); // 센서 Trig 핀
      pinMode(3,INPUT); // 센서 Echo 핀
      pinMode(4,OUTPUT); // 센서2 Trig 핀
      pinMode(5,INPUT); // 센서2 Echo 핀
      }

      void loop()
      {
      long duration, cm;
      long duration2, cm2;

      //—– 센서 1
      digitalWrite(2,HIGH); // 센서에 Trig 신호 입력
      delayMicroseconds(10); // 10us 정도 유지
      digitalWrite(2,LOW); // Trig 신호 off

      duration = pulseIn(3,HIGH); // Echo pin: HIGH->Low 간격을 측정
      cm = microsecondsToCentimeters(duration); // 거리(cm)로 변환

      //—– 센서 2
      digitalWrite(3,HIGH); // 센서에 Trig 신호 입력
      delayMicroseconds(10); // 10us 정도 유지
      digitalWrite(3,LOW); // Trig 신호 off

      duration2 = pulseIn(4,HIGH); // Echo pin: HIGH->Low 간격을 측정
      cm2 = microsecondsToCentimeters(duration2); // 거리(cm)로 변환

      Serial.print(cm);
      Serial.print(“cm”);
      Serial.println();

      Serial.print(cm2);
      Serial.print(“cm”);
      Serial.println();

      delay(300); // 0.3초 대기 후 다시 측정
      }

        박연용

        (2014년 5월 23일 - 12:50 오전)

        정말 감사합니다.
        이걸 스위치로 해야하나 한참을 고민했는데 ㅎ 역시 초보라 항상 다음 스탭에서 발만 동동거리네요

    최봉재

    (2014년 5월 27일 - 9:23 오전)

    거리는 잘 재는데 계속 0cm만 출력할땐 어떡해야할까요

      TORTUGA

      TORTUGA

      (2014년 5월 28일 - 12:16 오전)

      0cm만 출력한다면 거리를 못재는 상태인것 같네요. 위 코드에서 duration 값을 Serial.print() 함수로 찍어보세요.

        HWANG

        (2014년 7월 28일 - 1:09 오전)

        저도 같은 문제가 발생해서 duration 값을 찍어봤더니 2, 3의 값이 반복되어서 찍히네요.. 어떤 문제인지 알 수 있을까요 ?

    SUSAN

    (2014년 6월 1일 - 12:53 오전)

    좋은자료 감사합니다.
    Echo가 있는 4PIN은 어찌해야 하나 했는데 똑같이 digital이였네요.
    제가 초음파 센서를 이용해서 장애물에 따른DC모터를 제어할려고 제어부분 소스를
    U_SENSOR() >= 30? STOP() : FORWORD();
    delay(1000);
    이렇게 작성했는데 거리와 상관없이 계속 회전하는 문제가 발생하네요…
    전달인자도 사용했지만 제어가 안되는데 어떻게 접근을 해야 정상적으로 제어가 가능할까요?
    초음파 센서는 시리얼 모니터를 통해 출력되는 것을 확인했습니다.

    woojin

    (2014년 6월 23일 - 1:06 오전)

    이모델이랑 다른모델인 ultrasonic Ranger 이라는 제품을 사용중인데요
    센서에 echo 랑Trig 이 없고 vcc 랑 gnd 랑 nc sig 이렇게 4개의 핀이있는데요 어떻게 설계해야되나영 ??

      TORTUGA

      TORTUGA

      (2014년 6월 23일 - 4:50 오후)

      아마도 주기적으로 거리를 자체 즉정해서 결과만 보내주나봅니다. 정확한건 판매처에서 제공하는 문서를 확인해봐야 알것 같네요.

    Art

    (2014년 9월 10일 - 4:45 오후)

    측정값을 pc로 전달해서 웹캠으로 촬영하게 하려면 어떻게 해야하나요

      TORTUGA

      TORTUGA

      (2014년 9월 11일 - 6:22 오후)

      질문이 너무 어렵습니다;; 일단 PC로 전달할 방법부터 선택하셔야 할 듯. USB-Serial / BT / WiFi 등등요.

    미콩

    (2014년 10월 30일 - 11:27 오전)

    좋은 자료 감사합니다^^
    혹시 일정거리 안이면 어떤 단일 값을 출력하고 밖이면 다른 값을 출력하는,
    예를 들어 10cm 이내 일때는 “유효거리 안입니다” 라고 출력하고 그 외에는 “유효거리 밖입니다” 라고 출력하는 식의 소스도 만들 수 있나요?

      TORTUGA

      TORTUGA

      (2014년 11월 7일 - 10:49 오전)

      물론 가능합니다. 아래 소스코드를 보시면
      cm = microsecondsToCentimeters(duration); // 거리(cm)로 변환

      cm 값에 따라 유효거리인지 판단하면 됩니다.

        미콩

        (2014년 11월 15일 - 4:27 오후)

        감사합니다. 과제 중에 초음파센서를 사용하게 되어 질문했었습니다. if문을 사용해서 해보니깐 되네요^^

    학생탈출

    (2014년 12월 1일 - 7:58 오후)

    초음파센서 1개만 연결했을 때는 잘 작동하는데 2개를 연결하면 둘중 하나만 작동합니다 ㅠㅠ
    위에 댓글에 있는 소스도 써보고 직접 프로그래밍 짜보기도 했는데 안되는데 이유가 뭘까요??

      TORTUGA

      TORTUGA

      (2015년 1월 26일 - 1:06 오전)

      집에 센서가 하나 뿐이네요;;; 서로 간섭이 발생하지 않게 배치해서 한번 해보시겠어요?

    […] 브레드 보드에 초음파 센서를 끼우고, 점퍼로 보드와 연결했다. (참조: 초음파, […]

    Froggy

    (2015년 2월 16일 - 8:31 오후)

    아주 기본적인 문제입니다.
    노트북과 아두이노를 연결했는데 노트북이 아두이노를 인식하지 않습니다.
    어떻게 해야 하는지요.

      TORTUGA

      TORTUGA

      (2015년 2월 21일 - 9:01 오후)

      드라이버부터 확인해봐야 합니다. 아두이노 설치하면 기본 드라이버가 깔립니다. 아두이노 정식보드는 이 드라이버로 잡힙니다. 호환보드일 경우는 보드에 맞는 드라이버를 깔아줘야 합니다.

    Froggy

    (2015년 2월 24일 - 12:31 오후)

    초음파 센서의 구동원리를 좀 더 잘 이해하기 위해서 측정된 거리에 따른 echo 신호 변화를 오실로스코프로 보려고 합니다.
    첫번째 질문은 이를 위해 echo 신호를 오실로스코프와 공유했더니 거리 측정값이 0cm로 고정됩니다. 그 이유가 무엇인지 궁금합니다.
    두번째 질문은 echo 핀이 High 상태에서 Low로 전환될 때까지 걸리는 시간을 측정하여 거리를 측정한다고 하셨는데, 오실로스코프 상에서 echo 신호를 보면 두 개의 peak가 10us 간격으로 일정하게 나타납니다. delayMicroseconds()에서 괄호 안의 숫자를 변경하면 두 peak간의 간격도 동일한 크기로 변합니다. 센서에서 전달해 주는 echo 신호의 성격은 어떤 것인지요?

    초센

    (2015년 4월 22일 - 2:02 오후)

    안녕하세요
    DYP-ME007Y라는 4개핀짜리 방수형초음파센서를 통해 거리를 재려고하는데
    오차값이 1.5cm나 생깁니다. 교수님이 필터를 사용하여야한다고 하는데 어떤 필터를 말하는건지는 알려주시지 않아서요..

    황규남

    (2015년 9월 21일 - 10:53 오후)

    자료는 정말 도움이 되었습니다. 감사합니다.
    다름이 아니라 피에조 부저를 사용하여 후방감지를 표현하고 싶은데
    소스를 혹시 부탁드려도 될까요 ㅠㅠ..

    진윤태

    (2015년 11월 4일 - 8:25 오후)

    아두이노 초음파센서 실험을 하고있는데요 duration 값을 Serial.print로 찍으라는 말이 이해가 안되는데 코드를 직접 적어주실수 있나요? 일부분만…???

      태윤진

      (2015년 11월 4일 - 8:41 오후)

      저도 같은 현상인데 cm = microsecondsToCentimeters(duration); // 거리(cm)로 변환 이부분에서 duration안에 cm = microsecondsToCentimeters(Seiral.print(duration)); 으로 변환 시키는거 아닌가요?? 정말 궁금합니다..

      TORTUGA

      TORTUGA

      (2015년 11월 10일 - 12:37 오후)

      Serial.println(duration);
      이런식으로 변수를 println() 함수안에 넣어주면 값이 PC로 전송되어 출력됩니다.

        TORTUGA

        TORTUGA

        (2015년 11월 10일 - 12:38 오후)

        println() 함수는 값을 PC로 전송해주는 역할을 합니다. microsecondsToCentimeters() 함수는 단위를 변환하는 함수므로 일단 단위를 변환해서 cm로 바꾼 다움에 println(cm) 처럼 출력해주셔야 합니다.

    jhkim

    (2015년 12월 16일 - 11:02 오전)

    안녕하십니까, 저는 초음파센서로 측정거리값을 받아서 그 값을 c++(아두이노 스케치 프로그램이아닌 visual studio)에서 다루고싶은데 그렇게 할 수 있는 방법을 알고싶습니다. //만약, 그 측정값을 direct로 c++에서 받을수없고, 아두이노 스케치 프로그램을 거쳐서 받을 수 있다면 그 방법또한 알고싶습니다.

      TORTUGA

      TORTUGA

      (2015년 12월 22일 - 10:13 오전)

      스케치는 아두이노에서 동작하는 코드입니다. 따라서 초음파센서로 측정한 값은 아두이노가 가지고 있고, 이걸 PC로 보내줘야 합니다.
      PC로 보내줄때 아두이노는 시리얼 통신을 통해 USB로 전달합니다. PC에서는 아두이노가 COM 포트로 잡히게 되는데 이 COM 포트를 통해 아두이노가 보내주는 데이터를 받을 수 있습니다.
      결론은, 아두이노에서 측정한 거리값을 Serial 로 전송하세요. PC에서는 COM 포트를 열어 데이터를 받아서 처리하세요.

    김현우

    (2016년 5월 4일 - 6:09 오후)

    거리의 제한을 두고 싶은데 어떻게 해야하나요 몇 미터 부터 몇미터 까지만 측정하고 나머지는 측정안되게 하고싶어요

    임한별

    (2016년 6월 18일 - 10:55 오전)

    코드를 입력하고 업로드한뒤에 시리얼 모니터를 열면
    “시리얼 포트 ‘COM6’ 를 여는데 에러 발생 (Port busy)”
    라는 빨간 문구가 뜨면 열리지 않는데 이유를 알려주실 수 있을까요

      임한별

      (2016년 6월 18일 - 10:56 오전)

      포트는 COM6이 확실합니다

댓글 남기기

이메일은 공개되지 않습니다.