아다프루트 IR LED 950nm (Adafruit LED - Infrared 950nm) × 1
아두이노 우노 (Arduino UNO) × 1
틴지 3.1 (Teensy 3.1) × 1
마이크로칩 ATmega328 × 1
마이크로칩 ATtiny85 × 1
에스프레시프 ESP8266 ESP-01 × 1
블루즈 DK (Bluz DK) × 1
레드베어 듀오 (RedBear Duo) × 1
앱 및 온라인 서비스
포터 (porter)
프로젝트 소개
얼마 전 에어컨 적외선 리모컨을 디코딩하여 와이파이로 에어컨을 제어하려는 목적으로 이 작업을 시작했습니다.
그 과정에서 많은 것을 배웠고, 그 지식을 여러분과 공유하여 향후 프로젝트에 도움이 되길 바랍니다(미래의 저도 포함). 파티클 포톤을 사용했지만, 이 프로젝트에서 사용하는 Ken Shirriff의 IRremote 아두이노 라이브러리는 다른 MCU도 많이 지원합니다. 공식 페이지도 참고하세요.
그 페이지에 많은 정보가 있으니, 적외선 신호가 어떻게 작동하는지 깊이 이해하려면 꼭 읽어보세요. 하지만 중요한 점들은 다음 섹션에서 정리하겠습니다.
IR 코드에 대한 배경 지식
다음은 작성자의 원본 글을 옮긴 것입니다:
IR 리모컨은 LED를 특정 패턴으로 켜고 끄는 방식으로 작동합니다. 그러나 햇빛이나 조명 같은 IR 소스로부터 간섭을 방지하기 위해 LED를 꾸준히 켜는 대신 변조 주파수(일반적으로 36, 38, 또는 40kHz)로 켜고 끕니다. 변조 신호가 전송되는 시간을 '마크(mark)', LED가 꺼진 시간을 '스페이스(space)'라고 부릅니다.
리모컨의 각 키에는 특정 코드(일반적으로 12~32비트)가 연결되어 있으며, 키를 누르면 이 코드를 브로드캐스트합니다. 키를 누르고 있으면 리모컨은 보통 키 코드를 반복 전송합니다. NEC 리모컨의 경우 키를 누르고 있으면 코드를 반복 전송하는 대신 특수한 반복 코드를 전송합니다. 필립스 RC5 또는 RC6 리모컨의 경우 키를 누를 때마다 코드의 한 비트가 토글되며, 수신기는 이 토글 비트를 사용하여 키가 두 번째로 눌렸는지 판단합니다.
수신 측에서 IR 검출기는 이 신호를 복조하여 신호 수신 여부를 나타내는 로직 레벨 신호를 출력합니다. IR 검출기는 송신기의 주파수와 일치할 때 가장 잘 작동하지만, 실제로는 크게 중요하지 않습니다.
이제 다음 단계로 넘어갈 준비가 되었습니다...
IR 수신 회로 구성하기
적외선 신호를 디코딩하려면 적외선 수신 다이오드가 필요합니다:
라이브러리에 명시된 대로 수신 회로를 구성합니다:
핀아웃은 다음과 같습니다:
제 브레드보드는 이렇게 되었습니다:
지금은 수신 다이오드(검은색)에만 집중하고 송신기(투명한 것)는 나중에 다루겠습니다.
IR 신호 디코딩하기
프로젝트가 수신된 코드를 시리얼 라인으로 덤프하므로 컴퓨터에 연결해야 합니다. USB 케이블로 포톤에 전원을 공급하고 컴퓨터의 USB 포트에 연결합니다. 지금이 첨부된 펌웨어를 플래싱하기 좋은 시점입니다.
이 숫자들은 마이크로초 단위의 적외선 펄스 지속 시간을 나타냅니다. 원한다면 다음 코드로 이 명령어를 전송할 수 있습니다:
function sendIt() {
unsigned int ircommand[59]={8550,4000,550,1500,550,450,550,500,500,550,500,1550,500,500,500,500,550,500,500,500,550,500,500,500,550,500,500,1500,550,500,500,500,550,500,500,500,550,450,550,1500,550,1500,550,500,500,1500,550,500,550,1500,500,500,550,500,500,500,550,450,550};
irsend.sendRaw(ircommand,59,38);
}
하지만 그러려면 송신 회로가 필요합니다. 다음에 만들겠습니다.
IR 송신 회로 구성하기
가장 간단한 회로는 다음과 같습니다:
하지만 이 회로는 1미터 미만의 범위만 제공합니다.
가능하다면 아래 회로처럼 배선하여 범위를 개선하세요(약 10미터):
제 회로의 송신 측은 이렇게 생겼습니다:
IR 송신 회로 테스트하기
펌웨어에 삼성 TV 볼륨을 제어하는 함수 두 개를 추가했습니다. 주변에 삼성 TV가 있다면 송신 회로가 작동하는지 테스트할 수 있습니다.
송신 LED를 TV에 대고 sendSamsungVolumeUp()과 sendSamsungVolumeDown() 함수를 실행하세요.
참고: 휴대폰 카메라로 IR LED가 송신 중인지 확인할 수 있습니다. 카메라에서 IR이 보이기 때문입니다:
IR 명령어를 더 읽기 쉽게 만들기
500μs 근처 값을 0, 1500μs 근처 값을 1로, 5000μs 이상을 3, 4000μs 근처를 2로 임의로 매핑하면 다음과 같은 표현이 됩니다: