Опубликовано: 25.04.2017 16:38
Автор: jazon
Всем доброго времени дня (или ночи, как вам удобно), начнём пожалуй с лирического вступления. Сейчас у многих дома есть телевизор с пультом ДУ(дистанционного управления), тюнер, DVD проигрыватель. Многие люди(и семьи) не представляют свой домашний быт без пульта ДУ в руке. Согласитесь - как здорово быть властелином домашней техники, и в любой момент диктовать этим железякам свою волю. В этой статье, мы бы хотели рассмотреть технологию дистанционного управления более углубленно, и привести некоторые примеры применения для своих нужд.
Итак, что же нам потребуется в качестве компонентов для нашего эксперимента? Как вариант продаются готовые модули ИК-пульта и ИК-приёмника. Но нам не хочется ждать и платить деньги, поэтому будет действовать более хардкорно. Возьмём за основу пульт ДУ неизвестного происхождения, также у нас имеется кусок платы от китайского тюнера на котором распаян инфракрасный приёмник. На фото ниже вы можете видеть эти комплектующие. Если признаться честно - пульт ДУ был найден среди ненужного барахла в столе офиса, а плата с ИК-приёмником была взята в ближайшей радиомастерской.
Ну так что же, как говаривал Ганнибал - "Вперед, на Карфаген". Нам нужно просто выпаять приёмник и подключить его к плате Arduino по нижеследующей схеме...
ИК-приёмник который был выпаян из платы не имеет какой либо маркировки, это просто очередной неизвестный китайский радиокомпонент, каких выпущено было тысячи. Вкратце можно сказать - в одном корпусе он объединяет фотодиод, предусилитель и формирователь. На выходе формируется обычный ТТЛ-сигнал без заполнения, пригодный для дальнейшей обработки микроконтроллером. Несущая частота возможно(!) 36 кГц, но сейчас это не так важно... Просто попробуем его подключить к плате Arduino, условная схема даст нужную распиновку данного девайса. На схеме ниже, выделенное красным - это форма корпуса в котором выполнен наш ИК-приёмник, выделенное зеленым - распиновка по которой он подключен к плате Arduino.
Внимание !!! На просторах интернета есть много схем распиновок для приборов в таком корпусе(TSOP). Приведённая в этой статье распиновка может не совпадать с любыми найденными в интернете, но у нас всё подключено именно так. Если при подключении ИК-приёмник начинает греться - сразу же выключайте собранную схему, значит распиновка подключения не соответствует действительной, и вам придется подбирать её практически наугад. Именно так мы и сделали, потому что найденные в интернете схемы не подошли для нашего ИК-приёмника. Здесь, в общем то главное не спалить плату Arduino, действуйте осторожно !!!
Итак, всё подключено. Чтобы прочитать коды с пульта ДУ существует библиотека 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
И вот теперь, в общем то всё готово для финального теста - это будет элементарный тест управления включением/выключением релейных модулей. Приведем небольшое задание:
Скетч, который реализует вышеописанное задание:
#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. Описание различных датчиков и модулей. Советы и наставления начинающим. Пишите и размещайте свои статьи в соответсвующей ветке форума.