Это старая версия документа.


Модуль инфракрасного передатчика

Описание

Модуль инфракрасного передатчика представляет из себя плату со светодиодом, для передачи сигнала в инфракрасном диапазоне. С помощью данного модуля можно производить передачу информации беспроводным способом. Также, можно сымитировать нажатие кнопок (клавиш) пульта дистанционного управления, тем самым не приходя к помощи механического воздействия на пульт.

Технические характеристики

  • Цвет свечения: ИК
  • Длина волны: 940 нм
  • Мощность ИК излучения: 60мВт/ср
  • Угол по горизонтали/вертикали: 34°/34°

Физические размеры

  • Модуль (Д х Ш х В): 20 х 30 х 12 (мм)

Плюсы использования

  • Модуль не требует дополнительной обвязки
  • Имеет три вывода и шлейф в комплекте, облегчая подключение через Sensor шилд
  • Передача любых данных беспроводным способом

Минусы использования

  • Не высокая дальность (в сравнении с пультами управления)

Библиотека для работы с модулем

В среде разработки Arduino по-умолчанию присутствует библиотека для работы с ИК приёмником и передатчиком - она называется <RobotIRremote>, однако она работает некорректно и её необходимо удалить чтобы две библиотеки не конфликтовали друг с другом. Для этого перейдите в папку установки Arduino/Libraries и удалите папку RobotIRremote.

Обратите внимание что для работы ИК-приёмника и ИК передатчика используется одна и та же библиотека <IRremote>. Таким образом скачивать и устанавливать данную библиотеку дважды не требуется!

Примеры подключения и использования модуля

В примерах происходит подключение модуля ИК передатчика к первому контроллеру (что по сути является передатчиком). Подключение модуля приёмника ИК-сигнала ко второму контроллеру (приёмник). Таким образом, после заливки скетча иллюстрируется пример передачи информации с контроллера №1 (передатчика) на контроллер №2 (приёмник). Примеры тестировались на контроллерах Smart UNO.

Пример 1

Передача 1 и 0 с частотой в одну секунду. Передача происходит по алгоритму RC5.

Шаг 1: Подключите модуль ИК-передатчика к контроллеру №1:

Загрузите следующий скетч в контроллер №1:

#include <IRremote.h> //подключение библиотеки для работы с модулем ИК-передатчика
 
IRsend irsend; //объявление объекта ИК-передатчика
 
void setup() {
 
}
 
void loop() {
 
  irsend.sendRC5(0x10, 8); //отослать цифру 0 по алгоритму RC5
  delay(1000); // задержка в 1 секунду
 
  irsend.sendRC5(0x11, 8); //отослать цифру 1 по алгоритму RC5
  delay(1000); // задержка в 1 секунду
}

Шаг 2. Подключите ИК-приёмник к контроллеру №2.

Загрузите в контроллер №2 следующий скетч, и наблюдайте в мониторе Serial-порта получаемые данные.

#include <IRremote.h> // подключение библиотеки
const int IR_pin = 8; // пин подключения инфракрасного приемника
decode_results results; // переменная для хранения результата приема
 
IRrecv irreceiver(IR_pin); // создание объекта приемника
 
void setup()
{
  irreceiver.enableIRIn(); // инициализация приемника
  Serial.begin(9600); // инициализация Serial порта
}
 
void loop()
{
  if (irreceiver.decode(&results)) { // если что-то пришло
    Serial.print(results.value); // сообщить значение приема в монитор ( десятичная система счисления)
    Serial.print(" dec, in hex: "); // дополнительная поясняющая запись
    Serial.println(results.value, HEX); // сообщить значение приема в монитор (шестнадцатиричная система счисления)
    irreceiver.resume(); // возобновление работы ИК приемника
  }
}

Пример 2

