본문 바로가기
아두이노 센서

[센서/초음파 거리측정] 물체와의 거리를 측정해주는 초음파 센서(ultra sonic sensor)

by 작동미학 2015. 6. 24.
반응형

다양한 용도로 사물과의 거리를 측정해보자.

 

▶ 이 가이드를 따라하면

- 초음파를 사용하여 거리 측정하는 원리를 파악하고 간단히 구현할 수 있다.

 

▶ 먼저 읽으면 좋은 글

- Arduino 일반 : http://bbangpan.tistory.com/1

 

▶ 부품 설명 및 회로 구성

초음파 거리 센서의 원리는 생각보다 간단하다. 초음파를 발생시키고 돌아오는 시간을 측정한 후 그 진행 속도(340m/s, 29msec당 1cm)를 가지고 계산하는 것이다. 예컨데 290msec후에 소리가 감지되었으면 10cm를 진행한 것이고, 반사되어 온 거리이므로 2로 나누어, 물체와의 거리는 5cm이다.

시중에 판매하는 초음파 거리 센서는 대개 2cm~2m(혹은 3m)를 측정한다. 측정 거리를 키우기 위해서는 출력을 키워야 하므로(소리는 진행하면서 에너지를 잃는다), 저전력으로 적당한 기능을 하도록 제작된 셈이다. 대개 4pin짜리와 3pin짜리가 판매되는데, 초음파를 발생하고 수신하는 것을 다른 핀으로 조절하면 4pin이고, 하나의 핀으로만 감지하면 3pin이 된다.(2개의 핀은 GND/5V이다)

특이한 것은 약간의 부채꼴 모양으로 물체를 감지한다는 것이다(상하좌우 10도 정도 된다). 그래도 진행방향에 정렬할수록 더 쉽게 감지되고 일정 크기 이상이 될 필요가 있다. 불행히도 이는 사서 실험해보면서 정확히 알 수 있다.

아래는 Makeblock의 초음파 센서이나 시중에 파는 대부분의 초음파 센서가 측정 거리나 품질이 비슷하다. 특별히 구별하여 구매할 필요는 없다고 본다. 실제 소스도 4pin의 경우는 소리를 입력받는 pin만 하나 더 추가하여 구현하면 된다. ( http://arduinobasics.blogspot.kr/2012/11/arduinobasics-hc-sr04-ultrasonic-sensor.html )

<Make block의 3pin용 Ultra Sonic Sensor – 하단의 3개 핀이 보인다-GND/5V/SIG>

3pin용 4pin용 원리는 동일한데, 3pin용에 대한 완벽한 가이드는 Arduino 홈페이지에 올라와 있다. http://www.arduino.cc/en/Tutorial/Ping?from=Tutorial.UltrasoundSensor

<핀 연결모습. GND->GND, 5V->5V, SIG->D7연결>

 

▶ 소스 코드 입력 및 구동

arduino사이트에서 그대로 발췌하여 4pin도 수용할 수 있게 살짝 변경하여 게시한다(양해를 구한다).

거리 구하는 방식은 위 설명과 동일하다. 5msec동안 초음파를 쏜 후 시간을 측정하고, 음파 속도를 가지고 왕복한 거리를 구하여 2로 나눈다.

 

아래는 pingPin, echoPin이 모두 D7인데, 4pin짜리 초음파 거리 센서의 경우는 이를 trigPin=D7, echoPin=D8로 구성가능하다. 물론 연결하고, 해당 핀을 쓰도록 아래 소스를 바꾸면 된다.

4pin짜리의 경우 trigpin이 음파를 쏘고, echopin이 음파를 읽는다는 점을 헷갈리지 말자.

 

4핀용 소스 :


const int trigPin = 8;    //Trig 핀 할당

const int echoPin = 7;    //Echo 핀 할당


void setup()

{

  Serial.begin(9600);

  pinMode(trigPin, OUTPUT);

  pinMode(echoPin, INPUT);

}


void loop()

{

  long duration, cm=9999;


  digitalWrite(trigPin, LOW);

  delayMicroseconds(2);

  digitalWrite(trigPin, HIGH);

  delayMicroseconds(5);

  digitalWrite(trigPin, LOW);


  duration = pulseIn(echoPin, HIGH);


  cm = duration / 29 / 2;

  Serial.print(cm);

  Serial.print("cm");

  Serial.println();


  delay(100);

}



3핀용 소스:

/* Ping))) Sensor

 

This sketch reads a PING))) ultrasonic rangefinder and returns the

distance to the closest object in range. To do this, it sends a pulse

to the sensor to initiate a reading, then listens for a pulse

to return. The length of the returning pulse is proportional to

the distance of the object from the sensor.

 

The circuit:

* +V connection of the PING))) attached to +5V

* GND connection of the PING))) attached to ground

* SIG connection of the PING))) attached to digital pin 7

 

http://www.arduino.cc/en/Tutorial/Ping

 

created 3 Nov 2008

by David A. Mellis

modified 30 Aug 2011

by Tom Igoe

 

This example code is in the public domain.

 

*/

 

// this constant won't change. It's the pin number

// of the sensor's output:

const int pingPin = 7;

const int echoPin = 7;

 

void setup() {

// initialize serial communication:

Serial.begin(9600);

}

 

void loop()

{

// establish variables for duration of the ping,

// and the distance result in inches and centimeters:

long duration, inches, cm;

 

// The PING))) is triggered by a HIGH pulse of 2 or more microseconds.

// Give a short LOW pulse beforehand to ensure a clean HIGH pulse:

pinMode(pingPin, OUTPUT);

digitalWrite(pingPin, LOW);

delayMicroseconds(2);

digitalWrite(pingPin, HIGH);

delayMicroseconds(5);

digitalWrite(pingPin, LOW);

 

// The same pin is used to read the signal from the PING))): a HIGH

// pulse whose duration is the time (in microseconds) from the sending

// of the ping to the reception of its echo off of an object.

pinMode(echoPin, INPUT);

duration = pulseIn(echoPin, HIGH);

 

// convert the time into a distance

inches = microsecondsToInches(duration);

cm = microsecondsToCentimeters(duration);

 

Serial.print(inches);

Serial.print("in, ");

Serial.print(cm);

Serial.print("cm");

Serial.println();

 

delay(100);

}

 

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;

}

 

구동하여 앞에 물체를 가져다 대면 다음과 같이 출력되는 결과물을 시리얼 모니터를 통해 확인할 수 있다.

<앞서 구한 방식으로 표기한 거리>

이 모듈을 사용하면 충격방지를 위한 모터 제어 자동차에 활용하거나, 지나가는 사람을 감지 혹은 문 열림 등을 원거리에서 측정할 수 있다. 필자의 경우에는 창문 턱에 설치하여 문이 장시간 열려있으면 buzzer울리는 장치를 만든 적이 있다. 이처럼 관련하여 다양한 응용이 가능하다.

 

▶ 구매 가이드

센서 모듈 : http://www.aliexpress.com/wholesale?catId=0&initiative_id=SB_20150624061742&isPremium=y&SearchText=ultrasonic+sensor ($3~$6)

 

강의 키워드

Arduino UNO, HC-SR04, ultrasonic sensor, ultra sonic sensor, ultra sonic distance module, 아두이노 우노, 초음파 거리 센서

반응형