Программируемый ик передатчик. Управление arduino пультом ИК

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

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

  • Tutorial

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

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

Собранная схема нужна нам для получения кодов команд от обеих пультов, к несчастью снять команды с устройства для которого пульт утерян несколько сложнее. Вы можете всё-таки найти пульт донор, воспользоваться универсальным пультом подобрав код (а зачем тогда вам тогда транскодер, раз уж пульт подошёл?) или попытавшись воспользоваться данными из интернет баз по IR кодам. Самым простым для меня оказалось воспользоваться приложением под андроид, эмулирующий нужный мне пульт.
Для чтения данных используем пример IRrecvDumpV2 из поставки IRremote, если ваш пульт относится к распознаваемым библиотекой то сырой результат сканирования вам не понадобится, хотя например пульт от LG у меня ложно распознавался как Samsung и не заработал при попытке отправлять команды через sendLG.

Пример полученных данных под спойлером:

Encoding: SAMSUNG
Code: 34346897 (32 bits)
Timing:
+4450, -4350 + 600, - 500 + 600, - 500 + 600, -1600

+ 600, - 500 + 600, - 500 + 600, - 500 + 600, -1600
+ 600, -1600 + 600, - 500 + 600, -1600 + 600, - 500
+ 600, - 500 + 600, - 500 + 600, -1600 + 600, -1600
+ 600, - 500 + 600, -1600 + 600, - 500 + 600, - 500
+ 600, - 500 + 550, -1650 + 550, - 550 + 550, - 550
+ 550, -1650 + 550, - 550 + 550, -1650 + 550, -1600
+ 600, -1600 + 600
unsigned int rawData = {4450,4350, 600,500, 600,500, 600,1600, 600,1600, 600,500, 600,1600, 600,500, 600,500, 600,500, 600,500, 600,1600, 600,1600, 600,500, 600,1600, 600,500, 600,500, 600,500, 600,1600, 600,1600, 600,500, 600,1600, 600,500, 600,500, 600,500, 550,1650, 550,550, 550,550, 550,1650, 550,550, 550,1650, 550,1600, 600,1600, 600}; // SAMSUNG 34346897
unsigned int data = 0x34346897;


В случае если захват выдаёт сообщение “IR code too long. Edit IRremoteInt.h and increase RAWLEN” библиотеку придётся немного исправить - увеличив размер буфера для команд. Для пульта которым планируется управлять достаточно знать 32 битный код команды, стоит обратить внимание что на некоторых пультах код зажатой клавиши отличается от той же кнопки в режиме нажал и отпустил. Такие кнопки потребуют двух значений. Сводим полученные коды в удобную для вас таблицу. В ту же таблицу сохраняем коды для пульта донора в сыром виде.
Подключаем к Arduino инфракрасный светодиод и пишем простейшую программу которая получает инфракрасный сигнал с заданным кодом и отправляет другой код через светодиод. Резистор на 82 выбран из соображений того что валялось под рукой. Для встраиваемого устройства его можно смело увеличивать до 200 Ом а если передатчик должен быть дальнобойным то придётся дополнить его нехитрым транзисторным каскадом, иначе тока от Arduino обязательно не хватит.


При наличии кодов команд от обеих пультов код транскодера приобретает следующий вид

Void loop() { if (irrecv.decode(&results)) { switch(results.value){ case(0x845E5420):{ irsend.sendRaw(irSignal, sizeof(irSignal) / sizeof(irSignal), khz); }break; } } irrecv.resume(); irrecv.enableIRIn(); }
Запускаем скетч, заливаем в Arduino. Как ни странно после запуска одна команда проходит, после чего все последующие устройством игнорируются. Чтобы не связываться с отладкой добавляем в цикл мигалку на 13 пине и видим что после первой попытки отправить команду плата зависает. Что же, значит не всё так гладко в одновременном использовании передачи и приёма ИК сигнала в одном проекте. Немного покопавшись в используемых таймерах выясняется что так как и отправка и приём использует общий таймер то после начала отправки код должен подождать пока отправка не закончится. Можно эмпирически добавить задержку в пол секунды (delay(500))и всё будет работать, но зная что сырые данные у нас представляют собой отсчёты времени в миллисекундах то можно просто добавить функцию отправки с задержкой. В модуле Irsend есть даже подходящая функция custom_delay_usec, которой я изначально воспользовался неправильно, забыв домножить величину задержки на множитель USECPERTICK из библиотеки (50 мс).

