Передача данных в инфракрасном диапазоне при помощи Arduino

25.04.2017 16:38

jazon



        Всем доброго времени дня (или ночи, как вам удобно), начнём пожалуй с лирического вступления. Сейчас у многих дома есть телевизор с пультом ДУ(дистанционного управления), тюнер, DVD проигрыватель. Многие люди(и семьи) не представляют свой домашний быт без пульта ДУ в руке. Согласитесь - как здорово быть властелином домашней техники, и в любой момент диктовать этим железякам свою волю. В этой статье, мы бы хотели рассмотреть технологию дистанционного управления более углубленно, и привести некоторые примеры применения для своих нужд.

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


       

        Ну так что же, как говаривал Ганнибал - "Вперед, на Карфаген". Нам нужно просто выпаять приёмник и подключить его к плате Arduino по нижеследующей схеме...

  • Подключение ИК приёмника 

        ИК-приёмник который был выпаян из платы не имеет какой либо маркировки, это просто очередной неизвестный китайский радиокомпонент, каких выпущено было тысячи. Вкратце можно сказать - в одном корпусе он объединяет фотодиод, предусилитель и формирователь. На выходе формируется обычный ТТЛ-сигнал без заполнения, пригодный для дальнейшей обработки микроконтроллером. Несущая частота возможно(!) 36 кГц, но сейчас это не так важно... Просто попробуем его подключить к плате Arduino, условная схема даст нужную распиновку данного девайса. На схеме ниже, выделенное красным - это форма корпуса в котором выполнен наш ИК-приёмник, выделенное зеленым - распиновка по которой он подключен к плате Arduino

        Внимание !!! На просторах интернета есть много схем распиновок для приборов в таком корпусе(TSOP). Приведённая в этой статье распиновка может не совпадать с любыми найденными в интернете, но у нас всё подключено именно так. Если при подключении ИК-приёмник начинает греться - сразу же выключайте собранную схему, значит распиновка подключения не соответствует действительной, и вам придется подбирать её практически наугад. Именно так мы и сделали, потому что найденные в интернете схемы не подошли для нашего ИК-приёмника. Здесь, в общем то главное не спалить плату Arduino, действуйте осторожно !!!

  • Библиотека IRremote

        Итак, всё подключено. Чтобы прочитать коды с пульта ДУ существует библиотека IRremote.h, именно с её помощью будем изучать наш пульт, а точнее коды кнопок. В дальнейшем используем прочитанные коды в своих целях. Скетч, при помощи которого будут прочитаны коды кнопок, представлен в примерах этой библиотеки, называется он IRrecvDemo. Внимание !!! Скетч при компиляции выдаёт ошибку, в  самом начале  нужно добавить еще две подключаемые библиотеки:

#include "boarddefs.h"   //Добавочная библиотека
#include "IRremote.h"
#include "IRremoteInt.h" //Добавочная библиотека

int RECV_PIN = 2;        //Пин подключения выходного сигнала с ИК-приёмника

//Создаём экземпляр класса IRrecv, в качестве параметра передаём пин подключения сигнала ИК-приёмника
IRrecv irrecv(RECV_PIN);  

decode_results results;   //Переменная для сохранения полученного кода нажатой кнопки

void setup()
{
  Serial.begin(9600);
  irrecv.enableIRIn();     //Включение ИК-приёмника в работу
}

void loop()
{
  if (irrecv.decode(&results))             //Если произошло событие/кнопка была нажата
  {
    Serial.println(results.value, HEX);    //Выводим в монитор порта код нажатой кнопки в шестнадцатиричном виде
    irrecv.resume();                       //Считываем следующую значение/кнопку
  }
  delay(100);
} 


        После того как скетч был залит в плату Arduino(мы используем Arduino Nano на шилде I/O Wireless Shield for Nano), можно открыть монитор порта и посмотреть какие появляются коды при нажатии кнопок на пульте ДУ. Результат работы скетча представлен на скриншоте ниже:


        

        Кстати, в качестве монитора порта мы используем свой проверенный софт, если кому интересно - почитать статью и скачать Serial Monitor Pro можно здесь

