Универсальный пульт на Arduino. Передача данных в инфракрасном диапазоне при помощи Arduino Подключение ик приемника к arduino
Есть много статей в интернете о том, как сделать свой пульт к телевизору на Arduino, но мне понадобился универсальный пульт для управления телевизором и медиа-плеером. Главное преимущество моего универсального пульта в том, что кнопки в приложении для андроид телефона двух-целевые, а впрочем, смотрите на видео.
Пульт очень удобен в том, что на экране практически одни и те же кнопки используются для управления телевизором и плеером. Одно отличие в том, что кнопка "AV
" в режиме управления телевизором меняется на кнопку "◻
" (stop) при переходе в режим управления плеером. На картинках показано два режима, слева режим управления телевизором, справа - режим управления плеером.
Ну а сейчас я расскажу немного о создании такого пульта. Для устройства использовал пульт от телевизора ERGO и пульт от медиаплеера DUNE HD TV101W.
Для получения данных от пультов я использовал инфракрасный датчик TSOP1138 (аналог TSOP4838) на рабочей частоте 38 кГц и подключил его к плате Arduino по схеме:
Этот скетч на потребуется для определения кодировки передачи данных и считывания кода кнопок пультов.
В скетче в строке int RECV_PIN = 11; указываем наш пин под номером 4
После заливки скетча открываем «монитор порта» и, нажимая на кнопки пульта, смотрим на полученные данные.
На картинке пример сканирования кнопки включения от пульта телевизора и пульта плеера. Теперь формируем таблицу для кодов кнопок.
У меня получилось как на фото выше. Под надписью TV коды кнопок пульта от телевизора; под надписью Player - коды от пульта медиаплеера.
Теперь отключаем наш приемник инфракрасных сигналов от платы Arduino и подключаем к ней Bluetooth модуль HC-05 и инфракрасный светодиод по схеме на фото.
После этого переходим непосредственно к скетчу.
Скетч
#include
В скетче вам потребуется отредактировать коды кнопок, а именно в строках:
If (x == 97) {
irsend.sendNEC(0x807F08F7, 32);
delay(40);
Значение 807F08F7 поменять на:
If (y == 1) { //коды кнопок для пульта от телевизора
if (x == 97) {
irsend.sendNEC(0x12345678, 32);
delay(40);
}
Где 12345678 - это код вашей кнопки.
После редактирования скетча по ваши коды кнопок заливаем скетч в плату Arduino и переходим к установке приложения на телефон.
Включаем блютуз в телефоне, ищем наше устройство, создаем пару, потом запускаем приложение Pult на телефоне.
При запуске у нас появится экран с красным значком bluetooth в правом нижнем углу, что сигнализирует о том, что мы не подключены к нашему устройству.
После этого жмем на этот значок. У нас должно появится окно со списком всех доступных bluetooth устройств, где мы выбираем наше устройство для подключения.
Теперь мы снова вернулись на главный экран и уже можем управлять телевизором:
Для перехода в режим управления нам потребуется нажать кнопку с надписью «Player» . Как я говорил раньше, у нас кнопка с надписью «AV» поменяется на кнопку "◻ ":
Для отключения от нашего устройства просто зажмите кнопку «Power» на несколько секунд.
Ну и несколько фотографий моего готового устройства.
Получилось, вроде, неплохо. Жду комментарии к статье.
Он отправляет пакет закодированных и промодулированных данных на ИК-светодиод, а при удержании кнопки, еще и пакеты повтора.
Устройство может быть полезным, если назначить неиспользуемые кнопки телевизионного пульта (например цветные кнопки телетекста) для управления освещением в комнате.
Вместо ламп накаливания, Вы можете подключить любое устройство сети ~220 В, с током потребления до 2 А.
Нам понадобится:
- ИК-пульт дистанционного управления x 1шт. (подойдёт любой телевизионный ИК-пульт)
- Устройства (лампы), которыми мы будем управлять х 3шт.
Для реализации проекта нам необходимо установить библиотеку:
- Библиотека iarduino_IR для работы с ИК-приёмопередатчиками
ВАЖНО : библиотека использует второй аппаратный таймер,
НЕ ВЫВОДИТЕ СИГНАЛЫ ШИМ НА 3 ИЛИ 11 ВЫВОД!
О том как устанавливать библиотеки, Вы можете ознакомиться на странице Wiki - Установка библиотек в Arduino IDE .
Видео:
Схема подключения:
В данной схеме используются только цифровые модули, их можно подключать к любым (как цифровым так и аналоговым) выводам Arduino. Для примера, мы подключили все модули к аналоговым выводам. Не все знают, что аналоговые выводы Arduino могут работать как обычные цифровые выводы, позволяющие получать (от ИК-приёмника) и передавать (на твердотельные реле) цифровые сигналы в виде логических «0» и «1».
Если Вы будете подключать устройства к другим выводам, то их номера нужно указать во второй (объявление объекта IR) и третей (объявление массива pinRelay) строках скетча . Код программы написан так, что вы можете подключить столько реле , сколько есть свободных выводов у вашей Arduino , просто перечислив номера выводов в третей строке скетча (объявление массива pinRelay).
Алгоритм работы:
- При старте , скетч последовательно назначает код кнопки ИК-пульта каждому твердотельному реле . Сначала мигает светодиод и замыкается цепь твердотельного реле вывод которого указан первым. Если нажать на любую кнопку ИК-пульта , то код данной кнопки присвоится этому реле и начнет мигать следующее, и так, пока всем реле не будут назначены кнопки ИК-пульта .
- После назн ачения кнопок , все реле находятся в выключенном состоянии. Если нажать кнопку ИК-пульта , то включится реле которому присвоен код данной кнопки. Если повторно нажать на указанную кнопку, то реле выключится. Устройство не отреагирует на нажатие кнопок, код которых не присваивался ни одному реле.
- Если Вы не хотите присваивать коды кнопок при каждом старте, то явно укажите их при объявлении массива varRelay, а из кода setup удалите циклы for и while.
- Узнать код каждой кнопки можно написав следующую строку: if(IR.check()){Serial.println(IR.data);}
Код программы:
#includeОн представляет из себя не что иное, как ИК приемник VS1838B с установленной на плате рекомендуемой производителем обвязкой.
Для работы с данным модулем "из коробки" необходим ПДУ с частотой 38 кГц.
Плюсом данной платы является цанговый разъем, позволяющий без применения пайки заменить ИК приемник на другой, работающий на частоте, необходимой для вашего проекта.
Основные технические характеристики:
Напряжение питания: 2.7 - 5.5В
Частота модуляции: 38кГц
Диапазон температур: - 20 ... + 80°C
Интерфейс: Цифровой
Подключение к Arduino
Модуль оборудован трехпиновым разъемом стандарта 2.54мм
: подключается к выводу GND
: подключается к выводу +5V
: подключается к цифровому выводу (в примере D2)
Пример работы в среде Arduino
Для работы с данным модулем необходимо установить библиотеку IRRemote
Скачиваем, распаковываем и закидываем в папку libraries в папке Arduino. В случае, если на момент добавления библиотеки, Arduino IDE была открытой, перезагружаем среду.
Считывание показаний кнопок ПДУ
Для считывания показаний пульта заливаем нижеприведенный скетч. Он будет выводить в порт кодировки нажатых кнопок.
В качестве примера будем использовать пульт, как на картинке, т.к. пульт такого типа идет в наборе
Про отличия в логике работы различных пультов можно прочитать в статье-оригинале от члена нашего сообщества под ником
Пример программного кода:
#includeВ мониторе порта должны увидеть слудущее:
При почти секундном удержании каждой кнопки, мы получаем около 10 кодов. Первый из них и является кодом кнопки. А после него начинает идти стандартный код, который сообщает о залипании кнопки.
Управление платой Arduino c ПДУ
Заставим светодиод на плате Arduino (D13) загораться при получении кодировки первой кнопки и выключаться при получении кодировки второй.
Пример программного кода:
// Тестировалось на Arduino IDE 1.0.3 #includeВсем доброго времени дня (или ночи, как вам удобно), начнём пожалуй с лирического вступления. Сейчас у многих дома есть телевизор с пультом ДУ(дистанционного управления), тюнер, 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); }
И в конце статьи - видео, которое демонстрирует работу обоих скетчей. При желании и наличии творческой фантазии, можно расширить парк подключаемых модулей и управлять этим всем более продвинуто. Мы же в своей статье, постарались привести базовый пример применения этой технологии. Спасибо за внимание и приятного просмотра!!!
Пожалуйста, включите javascript для работы комментариев.
Есть много статей в интернете о том, как сделать свой пульт к телевизору на Arduino, но мне понадобился универсальный пульт для управления телевизором и медиа-плеером. Главное преимущество моего универсального пульта в том, что кнопки в приложении для андроид телефона двух-целевые, а впрочем, смотрите на видео.
Пульт очень удобен в том, что на экране практически одни и те же кнопки используются для управления телевизором и плеером. Одно отличие в том, что кнопка "AV
" в режиме управления телевизором меняется на кнопку "◻
" (stop) при переходе в режим управления плеером. На картинках показано два режима, слева режим управления телевизором, справа - режим управления плеером.
Ну а сейчас я расскажу немного о создании такого пульта. Для устройства использовал пульт от телевизора ERGO и пульт от медиаплеера DUNE HD TV101W.
Для получения данных от пультов я использовал инфракрасный датчик TSOP1138 (аналог TSOP4838) на рабочей частоте 38 кГц и подключил его к плате Arduino по схеме:
Этот скетч на потребуется для определения кодировки передачи данных и считывания кода кнопок пультов.
В скетче в строке int RECV_PIN = 11; указываем наш пин под номером 4
После заливки скетча открываем «монитор порта» и, нажимая на кнопки пульта, смотрим на полученные данные.
На картинке пример сканирования кнопки включения от пульта телевизора и пульта плеера. Теперь формируем таблицу для кодов кнопок.
У меня получилось как на фото выше. Под надписью TV коды кнопок пульта от телевизора; под надписью Player - коды от пульта медиаплеера.
Теперь отключаем наш приемник инфракрасных сигналов от платы Arduino и подключаем к ней Bluetooth модуль HC-05 и инфракрасный светодиод по схеме на фото.
После этого переходим непосредственно к скетчу.
Скетч
#include
В скетче вам потребуется отредактировать коды кнопок, а именно в строках:
If (x == 97) {
irsend.sendNEC(0x807F08F7, 32);
delay(40);
Значение 807F08F7 поменять на:
If (y == 1) { //коды кнопок для пульта от телевизора
if (x == 97) {
irsend.sendNEC(0x12345678, 32);
delay(40);
}
Где 12345678 - это код вашей кнопки.
После редактирования скетча по ваши коды кнопок заливаем скетч в плату Arduino и переходим к установке приложения на телефон.
Включаем блютуз в телефоне, ищем наше устройство, создаем пару, потом запускаем приложение Pult на телефоне.
При запуске у нас появится экран с красным значком bluetooth в правом нижнем углу, что сигнализирует о том, что мы не подключены к нашему устройству.
После этого жмем на этот значок. У нас должно появится окно со списком всех доступных bluetooth устройств, где мы выбираем наше устройство для подключения.
Теперь мы снова вернулись на главный экран и уже можем управлять телевизором:
Для перехода в режим управления нам потребуется нажать кнопку с надписью «Player» . Как я говорил раньше, у нас кнопка с надписью «AV» поменяется на кнопку "◻ ":
Для отключения от нашего устройства просто зажмите кнопку «Power» на несколько секунд.
Ну и несколько фотографий моего готового устройства.
Получилось, вроде, неплохо. Жду комментарии к статье.