카테고리 없음
(아두이노) 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();
}
}