Количество барахла в кладовке – величина монотонно возрастающая и не являющаяся функцией частоты уборки. Другими словами – бороться с фактом накопления у радиолюбителей нужного и не очень хлама, относящегося к электронике, бесполезно. Но тем не менее, чтобы хоть как-то реабилитироваться в глазах домашних, иногда стоит извлекать из этой кучки что-нибудь полезное на потеху изумленной публике… Ладно, это все лирика.
Долго ли, коротко ли, но собралось у меня такое вот разнообразие ИК-пультов и зачесались лапы приспособить их к делу:
Скажу сразу, что до конкретных применений мы в этот раз не доберемся, но вот что это вообще за звери такие выясним. Сильно в теорию вдаваться не буду, скажу лишь, что как правило информация передается пультом в виде модулированной прямоугольными импульсами разной длительности несущей частоты, которая обычно равна 36кГц. В качестве приемника такого сигнала можно применить фотодиод с необходимыми цепями усиления и фильтрации, а можно пойти по пути для ленивых и использовать интегральный фотоприемник типа TSOP17xx, где хх – и есть та самая несущая частота, который имеет цифровой выход и выдает непосредственно огибающую несущей частоты, те самые заветные нолики и единички. Именно так я и поступил, поэтому все дальнейшее будет происходить при непосредственном живейшем участии приемника TSOP1736:
Обрабатывать полученный от приемника сигнал мы поручим микроконтроллеру, осталось только выяснить особенности этого сигнала, временные диаграммы и способы кодирования информации, т.е. протокол передачи данных, которых, применительно к ИК-пультам наплодилось уже изрядно. По сути, практически каждый сколько-нибудь крупный производитель техники создает что-то свое в этой области.
Я, естественно, начал с поиска информации в Сети, но, к своему глубочайшему удивлению, ничего кроме нескольких вариантов исходников для кода RC-5 (один из существующих протоколов) не нашел. Сгоряча зашив пару вариантов этих прошивок в отладочную ATMega16 и убедившись в их неработоспособности, я взялся за осциллограф. Как оказалось, очень правильно. Дело в том, что ни один из имеющихся у меня пультов по протоколу RC-5 не работал.
Очень много полезной информации по этому поводу представлено на сайте https://www.sbprojects.com, которым я и руководствовался в своих дальнейших изысканиях.
В частности, для протокола NEC:
Временная диаграмма и способ кодирования 0 и 1
Посылка при удержании кнопки пульта
Временная диаграмма для кода повтора (удержание кнопки)
А для протокола SIRC:
Временная диаграмма и способ кодирования 0 и 1
Если достаточно долго и внимательно смотреть на представленные диаграммы, можно заметить, что в целом эти протоколы очень похожи. Различия касаются в основном стартовых условий и обработки длительного нажатия кнопок.
И в том, и в другом случае 0 и 1 кодируются длительностью импульса или, что то же, его шириной. Каждый бит начинается с импульса некоторой неизменной длительности. Соответственно, чтобы понять, получили мы 0 или 1, нам надо измерить длительность паузы после начального импульса бита или длительность паузы вместе с этим импульсом, поскольку его длина неизменна. С этой задачей вполне может справиться таймер микроконтроллера, который будет запускаться в момент начала стартового импульса бита.
На этом этапе мы уже можем в общих чертах обрисовать алгоритм обработки: по приходу импульса запустили счетчик, по следующему импульсу считали его показания, на их основе вынесли решение о том, что это было, запустили счетчик дальше. В качестве детектора импульсов удобно использовать механизм прерываний контроллера.
Замечу, что фотоприемник имеет инверсный выход, т.е. в момент присутствия ИК-излучения на его выходе 0, поэтому прерывание будем настраивать по спаду. Таким образом, в плане аппаратной реализации нам достаточно подсоединить выход фотоприемника к ножке свободного внешнего прерывания микроконтроллера, сконфигурированной как вход с «подтяжкой» (не лишним будет также поставить и внешний подтягивающий резистор килоом на 10 кОм плюсу питания).
Именно по этому приблизительному алгоритму я и написал программы обработки этих протоколов с помощью восьмибитного таймера-счетчика и внешнего прерывания МК ATMega16. NEC протокол чуть сложнее в реализации в силу большего количества возможных условий (добавляется специфичный импульс повтора), но принцип остается тем же.
Данные программы хоть и являются законченными модулями, однако могут быть полезны только в случае применения в составе более сложных алгоритмов, которые, возможно, необходимо будет дополнить процедурами буферизации полученных данных и т.п. Здесь же просто реализован программно-аппартный минимум, необходимый для приема данных без какой-либо их обработки.
Исходники достаточно подробно прокомментированы, а их более подробное обсуждение предлагаю продолжить на форуме.
При создании HTPC одним из вопросов является способ управления оболочкой. Думаю, не стоит рассказывать о том, что традиционные устройства ввода — клавиатура и мышь не подходят для данной задачи. Гораздо удобнее управлять HTPC так же как и другой бытовой электроникой — с помощью ПДУ. Чаще всего используются ПДУ от DVD-плееров и аналогичной техники совместно с LIRC / WinLIRC, или Windows MCE-совместимые пульты с USB-приемниками, коих полно в китайских интернет-магазинах. Такие ПДУ эмулируют usb-hid клавиатуру (и иногда мышь). У этих пультов есть существенный недостаток — если материнская плата и BIOS не поддерживают включение питания и пробуждение от usb-устройств, то с помощью такого пульта можно будет управлять устройством, выключать его, но включить не выйдет. С этим недостатком я и решил бороться.
Для своего HTPC я выбрал материнскую плату Intel D2700MUD. Как позже выяснилось — опрометчиво, поскольку встроенный видеоконтроллер GMA 3650, основанный на PowerVR, полностью поддерживается только в 32-битных Windows, а в Linux поддержка очень ограничена — не работает аппаратное декодирование видео. Но меня устраивает работа HTPC под управлением Windows 7 Home Basic. Также эта плата не умеет пробуждаться по сигналу от USB-клавиатуры.
Также у меня уже был пульт (Philips 2422 549 01930), который мне показался подходящим. Но WinLIRC с ним работал крайне нестабильно. Видимо, использовался какой-то необычный протокол.
Первая мысль была такой — подключить к Arduino IR-приемник, питание взять от шины 5VSB блока питания HTPC, а включение питания (и выключение) осуществлять с помощью имитации замыкания пинов на материнской плате, к которым подключается кнопка включения питания, а остальные команды передавать через RS-232. Но Arduino слишком дорога и занимает много места в и без того небольшом корпусе. Поэтому я решил обойтись дешёвым микроконтроллером ATMega8, в который можно зашить бутлоадер Arduino и программировать его как Arduino NG.
Разбор протокола
Для Arduino существует неплохая библиотека для работы с инфракрасными ПДУ — IRRemote, но она не работает с Arduino NG — не хватает памяти. К тому же, мне не удалось заставить эту библиотеку понимать мой пульт даже на Arduino UNO. Как я писал выше, LIRC (и WinLIRC) не очень хорошо работали с этим пультом — часто пропускали нажатия кнопок, иногда неверно определяли нажатую клавишу. Сам пульт работал исправно — с «родным» DVD-плейером проблем не возникало. Поиски информации о протоколе для этого пульта ничего не дали, так что я решил разобраться с ним самостоятельно.
Для этого мне понадобился осциллограф, но его под руками не оказалось, да и взять было негде. Но в случае с сигналами ПДУ вполне подходит линейный вход звуковой карты. К нему я подключил инфракрасный приёмник TSOP 31236.
Далее с помощью любого аудиоредактора можно записать входной сигнал и проанализировать:
Сначала идет длинная посылка, необходимая для установки уровня автоматической регулировки усиления в приёмнике. Затем следуют импульсы различной длины. Я написав промежуточный скетч для Arduino, который определял время между фронтами импульсов в микросекундах и выводил их в терминал через RS232. Полученные данные я загрузил в Excel:
Когда я только начал изучать протокол, моей главной ошибкой было то, что я считал длительности самих импульсов, но игнорировал длительность интервалов между ними. После того, как я начал считать интервалы между фронтами все встало на свои места. Как видно, большинство импульсов интервалов между фронтами имеют длительности в пределах 350-550 мкс и 700-1000 мкс. Значит так обозначаются значения передаваемых битов — «0» и «1». В протоколе ПДУ используется toggle-бит. Это означает что при нескольких последовательных нажатиях одной и той же клавиши на пульте, в коде будет меняться один бит (иногда несколько). В моем случае toggle-бит имеет необычную длительность — 1200-1400 мкс. К тому же число фронтов в «четных» и «нечетных» посылках отличается. Позже я пришёл к выводу, что интервал 1200-1400 мкс это сумма их двух битов с одинаковым уровнем, но различной длительностью (400+800). В коде я такую посылку обозначил как последовательность из двух бит — «01». Тогда количество бит на выходе стало постоянным.
Скетч для Arduino
Затем я написал скетч, который считал время между изменениями уровня на входе и выводил полученное число в uart. С помощью несложной отладки я добился стабильности определения кодов, добавил сложение с маской для игнорирования toggle-бита (у меня не было функций, в которых он пригодился бы). Потом я жестко закодил функцию, чтобы при получении кода кнопки «Power» микроконтроллер прижимал к земле один из «цифровых» пинов Arduino (в моем случае — 12).
А что дальше?
А дальше приложение EventGhost считывает коды из порта RS-232 и «дёргает за ниточки» всем известной оболочки XBMC. Настройка того и другого индивидуальна и в то же время проста, поэтому не заслуживает внимания.
Данные передаются младшим битом вперед. Каждый бит начинается с пачки импульсов несущей частоты. Длительность пачки равна 560 мкс. Путем изменением временного интервала между пачками импульсов осуществляется кодирование нулей и единиц. При передаче логической единицы интервал от начала текущей до начала следующей пачки импульсов составляет 2.25 мс, а при передаче логического нуля – 1.12 мс.
Стартовый импульс представляет собой пачку импульсов несущей частоты длительностью 9 мс. После подачи стартового импульса следует пауза в 4.5 мс.
Существует расширенная версия протокола Nec, в которой используется 16-ти разрядные адреса.
Алгоритм декодирования сигналов ПДУ
Файлы
Ссылки
Related items
Comments
мультиметр не покажет мгновенное значение напряжения, тут надо осциллографом только смотреть.
попробовал повторить прибор, но не пошло.
вопрос: какие Fuse mega8535, т.к. программатор USBASP AVRDUDE из хекса брать не умеет.
Мне тут подсказали, что в схеме ошибка. Чтобы проект заработал, нужно подправить файл lcd_lib.h Code: //порт, к которому подключена шина данных #define PORT_DATA PORTC #define PIN_DATA PINC #define DDRX_DATA DDRC
//порт, к которому подключены управляющие выводы #define PORT_SIG PORTC #define PIN_SIG PINC #define DDRX_SIG DDRC
Микроконтроллер работает от внешнего кварца на 16 МГц. Нужно выставить фуз биты соответствующие этому режиму..
Схему я скоро поправлю.
Не пошёл у меня этот код. Принимает всегда разные значения. Не знаю, это только у меня так, или ещё кому повезло? Немного упростил код, засунув его полностью в обработчик прерывания таймера иь всё пошло как по маслу. Имена многих переменных и констант изменены и некоторые вообще удалены за ненадобностью. Вот код прерывания:
В проекте для CodeVision ошибка. У меня руки не доходят исправить ее. Чтобы код заработал, нужно в файле timer.c кое чего подправить. Code: icr1 = icr2; icr2 = ((unsigned int)ICR1H чтобы было вот так Code: icr1 = icr2; icr2 = ICR1L; icr2 |= ((unsigned int)ICR1H Попробуй, должно заработать.
PS. первый раз неправильно написал. не выспался.
Весь код не лезет в размер. Вот объявление переменных и констант.
while (1) < // Place your code here if ((flag==0)&&(state==WAIT))
Это функция вывода результата. Code: void ShowResult() < lcd_gotoxy(0,1); sprintf(lcd_buffer,»%u %u %u %u \n»,buffer[0],buffer[1],buffer[2],buffer[3]); lcd_puts(lcd_buffer); sprintf(lcd_buffer,»%u «,buffer[4]); lcd_puts(lcd_buffer); >
Вот и весь кодю 😉 Да, у меня атмега32, для других надо соответсвенно менять инициализацию оборудования в майн функции.
while (rc5.dataOK) //ждем отпускания кнопки < _delay_ms(200); //задержка 70 мс rc5.dataOK = 0; // сбрасываем флаг кнопки Как бы проверка отпускания кнопки.Тестирую на реальном «железе»не идет
Cпасибо за ответ,но Вы знаете у меня все получилось с циклом while,просто вставил задержку Code: _delay_ms(200); //задержка 700 мс
Использование ИК ДУ пультов от бытовой техники достаточно популярно для управления различными самодельными устройствами от различных умных выключателей света, систем умного дома и до игрушек и роботов. Существует большое разнообразие протоколов ИК ДУ пультов и способов кодирования сигнала. Предлагаю один очень простой способ обработки ИК сигналов, работающий с большинством распространённых протоколов.
В сети опубликовано большое количество различных программных декодеров для приема команд с пультов ДУ, большинство заточены под какой-то определенный протокол, например, RC-5, RC-6, Sony, Nec и т.д., но есть и универсальные. Со специализированными декодерами всё понятно, они хорошо работают (только) со своими пультами, но по этой-же причине их применение ограниченно. Универсальные алгоритмы, как правило, либо сравнивают длительности импульсов и пауз между ними по таблице, либо производят выборку по таблице контрольных точек. Это требует относительно большого объёма памяти для хранения кодов кнопок. А нужно-ли для уверенного детектирования определенной команды ее в точности разбирать по определенному протоколу, или точно сопоставлять длительности всех импульсов/пауз? В общем-то не нужно. Минимальная длительность импульсов ограниченна используемой несущей частотой. Например, для ИК приёмников серий TSOP17xx (где xx — шесущая частота КГц) минимально детектируемый импульс — 15 периодов тактовой частоты
0.42 мс. Минимальная длительность импульсов в посылках пультов примерно вдвое больше и составляет около 0.85 мс. Увеличивать длительность импульсов больше этой величины не имеет смысла, так как на отправку команды будет уходить слишком много времени. Тоже самое касается пауз между импульсами. На практике, разница между длинами импульсов разных пультов ДУ меньше чем в в два раза, это позволяет отказаться от точного измерения длительности импульсов и пауз и характеризовать их только как «короткие» и «длинные» (стартовые импульсы нас не интересуют). То есть нам нужно запоминать один бит на фронт и спад.
Демонстрационное устройство
Схема демонстрационного устройства очень проста — контроллер AtTiny26 с минимальной обвязкой, приёмник TSOP1736 и знакосинтезирующий дисплей. Оно принимает от пулта и отображает полученный код на ЖК дисплее. На диодах vd1, vd2 и конденсаторах С1, С2 собрана схема накачки заряда (charge pump) для получения отрицательного напряжения контраста ЖК дисплея — мне попался экземпляр для работы при низких температурах, и ему нужно где-то минус 1.5 вольта на выводе CONTR относительно земли.
Для замера длительностей импульсов используется таймер и внешнее прерывание, но стем-же успехом можно использовать таймер с модулем захвата.
Декодер предельно прост, компактен и эффективен, но тем не менее работает с большинством протоколов ИК пультов.
Коды для настройки пульта дистанционного управления
За счет универсального пульта для телевизора пользователь сможет управлять различной техникой, в том числе цифровыми приставками, проигрывателями, тюнерами. Универсальные ПДУ отличаются от оригинальных, которые проходят настройку на заводах. Для них предусмотрен ручной метод настраивания.
Зачастую пользователи приобретают такие приборы в качестве замены потерянным либо неисправным оригиналам. В них предусмотрены автонастройки для десятков моделей. Как настроить пульт к телевизору? Чтобы сделать это, нужно узнать кодовое значение и следовать правильному и четкому порядку действий. Как узнать код пульта ДУ от конкретной модели? Подробнее об этом пойдет речь в публикации.
Для чего нужны шифры
В приборах ДУ предусмотрены функции программирования. За счет этого режима можно их перенастраивать.
Применение кодов для универсального пульта позволит синхронизировать технику разных производителей.
Для большинства марок есть своя комбинация цифр для активации. После ее завершения для выполнения разных команд можно будет пользоваться одним прибором, а не двумя (регулировка звука, включение и выключение ТВ и пр.).
Как узнать комбинацию
Как привязать ПДУ? Для подключения к ТВ применяются специальные идентификаторы, состоящие из нескольких цифр. Как узнать код телевизора? Комбинация для каждой модели указывается в техпаспортах, на интернет-сайтах компаний или в специальных таблицах.
Иногда пользователям не удается узнать комбинацию к универсальному пульту. Как найти код в этом случае? Для этого предусмотрена функция автонастройки.
Она есть в универсальных пультах вне зависимости от марки. При этом не понадобится узнавать комбинацию цифр.
Ее подключение активирует автоматический поиск идентификатора. Чтобы запустить функцию, понадобится выполнить определенный порядок действий. Об этом пойдет речь далее.
Настройка
Как настроить универсальный пульт? Как правило, в инструкции подробно описана ручная и автонастройка. Ниже детально изложен каждый способ подключения.
Автонастройка
Для начала стоит рассмотреть автоматический метод настройки универсального пульта для ТВ:
Настройка вручную
Как можно настроить вручную универсальный пульт для телевизора? Чтобы сделать это, достаточно узнать данные, занесенные в специальную таблицу. В ней указаны самые известные компании-производители и шифры, которые ей соответствуют. Когда комбинация найдена, нужно следовать этой инструкции:
Если прибор не срабатывает, можно повторить порядок действий, но уже с другим набором цифр. Есть и другие варианты. Но перед тем, как перейти к режиму программирования понадобится нажать на TV либо POWER на 5-10 сек. Можно использовать такие сочетания клавиш (зависит от производителя или конкретной модели):
Чтобы сделать все правильно, стоит сверяться с инструкцией. Далее перечислены другие методы настройки.
Способ №1
Способ №2
Способ №3
Способ №4
Этот вариант годится исключительно для моделей, в которых предусмотрена функция программирования вручную:
Перечень кодовых значений
В таблице указаны самые популярные марки телевизоров и кодовые значения, которые для них подходят.
Возможные проблемы
Бывает, что ни один указанный в таблице вариант не подходит, и ПДУ не удается настроить.
В таких случаях телемастеры советуют использовать автонастройку либо обратиться за советом к профессионалам.
Также сложности могут возникнуть из-за того, что модель УПДУ не подходит к конкретному телевизору. Поэтому перед покупкой прибора нужно проверить список соответствующих марок, прочитать технические характеристики. Кроме того, возможен слабый сигнал из-за севших аккумуляторных батареек. Перед использованием важно убедиться, что все приборы исправно работают.