Инфракрасное дистанционное управление (ИКДУ) применяется последние лет 30 практически во всей бытовой электронной аппаратуре. Иногда используется двусторонняя связь объекта управления и пульта (например - в кондиционерах с пульта передаются команды, а обратно - текущие параметры), но мы не будем ее рассматривать в данной статье. Также мы не будем рассматривать вопросы типа «что такое инфракрасный свет» (ИК) и т.п. Достаточно знать что это свет. Весьма небольшой мощности и невидимом человеческому глазу диапазоне (но прекрасно наблюдаемому любой видеокамерой или цифровым фотоаппаратом).
Как и всякий свет, в земных условиях он распространяется по прямой, т.е. не огибает предметы, не проходит через непрозрачные объекты, но в той или иной степени от них отражается. Как и всякое излучение, характеризуется своей величиной (интенсивностью и т.п., но мы договорились не вдаваться в физику), которая зависит от типа источника и режима его работы, и падает с расстоянием. Поэтому расстояние, на котором можно уверенно принимать сигнал зависит от мощности источника и чувствительности приемника, плюс несколько побочных факторов.
Для излучения используются ИК-светодиоды, работающие в импульсном режиме (ток в импульсе достигает нескольких ампер), для приема - фотодиоды с усилителями. Последние как правило, в аппаратуре закрываются ИК-фильтрами (на практике - красным или дымчатым пластиком) для снижения чувствительности к обычному солнечному или электрическому свету. Как всякий фильтр, он частично задерживает и полезное ИК излучение, поэтому от фильтра также зависит дальность работы ИКДУ.
Почему в свое время было выбрано для массового использования именно ИКДУ а не что-то другое? Да, были (и есть) системы, основанные на радиосвязи. Возможно даже в будущем они станут преобладать над ИК-системами, благодаря развитию таких способов коммуникаций как Bluetooth, ZigBee, MiWi (это не описка, я не имел ввиду Wi-Fi!) и подобных. Но три с лишним десятилетия назад - ИК оказалось самым надежным, и что самое важное - самым дешевым видом беспроводной односторонней связи на короткие расстояния в пределах одного помещения. Ведь прежде всего оно начало использоваться в бытовых телевизорах. Наиболее массово ИК используется и поныне, однако среди ИКДУ царит полный балаган - каждая фирма разрабатывала свои собственные протоколы и работала на разных частотах модуляции. В результате мы имеем около 2-х десятков(!) совершенно несовместимых между собою систем, из которых наиболее массово, к счастью, используются 6-7.
Самые первые ИК-системы работали по принципу: «есть излучение/нет излучения». Т.е. передавалась одна команда - «включить» или «выключить». Естественно, такой вариант совершенно не функционален, и не обладает приемлемой помехозащищенностью. Первое - потребовало разработки специальных последовательных протоколов связи. Второе -использованию модуляции, т.е. грубо говоря - излучение (ток) светодиода модулируется дважды, сначала несущей частотой (в районе 30-60кГц), которая в свою очередь, модулируется последовательностью битов команд. Замечу что существовали ИКДУ системы и без модуляции, например протокол ITT.
Исторически сложилось, что когда передается "1" это называют "Mark", когда передача отсутствует - это называют "Space". В рассматриваемых далее системах ИКДУ во время Space на светодиод ничего не подается, он выключен, а во время Mark - подается несущая частота. Т.е. светодиод вспыхивает с частотой 30-50кГц.
Со стороны приемника - сигнал усиливается и демодулируется. В результате на выходе имеем исходную последовательность импульсов. (Как правило, все современные приемники выдают инверсный сигнал, т.е. состояние Mark соответствует логическому нулю, а состояние Space -логической единице). В реальности - «ИК-приемник» несколько более сложное устройство чем просто фотодиод и усилитель. В нем имеется также ограничитель уровня (лимитер) и автоматическая регулировка усиления (АРУ), полосовой фильтр и демодулятор (детектор) с компаратором на выходе. Выпускаются готовые ИК-приемники такими фирмами как Vishay, Siemens, Sharp, а также многочисленными китайскими "тружениками". Учтите, что с протоколами без модуляции такие ИК-приемники использовать нельзя, но мы такие и не будем рассматривать в этой статье (по разным причинам. В т. ч. и из-за присущих без модуляционным системам недостатков). Для правильной работы АРУ, в начале посылки практически во всех модуляционных протоколах передается "преамбула".
Вряд ли стоит останавливаться на кодировании, т.е. изготовлении самого пульта ИКДУ - во первых, это сложно чисто конструктивно, ибо изготовить нормальный красивый пластмассовый корпус с кнопками и батарейным отсеком - задача не простая (и не для радиолюбителей). Во вторых - эта задача существенно проще задачи декодирования, достаточно взять описание протокола, и по нему все сделать. В декодированием сложнее, особенно, кода надо обеспечить работу с заранее неизвестным пультом (даже если известен стандарт, по которому он работает). В первую очередь потому, что разброс у пультов достаточно велик, и иногда даже выходит за рамки позволенного. Простой пример - пульт от моего CD-плеера Philips CD800. Работает он по самому что ни на есть стандартному протоколу RC5, использующего манчестерское кодирование.
При таком кодировании, импульсы могут иметь только две длительности - Т и 2Т, тем не менее, начальный импульс, который должен иметь одинаковые Mark и Space длительностью Т, получается весьма несимметричный. Как видно на осциллограмме ниже - первый импульс чуть больше 1мс, затем пауза 0.74мс, затем широкий импульс примерно 1.8мс. По стандарту -первые два должны были бы быть 0.88мс.
Во вторую очередь - когда встает вопрос универсальности. Т.е. когда хочется иметь свой аппарат, который можно настроить на любой имеющийся пульт. Здесь есть несколько вариантов: или просто пульту говорится примерно следующее: «ты работаешь в кодировке NEC для телевизора», после чего микроконтроллер пульта все делает "по стандарту". К сожалению, это имеет много недостатков. Например, я не смог настроить таким методом один такой "универсальный" пульт на мой телевизор - точнее вроде бы все работает, только кнопки "Громкость - " и "Громкость + " работают наоборот. Согласитесь, это несколько напрягает. (Там был еще какие-то мелочи, нестыковки, я уже не помню какие).
Другие варианты работают по принципу - "посвети имеющимся пультом в приемник". В "универсальных пультах" как правило, используется тупая оцифровка импульсов с приемника, с выделением начала и конца посылки, и запоминание этой последовательности (иногда делаются простые преобразования для уменьшения объема данных) в памяти. Т.е. своего рода "цифровой магнитофон". И лишь в некоторых делается по настоящему "разбор полетов" - анализ типа протокола и полное декодирование. Оба эти способа имеют как свои достоинства, так и недостатки. Первый способ "оцифровка" более простой, но требует достаточно большого запоминающего устройства для хранения оцифрованных данных (есть способы сильно сократить объем, но все равно он не мал), и хорошо работает когда нет ограничения на размер памяти и "хранителя" - например именно такой способ я использовал когда-то для управления видеомагнитофоном от компьютера для записи рентгенограмм и УЗИ в медицинской диагностике. Аналогичное решение (и также на видеомагнитофоне) использовали разработчики стримера "Арвид".
Для использования готовых "чужих" пультов своих конструкциях, (и при отсутствии памяти для запоминания оцифрованных последовательностей), наиболее интересна настройка на имеющийся пульт с "разбором полетов", т.е. с полным декодированием. Поэтому в данной статье я постараюсь описать некоторые наиболее часто встречающиеся протоколы (кодировки), и способы программного декодирования на простых микроконтроллерах.
Описания протоколов.
В Интернете масса описаний очень распространенной филипсовской кодировки RC5, но практически отсутствует информация по другим протоколам. Или же она настолько мизерна и разбросана по разным местам, что понять что-то сложно. Я решил собрать все что можно воедино, и дать насколько это возможно, наиболее полную информацию для того. Чтобы этим можно было пользоваться.
Не будем вдаваться в 7-уровневую модель OSI, разделим условно каждый протокол на две части
- битовое кодирование и логический состав. Т. ее первое - это как кодируется передаваемый бит информации, а второе - что он означает. Рассмотрим сначала битовое кодирование. Все протоколы можно условно разделить на две категории - использующих бифазное кодирование ("Манчестерский" код) и использующие временной код.
При бифазном кодировании (используется в филипсовских RC5 и RC6, Nokia NRC17 и других), каждый бит передается в течении фиксированного времени, значение бита - определяется направлением перехода в середине этого времени. На диаграмме ниже видно как это происходит
- показана передача как разных бит, так и нескольких одинаковых бит подряд. Как мы видим - в середине битового интервала всегда есть переход, направление которого определяет значение бита. Между битами - переход есть только при передаче одинаковых бит. Это доставляет некоторые неудобства при декодировании, т.к. не всегда известен момент перехода от одного бита к другому. Было бы все просто, если бы длительности импульсов были всегда одинаковы (как это требуется по стандарту). Но на практике это не так, и разброс весьма существенный.

Кодирование временными интервалами (Sony, NEC, Samsung, etc.) предполагает ВСЕГДА наличие импульса на каждом передаваемом бите, а за ним паузы (или наоборот), что абсолютно четко определяет начало и конец передаваемого бита, а его значение определяется соотношением времени импульса и времени паузы (собственно, это разновидность ШИМ - широтно-импульсной модуляции с переменной частотой). В отличие от манчестерского кодирования, длительность передачи нуля и единицы разная, следовательно и общая длительность передаваемой команды может быть разной (есть способы этого избежать, но об этом ниже).

Почти во всех протоколах, в начале каждой команды передается стартовый бит (его еще часто называют «преамбула» или "AGC pulse" - импульс, для установки автоматической регулировки усиления в приемнике). Это импульс и пауза определенной длительности. К огромному счастью, у большинства протоколов временные параметры стартового импульса различны, что позволяет по первому же импульсу детектировать тип протокола (но учтите, что это не в 100% случаев!)
Ниже представлена таблица известных длительностей преамбул:
В следующей таблице даны длительности информационных бит при кодировании временными интервалами:
В конце статьи будет представлена совмещенная таблица всех длительностей, для удобства.