Есть много статей в интернете о том, как сделать свой пульт к телевизору на Arduino, но мне понадобился универсальный пульт для управления телевизором и медиа-плеером. Главное преимущество моего универсального пульта в том, что кнопки в приложении для андроид телефона двух-целевые, а впрочем, смотрите на видео.



Пульт очень удобен в том, что на экране практически одни и те же кнопки используются для управления телевизором и плеером. Одно отличие в том, что кнопка "AV" в режиме управления телевизором меняется на кнопку "?" (stop) при переходе в режим управления плеером. На картинках показано два режима, слева режим управления телевизором, справа — режим управления плеером.

image image

Ну а сейчас я расскажу немного о создании такого пульта. Для устройства использовал пульт от телевизора ERGO и пульт от медиаплеера DUNE HD TV101W.

image

Для получения данных от пультов я использовал инфракрасный датчик TSOP1138 (аналог TSOP4838) на рабочей частоте 38 кГц и подключил его к плате Arduino по схеме:

image

Для начала нам потребуется прочитать коды кнопок пультов. Я воспользовался библиотекой IRremote и тестовым скетчем IRrecvDump.

image

Этот скетч на потребуется для определения кодировки передачи данных и считывания кода кнопок пультов.

В скетче в строке int RECV_PIN = 11; указываем наш пин под номером 4


После заливки скетча открываем «монитор порта» и, нажимая на кнопки пульта, смотрим на полученные данные.

image

На картинке пример сканирования кнопки включения от пульта телевизора и пульта плеера. Теперь формируем таблицу для кодов кнопок.

image

У меня получилось как на фото выше. Под надписью TV коды кнопок пульта от телевизора; под надписью Player — коды от пульта медиаплеера.

Теперь отключаем наш приемник инфракрасных сигналов от платы Arduino и подключаем к ней Bluetooth модуль HC-05 и инфракрасный светодиод по схеме на фото.

image

После этого переходим непосредственно к скетчу.

Скетч
#include <IRremote.h>
IRsend irsend;
int y = 1;

void setup()
{
  Serial.begin(9600);
}

void loop() {
  if (Serial.available() > 0) {
    int x = Serial.read();
    if (x == 49) {
      y = 1;
    }
    if (x == 50) {
      y = 2;
    }
    if (y == 1) { // коды кнопок для пульта от телевизора
      if (x == 97) {
        irsend.sendNEC(0x807F08F7, 32);
        delay(40);
      }
      if (x == 98) {
        irsend.sendNEC(0x807FA857, 32);
        delay(40);
      }
      if (x == 99) {
        irsend.sendNEC(0x807F708F, 32);
        delay(40);
      }
      if (x == 100) {
        irsend.sendNEC(0x807FF00F, 32);
        delay(40);
      }
      if (x == 101) {
        irsend.sendNEC(0x807F30CF, 32);
        delay(40);
      }
      if (x == 102) {
        irsend.sendNEC(0x807FB04F, 32);
        delay(40);
      }
      if (x == 103) {
        irsend.sendNEC(0x807F9867, 32);
        delay(40);
      }
      if (x == 104) {
        irsend.sendNEC(0x807F58A7, 32);
        delay(40);
      }
      if (x == 105) {
        irsend.sendNEC(0x807FD827, 32);
        delay(40);
      }
      if (x == 106) {
        irsend.sendNEC(0x807F38C7, 32);
        delay(40);
      }
      if (x == 107) {
        irsend.sendNEC(0x807F48B7, 32);
        delay(40);
      }
      if (x == 108) {
        irsend.sendNEC(0x807FB847, 32);
        delay(40);
      }
      if (x == 109) {
        irsend.sendNEC(0x807F6897, 32);
        delay(40);
      }
    }
    if (y == 2) {  //коды кнопок пульта от медиаплеера
      if (x == 97) {
        irsend.sendNEC(0xFDC23D, 32); 
        delay(40);
      }
      if (x == 98) {
        irsend.sendNEC(0xFDE01F, 32);
        delay(40);
      }
      if (x == 99) {
        irsend.sendNEC(0xFD18E7, 32);
        delay(40);
      }
      if (x == 100) {
        irsend.sendNEC(0xFDE817, 32);
        delay(40);
      }
      if (x == 101) {
        irsend.sendNEC(0xFDA857, 32);
        delay(40);
      }
      if (x == 102) {
        irsend.sendNEC(0xFD6897, 32);
        delay(40);
      }
      if (x == 103) {
        irsend.sendNEC(0xFDA857, 32);
        delay(40);
      }
      if (x == 104) {
        irsend.sendNEC(0xFD6897, 32);
        delay(40);
      }
      if (x == 105) {
        irsend.sendNEC(0xFDE817, 32);
        delay(40);
      }
      if (x == 106) {
        irsend.sendNEC(0xFD18E7, 32);
        delay(40);
      }
      if (x == 107) {
        irsend.sendNEC(0xFD9867, 32);
        delay(40);
      }
      if (x == 108) {
        irsend.sendNEC(0xFD28D7, 32);
        delay(40);
      }
      if (x == 109) {
        irsend.sendNEC(0xFD20DF, 32);
        delay(40);
      }
    }
  }
}


