거실등이 고장나서 led 전등으로 바꿨더니 형광등보다 훨씬 밝고 좋더라고요.
그래서 멀쩡한 제 방 전등도 led 전등으로 교체했습니다.
일반 전등으로 교체하는건 재미 없으니까 뭐가 있을까 찾아보다가
리모컨으로 조종할 수 있는 전등을 발견했습니다.
편리하고 좋지만 치명적인 문제가 있는데, 바로 전용 리모컨이 있어야 한다는 것입니다.
주위에 리모컨이 없으면 찾으러 다녀야 하고,
그럼 움직이지 않고 전등을 조종한다는 무선 리모컨의 의미가 잃어버리게 되죠.
그래서 이번 프로젝트는
컴퓨터 앞에 앉은 채 바로 전등을 컨트롤할 수 있는 시스템을 개발해보기로 하였습니다.
큰 흐름을 미리 살펴보자면,
- 리모컨이 보내는 신호를 파악한다.
- 컴퓨터와 시리얼 통신이 가능한 IR 송신 모듈을 제작한다.
- PC 상에서 시리얼 통신으로 IR 송신 모듈에 신호를 보낼 수 있는 프로그램을 제작한다.
순서로 진행될 예정입니다.
1. 리모컨이 보내는 IR 신호 파악
1.1 IR 수신 회로
IR receiver circuit diagram
IR receiver circuit
IR 수광 모듈은 왼쪽부터 Vout, GND, VCC 핀으로 구성되어있습니다. Vout 핀을 아두이노 A0 핀에 연결합니다.
1.2 아두이노 코드
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include <IRremote.h>
const int sensor = A0;
IRrecv irrecv(sensor);
void setup() {
Serial.begin(9600);
irrecv.begin(sensor, ENABLE_LED_FEEDBACK);
}
void loop() {
if(irrecv.decode()) {
irrecv.printIRResultShort(&Serial);
irrecv.printIRSendUsage(&Serial);
if (irrecv.decodedIRData.protocol == UNKNOWN) {
Serial.println(F("Received noise or an unknown (or not yet enabled) protocol"));
irrecv.printIRResultRawFormatted(&Serial, true);
}
Serial.println();
irrecv.resume();
}
}
IRremote.h
라이브러리를 사용하여 IR 수신 코드를 작성하였습니다. irrecv.printIRResultShort()
는 IR 수신 데이터의 protocol, address, command, raw data를 serial 모니터 상에 출력합니다. irrecv.printIRSendUsage()
는 수신 데이터를 똑같이 송신할 수 있는 IRremote 함수를 알려줍니다. 만약 알 수 없는 protocol 데이터가 수신될 경우 예외 메시지를 출력합니다. 대부분 노이즈에 해당합니다.
1.3 결과
IR receive result
제가 사용하는 전등 리모컨은 NEC protocol로 통신한다는 것을 알 수 있습니다. address는 0xDEA8로 항상 동일하고, command는 버튼마다 다르게 나타납니다. 독특한 점은 버튼을 꾹 누르고 있으면 같은 신호가 연속해서 송신되는 것이 아니라, repeat하고 있다는 신호가 송신된다는 점입니다. IrSender.sendNEC()
함수를 이용해 통신할 수 있다는 사실까지 함께 알려주네요.
리모컨 버튼에 대응되는 command를 아래에 정리해 보았습니다.
버튼 | Command |
---|---|
On | 0xFF |
Off | 0x1 |
취침등(가장 어두운 등) | 0x6 |
20%/50%/100% 밝기 | 0xA |
1분 타이머 | 0x1A |
10분 타이머 | 0x16 |
20분 타이머 | 0x14 |
30분 타이머 | 0x8 |
20%/50%/100% 밝기 버튼은 처음 1번 시 20%, 2번 누를 시 50%, 3번 누를 시 100%, 4번 누를 시 20%… 방식으로 밝기를 전환할 수 있는 버튼입니다.
1.4 NEC protocol
NEC bit expression
NEC protocol에 대해 좀 더 자세하게 조사해보았습니다. 0
은 562.5us HIGH 뒤에 562.5us동안 LOW, 1
은 562.5us HIGH 뒤에 1687.5us LOW으로 표현합니다. Data frame은 그림과 같이 5 단계로 구성됩니다.
NEC protocol
- Start : 9ms동안 HIGH 이후 4.5m LOW
- Address : 8Bit Address Data
- Inverse address : 8Bit Inverse Address Data
- Command : 8bit Command Data
- Inverse command : 8bit Command Data
원 데이터와 반전된 데이터를 함께 송신하여 수신부에서 데이터가 제대로 수신되었는지 손실 여부를 파악하도록 합니다. 이럴 경우 0, 1 bit가 8개씩 일정하게 사용되므로 한 신호를 송신할 때 총 걸리는 시간이 67.5ms로 일정하게 유지됩니다.
NEC repeat protocol
데이터를 연속해서 송신하는 경우, Start 신호 이후 2250us동안 HIGH로 출력하는걸로 규정되어 있습니다.