Принцип Работы
Встроенный приемник преобразует световой сигнал, полученный от передатчика, в слабый электрический сигнал. Сигнал усиливается усилителем ИС. После автоматической регулировки усиления, полосовой фильтрации, демодуляции, формирования волны, он возвращается к исходному коду. Затем код вводится в схему идентификации кода через выходной контакт приемника сигнала.
Выводы и Подключение Инфракрасного Приемника
Инфракрасный приемник имеет 3 контакта. При использовании подключите VOUT к 11 цифровому контакту, GND к GND, VCC к +5V.
Необходимое Оборудование
Плата Arduino UNO * 1
Инфракрасный Пульт Дистанционного Управления * 1
Инфракрасный Приемник * 1
Светодиоды * 6
Резисторы 220 Ом * 6
Провода * 11
USB - кабель * 1
Подключение Схемы
Сначала подключите плату управления; затем подключите инфракрасный приемник, как упомянуто выше, подключите VOUT к цифровому контакту 11, подключите светодиоды с резисторами и подключите резисторы к контактам 2, 3, 4, 5, 6, 7.
Принцип Эксперимента
Если вы хотите декодировать код с пульта ДУ, вы должны сначала знать, как он закодирован. Здесь используется метод кодирования по протоколу NEC. Ниже представлено краткое введение. • Протокол NEC
Особенности
(1) 8-битный адрес и 8-битная длина команды (2) адрес и команда передаются дважды для надежности (3) модуляция пульсового расстояния (4) частота несущей 38 КГц (5) время бита 1,125 мс или 2,25 мс
Протокол следующий
Определение логических 0 и 1 следующее
Импульс передается при нажатии и немедленном отпускании кнопки
На приведенной выше картинке показан типичный импульсный поезд протокола NEC. С этим протоколом LSB передается первым. В данном случае передается адрес $59 и команда $16. Сообщение начинается с 9-миллисекундного импульса AGC, который использовался для настройки усиления более ранних ИК-приемников. Затем следует 4,5-миллисекундный пробел, за которым следуют адрес и команда. Адрес и команда передаются дважды. Второй раз все биты инвертируются и могут использоваться для проверки полученного сообщения. Общее время передачи постоянно, потому что каждый бит повторяется с его инвертированной длиной. Если вам не интересна эта надежность, вы можете игнорировать инвертированные значения или можете расширить адрес и команду до 16 бит каждый!
Импульс передается при нажатии кнопки и отпускании после некоторого времени
Команда передается только один раз, даже если клавиша на пульте ДУ остается нажатой. Каждые 110 мс передается повторяющийся код, пока клавиша остается нажатой. Этот повторяющийся код - это просто 9-миллисекундный импульс AGC, за которым следует 2,25-миллисекундный пробел и 560-микросекундный всплеск.
Повторяющийся импульс
Обратите внимание, когда импульс поступает в интегрированный приемник, происходит процесс декодирования, усиления сигнала и формирования волны. Поэтому вам нужно убедиться, что уровень выходного сигнала прямо противоположен уровню сигнала передающего конца. То есть, когда инфракрасного сигнала нет, выходной конец находится в высоком уровне; когда инфракрасный сигнал есть, выходной конец находится в низком уровне. Вы можете увидеть импульс на приемном конце на осциллографе. Постарайтесь лучше понять программу на основе того, что вы видите.
FFA25D | FF629P | FFE21D |
FF22DD | FF02FD | FFC23D |
FFE01F | FFA857 | FF906F |
FF6897 | FF9867 | FFB04F |
FF30CF | FF18E7 | FF7A85 |
FF10EF | FF38C7 | FF5AA5 |
FF42BD | FF4AB5 | FF52AD |
Пример Кода для одного светодиода
//////////////////////////////////////////////////////////////////
// Проект 14: Дистанционное Управление https://github.com/shirriff/Arduino-IRremote
#include <IRremote.h>
int RECV_PIN = 11; // выбираем цифровой контакт 11 для инфракрасного приемника
int LED1 = 2; // выбираем цифровой контакт 2 для светодиода 1
long on1 = 0x00FF6897; // код включения для первой кнопки
long off1 = 0x00FF9867; // код выключения для первой кнопки
IRrecv irrecv(RECV_PIN); // создание экземпляра приемника ИК-сигналов
decode_results results; // создание экземпляра для результатов декодирования
void dump(decode_results *results) {
// Выводит структуру decode_results.
int count = results->rawlen;
if (results->decode_type == UNKNOWN) {
Serial.println("Сообщение не удалось декодировать");
} else {
if (results->decode_type == NEC) {
Serial.print("Декодирован NEC: ");
} else if (results->decode_type == SONY) {
Serial.print("Декодирован SONY: ");
} else if (results->decode_type == RC5) {
Serial.print("Декодирован RC5: ");
} else if (results->decode_type == RC6) {
Serial.print("Декодирован RC6: ");
}
Serial.print(results->value, HEX);
Serial.print(" (");
Serial.print(results->bits, DEC);
Serial.println(" бит)");
}
Serial.print("Необработанное (");
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(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);
last = millis();
irrecv.resume(); // Прием следующего значения
}
}
//////////////////////////////////////////////////////////////////
Пример Кода для 6 светодиодов
//////////////////////////////////////////////////////////////////
// Проект 14: Дистанционное Управление https://github.com/shirriff/Arduino-IRremote
#include <IRremote.h>
int RECV_PIN = 11; // выбираем цифровой контакт 11 для инфракрасного приемника
int LED1 = 2; // выбираем цифровой контакт 2 для светодиода 1
int LED2 = 3; // выбираем цифровой контакт 3 для светодиода 2
int LED3 = 4; // выбираем цифровой контакт 4 для светодиода 3
int LED4 = 5; // выбираем цифровой контакт 5 для светодиода 4
int LED5 = 6; // выбираем цифровой контакт 6 для светодиода 5
int LED6 = 7; // выбираем цифровой контакт 7 для светодиода 6
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) {
// Выводит структуру decode_results.
int count = results->rawlen;
if (results->decode_type == UNKNOWN) {
Serial.println("Сообщение не удалось декодировать");
} else {
if (results->decode_type == NEC) {
Serial.print("Декодирован NEC: ");
} else if (results->decode_type == SONY) {
Serial.print("Декодирован SONY: ");
} else if (results->decode_type == RC5) {
Serial.print("Декодирован RC5: ");
} else if (results->decode_type == RC6) {
Serial.print("Декодирован RC6: ");
}
Serial.print(results->value, HEX);
Serial.print(" (");
Serial.print(results->bits, DEC);
Serial.println(" бит)");
}
Serial.print("Необработанное (");
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(); // Прием следующего значения
}
}
//////////////////////////////////////////////////////////////////
Примечание: добавьте папку IRremote в директорию установки \Arduino\libraries, иначе компиляция не удастся. Библиотека инфракрасного пульта дистанционного управления: https://github.com/shirriff/Arduino-IRremote
Результат Теста
Декодируйте закодированный импульсный сигнал, излучаемый пультом дистанционного управления, затем выполняйте соответствующее действие в соответствии с результатами декодирования. Таким образом, вы сможете управлять своим устройством с помощью пульта дистанционного управления.
После загрузки откройте серийный монитор, и вы увидите результат, как показано ниже.