Подключение ик пульта к 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 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 и переходим к установке приложения на телефон.

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

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

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

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

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

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

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

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

Недавно мне понадобилось управлять пультом от телевизора маленький проект на arduino . Суть заключалась в том, чтобы управлять кондиционером через саму arduino с датчиком температуры. К моему кондиционеру идёт достаточно удобный пульт, но нам ведь необходимо автоматизировать включение, выставление температуры и выключение. В результате долгих поисков смог найти для себя решение. О нём подробно под катом.

Как это работает

Подключаем IR приёмник , направляем пульт ДУ на приёмник, записываем сигнал и выводим его на Serial . (т.к. это первая часть статьи мы не рассматриваем отправку сигнала. Речь об отправке пойдёт как раз во второй части).

Что нам понадобится

  • Arduino (или аналоги, я использую Tosduino - подешевле раза в 2, полная совместимость с обычным arduino)
  • Светодиод (LED )
  • Резистор на 220 kOm
  • IR приёмник из серии

Подключение

IR Receiver (Приёмник)

Светодиод LED

Arduino Breadboard Arduino
pin number 11 резистор 220 kOm GND (GrouND)

IR технология

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

Инфракрасное излучение на самом деле нормальный свет с определенным цветом. Мы, люди, не можем видеть этот цвет, потому что его длина волны 950 нм, что ниже видимого спектра. Это одна из причин, почему ИК выбран для нужд телемеханики, мы хотим использовать его, но мы не заинтересованы его видеть. Хотя мы не можем видеть инфракрасный свет, излучаемый от пульта дистанционного управления, но это не означает, что мы не можем сделать его видимым.

Видеокамера или цифровой фотоаппарат «видит» инфракрасный свет, как вы можете видеть на видео ниже. Даже самые дешевые сотовые телефоны имеют встроенные камеры. Просто наведите пульт на такую??камеру, нажмите любую кнопку, и вы увидите светодиодные мерцания.

Серия миниатюрных приемников для инфракрасных систем дистанционного управления. PIN диод и предусилитель собраны на выводной рамке, и выполнен в виде ИК-фильтра . Демодулированный выходной сигнал может быть непосредственно декодирован с помощью микропроцессора. - это стандартный приемник, поддерживает все основные коды передачи.

Part Carrier Frequency
30 kHZ
33 kHZ
36 kHZ
36.7 kHZ
38 kHZ
40 kHZ
56 kHZ

IRremote.h

Скачать библиотеку IRremote можно с моего репозитория на Github.com

Для установки данной библиотеки скопируйте содержимое архива в: arduino-1.x/libraries/IRremote Где arduino-1.x - это папка куда установлена Arduino IDE После чего должен быть доступен файл arduino-1.x/libraries/IRremote/IRremote.cpp и IRremote.h

Пример №1 - получаем код кнопки пульта ДУ

Данный скетч прочитает код нажатой на пульте кнопки и отправит информацию об этой кнопке в Serial порт для того чтобы мы могли потом этим кодом воспользоваться.

#include int RECEIVE_PIN = 2; IRrecv irrecv(RECEIVE_PIN); decode_results results; void setup() { Serial.begin(9600); irrecv.enableIRIn(); // Start the receiver } void loop() { if (irrecv.decode(&results)) { Serial.print("0x"); Serial.println(results.value, HEX); delay(50); irrecv.resume();// Receive the next value } }

Я буду использовать эти коды кнопок во всех следующих примерах:

Пример №2 - присваиваем имя для кнопки ПДУ

Отправим названия кнопок в Serial порт. (предварительно мы должны поймать коды этих кнопок и привязать им названия, смотрите в код, думаю там всё понятно будет).

#include int RECEIVE_PIN = 2; IRrecv irrecv(RECEIVE_PIN); decode_results results; void setup() { Serial.begin(9600); irrecv.enableIRIn(); } void loop() { if (irrecv.decode(&results)) { switch (results.value) { case 0x77E1A0CB: Serial.println("Center"); break; case 0x77E160CB: Serial.println("Right"); break; case 0x77E190CB: Serial.println("Left"); break; case 0x77E150CB: Serial.println("Up"); break; case 0x77E130CB: Serial.println("Down"); break; } irrecv.resume(); } }

Пример №3 - включаем LED по кнопке ПДУ

