카테고리 없음

(아두이노) IR remote control (적외선 리모콘 센서)

미친토끼 2025. 6. 16. 18:33

라이브러리: IRremote  by shirriff, ArminJo 버전 4.0.0 이상

기본 코드

/*
    IR Remote

    Print out the received IR value. Turn on the red LED if received a specific code.
*/
#include <IRremote.hpp>

const int IR_RECEIVE_PIN = 7;
const int redPin = 13;

void setup()
{
  Serial.begin(9600);
  IrReceiver.begin(IR_RECEIVE_PIN, ENABLE_LED_FEEDBACK); // Start the receiver
  pinMode(redPin, OUTPUT);
}

void loop(){
  if (IrReceiver.decode()) 
  {
    Serial.println(IrReceiver.decodedIRData.decodedRawData, HEX);
    IrReceiver.printIRResultShort(&Serial);

    switch(IrReceiver.decodedIRData.decodedRawData)
    {
      case 0xE31CFF00: //Keypad button "5"
        Serial.println("5");
        digitalWrite(redPin, HIGH);
        delay(2000);
        digitalWrite(redPin, LOW);
        break;
      default:
        break;
    }

    IrReceiver.resume(); // Enable receiving of the next value
  }
}

Hash가 0으로 나오는 것은 적외선 노이즈가 포착된 것 같은데, Hash가 0이 아닌 값들을 인식하고 출력한다. 아래.

// for ELEGOO's 17 keys remote con

#include <IRremote.hpp>

int IR_PIN  = 7;
int redPin = 13;

void setup() {
  Serial.begin(9600);
  IrReceiver.begin(IR_PIN, ENABLE_LED_FEEDBACK);
  pinMode(redPin, OUTPUT);
}

void loop() {
  if (IrReceiver.decode()) {
    // 아두이노(8비트)는 int가 2바이트기 때문에 int data; 로 선언하면 4바이트 Hash값을 다 담지 못해서 컴파일 시 오류가 남.
    uint32_t data = IrReceiver.decodedIRData.decodedRawData;
    if (data != 0) {
      Serial.println(data, HEX);
      IrReceiver.printIRResultShort(&Serial);
      switch(data) {
        case 0xE916FF00: 
          Serial.println("pressed 1!");
          break;
        case 0xE619FF00: 
          Serial.println("pressed 2!");
          break;
        case 0xF20DFF00: 
          Serial.println("pressed 3!");
          break;
        case 0xF30CFF00: 
          Serial.println("pressed 4!");
          break;
        case 0xE718FF00: 
          Serial.println("pressed 5!");
          break;
        case 0xA15EFF00: 
          Serial.println("pressed 6!");
          break;
        case 0xF708FF00: 
          Serial.println("pressed 7!");
          break;
        case 0xE31CFF00: 
          Serial.println("pressed 8!");
          break;
        case 0xA55AFF00: 
          Serial.println("pressed 9!");
          break;
        case 0xAD52FF00: 
          Serial.println("pressed 0!");
          break;
        case 0xBD42FF00: 
          Serial.println("pressed *");
          break;
        case 0xB54AFF00: 
          Serial.println("pressed #");
          break;
        case 0xB946FF00: 
          Serial.println("pressed arrow up!");
          break;
        case 0xEA15FF00: 
          Serial.println("pressed arrow down!");
          break;
        case 0xBB44FF00: 
          Serial.println("pressed arrow left!");
          break;
        case 0xBC43FF00: 
          Serial.println("pressed arrow right!");
          break;
        case 0xBF40FF00: 
          Serial.println("pressed ok!");
          break;
        default:
          break;
      }
    }
    IrReceiver.resume();
  }
}

 

거리가 멀면 수신율이 떨어지고, 각도가 틀어지면 잘못된 Hash값이 전달되는 등, 한계가 뚜렷한 리모트 컨트롤이라서, 조금이라도 정확도가 중요하다면 블루투스나 와이파이를 쓰는 것이 좋을 듯...

2미터 떨어진 지점에서 대략 각도를 맞추었는데도 약 1/3 정도는 인식을 제대로 하지 못한다.

 

