Ардуино: инфракрасный пульт и приемник. Arduino Uno. Подключение ИК-приемника Ардуино дистанционное управление на 30 каналов

Недавно мне понадобилось управлять пультом от телевизора маленький проект на 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); } }

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

Он отправляет пакет закодированных и промодулированных данных на ИК-светодиод, а при удержании кнопки, еще и пакеты повтора.

  • Невидимый инфракрасный свет от ИК-светодиода попадает на Trima-модуль ИК-приёмник , где преобразуются в демодулированные электрические импульсы.
  • Библиотека iarduino_IR постоянно считывает и раскодирует импульсы с ИК-приёмника (используя второй аппаратный таймер Arduino)
  • В коде loop мы сверяем раскодированные библиотекой данные с назначенными устройству (лампе) и если они совпали, то меняем состояние («1»/«0») на входе Trema-модуля Твердотельное реле , следовательно, включаем или выключаем устройство (лампу).
  • Устройство может быть полезным, если назначить неиспользуемые кнопки телевизионного пульта (например цветные кнопки телетекста) для управления освещением в комнате.

    Вместо ламп накаливания, Вы можете подключить любое устройство сети ~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 // подключаем библиотеку для работы с ИК приёмником iarduino_IR_RX IR(A5); // объявляем объект IR для работы с ИК приёмником (с указанием любого вывода к которому подключён ИК приёмник) const uint8_t pinRelay = {A1,A2,A3}; // объявляем массив с указанием номеров любых выводов (цифровых или аналоговых) к которым подключены твердотельные реле const uint8_t allRelay = sizeof(pinRelay); // объявляем константу передавая её количество элементов в массиве pinRelay (количество реле) uint32_t varRelay; // объявляем массив с кодами (командами) ИК-приёмника включающими реле bool modRelay; // объявляем массив с состояниями реле uint8_t setRelay; // объявляем переменную с количеством реле, для которых записана команда с ИК-приёмника void setup(){ IR.begin(); // инициализируем работу с ИК приёмопередатчиком for(uint8_t i=0; iИнфракрасный пульт дистанционного управления — один из самых простых способов взаимодействия с электронными приборами. Так, практически в каждом доме есть несколько таких устройств: телевизор, музыкальный центр, видеоплеер, кондиционер. Но самое интересное применение инфракрасного пульта — дистанционное правление роботом. Собственно, на этом уроке мы попытаемся реализовать такой способ управления с помощью популярного контроллера Ардуино Уно.

    1. ИК-пульт

    Что нужно для того, чтобы научить робота слушаться инфракрасного (ИК) пульта? Во-первых, нам потребуется сам пульт. Можно использовать обычный пульт от телевизора, а можно приобрести миниатюрный пульт от автомагнитолы. Именно такие пульты часто используются для управления роботами. На таком пульте есть 10 цифровых кнопок и 11 кнопок для манипуляции с музыкой: громкость, перемотка, play, stop, и т.д. Для наших целей более чем достаточно.

    2. ИК-датчик

    Во-вторых, для приема сигнала с пульта нам потребуется специальный ИК-датчик. Вообще, мы можем детектировать инфракрасное излучение обычным фотодиодом/фототранзистором, но в отличие от него, наш ИК-датчик воспринимает инфракрасный сигнал только на частоте 38 кГц (иногда 40кГц). Именно такое свойство позволяет датчику игнорировать много посторонних световых шумов от ламп освещения и солнца. Для этого урока воспользуемся популярным ИК-датчиком VS1838B , который обладает следующими характеристиками:
    • несущая частота: 38 кГц;
    • напряжение питания: 2,7 — 5,5 В;
    • потребляемый ток: 50 мкА.
    Можно использовать и другие датчики, например: TSOP4838, TSOP1736, SFH506.

    3. Подключение

    Датчик имеет три вывода (три ноги). Если посмотреть на датчик со стороны приёмника ИК сигнала, как показано на рисунке,
    • то слева будет - выход на контроллер,
    • по центру - отрицательный контакт питания (земля),
    • и справа - положительный контакт питания (2.7 — 5.5В).
    Принципиальная схема подключения Внешний вид макета

    4. Программа

    Подключив ИК-датчик будем писать программу для Ардуино Уно. Для этого воспользуемся стандартной библиотекой IRremote , которая предназначена как раз для упрощения работы с приёмом и передачей ИК сигналов. С помощью этой библиотеки будем принимать команды с пульта, и для начала, просто выводить их в окно монитора последовательного порта. Эта программа нам пригодится для того, чтобы понять какой код дает каждая кнопка. #include "IRremote.h" IRrecv irrecv(2); // указываем вывод, к которому подключен приемник decode_results results; void setup() { Serial.begin(9600); // выставляем скорость COM порта irrecv.enableIRIn(); // запускаем прием } void loop() { if (irrecv.decode(&results)) { // если данные пришли Serial.println(results.value, HEX); // печатаем данные irrecv.resume(); // принимаем следующую команду } } Загружаем программу на Ардуино. После этого, пробуем получать команды с пульта. Открываем монитор последовательного порта (Ctrl+Shift+M), берём в руки пульт, и направляем его на датчик. Нажимая разные кнопочки, наблюдаем в окне монитора соответствующие этим кнопкам коды. Проблема с загрузкой программы В некоторых случаях, при попытке загрузить программу в контроллер, может появиться ошибка: TDK2 was not declared In his scope Чтобы ее исправить, достаточно удалить два файла из папки библиотеки. Заходим в проводник. Переходим в папку, где установлено приложение Arduino IDE (скорее всего это «C:\Program Files (x86)\Arduino»). Затем в папку с библиотекой: …\Arduino\libraries\RobotIRremote , и удаляем файлы: IRremoteTools.cpp и IRremoteTools.h. Затем, перезапускаем Arduino IDE, и снова пробуем загрузить программу на контроллер.

    5. Управляем светодиодом с помощью ИК-пульта

    Теперь, когда мы знаем, какие коды соответствуют кнопкам пульта, пробуем запрограммировать контроллер на зажигание и гашение светодиода при нажатии на кнопки громкости. Для этого нам потребуется коды (могут отличаться, в зависимости от пульта):
    • FFA857 — увеличение громкости;
    • FFE01F — уменьшение громкости.
    В качестве светодиода, используем встроенный светодиод на выводе №13, так что схема подключения останется прежней. Итак, программа: #include "IRremote.h" IRrecv irrecv(2); // указываем вывод, к которому подключен приемник decode_results results; void setup() { irrecv.enableIRIn(); // запускаем прием } void loop() { if (irrecv.decode(&results)) { // если данные пришли switch (results.value) { case 0xFFA857: digitalWrite(13, HIGH); break; case 0xFFE01F: digitalWrite(13, LOW); break; } irrecv.resume(); // принимаем следующую команду } } Загружаем на Ардуино и тестируем. Жмем vol+ — светодиод зажигается. Жмем vol- — гаснет. Теперь, зная как это все работает, можно вместо светодиода управлять двигателями робота, или другими самодельными микроэлектронными устройствами!

    Есть много статей в интернете о том, как сделать свой пульт к телевизору на 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» на несколько секунд.

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

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