Теперь научим нашу Arduino включать светодиод (LED) на PIN 11 через кнопку на пульте

#include int LED = 11; int state = 0; // 0 = LED off while 1 = LED on int RECEIVE_PIN = 2; IRrecv irrecv(RECEIVE_PIN); decode_results results; void setup() { Serial.begin(9600); irrecv.enableIRIn(); pinMode(LED, OUTPUT); } void loop() { if ((irrecv.decode(&results)) && (results.value==0x77E1A0CB)) { if (state == 0) { state = 1; digitalWrite(LED, HIGH); Serial.println("Center - HIGH"); } else { state = 0; digitalWrite(LED, LOW); Serial.println("Center - LOW"); } delay(50); irrecv.resume(); } }

Пример №4 - ШИМ с ПДУ

Теперь давайте будем управлять яркостью нашего светодиода (так как он подключен к 11 порту, который имеет ШИМ то проблем не должно возникнуть). Для управления яркостью будут использоваться кнопки вверх и вниз на пульте ДУ.

#include int RECEIVE_PIN = 2; int brightness = 0; int LED = 11; IRrecv irrecv(RECEIVE_PIN); decode_results results; void setup() { Serial.begin(9600); irrecv.enableIRIn(); } void loop() { if (irrecv.decode(&results)) { switch (results.value) { case 0x77E150CB: if(brightness < 255) { brightness+=15; Serial.println(brightness); } break; case 0x77E130CB: if(brightness > 0) { brightness-=15; Serial.println(brightness); } break; } analogWrite(LED, brightness); irrecv.resume(); } }

Ну вот как то так. Во второй части статьи пойдёт речь о том, как полученный сигнал нам отправить на нашу технику. В моём случае это был кондиционер. Так же во второй части будет видео, которое покажет сборку под ключ, от начала и до конца + пример работы.

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

1. Vout – выход приемника.
2. GND – «земля», общий провод.
3. Vcc – питание.
Передача данных от ИК пульта к приемнику осуществляется по протоколу RC5, представляющий из себя последовательность импульсов. Подключение осуществляется по следующей схеме.

А собрав, получаем примерно следующее:

Для обработки данных, передаваемых пультом, используем библиотеку IRremote, данная библиотека прикреплена к статье. Вставляем следующий код:

#include "IRremote.h" IRrecv irrecv(11); // Указываем пин, к которому подключен приемник decode_results results; void setup() { Serial.begin(9600); // Выставляем скорость COM порта irrecv.enableIRIn(); // Запускаем прием } void loop() { if (irrecv.decode(&results)) // Если данные пришли { Serial.println(results.value, HEX); // Отправляем полученную данную в консоль irrecv.resume(); // Принимаем следующую команду } }

Теперь в консоле COM - порта можно наблюдать код нажимаемой клавиши в HEX.


Вот и все, теперь можно использовать эту схему в ваших устройствах. Ниже приведен пример одного из практических применений ИК - приемника.

В качестве демонстрации будет показано, как с помощью ИК-пульта управлять сервомашинкой.

Схема устройства:

Вот так оно должно выглядеть:

Для работы устройства используем следующий код:

#include "Servo.h" #include "IRremote.h" IRrecv irrecv(11); decode_results results; Servo servoMain; int servPoz = 90; //Начальное положение сервы int lastPoz = 0; void setup() { irrecv.enableIRIn(); servoMain.attach(10); // Servo присоединен к 10 выводу servoMain.write(servPoz); } void loop() { if (irrecv.decode(&results)) { int res = results.value; Serial.println(res, HEX); if(res==0xFFFF906F)// Если нажата кнопка "+" { lastPoz=res; servPoz++; servoMain.write(servPoz); } else if(res==0xFFFFA857)// Если нажата кнопка "-" { servPoz--; lastPoz=res; servoMain.write(servPoz); } else if(res==0xFFFFFFFF)// Если кнопку удерживают { if(lastPoz==0xFFFF906F) servPoz++;// Удерживают "+" if(lastPoz==0xFFFFA857) servPoz--;// Удерживают "-" servoMain.write(servPoz); } irrecv.resume(); delay(100); } }

Пульт используется какой-то китайский, при нажатии "+" серва вращается в одну сторону, при нажатии "-", в другую.