Далее, нужно оформить полученные коды кнопок в виде констант, сделано это будет примерно так:

#define KEY_ONOFF 0x807F807F    //Кнопка Включения/Выключения
#define KEY_MUTE  0x807F48B7    //Кнопка Mute
#define KEY_1     0x807F00FF    //Кнопка 1
#define KEY_2     0x807FE01F    //Кнопка 2
#define KEY_3     0x807F609F    //Кнопка 3
#define KEY_4     0x807F20DF    //Кнопка 4
#define KEY_5     0x807FD02F    //Кнопка 5
#define KEY_6     0x807F50AF    //Кнопка 6
#define KEY_7     0x807F10EF    //Кнопка 7
#define KEY_8     0x807FF00F    //Кнопка 8
#define KEY_9     0x807F708F    //Кнопка 9
#define KEY_0     0x807FC837    //Кнопка 0

        И вот теперь, в общем то всё готово для финального теста - это будет элементарный тест управления включением/выключением релейных модулей. Приведем небольшое задание:

  • Используем два релейных модуля
  • Реле №1 привязываем к кнопке "1" пульта
  • Реле №2 привязываем к кнопке "2" пульта 
  • Включение любого из релейных модулей производится нажатием на кнопку к которой он привязан
  • Выключение любого из релейных модулей также производится нажатием на кнопку к которой он привязан
  • Нажатие на кнопку On/Off безусловно выключает оба релейных модуля(если они были включены, либо один из них включеный) 

Скетч, который реализует вышеописанное задание:

#include "boarddefs.h"   //Добавочная библиотека
#include "IRremote.h"
#include "IRremoteInt.h" //Добавочная библиотека

#define KEY_ONOFF 0x807F807F    //Кнопка Включения/Выключения
#define KEY_1     0x807F00FF    //Кнопка 1
#define KEY_2     0x807FE01F    //Кнопка 2

#define RELOUT1 3               //Выходной порт для реле 1
#define RELOUT2 4               //Выходной порт для реле 2

int RECV_PIN = 2;

IRrecv irrecv(RECV_PIN);

decode_results results;

static boolean REL1_ONOFF = false;
static boolean REL2_ONOFF = false;

void setup() 
{
  pinMode(RELOUT1, OUTPUT);
  pinMode(RELOUT2, OUTPUT);
  
  Serial.begin(9600);
  irrecv.enableIRIn(); // Start the receiver
}

void loop() 
{
  if (irrecv.decode(&results)) 
  {
    switch(results.value)
    {
      case(KEY_ONOFF):
        REL1_ONOFF = false;
        REL2_ONOFF = false;
        break;
      case(KEY_1):
        if(REL1_ONOFF)
          REL1_ONOFF = false;
        else
          REL1_ONOFF = true;
        break;
      case(KEY_2):
        if(REL2_ONOFF)
          REL2_ONOFF = false;
        else
          REL2_ONOFF = true;
        break;
    }
    irrecv.resume();
  }

  digitalWrite(RELOUT1, REL1_ONOFF);
  digitalWrite(RELOUT2, REL2_ONOFF);
  
  delay(100);
}


        И в конце статьи - видео, которое демонстрирует работу обоих скетчей. При желании и наличии творческой фантазии, можно расширить парк подключаемых модулей и управлять этим всем более продвинуто. Мы же в своей статье, постарались привести базовый пример применения этой технологии. Спасибо за внимание и приятного просмотра !!!



Расскажи о нас

Сообщение

Если у Вас есть опыт в работе с Arduino и собственно есть время для творчества, мы приглашаем всех желающих стать авторами статей публикуемых на нашем портале. Это могут быть как уроки, так и рассказы о ваших экспериментах с Arduino. Описание различных датчиков и модулей. Советы и наставления начинающим. Пишите и размещайте свои статьи в соответсвующей ветке форума.