kz ru
Каталог

Проект 14: ИК-пульт дистанционного управления

Принцип Работы

Встроенный приемник преобразует световой сигнал, полученный от передатчика, в слабый электрический сигнал. Сигнал усиливается усилителем ИС. После автоматической регулировки усиления, полосовой фильтрации, демодуляции, формирования волны, он возвращается к исходному коду. Затем код вводится в схему идентификации кода через выходной контакт приемника сигнала.

Выводы и Подключение Инфракрасного Приемника


thumbthumb

Инфракрасный приемник имеет 3 контакта. При использовании подключите VOUT к 11 цифровому контакту, GND к GND, VCC к +5V.


thumb

 

Необходимое Оборудование

Плата 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 следующее

thumb

Импульс передается при нажатии и немедленном отпускании кнопки

thumb

На приведенной выше картинке показан типичный импульсный поезд протокола NEC. С этим протоколом LSB передается первым. В данном случае передается адрес $59 и команда $16. Сообщение начинается с 9-миллисекундного импульса AGC, который использовался для настройки усиления более ранних ИК-приемников. Затем следует 4,5-миллисекундный пробел, за которым следуют адрес и команда. Адрес и команда передаются дважды. Второй раз все биты инвертируются и могут использоваться для проверки полученного сообщения. Общее время передачи постоянно, потому что каждый бит повторяется с его инвертированной длиной. Если вам не интересна эта надежность, вы можете игнорировать инвертированные значения или можете расширить адрес и команду до 16 бит каждый! 

 Импульс передается при нажатии кнопки и отпускании после некоторого времени

thumb

Команда передается только один раз, даже если клавиша на пульте ДУ остается нажатой. Каждые 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

Результат Теста

Декодируйте закодированный импульсный сигнал, излучаемый пультом дистанционного управления, затем выполняйте соответствующее действие в соответствии с результатами декодирования. Таким образом, вы сможете управлять своим устройством с помощью пульта дистанционного управления.

После загрузки откройте серийный монитор, и вы увидите результат, как показано ниже.


thumb

Комментарии
Отзывов еще никто не оставлял
Товары упомянутые в статье
В наличии
Предзаказ
арт. 5-52
Инфракрасный датчик VS1838B, работающий на частоте 38 кГц. Применяется в...
100 тг 60 тг
В наличии
Предзаказ
арт. 7-6
IR пульт с приемником Напряжение питания приемника 5V
500 тг
Предзаказ
Предзаказ успешно отправлен!
Имя *
Телефон *
Добавить в корзину
Название товара
100 тг
1 шт.
Перейти в корзину
Обратный звонок
Запрос успешно отправлен!
Имя *
Телефон *
Заказ в один клик
С помощью уведомлений о заказе можно не только получать актуальную информацию по заказу, но и иметь быстрый канал связи с магазином