검색결과 리스트
글
1. 초음파센서란?
초음파란 사람의 귀에 들리지 않을 정도로 높은 주파수 (약 20 kHz 이상)의 소리를 말한다. 이와 같은 특성을 이용한 것이 초음파센서로 음파를 쏘아올리고 반사되어 오는 음파까지의 시간차를 거리로 계산하여 측정하는 방식으로 동작된다. 이번에 실습해볼 예제는 HC-SR04라는 초음파센서를 활용하여 거리를 측정하는 것이며 이를 통해 초음파센서의 기초 원리를 이해하고 갈릴레오보드의 활용법을 숙달한다.
동작 전압 | 5V | |
동작 전류 | 15mA | |
동작 주파수 | 40Hz | |
발생 주파수 | 40kHz | |
측정 거리 | 최대 4m | |
측정 각도 | 15도 |
2. 동작 원리
초음파센서는 두 개의 눈으로 구성되어 있으며, 하나는 초음파를 발생시켜 송신(Trig)하는 기능을 수행하고, 나머지 하나는 송신된 초음파의 신호를 수신(Echo)하는 기능을 수행하게 된다. 따라서 두 개의 눈이 서로 송신하고 수신되는 시간의 차이에 따라 물체와의 거리를 계산하는 방식으로 동작하며 주파수가 높은 만큼 파장이 매우 짧기 때문에 거리 방향의 분해력이 우수하고 정밀도가 높은 계측을 할 수 있다. 이러한 센서의 원리 때문에 거리감지센서나 레인지센서라고도 불린다. HC-SR04 초음파센서의 경우에는 4개의 핀으로 구성되어 있으며 각각 순서대로 Vcc, Trig, Echo, Gnd 이다.
3. 준비물
갈릴레오보드, HC-SR04, 브레드보드, 점퍼선
4. 회로도
Vcc부분에 5V의 전원을 인가하고 Gnd끼리 연결해준다. 그리고 D2와 D3를 각각 echo와 trig순으로 연결하면 기본적인 회로 구성이 완료된다.
5. 동작 방법
동작 설명에 앞서 어떤 보드를 사용하여 회로를 구성할 것인가가 중요하다. 필자는 초기의 갈릴레오보드1을 사용하였는데 처음에 초음파센서를 활용한 결과값이 제대로 나오지 않아 많은 시간을 허비했다. 분명 센서는 문제가 없었으며 코드 부분도 이상이 없음에도 불구하고 결과가 0m를 보여주는 현상이 일어났다. 때문에 보드에 무엇인가 문제가 있다고 판단하여 갈릴레오보드의 데이터시트를 확인해 보았는데 여기서 문제를 발견할 수 있었다. 바로 갈릴레오보드의 초기 모델은 GPIO핀의 동작주파수 범위가 매우 낮기 때문에 초음파센서에 나오는 출력 주파수 40kHz를 보드 자체에서 읽지 못하여 0m가 계속해서 나타나는 것이었다.
이러한 문제는 의외로 단순하게 해결할 수 있는데 갈릴레오보드에서는 동작주파수 범위가 큰 Fast I/O 핀이 따로 설정할 수 있다. 여기서는 D2와 D3핀이 해당되며 해당 핀을 사용하고 pinMode()함수를 사용하여 기존의 입력이나 출력을 INPUT_FAST나 OUTPUT_FAST로 설정하면 큰 주파수 범위의 출력에서도 무리없이 사용할 수 있다. 위 문제는 갈릴레오보드 초기모델에서만 나타나며 갈릴레오보드2나 아두이노보드에서는 동작주파수 범위가 넓기 때문에 문제없이 동작하여 굳이 Fast I/O를 사용할 필요가 없다.
동작 방법은 앞에서 설명했던 초음파의 원리를 응용한 것으로 센서에서 음파를 발생시키고 물체에 반사되어 되돌아오기까지의 시간을 측정하여 거리로 표시해주는 방식이다. 여기에서 중요한 역할을 하는 것이 바로 pulseIn() 함수이다. 이 함수는 해당 출력이 HIGH나 LOW가 되는 순간까지의 시간을 계산해주는 함수로서 초음파센서의 음파가 되돌아오는 시간을 계산해주는 역할을 한다. 또한 밑의 소스코드에서 pulseIn()함수로 측정된 값을 58로 나누어주고 있음을 알 수 있는데 그 이유는 소리의 속도가 대략 340m/s 이기 때문에 1cm를 이동하는데 걸리는 시간이 29.155 마이크로초가 된다. 따라서 측정된 시간 값은 음파가 갔다가 되돌아오는 시간이기 때문에 2로 나누어주고 여기에 방금 계산한 29.155를 다시 나눠주게 되면 우리가 원하는 거리의 값을 나타낼 수 있다.
6. 소스 코드
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | #define trig 3 // trig 단자를 Digital 3번 단자에 연결 #define echo 2 // echo 단자를 Digital 2번 단자에 연결 long duration, distance; void setup() { Serial.begin (9600); // Serial 통신 pinMode(trig, OUTPUT_FAST); // trig 단자를 빠른 출력모드로 설정 pinMode(echo, INPUT_FAST); // echo 단자를 빠른 출력모드로 설정 } void loop() { digitalWrite(trig, LOW); // Trig 단자 LOW로 설정 delayMicroseconds(2); digitalWrite(trig, HIGH); // Trig 단자 HIGH로 설정 delayMicroseconds(10); digitalWrite(trig, LOW); // Trig 단자 LOW로 설정 duration = pulseIn(echo, HIGH); // pulseIn 함수 호출 distance = duration / 58; // 반환값을 cm로 단위 변환 Serial.print(distance); // 거리 표시 Serial.println(" cm"); delay(1000); } | cs |
6. 결과 화면
'Electronic > Arduino' 카테고리의 다른 글
지그비 무선 통신하기 (13) | 2016.01.26 |
---|---|
XBee 모듈 정보 및 종류 (0) | 2016.01.17 |
지그비 통신의 개념 (네트워크의 이해) (8) | 2016.01.16 |
RECENT COMMENT