[아두이노] 리모콘(IRremote) 제어

IOT/아두이노|2019. 3. 14. 09:00

[아두이노] 리모콘(IRremote) 제어



오늘은 리모콘을 사용하는 법을 배워보도록 하겠습니다. 제가 참고했던 라이브러리 파일이 있는 github의 자료입니다. 링크된 곳에 들어가시면 기본 데모 예제가 있습니다. 그걸 이용해서 실험하시면 됩니다.

1. IRremote 라이브러리 설치


가상시뮬레이터에서 기본적으로 제공됩니다. 라이브러리 소스를 가져올 필요 없이 라이브러리 파일을 인크루드만 하면 됩니다.

#include <IRremote.h>

실제로 한다면 라이브럴리 파일을 추가해야겠죠.


라이브러리 매니저에서 IRremote 치시면 라이브러리가 여러게 보이는데 젤 위에거로 그냥 설치하시면 됩니다.

설치하시면 예제에 들어가시면 IRremote라는 예제가 추가되었고 거기에 IRrecvDemo 예제를 실행 시키면 됩니다.


아래 소스를 보면 대충 예제가 11번 핀을 IR Sensor핀으로 사용했네요. 그리고 두개의 IRrecv, decode_results 클래스가 있는데 소스상으로 대충 보면은 IR Sensor값을 IRrecv 클래스에서 받아서 뭔가 처리를 할꺼고 decode_results 클래스는 변수명을 보면 먼지는 모르지만 센서의 결과값이 여기에 있겠구나 하고 유추가 되실 꺼에요. println()에 results.value 값을 찍은거 봐서는 리모콘를 누른 값이겠군 하고 생각하시면 됩니다.


대충 이런느김으로 라이브러리를 살펴보실때 클래스 객체명이나 또는 함수 등을 통해서 데모 예제들을 통해 유추해보면서 한번 코딩을 해독 해보세요. 데모 예제들은 심풀하게 나와 있어서 어렵지 않게 해독이 될꺼에요.

2. 회로도 구성


  • 준비물 : IR Sensor, 리모콘, 아두이노우노
  • 내용 : 키를 누르면 그 값을 시리얼모니터로 출력


참 쉽죠. 측정하는 센서를 사용할때는 전원(Vcc,Gnd)핀과 Dout핀으로 구성된다고 했죠. 아두이노에 해당 핀에 연결만 하면 도비니다. 가상 리모콘은 따로 할 건 없고요. 아주 간단하게 구성 됩니다.

3. 코딩


  • 사용함수 : irrecv.enableIRIn(), irrecv.decode()
  • 내용 : 리모콘를 누른 값을 아두이노 IDE의 시리얼 모니터로 간단히 출력하자.
  • 참고출처 : http://playground.arduino.cc/Code/Keypad

  • irrecv.enableIRIn() : 리모콘 시작
  • irrecv.decode(results) : 키가 눌러진지 확인
  • irrecv.resume() : 다음값

데모소스를 기반으로 해서 수정해 보자. 우선 위에 링크된 라이브러리 파일이 있는 github로 가보세요. 이 라이브러리를 만드신 분의 라이브러리 IRremot.h 파일을 열어 볼 수 있습니다. 거기에 decode_results 클래스를 열어 보시면 여기에 리모콘의 정보가 어떤것을 저장하는지 잘 나와 있습니다.

보시면, decode_results 클래스에서는 decode_type, address. value, bits, *rawbuf, rawlen, overflow 변수들을 담고 있습니다. 여기서 decod_type, bits, value 값만 찍어보도록 하죠.

#include <IRremote.h>
 
int IRpin = 11;  
IRrecv irrecv(IRpin);
decode_results results;

void setup()
{
  Serial.begin(9600);
  irrecv.enableIRIn(); // 리모콘 시작
}

void loop()
{
  if (irrecv.decode(&results)) //리모콘 누른값이 없다면 패스
    {
     Serial.print("results.decode_type : "); //리모콘 타입
     Serial.println(results.decode_type);
     
     Serial.print("results.bits : "); //키값길이
     Serial.println(results.bits);
     
     Serial.print("results.value : "); //키값
     Serial.println(results.value);
     
     Serial.print("results.value, HEX : "); //키값을 16진수로변환
     Serial.println(results.value, HEX);
   
     irrecv.resume(); // 다음값
    }
}