В скетче вам потребуется отредактировать коды кнопок, а именно в строках:

if (x == 97) {
        irsend.sendNEC(0x807F08F7, 32);
        delay(40);

Значение 807F08F7 поменять на:

if (y == 1) { //коды кнопок для пульта от телевизора
      if (x == 97) {
        irsend.sendNEC(0x12345678, 32);
        delay(40);
      }

Где 12345678 — это код вашей кнопки.

После редактирования скетча по ваши коды кнопок заливаем скетч в плату Arduino и переходим к установке приложения на телефон.

[ Скачать приложение для android устройств «Универсальный пульт управления» ]

Включаем блютуз в телефоне, ищем наше устройство, создаем пару, потом запускаем приложение Pult на телефоне.

При запуске у нас появится экран с красным значком bluetooth в правом нижнем углу, что сигнализирует о том, что мы не подключены к нашему устройству.

image

После этого жмем на этот значок. У нас должно появится окно со списком всех доступных bluetooth устройств, где мы выбираем наше устройство для подключения.

image

Теперь мы снова вернулись на главный экран и уже можем управлять телевизором:

image

Для перехода в режим управления нам потребуется нажать кнопку с надписью «Player». Как я говорил раньше, у нас кнопка с надписью «AV» поменяется на кнопку "?":

image

Для отключения от нашего устройства просто зажмите кнопку «Power» на несколько секунд.

Список используемых компонентов с ссылками на продавцов

Ну и несколько фотографий моего готового устройства.

image

image

image

Получилось, вроде, неплохо. Жду комментарии к статье.

Комментарии (14)


  1. inhelp Автор
    02.04.2015 23:40
    +4

    В планах отобразить названия режима в приложении и добавить голосовое управление… Как считаете — развивать проект дальше ??? А то идей по совершенствованию много…


  1. shoomyst
    03.04.2015 00:09

    Честно признаюсь, что прочитал по диагонали, вопрос такой: где размещается это устройство и от чего питается?


    1. inhelp Автор
      03.04.2015 00:17

      куда разместить не решил, питается от 5 вольт (зарядка от телефона)


      1. shoomyst
        03.04.2015 00:30
        +1

        А почему отключение от блютуз при зажатии на power, а не на иконку блютуза?


  1. r00tGER
    03.04.2015 09:03

    ИК-диод прилично «жрет». По хорошему, надо подключать через транзистор.
    Когда делал подобное, выковырнул диод и транзистор из старого пульта.


    1. inhelp Автор
      03.04.2015 10:15

      Максимальный ток на 3 пине 50мА… Диоду этого тока вполне хватает, но большое спасибо за подсказку, попробую на макетке…


  1. TimReset
    03.04.2015 10:54

    Я делал что-то подобное — только у меня Arduino преобразовывал сигналы от одного пульта в сигналы в другого. Нужно было, когда пульт от колонок потерялся, а ручка управления громкость находится сзади, неудобно. Так же использовал эту библиотеку. А Вы не заменяли энерго потребление? Можно ли на батарейки перевести конструкцию? А то у меня сейчас от USB компа питается (т.к. возле компа находится), но хотелось бы отвязаться от него.


    1. inhelp Автор
      03.04.2015 11:59
      +2

      нет, не замерял, нет ваттметра в наличии, но по току посмотрю и отпишусь…


  1. Sa4ek
    03.04.2015 14:28

    Делал подобную штуку для управления и тв и румбой. Если интересно выложу свой опыт))


    1. inhelp Автор
      03.04.2015 17:44

      интересно


  1. lopatoid
    03.04.2015 16:06
    +1

    А можно избавиться от приемника/передатчика инфракрасных сигналов? То есть подключить выход с ардуины напрямую к выходам ик приемника в телевизоре?


    1. inhelp Автор
      03.04.2015 17:45
      +1

      можно, но зачем мучать телевизор ???


  1. om2804
    06.04.2015 01:02

    У Вас блютуз модуль тоже от 5 Вольт запитан? Не вижу стабилизатора. Он же под 3.3В идёт!?
    Если светодиод напрямую к пину подключать, то нужно ограничительный резистор поставить, чтоб порт не спалить. на 180 Ом примерно. Но лучше, как советовали выше через транзистор


    1. inhelp Автор
      06.04.2015 13:06

      Bluetooth модуль HC-05 размещен на подложке, где питание через стабилизатор от 5 вольт, максимальный ток на портах arduino около 40 mA, и светодиод нормально работает без резистора…