위즈네트 아카데미

TUTORIAL

튜토리얼

Home  > 튜토리얼

아두이노와 초음파 센서를 이용하여 거리를 측정해보자

WIZnet Academy 2016.06.22 10:02 조회 수 : 34

arduino_ultra-1

이번에는 아두이노와 초음파 센서를 이용해서 거리를 측정해 보도록 하겠습니다.

초음파 센서란?

초음파란 사람의 귀에 들리지 않을 정도의 높은 주파수 (약 20 kHz 이상)의 소리를 말합니다. 이와 같은 특성을 이용한 것이 초음파센서로 음파를 쏘아올리고 반사되어 오는 음파까지의 시간차를 거리로 계산하여 측정하는 방식으로 동작됩니다.

초음파 거리 센서는 발신부와 수신부로 구성되며, 발신부는 함수 발생기에서 (+)와 전압을 번갈아 압전소자에 가해주면 압전소자의 변형에 의해 진동이 발생하고 진동에 의해 초음파가 발생하는 역압전현상을 이용합니다. 수신부는 발신부에서 발생한 초음파가 물체에 반사되어 돌아오는 파동에 의해 압전소자가 진동하고 진동에 의해 전압이 발생되는 정압전형상을 이용하여 반사되어 돌아오는 시간을 기초로 거리를 측정합니다.

초음파는 파장이 짧아 지향성과 직진성이 높으며 공기 중에서는 340m/s의 일정한 속도로 진행하는 특징을 가지므로 거리 측정을 위한 수단으로 많이 사용됩니다. 자동차의 후방 경보 시스템이 초음파를 이용한 대표적인 예에 해당한다고 볼 수 있습니다.

arduino_ultra-2

실습

이번 실습에는 HC-SR04라는 초음파 센서를 사용하겠습니다.

HC-SR04는 최대 4m까지 거리 측정이 가능하고 측정 각도는 약 15도 입니다. HC-SR04는 VCC, GND, Trigm, Echo 총 4핀으로 이루어져 있습니다.

Trig핀에 최소 10us의 펄스를 입력하면 Echo 핀으로 거리에 비례하는 펄스가 반사되어 돌아옵니다. 우리는 Trig 핀에 펄스를 입력한 시점에서부터 Echo 핀으로 펄스가 출력되는 시점의 시간만 알게 되면 거리를 측정 할수 있습니다.

회로는 아래와 같이 구성합니다.

arduino_ultra-3

실제 구성은 아래 사진과 같습니다.

arduino_ultra-4

코드는 아래와 같습니다.
const int trigPin = 2;    //Trig 핀 할당
const int echoPin = 4; //Echo 핀 할당

void setup()
{
Serial.begin(115200); //시리얼 초기화
Serial.println("Hello Arduino!!");

pinMode(trigPin, OUTPUT); //Trig 핀 output으로 세팅
pinMode(echoPin, INPUT); //Echo 핀 input으로 세팅
}

void loop()
{
long duration, distance; //기본 변수 선언

//Trig 핀으로 10us의 pulse 발생
digitalWrite(trigPin, LOW); //Trig 핀 Low
delayMicroseconds(2); //2us 유지
digitalWrite(trigPin, HIGH); //Trig 핀 High
delayMicroseconds(10); //10us 유지
digitalWrite(trigPin, LOW); //Trig 핀 Low

//Echo 핀으로 들어오는 펄스의 시간 측정
duration = pulseIn(echoPin, HIGH); //pulseIn함수가 호출되고 펄스가 입력될 때까지의 시간. us단위로 값을 리턴.

//음파가 반사된 시간을 거리로 환산
//음파의 속도는 340m/s 이므로 1cm를 이동하는데 약 29us.
//따라서, 음파의 이동거리 = 왕복시간 / 1cm 이동 시간 / 2 이다.
distance = duration / 29 / 2; //센치미터로 환산

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

delay(100);
}

이 코드에서는 pulseIn 함수와 반사된 음파의 시간을 거리로 환산하는 부분을 집중해서 확인합니다.

pulseIn 함수는 지정된 핀의 상태(HIGH 또는 LOW)가 되기를 기다렸다가 해당되는 상태가 되면 시간을 재기 시작하고, 핀의 상태가 바뀌면 시간 재기를 중지한 후 경과 시간을 마이크로 초로 반환합니다. 예를 들어 인수 값을 HIGH로 지정하면 핀의 상태가 HIGH가 되는 순간부터 측정하여 LOW가 될 때까지의 시간을 마이크로 초 단위로 반환합니다. 지정된 시간 동안 해당 펄스가 발생하지 않으면 0을 반환합니다.

음파의 속도는 약 340m/s이다. 그렇기 때문에 1cm를 이동하는데 약 29us가 걸립니다. 그러면 2cm를 이동하면 38us, 10cm를 이동하면 290us가 걸립니다. 우리는 pulseIn 함수를 이용해서 음파가 반사된 시간을 us 단위로 받았기 때문에, 그 값을 29로 나누게 되면 거리가 나오게 됩니다. ex) duration / 29

하지만, pulseIn 으로 받은 시간이 음파가 반사되어 돌아온 왕복 시간이므로 나누기 2를 하게 되면 정확한 물체의 거리가 나옵니다. ex) duration / 29 / 2

아래는 동작 영상입니다.