아두이노 강좌 #36 IRremote 라이브러리로 IR 수신 코드 작성 - 603LM
Lucy Archive
Lucy 2023
2020. 9. 8. 00:35

Arduino IRremote Infrared ReceiveArduino IRremote Infrared Receive

Arduino Uno : 적외선 통신 수신 코드 작성 방법

지난 포스트에서 iR 통신 프로토콜과, IR 송수신 모듈에 대해 소개하였습니다. 이번 포스트는

IR 통신을 하기 위해 아두이노에서 제공하는 IRremote 라이브러리를 사용 하는 방법을 알아보고, 아두이노에서 IR 통신 수신 예제

를 소개합니다. 


IRremote 라이브러리 설치 방법

IRremote 라이브러리는 아두이노 라이브러리 매니저에서 편하게 설치 할 수 있습니다. Arduino IDE 를 실행 후 툴 > 라이브러리 관리 를 선택 후 라이브러리 매니저창에서 IRremote 를 검색 후 IRremote by shirriff 라이브러리를 설치하시면 됩니다. 설치 후에 아두이노 코드 작성시 상단에 #include <IRremote.h> 를 선언 하면 됩니다.

IRremote 라이브러리 설치IRremote 라이브러리 설치

IRremote 라이브러리

이 포스트에서는 IR 수신 관련된 코드만 자세히 알아보도록 하겠습니다. IRremote 라이브러리는 IR 수신과 관련된 함수가 아래와 같이 포함되어 있습니다. irrecv 는 클래스 객체명으로 코드 작성에 따라 다른 이름을 사용 할 수 있습니다.

  • IRrecv irrecv(receivePin) : receivePin 으로 IR 수신을 하는 IRrecv 클래스 객체 irrecv 를 생성합니다. 
  • irrecv.enableIRin() : IR 리시버 동작을 활성화 합니다.
  • irrecv.decode(&result) : IR 수신하여 변조된 데이터를 results 변수에 저장합니다.
  • irrecv.resume() : IR 데이터 수신 후 다음 신호를 받을 수 있도록 준비합니다.
  • irrecv.blink13(true) : IR 데이터 수신하는 동안 13번 핀 LED를 깜빡입니다. 필요한 경우 모니터 용으로 사용됩니다.
대부분의 함수는 간단히 사용할 수 있기 때문에, decode() 함수만 추가적인 설명을 작성하였습니다.


decode() 함수와 decode_results 클래스

decode() 함수

decode(&result) 함수는 수신된 데이터가 문제가 있는 경우 0을 반환, 문제가 없는 경우 1을 반환하고 수신된 데이터를 result (decode_result Class)에 저장합니다.

Syntax

  • int irrecv.IRrecv(decode_result *results)

Parameters

  • irrecv : IRrecv 로 선언된 클래스 객체 명
  • results : decode_result 클래스 객체

Returns :

  • 1(True) : 수신 된 데이터가 문제 없고, results 에 저장 완료
  • 0(False) : 수신 된 데이터가 무효함

Example

  • if(irrecv.IRrecv(&result)) : IR 수신이 정상적으로 완료된 경우 수행 되는 IF 문

decode_result 클래스

decode(&result) 함수는 IR에 수신된 데이터를 decode_result 클래스 형태로 result 객체에 저장합니다. decode_result 클래스에는 프로토콜 종류, 어드레스, 데이터, 데이터 길이 등의 정보가 담겨있습니다.

IRremote.h 파일에 보면 decode_result 클래스는 아래와 같이 정의 되어 있습니다. 주로 사용하는 클래스의 멤버는 아래와 같습니다. 

  • decode_type : 사용한 프로토콜
  • value : 수신된 데이터 (Decoded)
  • bits : 수신된 데이터의 비트 수 (Decoded)

1
2
3
4
5
6
7
8
9
10
11
class decode_results
{
    public:
        decode_type_t          decode_type;  // UNKNOWN, NEC, SONY, RC5, ...
        unsigned int           address;      // Used by Panasonic & Sharp [16-bits]
        unsigned long          value;        // Decoded value [max 32-bits]
        int                    bits;         // Number of bits in decoded value
        volatile unsigned int  *rawbuf;      // Raw intervals in 50uS ticks
        int                    rawlen;       // Number of records in rawbuf
        int                    overflow;     // true iff IR raw code too long
};
cs