Void sendDelayed(unsigned int array){ irsend.sendRaw(array, sizeof(array) / sizeof(array), khz); int array_size = sizeof(array) / sizeof(array); for(int i=0;i Такой код отлично работает, в switch теперь достаточно вписать нужное число case для кнопок и всё будет работать. Но не тут то было. Коды rawData записываются в виде массива int а у нас платформа на микроконтроллере. Память для переменных будет съедена уже пятью командами длиной по 100 элементов. А ведь на пультах бывает и по 25 кнопок.
Проблемы нет если не пользоваться сырым представлением данных, для этого в библиотеке есть возможность слать команды известными протоколами, например для пультов совместимых с Sony это sendSony. В библиотеке уже реализованы пульты известных производителей, но с ходу разобраться с моим пультом у меня не получилось. Поэтому переходим к более примитивным способам экономии памяти которые помогут тем у кого пульты совсем уж нестандартные.
Первое что приходит в голову это задавать rawData не в виде int, а перейти на байт. Все значения в этом массиве это результат чтения ИК сигнала таймером с периодом 50 миллисекунд, а так как эти данные кратны 50, то разделив их на 50 мы ничего не потеряем. Верхний предел будет ограничен значением 50*255=12750, а это 12 секунд, чего будет достаточно даже для декодирования неспешной азбуки Морзе - если такая необходимость возникнет.
В библиотеку был добавлен метод принимающий на вход байты, что сократило потребления памяти вдвое

IRsend::sendRaw (byte buf, unsigned int len, unsigned int hz)
Только вот памяти под переменные у Arduino всего два килобайта а это максимом 40 команд по 50 байтов. Нам необходимо больше памяти. И эту память мы извлечём из сегмента команд. Достаточно зарезервировать один массив достаточного размера и набивать его перед отправкой чередой присваиваний. Итого из кодового сегмента на одну команду будет тратиться около 100 байт, но ведь и места для кода у нас не меньше десяти килобайт. Так что на средний пульт со ста кнопками нам уже хватит.
Дабы не набивать руками присваивания в библиотеку был добавлен пример IRrecvDumpRawByte который выводит сырые данные не только в форме байтов но и в виде блока присваиваний

Пример под спойлером

rawData=87;rawData=87;rawData=10;rawData=9;rawData=10;rawData=9;rawData=10;rawData=10;rawData=10;rawData=9;rawData=10;rawData=9;rawData=10;rawData=29;rawData=10;rawData=9;rawData=10;rawData=9;rawData=10;rawData=10;rawData=10;rawData=9;rawData=10;rawData=9;rawData=10;rawData=10;rawData=10;rawData=9;rawData=10;rawData=9;rawData=10;rawData=10;rawData=10;rawData=9;rawData=10;rawData=86;rawData=10;rawData=9;rawData=11;rawData=9;rawData=10;rawData=9;rawData=10;rawData=9;rawData=10;rawData=28;rawData=10;rawData=29;rawData=10;rawData=28;rawData=10;rawData=9;rawData=10;rawData=28;rawData=10;rawData=10;rawData=10;rawData=9;rawData=10;rawData=28;rawData=10;rawData=10;rawData=10;rawData=9;rawData=10;rawData=9;rawData=10;rawData=28;rawData=10;rawData=9;rawData=11;rawData=27;rawData=10;rawData=29;rawData=10;rawData=9;rawData=10;


Пример уже написанного скетча который позволяет управлять Samsung DVD HR-755 при помощи пульта Daewoo R40A01 находится в примерах под именем DaewooR40A01toDVDHR755Transcoder. Pull request на добавление примеров в общую ветку пока никто не принял поэтому скачать модифицированную библиотеку можно с форка .

Много фото с переделанным рекордером





















Под катом находятся фотографии интеграции Arduino Nano внутрь этого DVD рекордера, Arduino Mini конечно занимает ощутимо меньше места, но под рукой была только Nano. Питание я взял с панели управления. Сигнал со встроенного приёмника был подключен к Arduino а параллельно ему был напаян ещё один ИК приёмник, расположенный с противоположной стороны от первого. Тем же навесным монтажом на него был напаян ИК светодиод. В принципе этого повторения можно было бы избежать - но сигнал с ИК приёмника инвертирован - поэтому напрямую завести ТТЛ сигнал на устройство не получится - а городить инвертор на логике или транзисторе я уже не стал.

Несмотря на то, что в моём случае сырые данные отлично работали, эксперименты с остальным домашним оборудованием показали что далеко не все захваченные сигналы корректно работали при попытке управления конкретным устройством. Команда включения кондиционера так и не заработала, хотя если он был уже включён смена режимов работала корректно. Колонка от LG тоже отказалась воспринимать сырые команды, но отлично реагировала на отправку кодов через sendSamsung. При этом пять собранных по знакомых телевизора отлично реагировали на сырые данные. Вариант с разной частотой сигнала я опробовал - это никак не помогло. Возможно проблема лежит в частоте дискретизации сигнала в 50 мс. Судя по работоспособности команд формата Samsung на технике LG, протокол стоит формализовать в виде отдельного модуль по аналогии с ir_LG.cpp ir_JVC.cpp ir_Dish.cpp, подобрав для конкретного устройства заголовок и параметры кодирования нулей и единиц. Наверное разбор написания такого протокола послужит неплохой темой для статьи.

Ну и в дополнение, вторая большая ИК библиотека для Arduino это

Модуль ИК Приемника в связке и ИК пультом дистанционного управления позволит легко реализовать дистанционное управление платой 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(); // Получаем следующее значение } }

Рассмотрим на этом занятии подключение ИК приемника к Ардуино. Расскажем какую библиотеку следует использовать для IR приемника, продемонстрируем скетч для тестирования работы инфракрасного приемника от пульта дистанционного управления и разберем команды в языке C++ для получения сигнала. Сразу отметим, что IR датчик Ардуино подходит не к каждому пульту, частота сигнала может отличаться.

Устройство ИК приемника. Принцип работы

Приемники инфракрасного излучения получили сегодня широкое применение в бытовой технике, благодаря доступной цене, простоте и удобству в использовании. Эти устройства позволяют управлять приборами с помощью пульта дистанционного управления и их можно встретить практически в любом виде техники. Но, несмотря на это, постепенно Bluetooth модуль набирает все большую популярность.

Принцип работы IR ресивера. Обработка сигнала от пульта ДУ

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

Под действием инфракрасного излучения в фотодиоде, у которого между p и n областями создана дополнительная область из полупроводника (i -область), начинает течь ток. Сигнал поступает на усилитель и далее на полосовой фильтр, который настроен на фиксированную частоту: 30; 33; 36; 38; 40 и 56 килогерц и защищает приемник от помех. Помехи могут создавать любые бытовые приборы.

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

Как подключить ИК приемник к Ардуино

Корпуса инфракрасных приемников содержат оптический фильтр для защиты прибора от внешних электромагнитных полей, изготавливаются они специальной формы для фокусировки принимаемого излучения на фотодиоде. Для подключения IR приемника к Arduino UNO используют три ножки, которые соединяют с — GND, 5V и A0. Советуем для начала использовать 3,3 Вольта, чтобы не сжечь ИК датчик при настройке.

Для занятия нам понадобятся следующие детали:

  • плата Arduino Uno / Arduino Nano / Arduino Mega;
  • макетная плата;
  • IR приемник;
  • пульт ДУ;
  • 1 светодиод и резистор 220 Ом;
  • провода «папа-папа» и «папа-мама».


Схема подключения ИК приемника к аналоговому порту Ардуино

Подключите IR приемник по схеме, представленной выше, и подключите светодиоды к 12 и 13 пину. Перед загрузкой программы, вам потребуется установить библиотеку IRremote.h, если она не была еще установлена. Данная библиотека не относится к стандартным библиотекам среды программирования Arduino IDE. Скачать библиотеку IRremote.h и готовый скетч можно одним архивом с Google Диск по ссылке .

Скетч для ИК приемника Arduino:

#include // подключаем библиотеку для IR приемника IRrecv irrecv(A0); // указываем пин, к которому подключен IR приемник decode_results results; void setup () // процедура setup { irrecv.enableIRIn (); // запускаем прием инфракрасного сигнала pinMode (13, OUTPUT ); // пин 13 будет выходом (англ. «output») pinMode (12, OUTPUT ); // пин 12 будет выходом (англ. «output») pinMode (A0, INPUT ); // пин A0 будет входом (англ. «intput») Serial .begin (9600); // подключаем монитор порта } void loop () // процедура loop { if (irrecv.decode (&results)) // если данные пришли выполняем команды { Serial .println (results.value); // отправляем полученные данные на порт // включаем и выключаем светодиоды, в зависимости от полученного сигнала if (results.value == 16754775) { digitalWrite (13, HIGH ); } if (results.value == 16769055) { digitalWrite (13, LOW ); } if (results.value == 16718055) { digitalWrite (12, HIGH ); } if (results.value == 16724175) { digitalWrite (12, LOW ); } irrecv.resume (); // принимаем следующий сигнал на ИК приемнике } }

Пояснения к коду:

  1. Библиотека IRremote.h содержит набор команд и позволяет упростить скетч;
  2. Оператор decode_results присваивает получаемым сигналам от пульта дистанционного управления имя переменной results .

ИК датчик можно применять во многих устройствах на микроконтроллере Ардуино, в том числе, можно сделать дистанционное управление сервоприводом на Ардуино от ИК приемника. При настройке следует включить монитор порта Arduino IDE и узнать какой сигнал отправляет та или иная кнопка на пульте ДУ. Полученные коды следует использовать в скетче после знака двойного равенства в условиях if () .

Записи по этой теме:


Всем доброго времени дня (или ночи, как вам удобно), начнём пожалуй с лирического вступления. Сейчас у многих дома есть телевизор с пультом ДУ(дистанционного управления), тюнер, 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 для работы комментариев.