У каждого дома есть пульт от телевизора, или другой пульт дистанционного управления(ДУ). Данное устройство позволяет на расстоянии управлять каким-либо устройством, что является очень удобным. Не надо тратить драгоценные калории и делать лишние движения. Если у вас есть какое-то устройство и вы хотели бы управлять им на расстоянии, тогда можно сделать дистанционное управление данным устройством. При желании можно сделать и пульт ДУ своими руками, но для этого нет необходимости и это другая история. Зачем может понадобиться дистанционное управление?! - все просто:

Лень - это качество, заставляющее прилагать огромные усилия к тому, чтобы снизить общие затраты энергии.

Впервые дистанционное управление в действии миру показал изобретатель Никола Тесла, в 1898 году на выставке в Медисон-сквер-гарден он представил лодку с радиоуправлением под названием «телеавтомат». На сегодняшний день эта технология получила широчайшее распространение, только добавилось разные способы передачи команд(канал связи).

Из основных каналов связи можно выделить:

  • Радиоканал
  • Ультразвуковой
  • Инфракрасный

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

Как то давно на старой работе взял пульт и "глазок"(ИК приемник) от списываемой охранной системы, он долго валялся без дела и наконец я добрался его проверить в работе.

Разобрав данный приемник Я увидел кое-какую хитрость, в данном "глазке" было спаяно вместе 4 ик приемника. Сделано это для того чтобы принимать ик волны с четырех сторон. И это удобно, не нужно ограничивать себя определенным углом приема.

Я так же набросал похожую схему с четырьмя приемниками, вдруг понадобиться. Ик приемники я использовал TSOP1836, но можно брать другие. Что бы обеспечить прием 360 градусов нужно выбрать соответственные ик приемники(с широким углом приема) и расположить максимально близко их между собой. С моим приемников проблем с приемом я не заметил. Так же забросил во вложение печатную плату и расположение элементов.

Для обработки команд я естественно буду использовать arduino uno, в качестве приемника ИК можно использовать
TSOP34836 (обладает высокой дальностью приема, но дороже) или TL1838 . Пульт можно взять любой ИК даже от телевизора. Ну если надо свой пульт то можно купить комплект для arduino .

Принцип работы:
При нажатии на кнопку пульта ду он посылает код кнопки в инфракрасном свете, после чего приемник принимает данный код кнопки и отправляет на исполнительное устройство, которое в зависимости от кнопки выполнит определенное действие.

Так же можно при помощи ИК волн можно передавать информацию на небольшое расстояние. Для передачи своих команд или информации можно использовать вторую arduino с ИК передатчиком. Но скорость такой передачи весьма небыстрая. К плюсам инфракрасного канала относится нечувствительность к электромагнитным помехам.

Для приема arduino ИК сигналов мы подключим ИК приемник следующим образом:

Обратите внимание что расположение ножек у приемника может отличаться.


Приемник имеет 3 ноги, «+» и «-» питания(в основном напряжение 3,3-5В) и нога данных именно она передает информацию на устройство(в нашем случае arduino). Напряжение питания для TSOP34836 является 2.7-5.5 вольт. Я буду использовать 5 вольт от стандартного выхода arduino.

Ну и естественно нужна прошивка для arduino. Алгоритм работы будет следующим: при нажатии на верхнюю кнопку пульта arduino включает реле, а при повторном нажатии выключает. С помощью этого реле можно запитать например подсветку, но не обязательно программировать нажатие кнопки на реле, можно выводить в компьютер команду или выполнить определенную операцию в arduino и т.д.
Для упрощения работы будем использовать готовую библиотеку . Код прошивки:

#include int RECEIVE_PIN = 11;//контакт приемника int RELAY_PIN = 3;//контакт реле IRrecv irrecv(RECEIVE_PIN);//присваиваем пин приемника decode_results results;//полученные данные

void setup() {
Serial.begin(9600);
irrecv.enableIRIn(); // включаем приемник
pinMode(RELAY_PIN, OUTPUT); // настраиваем реле на выход
digitalWrite(RELAY_PIN,HIGH); //устанавливаем высокое значение
}

void loop() {
if (irrecv.decode(&results)) {//если получены данные
Serial.print("0x");
Serial.println(results.value, HEX);//вывод полученного в терминал
if ((results.value == 0x8FF40BF) ||(results.value == 0xD72040BF)) digitalWrite(RELAY_PIN, !digitalRead(RELAY_PIN));//если код кнопки 0x8FF40BF или 0xD72040BF меняем состояние реле на противоположное
delay(200);// задержка от двойного срабатывания
irrecv.resume();// Получаем следующее значение
}
}

