이번에는 아두이노와 초음파 센서를 이용해서 거리를 측정해 보려고 한다.

초음파 센서란?

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

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

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


<실습>

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

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

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

이제 시작해 보자!! 회로는 아래와 같이 구성했다. 

실제 구성은 아래 사진과 같이 구성 했다.

코드는 아래와 같다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
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);
}
cs

이 코드에서는 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

동작영상은 아래와 같다. 동영상을 잘 찍고 싶었지만.....이 정도면 만족 하려고 한다.


<출처>

아두이노 상상을 츠케치 하다 - http://cafe.naver.com/sketchurimagination

개인 블로그 - http://creamp.tistory.com/entry/Galileo-%EC%B4%88%EC%9D%8C%ED%8C%8C%EC%84%BC%EC%84%9C-%EC%82%AC%EC%9A%A9%ED%95%98%EA%B8%B0

아두이노 쌩초보 무조건 따라하기 - http://cafe.naver.com/myarduino/504



+ Recent posts