본문 바로가기
아두이노 센서

[센서/IR] 가장 저렴한 통신방식인 IR(적외선) 리모콘을 아두이노(Arduino)로 해킹 해보자

by 작동미학 2015. 2. 6.
반응형

집안의 가전 리모콘을 복사하여 아두이노로 해당 리모콘을 에뮬하기

 

▶ 이 가이드를 따라하면,

- 적외선(IR) 통신 송신과 수신을 이해하고 구현할 수 있다

- 주변의 알려진 표준을 사용하는 리모콘을 복제하여 제어할 수 있다.

 

▶ 먼저 읽으면 좋은 글

- 라이브러리 설치 방법 : http://bbangpan.tistory.com/1

 

▶ 부품 설명 및 회로 구성

적외선 LED와 수신 회로를 통해 간단하게 적외선 리모콘을 아두이노로 쉽게 해킹할 수 있다(부품 가격도 잘하면, 2천원 안에서 구성이 가능하다). IR 통신에 대한 표준 몇가지가 공개되어 있고 이를 수신 및 송신할 수 있는 라이브러리도 존재해서 이를 활용하면 된다. 이를 위한 IR신호 수신 및 송신 회로도, 부품들은 아래와 같다. (부품소개 및 구매 : http://www.artrobot.co.kr/front/php/product.php?product_no=426 , 개별 부품을 타 사이트에서도 주문 가능하다.)

여기서는 간단히 리모콘 신호를 캡춰하기 위하여 상기 그림의 적외선 신호 수신회로를 먼저 구성해보자.

<수신회로 구성/5V,GND,D11 세 종류 핀을 연결한다>

<부품 및 연결 회로도/robobob.co.kr 발췌>

 

상기 배선은 IRremote 라이브러리 사용을 가정하였다. 이후 캡춰 완료 후 송신하기 위한 환경은 아래와 같이 구성한다.

<송신회로 구성/D3(PWM)에 IR LED를 연결한다>

이제 수신 회로구성한 것으로 리모콘의 신호를 캡춰하고, 송신 회로로 이 캡춰한 신호를 보내 실제 리모콘이 복제되는지 확인하자.

회로 구성시 IR LED는 다리가 긴 쪽이 (+)임을 주의한다.

 

▶ 소스 코드 입력 및 구동

라이브러리는 IRremote: https://github.com/shirriff/Arduino-IRremote 를 사용한다. Arduino 기본 IDE 강좌(http://bbangpan.tistory.com/1 )를 참조로 해당 라이브러리 zip을 다운받아 아두이노설치폴더/libraries/IRremote/* 에 해당 소스들과 examples폴더가 위치하도록 한다.

이렇게 설치한 후 Sketch를 재시작하면 해당 라이브러의 예제코드를 사용해볼 수 있다. 아래 화면을 참조하여 예제코드 중 IRrecvDump를 선택해서 실행하자. 그러면 다양한 종류의 리모콘 신호를 받아 화면에 출력해볼 수 있다.

<수신회로 구성 후 예제/IRremote/IRrecvDump선택 후 컴파일/업로드>

이렇게 구동하고 나서 Sketch->도구->시리얼 모니터를 수행하고 집안의 리모콘 중 적당한 것을 가져다 눌러서 신호를 캡춰해본다. 여기서는 올레TV 셋탑 리모콘을 한번 해보았다. 대개 TV리모콘 등은 모두 작동하고, 에어컨은 자체 표준을 따를 수도 있어 작동하지 않을 수 있다.

<올레TV 셋탑 리모콘의 전원 버튼 누를시 모습/ 셋탑과 TV전원 켜는 2개 신호를 내보낸다>

<사용한 리모콘 모습/빨간 단추를 눌렀다>

상기와 같은 방법으로 해당 리모콘 모든 버튼의 코드를 발췌할 수 있다. 중요한 것은 실제 코드와 방식, 코드 길이로서, 이 경우는 NEC방식, 32bits 길이, 20DF10EF 혹은 9CA800FF임을 알 수 있다.

이를 에뮬하기 위한 송신회로를 위한 소스 코드는 아래와 같다. 상기 전원부 제어 외에도 다른 다양한 버튼 정보도 함께 소스코드 상에 넣었으니 활용할 수 있다. 아래는 10초에 한번씩 TV와 셋탑을 껐다 켠다. 대개 10m정도의 거리에서도 LED의 방향만 맞으면 제어가 가능하다.(고출력 회로 구현시) 실제 구동하여 리모콘이 에뮬되는지 확인한다.

GitHub 원본 소스 링크 / https://github.com/bbangpan/bbangpan.com/blob/master/neibc_irsend_ollehtv/neibc_irsend_ollehtv.ino

 

http://www.bbangpan.com ----------------------------------

/* Originally posted on www.bbangpan.com

Program Description: IR send test(olleh TV turn on/off) code

Needed library : IRremote

Tested on : Arduino 1.0.6, Arduino UNO R3, IR LED

 

Copyright (c) 2015 www.bbangpan.com. All right reserved.

This program can be used for any non-commercial purpose freely. */

 

#include <IRremote.h>

 

IRsend irsend;

 

void setup()

{

Serial.begin(9600);

}

 

void loop() {

sendIR_OTS(1);

delay(10000);

}

 

void sendIR_OTS(int type) {

if (type == 1) { // turn on/off OLLEH TV

sendIR_OTS(2);

sendIR_OTS(3);

} else if (type == 2) {

irsend.sendNEC(0x20DF10EF, 32); //IR_TVPOWER

} else if (type == 3) {

irsend.sendSony(0x9CA800FF, 32); // IR_STBPOWER

} else if (type == 4) {

irsend.sendNEC(0x9CA88E71, 32); // IR_MOVIE

} else if (type == 5) {

irsend.sendNEC(0x9CA84EB1, 32); // IR_TVREVIEW

} else if (type == 6) {

irsend.sendNEC(0x9CA8AE51, 32); // IR_APPSTORE

} else if (type == 7) {

irsend.sendNEC(0x9CA8827D, 32); // IR_MENU

} else if (type == 8) {

irsend.sendNEC(0x9CA8D827, 32); // IR_EPG

} else if (type == 9) {

irsend.sendNEC(0x9CA8F807, 32); // IR_VOLUP

} else if (type == 10) {

irsend.sendNEC(0x9CA802FD, 32); // IR_VOLDN

} else if (type == 11) {

irsend.sendNEC(0x9CA8C837, 32); // IR_OK

} else if (type == 12) {

irsend.sendNEC(0x9CA8926D, 32); // IR_CHUP

} else if (type == 13) {

irsend.sendNEC(0x9CA852AD, 32); // IR_CHDN

} else if (type == 14) {

irsend.sendNEC(0x9CA848B7, 32); // IR_GOFIRST

} else if (type == 15) {

irsend.sendNEC(0x9CA828D7, 32); // IR_GOLAST

} else if (type == 16) {

irsend.sendNEC(0x9CA88877, 32); // IR_UP

} else if (type == 17) {

irsend.sendNEC(0x9CA8A857, 32); // IR_DOWN

} else if (type == 18) {

irsend.sendNEC(0x9CA88679, 32); // IR_PREV

} else if (type == 19) {

irsend.sendNEC(0x9CA818E7, 32); // IR_MUTE

} else if (type == 20) {

irsend.sendNEC(0x9CA846B9, 32); // IR_EXIT

} else if (type == 21) {

irsend.sendNEC(0x9CA8A659, 32); // IR_REW

} else if (type == 22) {

irsend.sendNEC(0x9CA806F9, 32); // IR_PAUSE

} else if (type == 23) {

irsend.sendNEC(0x9CA8C639, 32); // IR_STOP

} else if (type == 24) {

irsend.sendNEC(0x9CA826D9, 32); // IR_FF

} else if (type == 25) {

irsend.sendNEC(0x9CA8C03F, 32); // IR_NUM1

} else if (type == 26) {

irsend.sendNEC(0x9CA820DF, 32); // IR_NUM2

} else if (type == 27) {

irsend.sendNEC(0x9CA8A05F, 32); // IR_NUM3

} else if (type == 28) {

irsend.sendNEC(0x9CA8609F, 32); // IR_NUM4

} else if (type == 29) {

irsend.sendNEC(0x9CA8E01F, 32); // IR_NUM5

} else if (type == 30) {

irsend.sendNEC(0x9CA810EF, 32); // IR_NUM6

} else if (type == 31) {

irsend.sendNEC(0x9CA8906F, 32); // IR_NUM7

} else if (type == 32) {

irsend.sendNEC(0x9CA850AF, 32); // IR_NUM8

} else if (type == 33) {

irsend.sendNEC(0x9CA8D02F, 32); // IR_NUM9

} else if (type == 34) {

irsend.sendNEC(0x9CA8728D, 32); // IR_ASTER

} else if (type == 35) {

irsend.sendNEC(0x9CA830CF, 32); // IR_NUM0

} else if (type == 36) {

irsend.sendNEC(0x9CA8F20D, 32); // IR_SHARP

} else if (type == 37) {

irsend.sendNEC(0x9CA82ED1, 32); // IR_SEARCH

} else if (type == 38) {

irsend.sendNEC(0x9CA86897, 32); // IR_ERASE

} else if (type == 39) {

irsend.sendNEC(0x9CA8B04F, 32); // IR_KORTOGGLE

} else if (type == 40) {

irsend.sendNEC(0x9CA838C7, 32); // IR_RED

} else if (type == 41) {

irsend.sendNEC(0x9CA8B847, 32); // IR_ORANGE

} else if (type == 42) {

irsend.sendNEC(0x9CA858A7, 32); // IR_GREEN

} else if (type == 43) {

irsend.sendNEC(0x9CA87887, 32); // IR_BLUE

} else if (type == 44) {

irsend.sendNEC(0x9CA856A9, 32); // IR_MYMENU

} else if (type == 45) {

irsend.sendNEC(0x9CA86E91, 32); // IR_SHOPPING

} else if (type == 46) {

irsend.sendNEC(0x9CA8C23D, 32); // IR_WIDGET

} else if (type == 47) {

irsend.sendNEC(0x9CA8B24D, 32); // IR_WEBSEARCH

} else if (type == 48) {

irsend.sendNEC(0x20DFD02F, 32); // IR_EXTINPUT

} else if (type == 49) {

irsend.sendNEC(0x20DF40BF, 32); // IR_TVVOLUP

} else if (type == 50) {

irsend.sendNEC(0x20DFC03F, 32); // IR_TVVOLDN

}

}

        

---------------------------------------------------------

 

▶ 구매 가이드

IR LED등 : http://www.artrobot.co.kr/front/php/product.php?product_no=426

IR 송수신 킷: http://www.artrobot.co.kr/front/php/product.php?product_no=930&main_cate_no=&display_group=

기타 이를 개별로도 구매할 수 있다.

 

강의 키워드

IR리모콘 해킹, IR 제어, IR 통신, 적외선 통신, 적외선 제어, 적외선 리모콘, 아두이노, Arduino

반응형