У каждого дома есть пульт от телевизора, или другой пульт дистанционного управления(ДУ). Данное устройство позволяет на расстоянии управлять каким-либо устройством, что является очень удобным. Не надо тратить драгоценные калории и делать лишние движения. Если у вас есть какое-то устройство и вы хотели бы управлять им на расстоянии, тогда можно сделать дистанционное управление данным устройством. При желании можно сделать и пульт ДУ своими руками, но для этого нет необходимости и это другая история. Зачем может понадобиться дистанционное управление?! - все просто:
Лень - это качество, заставляющее прилагать огромные усилия к тому, чтобы снизить общие затраты энергии.
Впервые дистанционное управление в действии миру показал изобретатель Никола Тесла, в 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
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 датчиков
- Входное напряжение: 4,0 ... 5,5 В (номинально 5 В)
- Потребляемый ток: до 100 мА в импульсном режиме (при Vсс = 5 В)
- Длинна световой волны: 940 нм (пиковое значение)
- Максимальная частота сигнала: до 10 МГц
- Расстояние передачи: до 10 м (при Vcc = 5 В)
- Рабочая температура: -25 … 85 °C
- Угол направленности: 120° (с потерей мощности < 50%)
Все модули линейки "Trema" выполнены в одном формате
Подключение:
Модуль удобно подключать 3 способами, в зависимости от ситуации:
Способ - 1: Используя проводной шлейф и Piranha UNO
Библиотека использует второй аппаратный таймер,
НЕ ВЫВОДИТЕ СИГНАЛЫ ШИМ НА 3 ИЛИ 11 ВЫВОД!
Подробнее про установку библиотеки читайте в нашей ..
Дополнительная информация по работе с модулем:
Пакеты:
Практически все пульты отправляют не только информационный пакет (указывающий тип устройства и код нажатой кнопки), но и пакеты повтора, сообщающие устройству об удержании нажатой кнопки. Таким образом принимающее устройство может реагировать на нажатие кнопки однократно или в течении всего времени её удержания.
Например: нажимая и удерживая кнопку с номером телевизионного канала, телевизор переключится на данный канал только один раз. В то время, как нажимая и удерживая кнопку увеличения громкости, телевизор будет её увеличивать в течении всего времени удержания кнопки.
Количество информационных пакетов у большинства пультов равно одному, но некоторые устройства, например кондиционеры, используют 2, 3 и более информационных пакетов.
Состав пакетов: Информационный пакет несёт информацию о коде производителя, типе устройства, коде нажатой кнопки и т.д. Пакеты повтора могут частично или полностью совпадать с информационным пакетом, копировать его биты с инверсией, или не нести никакой информации, представляя последовательность из нескольких одинаковых, для каждого пакета повтора, битов.
Длительность пауз между пакетами: обычно не превышает 200мс.
Протоколы передачи данных: определяют следующие, основные, параметры:
Несущая частота: у большинства пультов равна 38 кГц, именно на эту частоту настроен Trema ИК-приёмник .
Кодирование информации: это принцип передачи битов данных. Выделим три основных вида кодирования, при которых каждый бит передаётся последовательностью из одного импульса и одной паузы:
Сигналы Start, Stop и Toggle: по своему названию располагаются в начале, конце или середине пакета.
Stop: При кодировании длинной паузы, нельзя определить значение последнего бита в пакете, так как после пакета следует большая пауза, и последний бит будет всегда определяться как «1», поэтому в пакет добавляется сигнал Stop представляющий из себя импульс не несущий никакой информации.
Start: При бифазном кодировании требуется подать сигнал Start, так как невозможно начать передачу пакета с паузы.
Toggle:
Это бит, который меняет своё значение при каждом новом нажатии на кнопку, используется в протоколах RS5, RS5X, RS6 (Philips), где пакеты повторов полностью повторяют данные информационного пакета. Таким образом принимающее устройство может отличить удержание кнопки от её повторного нажатия.
кодирование длиной импульсов - сначала передаётся импульс, длина которого зависит от значения передаваемого бита, затем следует пауза, длина которой не зависит от значения бита. Например: в протоколе SIRC (Sony), длина импульса для бита «1» = 1200мкс, а для бита «0» = 600мкс, длина пауз всегда равна 600мкс. Таким образом можно отличить «1» от «0» по длине импульса.
кодирование длиной пауз - сначала передаётся импульс, длина которого не зависит от значения передаваемого бита, затем следует пауза, длина которой зависит от значения бита. Например: в протоколе NEC, длина паузы для бита «1» = 1687,5мкс, а для бита «0» = 562,5мкс, длина импульсов всегда равна 562,5мкс. Таким образом можно отличить «1» от «0» по длине паузы.
бифазное кодирование - длина импульса равна длине паузы, а их последовательность определяет тип передаваемого бита. Например: в протоколе RS5 (Philips), для бита «1» импульс следует за паузой, а для бита «0» пауза следует за импульсом. Для протокола NRC (Nokia), наоборот, для бита «1» пауза следует за импульсом, а для бита «0» импульс следует за паузой.
Примеры:
Однократная передача данных:
#includeПередача данных с пакетами повторов:
#includeПередача данных с указанием протокола:
#includeДанный пример показывает, как передатчик может полностью имитировать сигналы других ИК-пультов дистанционного управления.
Полученную строку протокола, нужно передать в качестве параметра функции protocol(), после чего можно отправлять коды кнопок функцией send(). В результате, устройства будут реагировать на ИК-передатчик , как на собственный ИК-пульт .
Описание основных функций библиотеки:
Подключение библиотеки:
#includeФункция begin();
- Назначение: инициализация работы с ИК-передатчиком
- Синтаксис: begin();
- Параметры: Нет.
- Возвращаемые значения: Нет.
- Примечание: Вызывается 1 раз в коде setup.
- Пример:
Функция send();
- Назначение: Передача данных.
- Синтаксис: send(ДАННЫЕ [, УДЕРЖАНИЕ ]);
- Параметры:
- ДАННЫЕ - код, типа uint32_t, который требуется передать;
- УДЕРЖАНИЕ - необязательный параметр, типа bool - указывающий что необходимо передавать не только код, но и пакеты повторов. Параметр имеет смысл, если функция вызывается пока удерживается кнопка.
- Возвращаемые значения: Нет.
- Примечание: Если функция вызвана без параметра УДЕРЖАНИЕ, или он равен false, то функция, при каждом её вызове, однократно передаст указанный код. Если функция вызвана с параметром УДЕРЖАНИЕ равным true, то функция подавляет дребезг кнопки и отправляет пакеты повторов (с указанным в протоколе интервалом) при её удержании.
- Пример:
Функция protocol();
- Назначение: Установка протокола передачи данных.
- Синтаксис: protocol(СТРОКА);
- Параметры:
- СТРОКА - состоящая из 25 символов протокола + символ конца строки. Данную строку можно получить вызвав одноимённую функцию, без параметров, для приёмника.
- Возвращаемые значения: bool - строка содержит корректные данные о протоколе или нет.
- Примечание: Функция устанавливает протокол передачи данных, таким образом ИК-передатчик может имитировать сигналы обычных пультов. После вызова данной функции, передачи данных функцией send() будут осуществляться по новому протоколу. Протокол передачи данных по умолчанию, соответствует пульту «Car mp3».
- Пример:
Переменная frequency:
- Значение: Устанавливает несущую частоту передачи данных в кГц;
- Тип данных: uint8_t;
- Примечание: Если переменной не присваивать значение, то передача ведётся на частоте указанной в протоколе. Если указать значение 0, то данные будут передаваться без модуляции.
Применение:
- управление роботами, движущимися, летающими и плавающими моделями, бытовой и специализированной техникой.
- включение/выключение освещения, обогрева, вентиляции, полива и т.д.
- открывание/закрывание дверей, жалюзи, мансардных окон, форточек и т.д.
Инфракрасный пульт дистанционного управления — один из самых простых способов взаимодействия с электронными приборами. Так, практически в каждом доме есть несколько таких устройств: телевизор, музыкальный центр, видеоплеер, кондиционер. Но самое интересное применение инфракрасного пульта — дистанционное правление роботом. Собственно, на этом уроке мы попытаемся реализовать такой способ управления с помощью популярного контроллера Ардуино Уно.
1. ИК-пульт
Что нужно для того, чтобы научить робота слушаться инфракрасного (ИК) пульта? Во-первых, нам потребуется сам пульт. Можно использовать обычный пульт от телевизора, а можно приобрести миниатюрный пульт от автомагнитолы. Именно такие пульты часто используются для управления роботами. На таком пульте есть 10 цифровых кнопок и 11 кнопок для манипуляции с музыкой: громкость, перемотка, play, stop, и т.д. Для наших целей более чем достаточно.2. ИК-датчик
Во-вторых, для приема сигнала с пульта нам потребуется специальный ИК-датчик. Вообще, мы можем детектировать инфракрасное излучение обычным фотодиодом/фототранзистором, но в отличие от него, наш ИК-датчик воспринимает инфракрасный сигнал только на частоте 38 кГц (иногда 40кГц). Именно такое свойство позволяет датчику игнорировать много посторонних световых шумов от ламп освещения и солнца. Для этого урока воспользуемся популярным ИК-датчиком VS1838B , который обладает следующими характеристиками:- несущая частота: 38 кГц;
- напряжение питания: 2,7 — 5,5 В;
- потребляемый ток: 50 мкА.
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 — уменьшение громкости.
В сегодняшней статье будет рассматриваться подключение ИК приемника 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); } }
Пульт используется какой-то китайский, при нажатии "+" серва вращается в одну сторону, при нажатии "-", в другую.
- Входное напряжение: 2,7 ... 5,5 В
- Потребляемый ток: 0,65 … 1,05 мА (при Vсс = 5В) номинально 0,9 мА
- Несущая частота: 38 кГц
- Длинна световой волны: 850 … 1050 нм (пропускаемая фильтром более 80%)
- Чувствительность: 0,17… 30000 мW/м2 (к мощности светового потока)
- Расстояние приёма: до 45 м
- Рабочая температура: -25 … 85 °C
- Угол направленности: ±45°
Все модули линейки "Trema" выполнены в одном формате
Подключение:
Модуль подключается к любому цифровому выводу arduino. В комплекте имеется кабель для быстрого и удобного подключения к Trema Shield .
Модуль удобно подключать 3 способами, в зависимости от ситуации:
Способ - 1: Используя проводной шлейф и Piranha UNO
Библиотека использует второй аппаратный таймер,
НЕ ВЫВОДИТЕ СИГНАЛЫ ШИМ НА 3 ИЛИ 11 ВЫВОД!
Подробнее про установку библиотеки читайте в нашей ..
Дополнительная информация по работе с модулем:
Пакеты: Практически все пульты отправляют не только информационный пакет (указывающий тип устройства и код нажатой кнопки), но и пакеты повтора, сообщающие устройству об удержании нажатой кнопки. Таким образом принимающее устройство может реагировать на нажатие кнопки однократно или в течении всего времени её удержания.
Например: нажимая и удерживая кнопку с номером телевизионного канала, телевизор переключится на данный канал только один раз. В то время, как нажимая и удерживая кнопку увеличения громкости, телевизор будет её увеличивать в течении всего времени удержания кнопки.
Количество информационных пакетов у большинства пультов равно одному, но некоторые устройства, например кондиционеры, используют 2, 3 и более информационных пакетов.
Состав пакетов: Информационный пакет несёт информацию о коде производителя, типе устройства, коде нажатой кнопки и т.д. Пакеты повтора могут частично или полностью совпадать с информационным пакетом, копировать его биты с инверсией, или не нести никакой информации, представляя последовательность из нескольких одинаковых, для каждого пакета повтора, битов.
Длительность пауз между пакетами: обычно не превышает 200мс.
Протоколы передачи данных: определяют следующие, основные, параметры:
- несущую частоту;
- способ кодирования информации, длительность импульсов и пауз передаваемых битов;
- количество информационных пакетов:
- состав информационного пакета и пакетов повторов;
- длительность пауз между пакетами;
- наличие и форму сигналов Start, Stop и Toggle;
Несущая частота: у большинства пультов равна 38 кГц, именно на эту частоту настроен Trema ИК-приёмник .
Кодирование информации: это принцип передачи битов данных. Выделим три основных вида кодирования, при которых каждый бит передаётся последовательностью из одного импульса и одной паузы:
- кодирование длиной импульсов - сначала передаётся импульс, длина которого зависит от значения передаваемого бита, затем следует пауза, длина которой не зависит от значения бита. Например: в протоколе SIRC (Sony), длина импульса для бита «1» = 1200мкс, а для бита «0» = 600мкс, длина пауз всегда равна 600мкс. Таким образом можно отличить «1» от «0» по длине импульса.
- кодирование длинной пауз - сначала передаётся импульс, длина которого не зависит от значения передаваемого бита, затем следует пауза, длина которой зависит от значения бита. Например: в протоколе NEC, длина паузы для бита «1» = 1687,5мкс, а для бита «0» = 562,5мкс, длина импульсов всегда равна 562,5мкс. Таким образом можно отличить «1» от «0» по длине паузы.
- бифазное кодирование - длина импульса равна длине паузы, а их последовательность определяет тип передаваемого бита. Например: в протоколе RS5 (Philips), для бита «1» импульс следует за паузой, а для бита «0» пауза следует за импульсом. Для протокола NRC (Nokia), наоборот, для бита «1» пауза следует за импульсом, а для бита «0» импульс следует за паузой.
Сигналы Start, Stop и Toggle: по своему названию располагаются в начале, конце или середине пакета.
Stop: При кодировании длинной паузы, нельзя определить значение последнего бита в пакете, так как после пакета следует большая пауза, и последний бит будет всегда определяться как «1», поэтому в пакет добавляется сигнал Stop представляющий из себя импульс не несущий никакой информации.
Start: При бифазном кодировании требуется подать сигнал Start, так как невозможно начать передачу пакета с паузы.
Toggle: Это бит, который меняет своё значение при каждом новом нажатии на кнопку, используется в протоколах RS5, RS5X, RS6 (Philips), где пакеты повторов полностью повторяют данные информационного пакета. Таким образом принимающее устройство может отличить удержание кнопки от её повторного нажатия.
Примеры:
Проверка наличия данных поступивших с ИК-пульта , осуществляется функцией check(). Эта функция реагирует на нажатие кнопок ИК-пульта , но если её вызывать с параметром true , то она будет реагировать и на удержание кнопок.
Чтение данных с любого пульта, реагируем только на нажатие кнопок:
#includeВ данном скетче функция check() вызывается без аргументов, значит и реагирует она только на нажатия кнопок ИК-пульта .
Чтение данных с любого пульта, реагируем на удержание кнопок:
#includeВ данном скетче функция check() вызывается с параметром true , значит и реагирует она как на нажатия, так и на удержания кнопок ИК-пульта .
Чтение данных с любого пульта, с указанием как реагировать на какие кнопки.
#includeВ данном скетче функция check() вызывается с параметром true , значит она реагирует как на нажатия, так и на удержания кнопок ИК-пульта . Но вывод данных в монитор последовательного порта осуществляется только при установленном флаге flgKey , который сбрасывается при удержании кнопок с кодами 0xFF30CF , 0xFF18E7 и 0xFF7A85 . Получается что на 3 кнопки скетч реагирует только при нажатии, а на остальные кнопки, как на нажатие, так и на удержание.
Чтение данных только с тех пультов, которые работают по указанному протоколу:
#includeВ данном скетче, в коде setup(), указан протокол передачи данных, который редко совпадает у разных производителей ИК-пультов . Значит функция check() в коде loop() будет реагировать только на те ИК-пульты , которые поддерживают указанный протокол.
Получение протокола передачи данных и типа кодировки:
#includeВ данном примере описано как получить протокол передачи данных ИК-пультов . В статье , описано, как передавать коды кнопок по указанному протоколу.
Таким образом, можно создать скетч ИК-передатчика для имитации сигналов различных ИК-пультов . В результате, устройства будут реагировать на ИК-передатчик , как на собственный ИК-пульт .
Описание основных функций библиотеки:
Подключение библиотеки:
#includeФункция begin();
- Назначение: инициализация работы с ИК-приёмником
- Синтаксис: begin();
- Параметры: Нет.
- Возвращаемые значения: Нет.
- Примечание: Вызывается 1 раз в коде setup.
- Пример:
Функция check();
- Назначение: Проверка наличия принятых с пульта данных.
- Синтаксис: check([ УДЕРЖАНИЕ ]);
- Параметры:
- УДЕРЖАНИЕ - необязательный параметр, типа bool - указывающий что необходимо реагировать на удержание кнопок пульта.
- Возвращаемые значения: bool - приняты или нет, данные с пульта.
- Примечание: Если функция вызвана без параметра, или он равен false, то функция будет реагировать только на сигналы с пульта при нажатии его кнопок, а если указать true, то функция будет реагировать, как на нажатие, так и на удержание кнопок пульта.
- Пример:
Функция protocol();
- Назначение: Получение, установка или сброс протокола передачи данных.
- Синтаксис: protocol([ ПАРАМЕТР ]);
- Получение протокола: Если функция вызвана без параметра, то она вернёт строку из 25 символов + символ конца строки. Биты данной строки, несут информацию о типе протокола передачи данных пульта, данные которого были приняты последними. Данную строку можно использовать для установки протокола ИК-передатчику, или ИК-приёмнику (см.ниже).
- Установка протокола: Если функция вызвана с параметром в виде строки из 25 символов протокола + символ конца строки, то после этого, функция chek(), будет реагировать только на пульты, соответствующие указанному протоколу передачи данных.
- Сброс протокола: Если функция вызвана с параметром IR_CLEAN, то функция chek() опять станет реагировать на сигналы с любых пультов.
- Получение параметров протокола: Если функция вызвана с параметром int, от 0 до 17, то она вернёт не строку протокола, а значение типа int с одним из параметров протокола передачи данных пульта, данные которого были приняты последними:
- 0 - тип кодировки:
- IR_UNDEFINED - тип кодировки не определён;
- IR_PAUSE_LENGTH - кодирование длинной паузы;
- IR_PULSE_LENGTH - кодирование длинной (шириной) импульса (ШИМ);
- IR_BIPHASIC - бифазное кодирование;
- IR_BIPHASIC_INV - бифазное кодирование с инверсными битами;
- IR_NRC - пакеты повтора идентичны, а первый и последний пакеты специальные;
- IR_RS5 - кодировка PHILIPS с битом toggle;
- IR_RS5X - кодировка PHILIPS с битом toggle;
- IR_RS6 - кодировка PHILIPS с битом toggle.
- 1 - несущая частота передачи данных (в кГц);
- 2 - заявленное количество информационных бит в 1 пакете;
- 3 - заявленное количество информационных бит в пакете повтора;
- 4 - длительность паузы между пакетами (в мс);
- 5 - длительность импульса в стартовом бите (в мкс);
- 6 - длительность паузы в стартовом бите (в мкс);
- 7 - длительность импульса в стоповом бите (в мкс);
- 8 - длительность паузы в стоповом бите (в мкс);
- 9 - длительность импульса в бите рестарт или toggle (в мкс);
- 10 - длительность паузы в бите рестарт или toggle (в мкс);
- 11 - позиция бита рестарт или toggle в пакете (№ бита);
- 12 - максимальная длительность импульса в информационных битах (в мкс);
- 13 - минимальная длительность импульса в информационных битах (в мкс);
- 14 - максимальная длительность паузы в информационных битах (в мкс);
- 15 - минимальная длительность паузы в информационных битах (в мкс);
- 16 - флаг наличия стартового бита (true/false);
- 17 - флаг наличия стопового бита (true/false);
- 18 - флаг наличия бита рестарт или toggle (true/false);
- 19 - тип пакета повтора (0-нет, 1-с инверсными битами, 2-идентичен информационному, 3-уникален);
- 0 - тип кодировки:
- Возвращаемые значения: Зависят от наличия и типа параметра.
- Примечание: Если ранее был установлен протокол, то попытка получения протокола, или параметров протокола, вернёт значения установленного ранее протокола, а не протокола передачи данных пульта, данные которого были приняты последними.
- Пример:
Переменная data
- Значение: Возвращает код кнопки, принятый с пульта;
- Тип данных: uint32_t.
Переменная length
- Значение: Возвращает размер кода кнопки, в битах;
- Тип данных: uint8_t.
Переменная key_press
- Значение: Возвращает флаг, указывающий на то, что кнопка пульта нажимается а не удерживается;
- Тип данных: bool.
Применение:
- управление роботами, движущимися, летающими и плавающими моделями, бытовой и специализированной техникой.
- включение/выключение освещения, обогрева, вентиляции, полива и т.д.
- открывание/закрывание дверей, жалюзи, мансардных окон, форточек и т.д.
Похожие статьи