Передача 1 и 0 с частотой в одну секунду. Передача происходит по алгоритму RC5. При приёме сигнала считаем что 1 - это команда ко включению светодиода, 0 - к выключению светодиода. Таким образом, на стороне приёмника модуль светодиода мигает с частотой в 1 секунду.

Шаг 1: Подключите модуль ИК-передатчика к контроллеру №1:

Загрузите следующий скетч в контроллер №1:

#include <IRremote.h> //подключение библиотеки для работы с модулем ИК-передатчика
 
IRsend irsend; //объявление объекта ИК-передатчика
 
void setup() {
 
}
 
void loop() {
 
  irsend.sendRC5(0x10, 8); //отослать цифру 0 по алгоритму RC5
  delay(1000); // задержка в 1 секунду
 
  irsend.sendRC5(0x11, 8); //отослать цифру 1 по алгоритму RC5
  delay(1000); // задержка в 1 секунду
}

Шаг 2. Подключите ИК-приёмник и модуль светодиода к контроллеру №2.

Загрузите в контроллер №2 следующий скетч, и наблюдайте мигание модуля светодиода.

#include <IRremote.h> //подключение библиотеки
const int IR_pin = 8; //пин подключения инфракрасного приемника
const int LED = 13; // пин подключения светодиода
bool CUR_state = LOW; //состояние светодиода (изначально выключен)
bool NEW_state = LOW; // новое стостояние светодиода (изначально выключен)
 
decode_results results; //переменная для хранения результата приема
 
IRrecv irreceiver(IR_pin); //создание объекта приемника
 
void setup()
{
  irreceiver.enableIRIn(); //инициализация приемника
  pinMode(LED, OUTPUT); //конфигурация вывода светодиода на выход
  digitalWrite(LED, CUR_state); //изначальная установка режима вывода светодиода в LOW
}
 
void loop()
{
  if (irreceiver.decode(&results)) { //если что-то пришло
 
    irreceiver.resume(); //возобновление работы ИК приемника
 
    switch (results.value) { //в зависимости от полученных данных
      case 16: //если это 0х10 (или 16 в десятиричной системе)
        NEW_state = LOW; //новый статус = ПОГАСИТЬ
        break;
      case 17: //если это 0х11 (или 17 в десятиричной системе)
        NEW_state = HIGH; //новый статус = ВКЛЮЧИТЬ
        break;
    }
 
    if (NEW_state != CUR_state) { //если новый статус изменился
      digitalWrite(LED, NEW_state); //применить изменение к свету
      CUR_state = NEW_state; //теперь новый статус стал текущим
    }
  }
}

Пример 3

В данном примере с помощью модуля ИК передатчика имитируется нажатие кнопок пульта дистанционного управления. (Коды кнопок в шестнадцатиричной системе счисления)

Шаг 1: Подключите модуль ИК-передатчика к контроллеру №1:

Загрузите следующий скетч в контроллер №1:

#include <IRremote.h> //подключение библиотеки для работы с ИК-передатчиком
 
//далее определяется соответствие синонимов кнопок цифрам
#define PLUS    1 //цифре 1 определен синоним "PLUS"
#define MINUS   2 //цифре 2 определен синоним "MINUS"
#define ONOFF   3 //цифре 3 определен синоним "ONOFF"
#define BACK    4 //цифре 4 определен синоним "BACK"
#define FWD     5 //цифре 5 определен синоним "FWD"
#define PLAY    6 //цифре 6 определен синоним "PLAY"
#define MENU    7 //цифре 7 определен синоним "MENU"
#define CANS    8 //цифре 8 определен синоним "CANS"
 
IRsend irsend; //объект для работы с ИК-приёмником
 