집에 나뒹구는 B tv 리모콘으로 테스트해보니 아두이노 키트의 리모콘보다 신호 강도가 훨씬 세서 수신기에서 잘 잡는다. 테스트를 해보니, 일부 버턴의 경우, 두 번 신호가 발생하는데 뒤의 신호가 버턴 release할 때마다 FF7F80로 일정하다.(마우스 누르기, 떼기처럼 신호 처리가 가능하겠다) 또 일부 버턴은 삼성 프로토콜로 특정 hash가 선행하기도 한다. NEC2 프로토콜만 잡아서 신호를 처리하기로 한다.

// for B tv's 40 keys remote con

#include <IRremote.hpp>

int IR_PIN  = 7;
int redPin = 13;

void setup() {
  Serial.begin(9600);
  IrReceiver.begin(IR_PIN, ENABLE_LED_FEEDBACK);
  pinMode(redPin, OUTPUT);
}

void loop() {
  if (IrReceiver.decode()) {
    uint32_t data = IrReceiver.decodedIRData.decodedRawData;
    if (data != 0) { // && data != 0xFF7F80) {  // 0xFF7F80 : when release the key
      Serial.println(data, HEX);
      IrReceiver.printIRResultShort(&Serial);
      switch(data) {
        case 0xF8070707: //TV vol +
          Serial.println("TV vol +");
          break;
        case 0xF40B0707: 
          Serial.println("TV vol -");
          break;
        case 0xFD020707: 
          Serial.println("TV Power");
          break;
        case 0xFE010707: 
          Serial.println("ext input");
          break;
        case 0xFE017F80: 
          Serial.println("B tv Power");
          break;

        case 0xBA457F80: 
          Serial.println("silent");
          break;
        case 0xA9567F80: 
          Serial.println("prefered channel");
          break;
        case 0xBC437F80: 
          Serial.println("vol +");
          break;
        case 0xBD427F80: 
          Serial.println("vol -");
          break;
        case 0xFD027F80: 
          Serial.println("home");
          break;
        case 0xB24D7F80: 
          Serial.println("broadcast");
          break;
        case 0xBF407F80: 
          Serial.println("channel up");
          break;
        case 0xBE417F80: 
          Serial.println("channel down");
          break;
        case 0x9F607F80: 
          Serial.println("fast backward");
          break;
        case 0x9E617F80: 
          Serial.println("stop");
          break;
        case 0x9D627F80: 
          Serial.println("pause");
          break;
        case 0x9C637F80: 
          Serial.println("fast forward");
          break;
        case 0x9B647F80: 
          Serial.println("go to start");
          break;
        case 0x9A657F80: 
          Serial.println("go to end");
          break;
       
        case 0xB6497F80: 
          Serial.println("arrow up!");
          break;
        case 0xB54A7F80: 
          Serial.println("arrow down!");
          break;
        case 0xB44B7F80: 
          Serial.println("arrow left!");
          break;
        case 0xB34C7F80: 
          Serial.println("arrow right!");
          break;
        case 0xB9467F80: 
          Serial.println("pressed ok!");
          break;
        case 0xB8477F80: 
          Serial.println("menu");
          break;
        case 0xB04F7F80: 
          Serial.println("search");
          break;
        case 0xAC537F80: 
          Serial.println("favorite");
          break;
        case 0xB14E7F80: 
          Serial.println("previous/cancle");
          break;
        case 0xDE217F80: 
          Serial.println("pressed 1");
          break;
        case 0xDD227F80: 
          Serial.println("pressed 2");
          break;
        case 0xDC237F80: 
          Serial.println("pressed 3");
          break;
        case 0xDB247F80: 
          Serial.println("pressed 4");
          break;
        case 0xDA257F80: 
          Serial.println("pressed 5");
          break;
        case 0xD9267F80: 
          Serial.println("pressed 6");
          break;
        case 0xD8277F80: 
          Serial.println("pressed 7");
          break;
        case 0xD7287F80: 
          Serial.println("pressed 8");
          break;
        case 0xD6297F80: 
          Serial.println("pressed 9");
          break;
        case 0xD52A7F80: 
          Serial.println("pressed *");
          break;
        case 0xDF207F80: 
          Serial.println("pressed 0");
          break;
        case 0xD42B7F80: 
          Serial.println("pressed #");
          break;

        case 0xFF7F80:
          Serial.println("the key released");
          break;  
        default:
          break;
      }
    }
    IrReceiver.resume();

  }
}