Изучаем возможность использования инфракрасных пультов дистанционного управления с Ардуино в средствах телемеханики. Используем библиотеку IRremote.

Телемеханика:

  1. Наука об управлении и контроле на расстоянии с передачей (по каналу связи) кодированных электрических или радиосигналов, несущих управляющую информацию или данные о состоянии контролируемого объекта. Объектами телемеханического управления и контроля могут служить технологические процессы, машины, устройства, биологические системы и др.
  2. Отрасль техники, разрабатывающая, создающая и использующая средства кодирования, передачи и приёма информации по каналам проводной, оптической и радиосвязи. В системах телемеханики информация обычно передается в кодированном виде по одному каналу связи. Средства телемеханики используются для телеизмерений и телеуправления объектами энергосистем, газо- и нефтепроводов, атомных электростанций, некоторых химических предприятий, автоматических метеостанций и др.

Инфракрасный пульт дистанционного управления (ИР ПДУ) рис. 1 — электронный прибор предназначенный для дистанционного управления техническими устройствами.

Рис. 1. Пульт дистанционного управления.

ИК датчик (ИК приемник) рис. 2 способен обнаруживать импульсы инфракрасного излучения. Чтобы датчик не реагировал на все теплые предметы и солнечный свет, в спектре которого значительная доля инфракрасного света, датчик настроен на прием модулированного инфракрасного излучения с частотой модуляции 38 кГц. Такое, модулированное инфракрасное излучение в природе встречается редко и, соответственно, датчик защищен от ложных срабатываний. ИК датчик обнаруживает инфракрасные импульсы излучаемые инфракрасным светодиодом пульт дистанционного управления.

Рис. 2. Изображение ИК датчика.

Рис. 3. Схематичное изображение ИК приёмника.

Внешний вид и внутреннее устройство различных ИК ПДУ может сильно отличаться, но принцип действия у большинства из них один. При нажатии на клавишу ПДУ, ИК светодиод передаёт код этой клавиши. Коды передаваемые ПДУ у разных производителей разные, поэтому пульты от разных устройств не подходят друг к другу. Но программист может использовать в своих устройствах любой пульт, надо только узнать для каждой клавиши её код.

Для работы с ИР ПДУ и Ардуино подходит библиотека IRremote. Чтобы воспользоваться функциями библиотеки IRremote, сначала эту библиотеку необходимо загрузить.

Рис. 4. Загрузка библиотеки IRremote в Arduino IDE. 

Поддерживаемые библиотекой ИК-протоколы: Denon/Sharp, JVC, LG, NEC/Onkyo/Apple, Panasonic/Kaseikyo, RC5, RC6, Samsung, Sony, (Pronto), BoseWave, Lego, Whynter и дополнительный MagiQuest.

Выбрать протокол и загрузить библиотеку в свою программу можно следующим образом:

#define DECODE_NEC
//#define DECODE_DENON
#include <IRremote.hpp>

Программа 1.

#include <IRremote.h>
#define IR_RECEIVE_PIN      2

void setup()
{
  Serial.begin(9600);
  IrReceiver.begin(IR_RECEIVE_PIN, ENABLE_LED_FEEDBACK);
}

void loop() {
  if (IrReceiver.decode()) {
    IrReceiver.printIRResultShort(&Serial);
    IrReceiver.resume();
  }
}

Программа 1.

В программе 1 в строке

IrReceiver.begin(IR_RECEIVE_PIN, ENABLE_LED_FEEDBACK); 

происходит инициализация объекта irReceiver. Параметрами, передаваемыми в метод begin являются номер порта на плате Arduino, к которому подключён выход датчика и константа ENABLE_LED_FEEDBACK, которая включает ретрансляции кода, полученного от датчика на светодиод L на плате Arduino. Используйте константy DISABLE_LED_FEEDBACK для отмены ретрансляции сигнала. 

Protocol=NEC Address=0x9168 Command=0xB Raw-Data=0xF40B9168 32 bits LSB first
Protocol=NEC Address=0x9168 Command=0xB Repeat gap=42200us
Protocol=NEC Address=0x9168 Command=0x7 Raw-Data=0xF8079168 32 bits LSB first
Protocol=NEC Address=0x9168 Command=0x1B Raw-Data=0xE41B9168 32 bits LSB first
Protocol=NEC Address=0x9168 Command=0x0 Raw-Data=0xFF009168 32 bits LSB first
Protocol=NEC Address=0x9168 Command=0x0 Repeat gap=42200us
Protocol=NEC Address=0x9168 Command=0x3 Raw-Data=0xFC039168 32 bits LSB first
Protocol=NEC Address=0x9168 Command=0x1 Raw-Data=0xFE019168 32 bits LSB first
Protocol=NEC Address=0x9168 Command=0x9 Raw-Data=0xF6099168 32 bits LSB first
Protocol=NEC Address=0x9168 Command=0x5 Raw-Data=0xFA059168 32 bits LSB first
Protocol=NEC Address=0x9168 Command=0x2 Raw-Data=0xFD029168 32 bits LSB first
Protocol=NEC Address=0x9168 Command=0x2 Repeat gap=42250us

Лист. 1. Монитор последовательного порта принимает данные с модуля Arduino

Задание 1. Определите шестнадцатеричные коды всех клавиш на пульте. Результаты исследований занесите в таблицу 1.

Key Code Key Code Key Code
           
           
           
           
           
           
           


Табл. 1. Коды клавиш ИК ПДУ

Теперь мы знаем коды всех клавиш для нашего пульта и можем их использовать в своей программе для Ардуино модуля.

switch (results.value) {
case 0xB:            // POWER
  break;
case 0x7:            // Minus
  break;
case 0x1B:           // Plus
  break;
default:    // Выполняется, если код неизвестен
}

Программа 2. Фрагмент программы, обрабатывающей коды клавиш на языке Си для Ардуино.

Рис. 3. Схема подключения ИК приёмника и RGB светодиода к Ардуино модулю.

#include <IRremote.h>
#define IR_RECEIVE_PIN      2
#define R_PIN               5
#define G_PIN              10
#define B_PIN               9
byte R = 0xFF, G = 0xFF, B = 0xFF;

void setup()
{
  Serial.begin(9600);
  IrReceiver.begin(IR_RECEIVE_PIN, ENABLE_LED_FEEDBACK);
}

void loop() {
  if (IrReceiver.decode()) {
    switch (IrReceiver.decodedIRData.command) {
      case 0x7:            // Minus
        if (R > 0) R--;
        break;
      case 0x1B:            // Plus
        if (R < 255) R++;
        break;
      case 0x3:
        if (G > 0) G--;
        break;
      case 0x1:
        if (G < 255) G++;
        break;
      case 0x5:
        if (B > 0) B--;
        break;
      case 0x2:            // Minus
        if (B < 255) B++;
        break;
    }
    Serial.print("Red ");
    Serial.print(R);
    Serial.print(" Green ");
    Serial.print(G);
    Serial.print(" Blue ");
    Serial.println(B);
    IrReceiver.resume();
    analogWrite(R_PIN, R);
    analogWrite(G_PIN, G);
    analogWrite(B_PIN, B);
  }
  delay(20);
}

Программа 3. 

Литература

https://github.com/z3t0/Arduino-IRremote Библиотека IRRemoute

http://arduino.on.kg/peredacha-dannyh-v-infrakrasnom-diapazone-pri-pomoshchi-Arduino