//функция, возвращающая код кнопки пульта
// http://smartelements.ru/collection/svyaz/product/pult-upravleniya-infrakrasnyy
unsigned long buttonCode(const int& definitionButton) { 
  switch (definitionButton) { // на входе синоним кнопки
    case PLUS:          //если это кнопка PLUS 
      return 0xFF02FD;  //вернуть её код в шестнадцатиричной системе счисления
    case MINUS:         //если это кнопка MINUS 
      return 0xFF9867;  //вернуть её код в шестнадцатиричной системе счисления
    case ONOFF:         //если это кнопка ONOFF 
      return 0xFFA25D;  //вернуть её код в шестнадцатиричной системе счисления
    case BACK:          //если это кнопка BACK 
      return 0xFFE01F;  //вернуть её код в шестнадцатиричной системе счисления
    case FWD:           //если это кнопка FWD 
      return 0xFF906F;  //вернуть её код в шестнадцатиричной системе счисления
    case PLAY:          //если это кнопка PLAY 
      return 0xFFA857;  //вернуть её код в шестнадцатиричной системе счисления
    case MENU:          //если это кнопка MENU 
      return 0xFFE21D;  //вернуть её код в шестнадцатиричной системе счисления
    case CANS:          //если это кнопка CANS 
      return 0xFFB04F;  //вернуть её код в шестнадцатиричной системе счисления
    default:            //если синоним неизвестен
      return 0x0;       //вернётся 0
  }
}
 
void setup() {
 
}
 
void loop() {
 
  //в цикле от 1 до 8
  for (int i = 1; i <= 8; i++) {
    irsend.sendNEC(buttonCode(i), 32); //послать код кнопки (имитировать нажатие кнопки на пульте управления)
    delay(1000); //задержка в 1 секунду
  }
 
}

Шаг 2. Подключите ИК-приёмник к контроллеру №2.

Загрузите в контроллер №2 следующий скетч, и наблюдайте в мониторе Serial-порта получаемые данные.

#include <IRremote.h> //подключение библиотеки
const int IR_pin = 8; //пин подключения инфракрасного приемника
decode_results results; //переменная для хранения результата приема
 
IRrecv irreceiver(IR_pin); //создание объекта приемника
 
//функция переводящая код кнопки в её обозначение
// для пульта http://smartelements.ru/collection/svyaz/product/pult-upravleniya-infrakrasnyy
String whatIsTheButtonPressed(const unsigned long &value) { 
  switch (value) {
    case (unsigned long)0xFF02FD:
      return "+";
    case (unsigned long)0xFF9867:
      return "-";
    case (unsigned long)0xFFA25D:
      return "ONOFF";
    case (unsigned long)0xFFE01F:
      return "<<";
    case (unsigned long)0xFF906F:
      return ">>";
    case (unsigned long)0xFFA857:
      return "PLAY";
    case (unsigned long)0xFFE21D:
      return "MENU";
    case (unsigned long)0xFFB04F:
      return "C";
    default:
      return "UNNOWN";
  }
}
 
void setup()
{
  Serial.begin(9600); //инициализация Serial - порта
  irreceiver.enableIRIn(); //инициализация приемника
}
 
void loop()
{
  if (irreceiver.decode(&results)) { //если что-то пришло
    Serial.print(results.value, HEX); //сообщить значение приема в монитор (в шестнадцатиричной системе счисления)
    Serial.print(" "); //выведем разделитель - пробел
    Serial.println(whatIsTheButtonPressed(results.value)); //сообщить значение кнопки в монитор
    irreceiver.resume(); //возобновление работы ИК приемника
  }
}

Пример 4

В данном примере с помощью модуля ИК передатчика имитируется нажатие кнопок пульта дистанционного управления. (Коды кнопок в десятичной системе счисления)

Шаг 1: Подключите модуль ИК-передатчика к контроллеру №1:

Загрузите следующий скетч в контроллер №1:

#include <IRremote.h> //подключение библиотеки для работы с ИК-передатчиком
 