Немного поясню по скетчу:



if ((results.value == 0x8FF40BF) ||(results.value == 0xD72040BF))

Полученное значение сравнивается с "0x8FF40BF" и "0xD72040BF" - это коды кнопок в шестнадцатеричной системе исчисления. Два значения лишь потому что я использую два пульта с уникальными кодами.



digitalWrite(RELAY_PIN, !digitalRead(RELAY_PIN));

Стандартная процедура цифровой записи пина за исключением "!digitalRead(RELAY_PIN)". Знак "!" обозначает инверсию, в нашем случае инверсия состояния цифрового выхода "RELAY_PIN".



Serial.print("0x");
Serial.println(results.value, HEX);//вывод полученного в терминал

Данные строки выводят все полученные коды в терминал. В рабочей программе это без надобности, но это нужно что бы узнать нужный код той или иной кнопки. То есть сначала загружаем скетч в ардуино, заходим в терминал и нажав на кнопку получим нужный код.


Так же в библиотеке IRremote есть несколько разных примеров, что может оказаться полезным.


Во вложении к статье:


  • скетч для arduino

  • печатная плата для 4 датчиков

Модуль ИК Приемника в связке и ИК пультом дистанционного управления позволит легко реализовать дистанционное управление платой Arduino.

Он представляет из себя не что иное, как ИК приемник VS1838B с установленной на плате рекомендуемой производителем обвязкой.

Для работы с данным модулем "из коробки" необходим ПДУ с частотой 38 кГц.

Плюсом данной платы является цанговый разъем, позволяющий без применения пайки заменить ИК приемник на другой, работающий на частоте, необходимой для вашего проекта.

Основные технические характеристики:

Напряжение питания: 2.7 - 5.5В

Частота модуляции: 38кГц

Диапазон температур: - 20 ... + 80°C

Интерфейс: Цифровой

Подключение к Arduino

Модуль оборудован трехпиновым разъемом стандарта 2.54мм

: подключается к выводу GND

: подключается к выводу +5V

: подключается к цифровому выводу (в примере D2)

Пример работы в среде Arduino

Для работы с данным модулем необходимо установить библиотеку IRRemote

Скачиваем, распаковываем и закидываем в папку libraries в папке Arduino. В случае, если на момент добавления библиотеки, Arduino IDE была открытой, перезагружаем среду.

Считывание показаний кнопок ПДУ

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

В качестве примера будем использовать пульт, как на картинке, т.к. пульт такого типа идет в наборе

Про отличия в логике работы различных пультов можно прочитать в статье-оригинале от члена нашего сообщества под ником

Пример программного кода:

#include int RECV_PIN = 2; IRrecv irrecv(RECV_PIN); //Создаем объект получения сигнала с определенного порта decode_results results; //Переменная, хранящая результат void setup () { Serial // Начинаем прием } void loop () { if (irrecv.decode(&results)) //При получении сигнала... { Serial .println (results.value); //…выводим его значение в последовательный порт irrecv.resume(); } }

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

При почти секундном удержании каждой кнопки, мы получаем около 10 кодов. Первый из них и является кодом кнопки. А после него начинает идти стандартный код, который сообщает о залипании кнопки.

Управление платой Arduino c ПДУ

Заставим светодиод на плате Arduino (D13) загораться при получении кодировки первой кнопки и выключаться при получении кодировки второй.

Пример программного кода:

// Тестировалось на Arduino IDE 1.0.3 #include int RECV_PIN = 2; int LED = 13; IRrecv irrecv(RECV_PIN); decode_results results; void setup () { Serial .begin (9600); irrecv.enableIRIn(); // Запуск приемника pinMode (LED, OUTPUT ); } void loop () { if (irrecv.decode(&results)) { Serial .println (results.value); if (results.value == 16769565) // При получении кодировки 1 { digitalWrite (LED, HIGH ); // Включаем светодиод } if (results.value == 16761405) // При получении кодировки 2 { digitalWrite (LED, LOW ); // Выключаем светодиод } irrecv.resume(); // Получаем следующее значение } }

Если вы нашли ошибку, пожалуйста, выделите фрагмент текста и нажмите Ctrl+Enter.