대충 11번 핀을 IR Sensor 값을 읽는 핀입니다. IRrecv 객체변수를 선언할대 인자값으로 IR핀을 넘겨줍니다. 그리고 우리가 리모콘의 키값을 얻어야 하기때문에 리모콘 키값이 저장되어 있는 decode_results 클래스 객체 변수를 선언합니ㅏㄷ.

시리얼모니터로 출력하기 때문에 지난시간에 배웠듯이 begin(9600)으로 시리얼통신 시작을 선언하고 시리얼출력을 하기 위해서 print(), println()함수를 사용했네요.

리모콘을 사용하기 위해서 enableIRin()함수를 리모콘을 사용을 선언해야겠죠.

loop()함수에서 irrecv.decode(&reults)함수로 리모콘 키가 눌러졌는지 확인 작업을 합니다. 눌러졌다면 results 객체 변수에는 키값이 저장되어 있고 리모콘 decode_type, bits, value 정보를 print(), println()함수로 출력하는 로직입니다.

여기서 중요한 것은 value값입니다. 이 값을 토대로 리모콘을 눌렀을때 누른키값의 동작을 아두이노에서 명령을 내리면 됩니다.

핵심은results.value 이거 입니다.
다른 건 몰라도 대충

  irrecv.enableIRIn(); // 리모콘 시작
    
    if(irrecv.decode(&results)){ //리모콘 눌렀는지 확인
     if(results.value==0xFD48B7) {
       Serial.println(" key : 3"")
     }
     irrecv.resume(); //다음값
 } 

리모콘을 3번키를 누르면 3번키값이 'FD48B7' 16진수 값입니다. 3번키가 눌러졌다면 프린트문장을 수행되겠죠. 만약에 특정 동작을 프린트문장 대신에 모터를 돌린다거나 불을 끈다든가 다른 동작을 수행하도록 할 수 도 있겠죠.

다 빼고 부분만 빼내오니간 별거 없죠. 키값을 미리 알수가 없으니깐 실제로 실험하실때 리모톤의 기본 정보를 출력하시고 각 키값을 누러서 값을들 미리 적어놓고 그 값을 기준으로 제어 하시면 될꺼에요.

어려운 것은 없습니다.

4. 결과


리모콘 3번 키를 눌렀을때 결과입니다.


동영상은 실험과정을 담아 놨습니다. 보시고 따라해보세요. 소스를 복사한 곳은 위에 링크된 라이브러리 Github에 등록된 자료입니다. 위 링크된 곳을 미리 창을 열어 놓고 따라서 해보세요.

마무리


IRremote 라이브러리를 누군가 이미 만들어 놓았습니다. 우리는 단지 실험을 할때 그걸 이용할 뿐이죠. 리모콘을 제어하기 위해서 라이브러리를 개발 해야하는 소모적 시간을 줄일 수 있습니다. 아두이노를 다루는 가장 큰 장점은 이미 많은 라이브러리들이 오픈 되어 있어서 우리들은 창의적인 개발만 신경쓰면 됩니다. 뭘 만들지 그것만 여러분들이 상상의 나래만 펼치면 되고 기본 베이스 소스나 코딩은 오프라인으로 다 공개되어 있기 때문데 가져다가 잘 응용하여 표현만 하시면 됩니다.

처음부터 하나하나 프로그래머로써 코딩을 한다면 리모콘 하나를 다루기 위해서 엄청난 많은 시간을 소비해야 합니다. 전문적 지식도 필요하고요. 짧게는 몇일 길게는 한달이 걸리지 모릅니다.
하지만 IRremote 라이브러리를 이미 오프라인으로 공개되어 있어서 누구나 쉽게 이걸 활용할 수 있습니다. 물론 상업적으로는 저작권의 문제가 있겠지만 단지 실험을 목적으로 우리가 다룬다면 사실 부담없이 실험 할 수 있습니다.

이 라이브러리를 통해서 리모콘 키값을 얻을 수 있게 되었고 그 키값을 통해서 해당 동작만 설계만 우리들이 표현하면 되니깐 개발 시간을 엄청 단축시킬 수 있습니다. 참 좋은 세상에 살고 있는 거지요.
암튼 리모콘의 키값을 읽을 수 있게 되었으니깐 이 키로 뭘 제어할지 상상의 나래를 펼쳐 보세요


댓글()