ATmega128 적외선 리모콘으로 수신기 제어하기

2019. 7. 13. 17:15임베디드/ATmega128

적외선은 가시광선보다 파장이 길고, 마이크로파보다는 파장이 짧은 빛이다. 사람의 눈으로 확인할 수 없지만, 스마트폰 카메라로 확인할 수 있다. 가시광선의 붉은색 영역 바로 옆에 위치해 있어 붉은색의 빛을 볼 수 있다. 적외선을 이용하여 위조지폐 검출 혹은 리모콘 그리고 예전까지 적외선 통신으로 데이터를 전달하기도 했다. 10m 이내의 근거리 통신에서만 사용이 가능하며, 정해진 각도에서만 통신이 가능하고, 보안성이 우수하다는 특징이 있다

우리가 하려는 리모콘 통신에서는 940nm 부근의 적외선을 사용한다

먼저 아두이노로 실제 어떻게 이뤄지는지 확인하려고 한다. 아래는 단순한 적외선 LED로 빛을 쏘고, 수신기로 받는 코드다

 

 

적외선 리모콘을 사용한 코드 출력하기

 

 

 

 

리모콘의 버튼을 누르면 나오는 신호에 대해서 자세히 분석해보자. 리모콘은 초당 38,000회 깜빡거리면서 데이터를 전송한다. 디지털 제어 신호가 38KHz 반송파를 통해 변조되어서 전달된다. 실생활에서 38KHz 주파수 대역의 적외선은 거의 존재하지 않으므로 데이터 전달을 위해 사용하고 있다. 적외선 신호를 수신하는 수신기에서는 신호를 수신하고 반송파를 제거하여 펄스열로 바꾸는 역할을 한다. 따라서 그 펄스열을 분석해서 전달된 데이터 값을 읽을 수 있다

 

적외선 데이터 포맷을 알아보면 위에서 말했듯이, 펄스열로 바꾸는 방법은 여러 가지가 있는데 흔히 NEC 프로토콜을 사용한다. NEC 프로토콜은 펄스거리 인코딩(Pulse Distance Encoding) 방식을 사용한다

 

펄스 거리 인코딩은 상승 에지 사이의 시간을 통해 논리 0과 논리 1을 구별하는 방법을 말한다

 

https://www.sbprojects.net/knowledge/ir/nec.php

 

논리 0을 전달하기 위해서는 560us의 HIGH 값 이후 동일한 길이의 LOW 값을 전송한다. 반대로 1은 560us의 HIGH 값 이후 3배 길이에 해당하는 1.69ms LOW 값을 전송하게 된다

 

https://www.sbprojects.net/knowledge/ir/nec.php

 

비트 단위 데이터 이외에도 리모콘에서는 데이터의 시작을 표시하기 위해 특별한 신호를 전송한다. 데이터 시작을 표시하는 신호는 일반 데이터와 반복 데이터의 두 가지가 있다. 일반 데이터는 시작 신호 이후 4바이트의 데이터를 펄스 거리 인코딩에 의해 전송한다. 반면 반복 데이터는 리모콘에서 동일한 버튼을 계속 누르고 있는 경우 전송되는 데이터를 시작 신호 이후 하나의 펄스만이 전달된다

 

일반 데이터의 시작은 위와 같이 9ms의 HIGH 값 이후에 4.5ms의 LOW 값을 전송한다. 반대로 반복 데이터는 아래와 같이 일반 데이터와 똑같이 9ms의 HIGH 값 이후 2.25ms의 LOW 값을 전송하게 된다

 

반복 데이터 시작

 

그래서 NEC 프로토콜은 110ms을 주기로 데이터가 전달되게 된다. 데이터의 시작을 표시하는 부분을 리드 코드라고 한다. 이후 4바이트의 데이터는 2바이트의 커스텀 코드와 2바이트의 데이터 코드로 이뤄졌다. 이후 전송의 끝을 알리는 펄스가 하나 추가된다. 커스텀 코드와 데이터 코드의 2바이트는 각각 서로 반전된 값을 가진다. 따라서 두 바이트의 합은 반드시 0xFF가 된다.

 

 

그러면 AVR 코드를 작성하도록 할 것이다. 결국엔 적외선 수신기로 전달된 데이터에서 상승 에지에서 다음 상승 에지까지의 시간을 측정함으로써 구분할 수 있다. 주의해야 할 점은 우리가 사용하는 적외선 수신기에 들어가는 신호는 반전되어서 들어간다. 따라서 하강 에지 사이에서의 시간을 통해 측정해야만 한다

 

타이머는 1024분주를 사용해서 오버플로우가 생기기까지 약 16ms가 걸린다. 그런데 우리가 측정하려는 신호는 모두 16ms 안에서 모두 동작하기 때문에 오버플로우가 없어야만 한다

 

1024분주, 16MHz

 

 

깃허브주소: https://github.com/surinoel/avr/tree/master/irled/irled

 

[참고] 도서, ATmega128로 배우는 마이크로컨트롤러 프로그래밍