일반적으로 로봇을 만들때 장애물 감지등을 위해서 적외선 센서를 많이 사용한다.
간단한 방법은 적외선 센서의 발광부에서 반사된 빛이
반사되어 돌아오는 양을 측정하는 방법이다.
적외선 센서 수광부는 되돌아온 빛의 세기에 비례하는 전압이 출력되므로
그것을 OP-AMP를 이용하거나 마이컴으로 ADC를 하면
장애물의 유무, 거리등을 판단할수 있다.
그러나 빛의 반사는 반사면의 상태에 따라 많은 차이가 나게 되므로
반사되는 곳의 상태에 따라 돌아오는 광량도 차이가 나고 정확한 거리 측정은 불가능하다.
그러나 이 샤프 적외선 센서는
빛을 보내고, 그 빛이 반사되어 돌아오는 각도를 측정한다.
삼각측량과 비슷한 방법이라고 하겠는데
따라서 반사면의 상태에 상관없이 매우 정확한 거리 측정이 가능하다.
http://www.automation.co.kr/sharp/index.html
이곳을 보면 여러가지 샤프 적외선 센서가 나온다.
측정 거리에 따라 나뉘어져 있고,
출력이 아날로그 값으로 나오는 것과 추가적으로 거리에 따라 LED를 켤수 있는 것도 있다.
(내부적으로 OP-AMP를 사용했을것으로 생각된다.)
사용방법은 간단하다..--;
핀이 3개인데..(3개가 넘는 모델은 다른 기능이 있는것이다. 사용여부에 따라 알아서..)
하나는 VCC, GND, 출력이다.
VCC와 GND를 연결하고, 출력은 ADC가 가능한 포트에 연결해야 한다.
즉 100cm 일때는 3v, 5m일때는 0.65볼트 정도 된다고 생각이 된다.
이걸 마이컴에서 어떻게 계산하느냐...
일정 범위를 나누어서 각 구간별로 식을 세워주면 된다.
그림에서 처럼 1미터 간격정도로 나누어
전압에 따라 1차식을 만들어 사용하면 된다.
그래프에서 보는 것처럼 가까운 거리보다 먼 거리에서 정밀도가 떨어지게 된다.
(근데 이거 보다 보니 오래된 카메라용 거리계로 쓰면 딱이겠다는 생각이 든다.... )
원래는 거리 구하는 식까지 들어간 소스를 올릴려고 하였으나 찾기가 귀찮아서
그냥 기본적으로 거리에 따라 AVR에서 AD 컨버팅하여 전압값만 출력되는 소스에서 필요한 부분을 찾아서 올린다.
(AVR ATMEGA 128 소스임)
ADC0 - 온도센서
ADC1 - 거리 측정 센서
//기본 ADC 설정 부분
ADMUX = 0x00 ; //ADC0, ADC1 사용 (순차적 설정)
ADCSRA = 1<<ADEN | 1<<ADPS0 | 1<<ADPS1 | 1<<ADPS2 ;
//AD시작하는 부분(main 함수에 있음)
ADCSRA = ADCSRA | 1<<ADSC; //ADC를 시작하고
sensor_check(); //ADC 처리 함수를 호출
//AD완료 체크 및 결과값 저장
void sensor_check(void){
u16 temp=0;
while((ADCSRA & 0x10) != 0x10); //ADC가 완료될때까지 기다린다.
temp = ADCL;
temp = temp + (ADCH <<8); //ADC는 하위 8비트 상위 8비트로 나뉘어 저장되므로 하나의 변수로 합쳐준다.
switch (adc_num){
case 0:
temp = (temp /2) -5 ; //각 변수에 저장.
temp_sensor = temp; break;
case 1:
range_sensor = temp; break;
}
adc_num++;
ADMUX = adc_num%2; //ADC할 채널을 정한다. 여기는 0, 1만 사용한다.
//TX_sensors();
}
ADC는 여러개의 핀을 가질수 있으나 ADC 컨버터 자체는 하나이므로 어떤 핀(채널)을 ADC할지를 결정하고
ADC를 시작하고,
ADC가 완료되면 ADC결과값이 저장된 레지스터를 읽으면 끝이다.
대체로 ADC에 문제가 있을경우는 다음과 같다.
1. ADC용 레퍼런스 전압 설정이 잘못된 경우. - ADC의 기준 전압이 내가 사용할 ADC 범위에 맞게 결정되어야 한다.
2. 셋팅이 잘못된 경우. - ADC 완료 인터럽트를 사용하거나 사용하지 않거나에 따라 레지스터를 주의해서 설정해야 한다.
'로봇 만들기 - AVR > 센서' 카테고리의 다른 글
COMFILE ACODE-300A (0) | 2006.08.22 |
---|---|
128 ADC 관련.. (0) | 2006.08.06 |