※이번에는 ATMEGA에 초음파센서를 연결해서 거리를 측정한뒤 LCD로 뿌려주는 것에 대해서 알아보도록하자.
일단 모양은 위와같이 생겼다. 그리고 해당 센서의 스펙은 아래와 같다.
(http://eleparts.co.kr/front/productdetail.php?productcode=005035002004000009&sort=) 참고했다.
-입력전압 : +5VDC
-소비전류 : 4mA Typical
-주파수 : 40Khz(초음파센서이니 40Khz의 주파수(초음파)를 사용한다는 의미이다.)
-최대 측정거리 : 4M
-최소 측정거리 : 1cm
-모드 : mode 1 => SRF04 모드 (Input핀과 Output 핀이 분리됨)
mode 2 => Single Pin Mode (Input핀과 Output 핀을 공유함) -> SRF05의 특징임
-입력신호 : 10usec의 TTL High Pulse
-에코펄스신호(출력되는 신호) : Positive TTL level Signal(측정거리에 따라 Pulse Width가 달라짐)
-크기 : 43 * 20 * 17mm
-초당 측정횟수 : 약 20회/sec (한번측정에 최대 50msec 소요)
일단 위와 같은데 중요하게 생각할 것이 cm 단위로의 측정이 가능하다는 것이다.
물론 계산하기에 따라서 mm 단위도 가능할 수도 있겠으나 스팩에서 사용하는 단위는 Cm와 inch 단위 이다.
자이제 본격적으로 내용을 살펴보자.
1) Trigger Input 핀에 10usec의 High Pulse를 출력해준다(첫번째 펄스 그림)
2) 10usec 의 펄스를 입력해 주게 되면 2번째 펄스 그림과 같이 8 싸이클의 초음파(40khz)가 발생된다.
즉, 10usec의 High 펄스가 초음파를 쏴라~! 라고 명령을 주게 되는 것이다.
3) 이렇게 초음파가 출력되고 물체에 부딪쳐서 반사되어 다시 센서로 되돌아 오게 되면 Echo Output 핀쪽에서
해당 거리에 따라 High Pulse가 출력되게 된다. 즉, 측정된 거리에 따라 High Pulse의 Width가 달라진다.
위의 그림에 따르면 100usec ~ 25msec까지 출력되고 30msec가 넘어가면 물체를 감지하지 못한것으로
간주한다고 나와있다(Time OUT이라는 의미임)
따라서 우리는 이렇게 출력되는 High Pulse의 Width의 시간폭을 알아내면 측정거리를 알 수 있다.
4) 펄스 폭에 대해 거리 계산을 하는 방식은 데이터 시트에 아래와 같이 나와있다.
The SRF04 provides an echo pulse proportional to distance. If the width of the pulse is measured
in uS, then dividing by 58 will give you the distance in cm, or dividing by 148 will give the distance
in inches. uS/58=cm or uS/148=inches.
: 위의 글에 따르면 58usec = 1cm 이고 148usec = 1inch 로 계산하라고 나와있다.
즉, Cm 단위를 사용하기 위해 출력되는 펄스의 시간적 폭을 58usec씩 구분하면 된다.
아래의 그림은 xls을 이용해서 해당 펄스폭의 거리를 구할때 쓰는 시간을 계산한 식이다.
#define TRI_PORT PORTA
#define TRI_DDR DDRA
#define TRI_PIN 7
#define TRI_H (TRI_PORT | (1<<TRI_PIN)) //HIGH
#define TRI_L (TRI_PORT & (~(1<<TRI_PIN))) //LOW
#define ECHO_PIN INT6
▶먼저 Trigger를 PORTA의 7번 PIN에 연결하고자 하기때문에 헤더파일에 위와같이 define해준다.
그리고 TRI_H와 TRI_L는 PORT 7을 사용여부에 따라서 High값과 Low값을 주는 공식을 define해둔것이다.
그리고 Trigger 8 cycles sonic buster되고 센서에서 해당 거리만큼 즉 펄스폭을 계산해주는 끝나는 시점 즉 Falling Edge타이밍에 인터럽트를 걸어주기 위한 INT핀이며 우리는 6번 핀을 사용하고자 한다.
#include "USONIC.h"
void Usonic_INIT(void)
{
Usonic_INIT_PIN();
Usonic_INIT_Timer();
}
void Usonic_INIT_PIN(void)
{
//DDRA를 High를 바꿈
TRI_DDR = TRI_DDR | (1 << TRI_PIN);
TRI_PORT = TRI_L;
}
void Usonic_INIT_Timer(void)
{
}
▶먼저 Init 부분이다. Usonic_INIT함수를 이용해서 사용 Triger와 연결된 7번핀을 활성화 시켜주는 코드이며 현재 타이머는 설정하지 않은 상태이다.
void Usonic_INIT_INT(void)
{
cli(); //모든장치들의 INT를 초기화 시킨다.
EICRB = EICRB |(1<<ISC61)|(0<<ISC60); //하강엣지 Falling Edge
EIMSK = EIMSK |(1<<ECHO_PIN);
}
void USonic_Trigger(void)
{
volatile unsigned int uiCnt;
TRI_PORT = TRI_L; // 다른값이 들어가는 것을 방지한다.(한번더 LOW)
DELAY(60000);
TRI_PORT = TRI_H; //Trigger ON
DELAY(60000);
TRI_PORT = TRI_L; //Trigger OFF
}
▶Usonic_INIT_INT 함수는 하강엣지에 INT가 걸리도록 셋팅하는 함수이며 사용핀은 6번핀으로 설정했다.
Usonic_Trigger함수는 Trigger을 ON/OFF해주는 함수이며 delay값을 넣음으로써 센서가 작동되는 시간에 Term을 넣은 것이다.
※참고사항
→초음파센서라는 것 자체가 음파의 반사를 이용하는 것이므로 주변의 환경이 시끄럽거나 하게 되면 신호에 노이즈가 타게되면서
거리측정의 오차가 더욱 심해질 우려가 있따는 것을 주의해야한다.
추가적으로 반사되는 물체에 따라서도 측정거리가 달라질 수 있으니 되도록 반사되는 물체는 반듯한면이 되는 물체와 거리를 측정하는 것이 좋다.
최대 측정거리도 실제로 하면 2M가 넘게되면 정확도가 떨어지게되며 되도록이면 1M이내의 거리에서 측정하는 용도로 사용하는 것이 좋다.
'코스웨어 > 14년 스마트컨트롤러' 카테고리의 다른 글
20140520 일일업무일지 9번 김해성 (11) | 2014.05.20 |
---|---|
2014.05.19 김진철 업무일지 [번호 8] (12) | 2014.05.19 |
20140516 김재성 업무일지 7번 (16) | 2014.05.16 |
2014.05.16 ATmega128 SRF05(초음파센서)를 이용한 거리 측정 (0) | 2014.05.16 |
2014.05.14 업무일지 출석번호 5번 김상엽 (9) | 2014.05.15 |
2014 / 5 / 13 화요일 출석번호3번 김대희 (12) | 2014.05.13 |
2014년 5월 12일 업무일지 고한솔 [출석번호 2번] (12) | 2014.05.12 |
Turbo c에서 한글 깨짐 해결하기 (1) | 2014.05.12 |