//далее определяется соответствие синонимов кнопок цифрам
#define PLUS    1 //цифре 1 определен синоним "PLUS"
#define MINUS   2 //цифре 2 определен синоним "MINUS"
#define ONOFF   3 //цифре 3 определен синоним "ONOFF"
#define BACK    4 //цифре 4 определен синоним "BACK"
#define FWD     5 //цифре 5 определен синоним "FWD"
#define PLAY    6 //цифре 6 определен синоним "PLAY"
#define MENU    7 //цифре 7 определен синоним "MENU"
#define CANS    8 //цифре 8 определен синоним "CANS"
 
IRsend irsend; //объект для работы с ИК-приёмником
 
//функция, возвращающая код кнопки пульта
// http://smartelements.ru/collection/svyaz/product/pult-upravleniya-infrakrasnyy
unsigned long buttonCode(const int& definitionButton) { 
  switch (definitionButton) { // на входе синоним кнопки
    case PLUS:          //если это кнопка PLUS 
      return 16712445;  //вернуть её код в шестнадцатиричной системе счисления
    case MINUS:         //если это кнопка MINUS 
      return 16750695;  //вернуть её код в шестнадцатиричной системе счисления
    case ONOFF:         //если это кнопка ONOFF 
      return 16753245;  //вернуть её код в шестнадцатиричной системе счисления
    case BACK:          //если это кнопка BACK 
      return 16769055;  //вернуть её код в шестнадцатиричной системе счисления
    case FWD:           //если это кнопка FWD 
      return 16748655;  //вернуть её код в шестнадцатиричной системе счисления
    case PLAY:          //если это кнопка PLAY 
      return 16754775;  //вернуть её код в шестнадцатиричной системе счисления
    case MENU:          //если это кнопка MENU 
      return 16769565;  //вернуть её код в шестнадцатиричной системе счисления
    case CANS:          //если это кнопка CANS 
      return 16756815;  //вернуть её код в шестнадцатиричной системе счисления
    default:            //если синоним неизвестен
      return 0x0;       //вернётся 0
  }
}
 
void setup() {
 
}
 
void loop() {
 
  //в цикле от 1 до 8
  for (int i = 1; i <= 8; i++) {
    irsend.sendNEC(buttonCode(i), 32); //послать код кнопки (имитировать нажатие кнопки на пульте управления)
    delay(1000); //задержка в 1 секунду
  } 
}

Шаг 2. Подключите ИК-приёмник к контроллеру №2.

Загрузите в контроллер №2 следующий скетч, и наблюдайте в мониторе Serial-порта получаемые данные.

#include <IRremote.h> //подключение библиотеки
const int IR_pin = 8; //пин подключения инфракрасного приемника
decode_results results; //переменная для хранения результата приема
 
IRrecv irreceiver(IR_pin); //создание объекта приемника
 
//функция переводящая код кнопки в её обозначение
// для пульта http://smartelements.ru/collection/svyaz/product/pult-upravleniya-infrakrasnyy
String whatIsTheButtonPressed(const unsigned long &value) { 
  switch (value) {
    case (unsigned long)16712445:
      return "+";
    case (unsigned long)16750695:
      return "-";
    case (unsigned long)16753245:
      return "ONOFF";
    case (unsigned long)16769055:
      return "<<";
    case (unsigned long)16748655:
      return ">>";
    case (unsigned long)16754775:
      return "PLAY";
    case (unsigned long)16769565:
      return "MENU";
    case (unsigned long)16756815:
      return "C";
    default:
      return "UNNOWN";
  }
}
 
void setup()
{
  Serial.begin(9600); //инициализация Serial - порта
  irreceiver.enableIRIn(); //инициализация приемника
}
 
void loop()
{
  if (irreceiver.decode(&results)) { //если что-то пришло
    Serial.print(results.value); //сообщить значение приема в монитор (в шестнадцатиричной системе счисления)
    Serial.print(" "); //выведем разделитель - пробел
    Serial.println(whatIsTheButtonPressed(results.value)); //сообщить значение кнопки в монитор
    irreceiver.resume(); //возобновление работы ИК приемника
  }
}