decode_result 클래스에서 프로토콜 정보를 저장하고 있는 멤버 decode_typte_t 는 아래와 같이 정의되어 있습니다. enum 은 int형 상수에 이름을 붙여서 코드를 이해하기 쉽게 하는 용도로 사용됩니다. 즉, 아래 코드에서 UNKNOWN 은 -1, SAMSUNG 은 7를 의미합니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
typedef
    enum {
        UNKNOWN      = -1,
        UNUSED       =  0,
        RC5,
        RC6,
        NEC,
        SONY,
        PANASONIC,
        JVC,
        SAMSUNG,
        WHYNTER,
        AIWA_RC_T501,
        LG,
        SANYO,
        MITSUBISHI,
        DISH,
        SHARP,
        DENON,
        PRONTO,
        LEGO_PF,
    }
decode_type_t;
cs

즉, 아래 코드에서 temp 의 값이 3인 경우 NEC 프로토콜을 사용했음을 알 수 있습니다.

irrecv.decode(&results);

temp = result.decode_type; 


아두이노로 IR 데이터 수신

Arduino Uno 와 603LM 연결

아두이노 우노 보드에서 IR 데이터를 수신를 하기 위해 보드와 603LM 모듈을 아래와 같이 연결하였습니다. 적외선 송신 모듈은 가정에 있는 아무 리모콘을 사용하셔도 됩니다. 

IR 수신기 KSM-603LM 연결 회로IR 수신기 KSM-603LM 연결 회로

코드

IRremote 라이브러리를 사용하여 IR 통신 수신 코드를 작성하였습니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
#include <IRremote.h>
 
#define IRRECV_PIN 8 // IR 수신 핀 할당
 
// IR 수신 클래스 객체 생성
IRrecv irrecv(IRRECV_PIN);
// IR 수신하여 복조된 데이터 클래서 객체 생성(수신된 데이터의 저장소)
decode_results results;
// decodeType 출력을 편하게 하기위한 문자열 배열
String decodeType[19= {
                          "UNKNOWN"// decodeType : -1
                          "UNUSED"// decodeType : 0
                          "RC5",
                          "RC6",
                          "NEC",
                          "SONY",
                          "PANASONIC",
                          "JVC",
                          "SAMSUNG",
                          "WHYNTER",
                          "AIWA_RC_T501",
                          "LG",
                          "SANYO",
                          "MITSUBISHI",
                          "DISH",
                          "SHARP",
                          "DENON",
                          "PRONTO",
                          "LEGO_PF",
                      };
 
void setup()
{
    Serial.begin(9600);
    delay(3000);
    Serial.println(F("IR Recv Program Start..."));
    irrecv.enableIRIn(); // IR 리시버 동작 시작
    irrecv.blink13(true);
}
 
void loop() {
    // irrecv.decode(&results) 수신된 IR 데이터 처리가 문제 없는 경우 1(TRUE)을 반환
    if (irrecv.decode(&results)) {
        // DecodeType, Data, Bit 수를 출력
        Serial.println(F("========================================"));
        Serial.print(F("Decode Type        : "));
        Serial.println(decodeType[results.decode_type+1]);
        Serial.print(F("Received Data      : 0x"));
        Serial.println(results.value, HEX);
        Serial.print(F("Received Data Bits : "));
        Serial.println(results.bits);
        irrecv.resume(); // 다음신호를 받을 수 있도록 준비
    }
    delay(100);
}
cs

10 번 Line 의 decodeType 문자열 배열은 IR 수신 프로토콜 종류 출력을 편하게 하기 위한 문자열 배열입니다. 배열의 순서는 decode_results 클래스의 decode_type_t 를 참조하여 작성하였습니다. 

38 Line 의 irrecv.blink13(true) 는 IR 적외선 데이터가 수신된 경우 13번 LED 를 깜빡이는 기능을 활성화 합니다. 육안상으로 데이터가 수신했는지 확인하기 위해 작성된 코드로, 필요에 따라 삭제 하셔도 됩니다.

Serial.printf 문의 F() 메크로는 SRAM 메모리를 아끼기 위해 시리얼 통신으로 출력할 문자열을 FLASH 메모리에 저장하는 매크로입니다. 지난 포스트에서 소개한 내용을 복습할 겸 사용하였습니다. 

실행 결과

위 코드를 실행하면 아래 영상과 같이 IR 적외선 통신으로 수신 된 프로토콜과 데이터를 16진수로 표시합니다.


마무리

이번 포스트에서 아두이노에서 제공하는

IRremote 라이브러리를 사용하여 IR 수신 코드 작성 방법과 예시

를 소개하였습니다. 이후 포스트에서는 IR 송신 코드 작성 방법과 예시를 소개할 예정입니다.

끝까지 읽어 주셔서 감사합니다.^^

관련포스트

👉 아두이노 적외선 송수신 관련글 목록 보기

👉 아두이노 센서 관련글 목록 보기

👉 아두이노 관련글 전체 목록 보기