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

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

==== Физические размеры ====
  * Модуль (Д х Ш х В): 20 х 30 х 12 (мм)

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

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

==== Библиотека для работы с модулем ====
  * [[http://files.smartelements.ru/know_libs/irremote_master.zip|Скачать (irremote)]]
  * [[http://files.smartelements.ru/datasheet/tsal6200.pdf|Даташит]]

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

<WRAP center round info 60%>
Обратите внимание что для работы ИК-приёмника и ИК передатчика используется одна и та же библиотека <IRremote>. Таким образом скачивать и устанавливать данную библиотеку дважды не требуется!
</WRAP>
===== Примеры подключения и использования модуля =====

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

==== Пример 1 ====

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

^ Что нужно                                                                                                               ^ Кол-во, шт  ^
| [[http://smartelements.ru/collection/kontrollery/product/kontroller-smart-uno|Контроллер Smart UNO]]                            |  2           |
| [[http://smartelements.ru/collection/new_products/product/modul-infrakrasnogo-peredatchika|Модуль ИК передатчика]]    |  1           |
| [[http://smartelements.ru/collection/svyaz/product/modul-infrakrasnogo-priemnika-tsop4838|Модуль ИК приёмника TSOP4838]]|  1           |
| [[http://smartelements.ru/collection/provoda-i-kabeli/product/nabor-provodov-20-sht-20sm-papa-papa|Провода папа-папа]]  |  6           |

**Шаг 1:** Подключите модуль ИК-передатчика к контроллеру №1:
{{ :главная:связь:модуль_ик_передатчика_н.png?nolink |}}

Загрузите следующий скетч в контроллер №1:
<file Arduino>
#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 секунду
}
</file>

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

{{ :главная:связь:модуль_ик_приемника-4838_н.png?nolink |}}

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

<file Arduino>
#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(); // возобновление работы ИК приемника
  }
}

</file>

==== Пример 2 ====

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

^ Что нужно                                                                                                               ^ Кол-во, шт  ^
| [[https://smartelements.ru/collection/kontrollery/product/kontroller-smart-uno|Контроллер Smart UNO]]        |  2           |
| [[https://smartelements.ru/collection/new_products/product/modul-infrakrasnogo-peredatchika|Модуль ИК передатчика]]    |  1           |
| [[https://smartelements.ru/collection/moduli/product/modul-svetodioda-krasnyy|Модуль светодиода (красный)]]             |  1           |
| [[https://smartelements.ru/collection/svyaz/product/modul-infrakrasnogo-priemnika-tsop4838|Модуль ИК приёмника TSOP4838]]|  1           |
| [[https://smartelements.ru/collection/provoda-i-kabeli/product/nabor-provodov-20-sht-20sm-papa-papa|Провода папа-папа]]|  9           |
| [[https://smartelements.ru/collection/raznoe/product/maketnaya-plata-srednyaya|Макетная плата]]             |  1           |

**Шаг 1:** Подключите модуль ИК-передатчика к контроллеру №1:
{{ :главная:связь:модуль_ик_передатчика_н.png?nolink |}}

Загрузите следующий скетч в контроллер №1:
<file Arduino>
#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 секунду
}
</file>

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

{{ :главная:связь:модуль_ик_передатчика_пример_2_шаг_2_н.png?nolink |}}

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

<file Arduino>
#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; //теперь новый статус стал текущим
    }
  }
}
</file>

==== Пример 3 ==== 

В данном примере с помощью модуля ИК передатчика имитируется нажатие кнопок [[http://smartelements.ru/collection/svyaz/product/pult-upravleniya-infrakrasnyy|пульта дистанционного управления]]. (Коды кнопок в шестнадцатиричной системе счисления)

^ Что нужно                                                                                                               ^ Кол-во, шт  ^
| [[https://smartelements.ru/collection/kontrollery/product/kontroller-smart-uno|Контроллер Smart UNO]]  |  2           |
| [[https://smartelements.ru/collection/new_products/product/modul-infrakrasnogo-peredatchika|Модуль ИК передатчика]]   |  1           |
| [[https://smartelements.ru/collection/svyaz/product/modul-infrakrasnogo-priemnika-tsop4838|Модуль ИК приёмника TSOP4838]]|  1           |
| [[https://smartelements.ru/collection/provoda-i-kabeli/product/nabor-provodov-20-sht-20sm-papa-papa|Провода папа-папа]]  |  6           |

**Шаг 1:** Подключите модуль ИК-передатчика к контроллеру №1:
{{ :главная:связь:модуль_ик_передатчика_н.png?nolink |}}

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

<file Arduino>
#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 секунду
  }
  
}
</file>

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

{{ :главная:связь:модуль_ик_приемника-4838_н.png?nolink |}}

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

<file Arduino>
#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(); //возобновление работы ИК приемника
  }
}
</file>

==== Пример 4 ====

В данном примере с помощью модуля ИК передатчика имитируется нажатие кнопок [[http://smartelements.ru/collection/svyaz/product/pult-upravleniya-infrakrasnyy|пульта дистанционного управления]]. (Коды кнопок в десятичной системе счисления)

^ Что нужно                                                                                                               ^ Кол-во, шт  ^
| [[http://smartelements.ru/collection/kontrollery/product/kontroller-smart-uno|Контроллер Smart UNO]]                            |  2           |
| [[http://smartelements.ru/collection/new_products/product/modul-infrakrasnogo-peredatchika|Модуль ИК передатчика]]    |  1           |
| [[http://smartelements.ru/collection/svyaz/product/modul-infrakrasnogo-priemnika-tsop4838|Модуль ИК приёмника TSOP4838]]|  1           |
| [[http://smartelements.ru/collection/provoda-i-kabeli/product/nabor-provodov-20-sht-20sm-papa-papa|Провода папа-папа]]  |  6           |

**Шаг 1:** Подключите модуль ИК-передатчика к контроллеру №1:
{{ :главная:связь:модуль_ик_передатчика_н.png?nolink |}}

Загрузите следующий скетч в контроллер №1:
<file Arduino>
#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 секунду
  } 
}
</file>

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

{{ :главная:связь:модуль_ик_приемника-4838_н.png?nolink |}}

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

<file Arduino>
#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(); //возобновление работы ИК приемника
  }
}
</file>