이 글에서는 TV나 에어컨과 같은 가전제품 리모컨에 사용되는 적외선 통신 프로토콜에 대해 다룹니다. 특정 가전제품에 대한 설명이 아닌, 일반적인 IR 리모컨의 신호 구성 이론에 대해 설명합니다. 각 가전제품별로 특화된 프로토콜에 대한 설명은 추후에 다루도록 하겠습니다.
※ 이 글에서 설명하는 신호는 적외선 송신부에서 보내는 신호를 나타냅니다. 즉, IRED가 어떻게 깜박이는지를 나타내며, 이는 적외선 수광 모듈의 출력 신호와는 다릅니다. 이게 무슨말인지 잘 이해가 안 간다면, 바로 전 글의 '적외선 수광 모듈' 섹션을 먼저 읽고 진행해 주세요.
Modulation Carrier
적외선 통신에서는 태양광이나 형광등으로부터 발산되는 적외선으로 인한 노이즈 효과를 제거하기 위해 전송할 신호를 Carrier에 싣는 Modulation과정을 거쳐서 송신합니다.
예를 들어, 보내고 싶은 신호가 다음과 같다면,
이를 다음과 같이 Modulation해서 전송합니다. 이는 적외선 송신시 IRED를 깜박이는 타이밍 다이어그램과 동일합니다.
조사해 본 결과, 가전제품용 IR리모컨에서는 38kHz(37.9kHz), 40kHz, 56kHz를 Carrier Frequency로 많이 사용합니다. 물론, 이 주파수는 절대적인 것이 아니고 대역폭(Bandwidth)을 갖기 때문에 주파수가 어느 정도 달라져도 무방합니다. 직접 실험해 본 결과, 삼성 벽걸이형 에어컨의 경우 38kHz를 사용하지만 30kHz~50kHz 범위에서도 수신 감도가 약간 떨어질 뿐 정상적으로 제어가 가능했습니다.
적외선 통신 프로토콜
적외선 통신에서 IRED를 통해 Carrier가 출력되고 있는 상태를 'Mark'(혹은 'Burst'), 꺼져 있는 상태를 'Space'라고 합니다. 적외선 통신의 Data Frame은 이 Mark와 Space의 교대로 이루어지며, (당연한 말이지만) 시작과 끝은 항상 Mark가 됩니다.
이 Data Frame을 구성하는 'Mark'들과 'Space'들의 길이(Duration)는 제조사와 리모컨마다 서로 다릅니다. 이는 같은 주파수의 Carrier를 사용하더라도 서로 다른 모델의 가전제품간에 혼선이 발생하지 않도록 하기 위함입니다. (에어컨 리모컨을 눌렀는데 TV가 꺼지면 난감하겠죠..?)
다음 Data Frame은 LG 에어컨 리모컨에서 송신된 IR 신호를 그대로 옮긴것이며, 천장형 에어컨을 {온도 16℃, 바람세기 3단}으로 제어하는 신호입니다.
▲ 적외선 통신 Data Frame 예시
Mark부분에 세로빗금을 쳐놓은 이유는 이 부분이 IRED가 계속 켜져 있는 것이 아니라, 앞서 설명한 Carrier Frequency로 계속 깜박이고 있음을 나타내기 위함입니다. (참고로, LG에어컨에서는 38kHz를 사용합니다.)
- Header Mark(8000㎲): Data Frame의 시작을 나타냅니다.
- Header Space(4000㎲): Data의 시작을 나타냅니다.
- Bit Mark(600㎲): Bit들을 구분합니다.
- Zero Space(550㎲): Bit '0'을 나타냅니다.
- One Space(1600㎲): Bit '1'을 나타냅니다.
※ 괄호 안의 Timing Parameter들은 LG에어컨에서만 유효합니다.
이 형태의 Data Frame은 LG에어컨 뿐만이 아니라 다른 가전제품에서도 공통으로 사용되고 있는 형태입니다. 다만, 앞서 설명했듯이 각 Mark들과 Space들의 길이 및 한 Data Frame에 포함된 Bit의 수는 제조사와 가전제품마다 모두 다릅니다.
따라서 MCU로 가전제품을 제어하기 위한 IR 리모컨을 구현하려면 해당 가전제품의 정품 IR 리모컨을 구해서 오실로스코프 등을 통해 이들 Timing Parameter들을 직접 찾아야 합니다. 물론, 찾아낸 Bit열에 포함된 의미를 해석하는 것은 또 다른 큰일입니다.
MCU로 적외선 리모컨 구현하기
MCU를 이용해서 IR 리모컨을 구현하는 데 있어 가장 중요한 것은 타이밍입니다. (인생은 타이밍)
기본적으로 Hardware Timer를 사용해서 Carrier Frequency의 PWM 파형을 생산해내도록 한 뒤, PWM 출력 핀을 ON/OFF하는 방식으로 Mark와 Space를 교대로 배치하여 Data Frame을 구성해야 합니다.
여기서 주의할 점이 있는데, Modulation Carrier는 가급적 Timer를 이용해서 만들어야 한다는 점입니다. 귀찮아서 Delay함수로 Carrier를 만들어내면 Carrier Frequency는 얼추 맞을지 몰라도, Delay함수의 오차가 누적되서 Mark의 전체 길이가 심각하게 달라져 버립니다.
위의 LG에어컨 Data Frame에서 8000㎲길이의 Header Mark를 예로 들자면, Carrier Frequency가 38kHz이므로 Header Mark 내에 약 304개의 Cycle이 존재하고, 한 Cycle은 ON과 OFF로 이루어지므로 Delay함수는 총 2*304=608번 사용되게 됩니다. 여기서 Delay함수의 오차가 1㎲라고 가정하면 본디 8000㎲여야 할 Header Mark가 608㎲늘어나서 8608㎲가 되어 버립니다. 수신측(에어컨 본체)에서는 Header Mark가 수신된 뒤 사전에 설정된 길이인지 여부를 검사하여 수신 여부를 결정하므로 이 Data Frame은 버려지게 됩니다. (만약 송신중에 인터럽트라도 끼어든다면..ㅁㄴㅇㄹ)
Timer를 이용해 Carrier를 만들어낸다면, Mark와 Space의 Duration은 다음과 같이 Carrier를 켜고 끄는 방식으로 제어해도 크게 문제가 되지 않습니다.
Carrier_ON(); Delay_us(8000); // Header Mark Carrier_OFF(); Delay_us(4000); // Header Space Carrier_ON(); Delay_us(600); // Bit Mark Carrier_OFF(); Delay_us(1600); // '1' Carrier_ON(); Delay_us(600); // Bit Mark Carrier_OFF(); Delay_us(550); // '0' ... Delay_us(1600); // '1' Carrier_ON(); Delay_us(600); // Bit Mark Carrier_OFF();
다만, 이 경우에도 중간에 인터럽드가 끼어들면 전체 Data Frame이 왜곡되어 전송이 실패하게 되므로 가급적이면 Delay를 사용하지 말고 Timer와 Interrupt를 이용해서 비동기식으로 전송하는 방법을 사용하는 것이 좋습니다.
- [적외선 통신] IR 송수신 소자, IR 송수신 회로 (25620)