본문 바로가기

AVR 8BIT/적외선센서를 이용한 문자찍기!

적외선통신을 이용한 문자찍기!!

안녕하세요 숭덕이 박제현입니다. 오랜만에 이렇게 글을 쓰는거 같네요 !!!
음 일요일날은 IR센서를 이용한 통신을 할 건데요 !! 간략하게 설명만 하고 일요일날 자료를 올리겠습니다.
많은 자료조사와 테스트는 해보지 않았으나 리모콘 수신용이면 발광부에 케리어만 실어주게 되면 데이터전송이 가능할거
같아 이렇게 구매를 해서 테스트 해볼 예정입니다. 빨리 테스트 해보고 싶지만 졸리네요 !!!!!!!



수광부(603LM)


발광부(CL-1L5)




                   출처 : http://www.devicemart.co.kr/mart7/mall.php?cat=049001000&query=view&no=6900


                                                                    603LM
                출처 : http://www.devicemart.co.kr/mart7/mall.php?cat=049001000&query=view&no=6899

                                                                  
                                                                        CL-1L5R

ADC 계산
16Mhz / 128 분주 = 125kHz
1 / 125000 = 0.000008 = 8us

채널0 을 가정해서 A/D한다면 최초에 25클럭이 소요되고 그 이후 13클럭이 되므로
( 25 + 13 ) * 8 = 304us

UART 계산

1/9600bps = 1.041666667

start(1bit) + data(8bit) + stop(1bit) = 총 10bit
1.041666667 * 10bit = 0.001041666667

2byte 전송시
0.001041666667 * 2 = 0.0020833333...

답은 : 2.0833333333ms


-----------------------------------------------------------------------------------------------------
자 저는 리모콘형식의 수광부와 발광부를 구매했고 38khz의 주파수로 테스트를 해보겠습니다.

38khz일떄 펄스 1개는 약 26us 나옵니다.

16Mhz / (1+410) = 0.0000256878 = 26us

1 / 0.0000256878 = 38khz 입니다. 계산은 다 나온거 같네요!!!

저도 처음으로 적외선통신을 해보는것이라 방식이 어려운거 같기도 하네요

일단 집에 가서 납땜 후 테스트까지는 몰라도 한번 해보겠습니다.

발광부에 트랜지스터를 사용해야하는데 그렇게 안하고 거리가 가까운곳에서 테스트 예정이기 떄문에

트랜지스터 없이 그냥 직렬로 연결해서 테스트하겠습니다.

일단 CP2102로 USB to Serial로 적외선통신값을 컴퓨터 하이퍼터미널에 찍기 위한 회로도 입니다.




 자 LED는 적외선통신시 CP2102를 통해 키보드로 1번을 눌렀을 시 적외선센서로 통신을 통해 반대편에 있는 LED로 수신을
 표시하기 위한 장치로 회로를 구성하였습니다.


아래 그림은 PB5포트에서 38khz PWM파형이 나오며, TX단자에서 데이터를 싫어주고 발광부로
내보내게 된다.


PB5와 TX단자를 NOR 했습니다. 둘 다 LOW 일때 HIGH가 출력이 되므로 LED에 PW ON이 됩니다.
RS-232 TX 파형은 아래 그림과 같이 LOW일때 데이터출력이 됩니다.




아래 그림은 위에 그림과 같은 건데 PB5와 TX단자를 NOR 했을 2포트의 입력이 LOW일때, 출력은 HIGH가 출력이 됨으로써
LED PW ON 이 됩니다.



수광부 603LM은 38khz의 Frequency를 가지고 있으며, Supply Voltage는 5.5V 이다.
이 단자는 RX에 물려서 TX에 나온 데이터 38khz를 갖는 데이터를 받아 처리한다.




2011년 8월 5일 새벽 12:26분 오늘은 흠냥 부품이 많이 없던 탓인지 휴 잘안되네!!! TX보내기 귀찮아서 while문안에
TX통신함수를 사용하여 1 ~ 4까지 반복문을 돌리고 수광부에서 1,2,3,4를 체크해서 LED 불키는것을 하는데 흠냥..
수광부 이놈의 시키가 왜 반응을 안하지 ㅡㅡ;;; 내일은 필히 2개의 과제를 끝내고 ARM과제를 하겟엉 기다려라...


 




 



603LM은 37.9khz의 주파수만 감지하는것이 아닙니다. 다른 주파수도 감지하지만 37.9khz에 대해서 감도가 제일 크다는것을 의미합니다. 적외선센서를 사용하면 발광부에서 수광부로 데이터를 전송하는데 대기중의 노이즈가 섞여 수신이 될 수도 있습니다. 이러한것을 조금이나마 줄이기 위해 발광부에 특정 주파수를 보내게 됩니다. 이러한 과정을 인코딩이라고 하며 또한 펄스파를 캐리어라고 부른다고 합니다. 저는 37.9khz를 사용했기때문에 1초에 37900번의 일정한 펄스파를 발광부에서 쏘게 됩니다. 
이 센서는 Band Pass Filter로 설계된 센서로 캐리어주파수는 증폭을 하고 그 외에 주파수는 증폭률이 캐리어주파수보다 작게 설정되어 있어 노이즈를 필터링에 용이 합니다.


 


 

 드디어 다했군요!!!! 일찍 퇴근 후에 바람 좀 쐬고 여유롭게 놀다가 10분만에 뚝!!!!!!!쿄쿄쿄 LED 한개가 DIE ^^
CP2102칩을 안가져와서 그냥 TX에 임의에 값을 넣어주고 쏴주었습니다. 지갑으로 가렸을때 LED가 멈추는것을 볼 수있습니다. LED가 멈추면 발광부에 캐리어를 싫어서 보내도 수신부에서 받지를 못하면 쓰레기값이 됩니다. 지갑을 치우는 순간 1초에 LED가 한칸씩 움직입니다.
                  

#include 
#include  

char rx; interrupt [USART0_RXC] void usart0_rx_isr(void)
{    
	rx=UDR0;     
	if(rx=='2')PORTB=2;    
	if(rx=='3')PORTB=4;    
	if(rx=='4')PORTB=8; 
} 

void TX0_CHAR(char Sdata){ while(!(UCSR0A&0x20)); UDR0=Sdata; } 

void main(void)
{    
	UCSR0A=0; UCSR0B=0x98; UCSR0C=6; UBRR0H=416/256; UBRR0L=416&0xFF;  //2400     
	DDRB=0xff; OCR1A=210;    
	TCCR1A=0x40; TCCR1B=9; TCCR1C=0x80;     
	#asm("sei")    
	
	while(1)
		{       
		TX0_CHAR('2');     delay_ms(1000);   
		TX0_CHAR('3');      delay_ms(1000);  
		TX0_CHAR('4');     delay_ms(1000);           
		}
}