중급 예제

약간은 익숙하시거나 익숙해지셨나요? 그렇다면 조금더 깊이 다뤄볼까요?

IRremote 모듈

2017-03-29 09:41:27

개요

 

IR통신이란?

 

먼저 IR통신을 이해하기 전에 IR(Infrared)를 이해해야 합니다.

 

흔히 적외선이라 부르며 우리가 눈으로 볼 수 있는 가시광선보다 파장이 길고, 햇빛이나 백열된 물체로부터 방출되는 빛을 스펙트럼으로 분산시키면 적색 스펙트럼보다 더 바깥쪽에 있기 때문에 적외선이라 부릅니다.

 

<적외선의 파장은 0.75um부터 1,000um사이에 위치합니다>

 

 

 

 

 

IR통신은 이런 적외선을 이용한 통신 방법으로 TV나, 에어컨 등에서 사용되는 리모컨이 IR통신 방식을 사용합니다. 

적외선 통신은 송신부와 수신부 2가지로 나눠지고 송신부에서 적외선을 발산하면 수신부에서 포토다이오드를 통해 적외선을 수신합니다.

 

 

 

 

 

 

IR통신 방법

 

송신부에는 적외선 발광 다이오드가 있으며 일반 LED와는 달리 우리 눈에 보이지 않는 적외선을 발산합니다. 

적외선 통신에서 송신부는 보내는 신호를 변조하여 전송하는데 변조란 파장의 진폭을 변화시켜 일종의 신호를 만드는 행위입니다.

 

아래 사진과 같이 하나의 하나의 긴 HIGH와 LOW로 이루어진 Message Signal을 보내면 변조과정을 거쳐 Modulated 신호로 바뀝니다.

Message Signal이 HIGH일때 변조를 통해 신호를 생성하는데 적외선 통신은 보통 37 ~ 42KHz로 변조과정을 거치며, 보통 리모컨에서는 38KHz로 변조됩니다.

 

 

 

 

 

 

 

 

수신부에는 포토다이오드로 송신부에서 전달된 적외선을 검출하는데 포토다이오드에서는 빛에너지를 전기에너지로 바꾸어 전류를 흘러보냅니다.

보통 포토다이오드의 경우 검정색인데 검정색인 이유는 적외선만을 검출하기 위한 필터의 역할을 하기 때문입니다.

 

 

 

 

 

이때 위에서 송신부에서는 변조과정을 거친다고 했는데 수신부에서는 쌍을 이루는 송신부에서 보내는 적외선만을 검출해야 합니다. 그렇기 때문에 별도의 필터를 통해 특정 주파수의 적외선만 검출하게 되는데 아래 사진과 같은 모듈이 그런 모듈입니다.

 

 

 

 

 

 

최종적으로 구현된 적외선 통신 형태는 아래와 같습니다.

 

 

 

 

 

 

 

동영상

 

 

 

 

 

 

필요한 부품 목록

 

NO 부품명 수량 상세설명
 1 오렌지 보드  
IRremote 모듈 KPX 1203S 
3색 LED  
330옴 저항 3  
점퍼 케이블  8  
6 브레드보드 1  

 

 

부품명 오렌지 보드 IRremote 모듈 3색 LED 330옴 저항 점퍼 케이블 브레드보드
파트
 

 

 

 

 

 

 

하드웨어 making

 

브레드보드

 

 

 

 

 

 

 

전자회로도

 

 

 

 

 

 

 

 

 

 

 

 

 

소프트웨어 coding

 

/*
 * IRremote: IRrecvDemo - demonstrates receiving IR codes with IRrecv
 * An IR detector/demodulator must be connected to the input RECV_PIN.
 * Version 0.1 July, 2009
 * Copyright 2009 Ken Shirriff
 * http://arcfn.com
 */

#include <IRremote.h>

int RECV_PIN = 5;

IRrecv irrecv(RECV_PIN);

decode_results results;

void setup()
{
  pinMode(10,OUTPUT);
  pinMode(8,OUTPUT);
  pinMode(9,OUTPUT);
  Serial.begin(9600);
  irrecv.enableIRIn(); // Start the receiver
}

void loop() {
  if (irrecv.decode(&results)) {
    int a = results.value;
    Serial.println(a, HEX);
    if(a == 0x6897) {
      digitalWrite(8,HIGH);
      digitalWrite(9,LOW);
      digitalWrite(10,LOW);
      Serial.println("blue");
    }
    if(a == 0xFFFF9867) {
      digitalWrite(8,LOW);
      digitalWrite(9,HIGH);
      digitalWrite(10,LOW);
      Serial.println("green");
    }
     if(a == 0xFFFFB04F) {
      digitalWrite(8,LOW);
      digitalWrite(9,LOW);
      digitalWrite(10,HIGH);
      Serial.println("red");
    }
    if(a == 0x30CF) {
      digitalWrite(8,HIGH);
      digitalWrite(9,HIGH);
      digitalWrite(10,HIGH);
      Serial.println("white");
    }
    if(a == 0x18E7) {
      digitalWrite(8,LOW);
      digitalWrite(9,LOW);
      digitalWrite(10,LOW);
      Serial.println("OFF");
    }
    irrecv.resume(); // Receive the next value
  }
  delay(100);
}

 

 

 

 

 

우선 IR리모컨을 사용하기 위해서는 별도의 라이브러리가 필요합니다. 

하지만 라이브러리의 경우 아두이노IDE에서 받을 수 있습니다.

 

IRremote로 검색 시 제일 상단에 나오는 라이브러리를 받으시면 사용할 수 있습니다.

 

 

 

 

 

 

IR리모컨은 각 버튼에 따라 아두이노에 전달되는 신호값이 달라집니다.

 

가령 위 코드의 경우

 

리모컨의 1번 버튼을 눌렀을 경우 0x6897이 전달되고 2번을 눌렀을 경우에는 0xFFFF9867이 전달됩니다.

버튼마다의 전달되는 값은 각 리모컨마다 달라질 수 있으니 참고하세요.

 

또한 일정 거리 이상 벗어나거나 통신 방향이 엇갈릴때, 통신 경로 중 단단한 장애물이 있을 경우 전달되는 값이 변하기 때문에 되도록 통신 할 때는 장애물이 없는 곳에서 정방향으로 할 수 있도록 해주세요.

 

 

 

kocoafabeditor

항상 진취적이고, 새로운 것을 추구하는 코코아팹 에디터입니다!

IR통신, 아두이노, 오렌지보드

rlaqhqls 2021-03-19 21:43:19

저... 따라해봤는데 작동도 안되고 오히려 탄 냄새가 나면서 리모컨 묘듈이 뜨거워 지는데요..
혹시 제가 뭔가를 잘못 건드린 것 일까요?