Сигналът от инфрачервеното дистанционно управление е серия от двоичен импулсен код. За да се избегнат смущения от други инфрачервени сигнали по време на безжичното предаване, сигналът предварително се модулира с определена носеща честота и след това се изпраща чрез инфрачервен диод. Инфрачервеният приемник трябва да филтрира друга вълна и да приема сигнал с тази специфична честота и да я модулира обратно към двоичен импулсен код - известен като демодулация.
Фиг. 1 Пин конфигурация на приемника
Необходим хардуер:
- Arduino UNO/Nano;
- Breadboard;
- ДУ и приемник;
- Светодиоди – 6бр.
- Резистор 220 Ом – 6бр.
- Проводници.
Фиг. 2 Схема на свързване
*Забележка 1 - за да използвате Arduino Nano свържете към вашето Nano , така както е
свързано към UNO и няма да имате проблем.
*Забележка 2 – Инсталирайте библиотеката „IRremote.h” , защото без нея кода няма да се
компилира (ще ви даде грешка).
Програмен код:
#include
int RECV_PIN = 11;
int LED1 = 2;
int LED2 = 3;
int LED3 = 4;
int LED4 = 5;
int LED5 = 6;
int LED6 = 7;
long on1 = 0x00FF6897;
long off1 = 0x00FF9867;
long on2 = 0x00FFB04F;
long off2 = 0x00FF30CF;
long on3 = 0x00FF18E7;
long off3 = 0x00FF7A85;
long on4 = 0x00FF10EF;
long off4 = 0x00FF38C7;
long on5 = 0x00FF5AA5;
long off5 = 0x00FF42BD;
long on6 = 0x00FF4AB5;
long off6 = 0x00FF52AD;
IRrecv irrecv(RECV_PIN);
decode_results results;
void dump(decode_results *results) {
int count = results->rawlen;
if (results->decode_type == UNKNOWN)
{
Serial.println("Could not decode message");
}
else
{
if (results->decode_type == NEC)
{
Serial.print("Decoded NEC: ");
}
else if (results->decode_type == SONY)
{
Serial.print("Decoded SONY: ");
}
else if (results->decode_type == RC5)
{
Serial.print("Decoded RC5: ");
}
else if (results->decode_type == RC6)
{
Serial.print("Decoded RC6: ");
}
Serial.print(results->value, HEX);
Serial.print(" (");
Serial.print(results->bits, DEC);
Serial.println(" bits)");
}
Serial.print("Raw (");
Serial.print(count, DEC);
Serial.print("): ");
for (int i = 0; i < count; i++)
{
if ((i % 2) == 1) {
Serial.print(results->rawbuf[i]*USECPERTICK, DEC);
}
else
{
Serial.print(-(int)results->rawbuf[i]*USECPERTICK, DEC);
}
Serial.print(" ");
}
Serial.println("");
}
void setup()
{
pinMode(RECV_PIN, INPUT);
pinMode(LED1, OUTPUT);
pinMode(LED2, OUTPUT);
pinMode(LED3, OUTPUT);
pinMode(LED4, OUTPUT);
pinMode(LED5, OUTPUT);
pinMode(LED6, OUTPUT);
pinMode(13, OUTPUT);
Serial.begin(9600);
irrecv.enableIRIn();
}
int on = 0;
unsigned long last = millis();
void loop()
{
if (irrecv.decode(&results))
{
if (millis() - last > 250)
{
on = !on;
digitalWrite(13, on ? HIGH : LOW);
dump(&results);
}
if (results.value == on1 )
digitalWrite(LED1, HIGH);
if (results.value == off1 )
digitalWrite(LED1, LOW);
if (results.value == on2 )
digitalWrite(LED2, HIGH);
if (results.value == off2 )
digitalWrite(LED2, LOW);
if (results.value == on3 )
digitalWrite(LED3, HIGH);
if (results.value == off3 )
digitalWrite(LED3, LOW);
if (results.value == on4 )
digitalWrite(LED4, HIGH);
if (results.value == off4 )
digitalWrite(LED4, LOW);
if (results.value == on5 )
digitalWrite(LED5, HIGH);
if (results.value == off5 )
digitalWrite(LED5, LOW);
if (results.value == on6 )
digitalWrite(LED6, HIGH);
if (results.value == off6 )
digitalWrite(LED6, LOW);
last = millis();
irrecv.resume(); // Receive the next value
}
}
Ако искате да декодирате кода от ДУ, първо трябва да знаете как е кодиран. Методът на кодиране, който се използва тук е NEC протокол. При него импулсът се предава при натискане на бутон от ДУ. Командата се предава само веднъж, дори когато бутона остава натиснат. На всеки 110ms се предава код за повторение, докато бутона остава натиснат. Когато импулсът подаден от ДУ влезе към приемника ще настъпи процеса на декодиране,усилване на сигнала и формиране на вълната. Кода ни показва как можем да декодираме кодиран импулсен сигнал, излъчван от ДУ, след което да се изпълни съответно действие, в случая да се включват и изключват различни светодиоди. По подобен начин вие може да управлявате всякакви устройства с ДУ.