на главную
Карта сайта
English version
Вы читаете:

Эмуляция инфракрасных пультов дистанционного управления

Компьютерная техника
2 года назад

Postal programmer — «умный» программатор. Эмуляция инфракрасных пультов дистанционного управления


При ремонте и сервисном обслуживании телевизоров и другой электроники используется огромное количество различных пультов дистанционного управления (ПДУ). Вести учет такого количества и постоянно искать потерявшиеся - непосильная задача. Для решения вопроса применяются специальные (похожие на обычные, но имеющие разъем для связи с компьютером) сервисные пульты, перезаписываемые с помощью компьютера, некоторые из них способны передавать команды с компьютера напрямую, без записи в себя. Однако все эти решения - коммерческие, с закрытыми форматами и протоколами. Существуют также и открытые решения. Оба варианта решений показались автору неудобными в работе, поэтому программатор Postal имеет собственную реализацию эмулятора ПДУ с претензией на простоту и эффективность.

 

Общие сведения

Управляющая программа программатора Postal имеет четыре дополнительных окна для работы с эмуляцией ПДУ:

1."IR Common Page” или “Common" (рис. 1), предназначено для действий по загрузке файлов и для некоторых дополнительных функций.

Вид окна общих настроек и функций Common

Рис. 1. Вид окна общих настроек и функций Common (IR Common Page для LPT-версии)

 

2."IR constructor" или "Synthesis" (рис. 2) - синтезатор команд для разных протоколов.

Вид окна синтезатора команд ПДУ Synthesis

Рис. 2. Вид окна синтезатора команд ПДУ Synthesis

 

3."Capture - Decoding" или "Capturing" (рис. 3) - работа с захватом команд, посылаемых различными пультами, и декодированием форматов.

Вид окна захвата команд ПДУ Capturing

Рис. 3. Вид окна захвата команд ПДУ Capturing (USB-версия)

 

4."VirtualRemote" или "VirtualRC" (рис. 4) - "виртуальный пульт" на 28 кнопок, использующий данные из файла описания пульта.

Вид окна виртуального ПДУ

Рис. 4. Вид окна виртуального ПДУ, показана нумерация кнопок

 

Главное окно управляющей программы в режиме эмулятора имеет заголовок "IR CAPTURE" и также предназначено для захвата команд либо для посылки одиночных команд.

Чтобы выбрать режим работы с эмуляцией ПДУ, в группе "Select Mode" главного окна программы отменяют пункт "Other", затем нажимают кнопку "Settings". В открывшейся вкладке настроек отмечают пункт "IR box", слева станет активным меню с выпадающим списком (по умолчанию - "Common"). Однако выбор из списка влияет только на работу кнопки "Open..." на этой же странице настроек, по нажатию кнопки "Open." откроется соответствующее окно. Если же выйти из настроек в главное окно программы, то выбор в окне настроек не имеет значения, имеет значение только установка параметров в окне захвата команд (и тактовой частоты для LPT-порта).

В версии для LPT-порта на странице настроек присутствует выбор способа подключения - "Jig by Protocol", для эмуляции используются контакты, соответствующие SDA (прием данных с фотоприемника) и SCL (передача на излучающий ИК диод либо управление внешним генератором). Установка скорости порта LPT (fast-slow) именно на странице настроек значения не имеет.

 

Формат файлов описания ПДУ, используемый программатором Postal

Для эмуляции ПДУ разработан свой формат файлов, имеющий расширение ".irp" ("InfraRedPostal"). Каждая команда ПДУ описывается отдельной строкой. Иногда команды в посылаемых данных используют переключаемый бит ("Toggle bit") от команды к команде, тогда такие команды имеют по одной строке для каждого варианта со специальной пометкой, например, каждая команда протокола RC-5 имеет по две строки. Тем не менее, программа интерпретирует такие команды как одну, используя внутреннее переключение между вариантами. Для этого программа содержит внутренний счетчик, постоянно инкрементируемый, который сбрасывается в ноль, если команда с текущим номером не найдена в файле (команда с номером "0" передается сразу).

В файле также в начале строк распознаются знаки, позволяющие "закомментировать" ненужные строки либо написать комментарий - это "//, #, ;" (две косые черты, решетка, точка с запятой).

Файл может содержать большое число строк, однако "виртуальный пульт" будет использовать только первые 28. Для больших файлов у окна "Common" имеется поле ввода для номера, указывающего, сколько строк пропустить перед загрузкой, но всего загружаются названия команд из 64 строк, поэтому разумно не создавать большие файлы описаний команд ПДУ. Загружаются только названия команд ("label"). Названия не должны повторяться, поскольку при каждой передаче файл открывается и передается первая найденная от начала команда с совпавшим названием. Такой подход позволяет редактировать файл между передачами команд. Если же редактируется название команды (выводимое как надпись на кнопке), то файл следует загрузить заново (кнопка "Reload" виртуального пульта или кнопка "Load" страницы "IR Common Page").

Типичная строка в файле (протокол NEC):

carrier=38000 pulses=21 duty=4 label=play 00FFFF008 8A288AA8AAAAA2888888A2800

Две строки для одной команды при использовании переключаемого бита (RC-5):

carrier=36000 pulses=32 duty=4 label=unnamed_001#0 005AA596A0 carrier=36000 pulses=32 duty=4 label=unnamed_001#1 0056A596A0

Содержимое строки интерпретируется следующим образом. После того как найдена строка с нужным названием команды в поле "label", она подается на исполнение парсеру, который непосредственно работает с данными. Сначала он извлекает из строки установочные данные: частоту несущей "carrier" (указывается в Гц); число тактов несущей на 1 бит в битовой строке данных "pulses"; скважность несущей "duty" (обычно 1/4, указывается как 4). Если установочных данных нет, то используются предыдущие, то есть переменные в программе, которые были установлены предыдущей командой, не изменяются. Битовая строка данных определяется двумя символами нуля (00) после пробела, далее идут байты в текстовом виде (по два символа на байт, как в файле hex-формата) без пробелов между ними. Биты обрабатываются слева направо (от старшего к младшему), на каждый бит отсчитывается число импульсов несущей, указанное в "pulses". Если бит равен 1, то на ИК диод подается пульсирующий сигнал, если 0 - отсчет продолжается, но выход при этом будет в неактивном состоянии. Длина битовой строки имеет ограничение, поскольку загружается целиком в буфер микроконтроллера, однако для единичной команды размера буфера всегда хватает с запасом. В случае LPT-варианта ограничений нет и длина строки может достигать 1024-х реальных байтов(2048 текстовых), это несколько секунд непрерывной передачи.

Также в файле распознается строка "setup" с установкой только параметров, без битовой строки данных для передачи. Однако она не имеет смысла, т.к. друг за другом могут идти команды с совершенно разными параметрами,поэтому эффективнее иметь параметры в каждой строке, даже если они и повторяются.

Таким образом, файл имеет текстовый вид и легко доступен для редактирования.

 

Работа в программе с окном загрузки файлов "Common"

Окно "Common" (рис. 1) предназначено для действий, которые могут быть либо обобщены для всех остальных окон, либо не относятся ни к одному из них.

Сверху находится группа "Load IR File", имеющая 3 отмечаемых пункта: "User", "Default", "Synth". При смене отметки файл не будет загружен автоматически, нужно нажать кнопку "Load", при этом для пункта "Default" загружается файл с фиксированным названием "default.irp", для пункта "Synth" - текущий файл, с которым работал синтезатор команд, и для пункта "User” - последний открытый вручную файл. Отметим, что программа не сохраняет имя последнего файла для пункта "User" в своей конфигурации, при завершении программы оно будет сброшено. Загрузить произвольный файл можно, открыв диалог загрузки кнопкой "Open", либо набросив файл мышкой на окно. Если при этом имеется конвертор под загружаемый "неродной" формат, то файл будет преобразован автоматически в нужный вид. Если требуется автоматическая загрузка какого-либо пользовательского файла с описанием команд ПДУ, то для этой цели файл можно переименовать в "default.irp" (он должен находиться в папке с программой). Имя текущего загруженного файла также показывается. Поле ввода "Skip labels" позволяет начать загрузку не с нулевой строки, но обычно не используется. Максимально загружается 64 разноименных команды (то есть имен "label" для команд), они тут же появляются в выпадающем списке в группе "Single Command", где можно выбрать нужную по имени и тут же передать кнопкой "Send", либо переключиться на окно виртуального пульта для свободного выбора команд. Слева у окна "Common" есть кнопки переключения на другие окна режима работы с ПДУ.

В качестве дополнительного инструмента имеется группа "AutoSend from File". Работа происходит с текущим файлом, файл передается построчно независимо от названий команд с интервалом по таймеру. Это позволяет хранить в файле очень длинную последовательность и автоматически ее использовать. Передачу можно зациклить ("Endless"), остановка происходит по нажатию любой кнопки. Во избежание переполнения окна лога предусмотрена кнопка "Clear".

Для LPT-версии в окне "Common" имеются дополнительные инструменты. Чекбоксы "IR Inv.Input" и "IR Long String" имеют назначение как у USB-версии, но у последней они находятся в окне дополнительных настроек "Misc". "IR Inv.Input" в неотмеченном состоянии означает прием сигнала от стандартного фотоприемника, у которого низкий активный уровень. Если отметить "IR Long String", то при захвате длинная строка не будет отброшена, однако передать такую строку сможет только LPT-версия. Состояние этих чекбоксов не сохраняется при выходе из программы.

Также LPT-версия имеет чекбоксы "Use External Carrier" и "TX RealTime", первый предполагает управление внешним генератором несущей (выходной сигнал аналогичен полученному с фотоприемника, пульсаций нет), а второй устанавливает максимальный приоритет для передачи, чтобы между тактами не возникало случайных прерываний (чекбокс отмечен по умолчанию). Имеется поле ввода тактовой частоты LPT-порта, которое может быть заполнено автоматически по нажатию кнопки "Test", либо вручную. Кнопка "Default" сбрасывает тактовую частоту на значение по умолчанию. Установленное значение частоты и состояние двух последних чекбоксов запоминается.

LPT-версия имеет дополнительные тесты (группа "Echo Test"). Тест "Send-Rcv" выполняет непрерывную передачу импульсов, имитирующих команду ПДУ, и одновременно прием сигнала с индикацией уровня. Это необходимо при управлении внешним генератором несущей для подстройки его (генератора) частоты на пик чувствительности фотоприемника. В этом режиме для приема используется интервал, совпадающий с активной частью передаваемого импульса, поэтому если требуется контроль сигнала с внешнего ПДУ - используется тест "Rcv only". Контроль интенсивности принимаемого с фотоприемника сигнала производится по высоте полоски индикатора. Минимум и максимум гибко подстраиваются автоматически в процессе измерения, чтобы увеличить заметность изменений уровня сигнала. Тесты "Send-Rcv" и "Rcv only" завершаются вручную нажатием "Stop" или любой другой кнопкой. Необходимо проконтролировать в окне лога, что тест завершился (сообщение "-done"), отсутствие сообщения о завершении говорит о том, что бесконечный цикл продолжается внутри системы Windows (Windows теряет часть ресурсов для дальнейшей работы). Критичные тесты и переключатели изначально заблокированы, для разблокировки отмечают чекбокс "Unlock Test".

 

Работа в программе с окном синтезатора протоколов ПДУ "Synthesis"

Синтезатор (конструктор) протоколов ПДУ имеет простой интерфейс (рис. 2) и позволяет синтезировать команды известных протоколов, описание которых взято из Интернета [1]. Нотация полей данных протоколов соблюдена, но используется обычно проверка команд перебором. После нахождения подходящей команды можно ввести ее имя в поле ввода (группа "Define caption") и сохранить. Сохранение идет для каждого протокола в свой отдельный файл (текущий указан внизу окна). Протокол, для которого синтезируются команды, выбирается в выпадающем списке слева, выбор сохраняется в конфигурации программы. Чтобы начать сканирование, отмечают чекбокс "Enable". После этого вручную или по таймеру можно перебирать команды соответствующими кнопками. На каждом шаге увеличиваются или уменьшаются значения всех полей ввода одновременно. Чтобы остановить какое-либо поле, нужно выполнить двойной щелчок левой кнопкой мыши прямо на поле ввода (необычно - но удобно), поле ввода станет серым и перестанет изменяться. И наоборот, можно включить обратно двойным щелчком. Остановка автоперебора - любой кнопкой.

Найденную команду можно еще раз проверить кнопкой "Send" и сохранить кнопкой "Save" в файле с фиксированным именем (внизу окна), соответствующим протоколу. Можно сразу написать в поле ввода имя команды либо отредактировать файл позже.

Из найденных команд можно составить собственный файл для виртуального пульта. Если команда синтезируется из вручную заполненных полей ввода режима и адреса, то проверка на валидность согласно протокола будет осуществляться при передаче команды (например, по нажатию "Send"). Запредельное значение будет округлено с одновременной коррекцией полей ввода. Если требуется знать соответствие команды числам в полях ввода, можно отразить это в имени команды либо использовать комментарий в файле. Имя команды может содержать максимум 20 символов, т.к. оно размещается на кнопках виртуального пульта при его загрузке.

Также, просто сохраняя команды синтезатора и просматривая затем файл, можно, например, уточнять синтаксис для ручного формирования команд с переключаемым битом ("Toggle bit").

Если для синтеза используется LPT-версия, то для стабильности может потребоваться подстройка частоты порта LPT в сторону от но минального значения (на странице "Common"), причем подстройка под каждый протокол разная. Это связано с предпочтениями принимающего устройства, при одном значении частоты порта меньше джиттер ("дрожание" импульсов), при другом - точнее интервалы (имеется в виду работа с излучающим ИК диодом напрямую, без дополнительного генератора). При передаче команд LPT-версией без дополнительного генератора может оказаться затруднен или невозможен захват сигнала универсальными ПДУ и программами из-за того, что они пытаются измерить несущую частоту, которая с выхода LPT-порта близка к шуму. Для загрузки запоминающих ПДУ удобнее использовать USB-версию, которая формирует несущую и интервалы с абсолютной точностью.

 

Работа в программе с окном захвата команд ПДУ "Capturing"

Захват команд ПДУ происходит с выхода стандартного фотоприемника, подключенного в случае USB-версии на вход данных spi ATmega (MISO). Дискретность захвата равна 230400 бит/с или 115200 бит/с (чекбокс "Low Speed Capture"). Если разрывов в передаче данных нет, то скорость снижать необязательно. LPT-версия не имеет регулировки скорости захвата, выход фотоприемника подключается к контакту SDA соответствующей переходной платы ("Jig"). Исходная несущая частота оригинального пульта ("carrier") при захвате неизвестна (фотоприемник выдает только огибающую), она устанавливается в соответствующем поле ввода вручную. Частоту можно узнать из данных о протоколе либо прочитать маркировку оригинального фотоприемника принимающего устройства - возможно, на нем указана несущая частота, на которую он рассчитан. По умолчанию установлена частота 38000 (протокол NEC). Битовая строка данных при захвате рассчитывается от частоты, поэтому при смене частоты нужно повторить захват команды, просто отредактировать частоту несущей в файле нельзя. Значение несущей частоты используется только при передаче, захват же происходит по огибающей, как указывалось выше. Захват при использовании LPT-версии следует производить, установив на страничке "Common" точную реальную тактовую частоту порта LPT - это позволит избежать проблем с совместимостью при обмене файлами и обеспечит нормальную работу захваченных команд с USB-версией.

Поле ввода "Pause Size" (рис. 3) используется для установки времени паузы между командами, по умолча-нию 40 мс. Это время используется для остановки захвата только в случае отмеченного чекбокса "End By Pause", если отметка снята, то захват будет продолжен и команды будут разделяться по тому же интервалу, но внутренне. При этом множество команд будет записано сразу в файл, битовые строки в логе при этом не показываются. Кнопка "Test Send" при этом выдаст из файла последнюю записанную команду. Если время паузы установить слишком большим, серия команд сольется в одну длинную строку данных, которую, тем не менее, способна передать версия для LPT-порта. Файл для захвата используется с фиксированным именем "ir_ capture.irp". Когда он становится неактуален, то его можно переименовать или удалить, будет создан новый. При захвате длинной последовательности в виде серии команд можно затем, оперируя задержкой по таймеру, выполнить ее полную передачу в режиме "AutoSend" со странички "Common".

В основном, требуется захват единственной команды с остановкой по паузе (по умолчанию). При этом получаемая битовая строка выводится в окно лога. Для LPT-версии по умолчанию выводится только длина строки из-за маленького размера окна лога, для переключения на вывод полной строки данных предусмотрен переключающий чекбокс. Делая несколько попыток с разным положением захватываемого пульта, можно получить максимально короткую строку, которая будет работать на передачу - ее и следует записать как оптимальную кнопкой "Save to File". Перед записью можно присвоить команде название, либо отредактировать в файле позже. При записи команды буфер очищается, чтобы не записать команду повторно (в отличие от синтезатора), хотя тестовая передача будет работать - при пустом буфере берется последняя строка из файла.
Для предотвращения перегрузки окна лога предусмотрена кнопка "Clear".

Поле ввода "Noise Level" не требует подстройки, упрощенно - для протокола ITT более приемлем уровень ноля, но стандартный фотоприемник не принимает такие короткие импульсы. К тому же этот протокол есть в списке синтезатора - его захват не нужен.

Возможен также анализ захватываемой команды, результат выводится в окно лога (на момент написания статьи это не реализовано).

Как указывалось выше, для USB-версии на странице настроек "Misc" имеется два дополнительных чекбокса установки режима захвата ПДУ:

-"IR Inv.Input" при отметке позволяет работать с фотоприемниками, у которых активный уровень сигнала высокий (обычно - низкий).

-"IR Long String" при отметке позволяет не отсекать длинные строки захвата, что позволяет их просмотреть и, при необходимости, разделить вручную. Логика работы захвата выглядит следующим образом. Исходя из необходимости представить команду наиболее короткой битовой строкой, программа высчитывает наибольший интервал, умножая который на минимальное целое число можно получить любой интервал в захватываемой последовательности, учитывая допустимое отклонение. В дальнейшем полученные множители дают количество битов на каждый интервал.

При захвате можно проанализировать результаты подсчета, выдаваемые в следующий лог (сверху вниз):

-число обнаруженных активных уровней (импульсов) в посылке;

-число вариантов ширины активных импульсов;

-число вариантов ширины пауз между ними;

-общее число вариантов ширины для представления битами;

-число делителей с разной ошибкой;

-наибольший общий делитель с компромиссом между ошибкой и получаемой длиной строки;

-"pulses=" - то же, что и в файле (количество импульсов целевой несущей на 1 бит в строке данных).

В начало строки данных сразу добавляются незначащие 00, в конец также добавляются 00, если строка достаточно короткая. Максимальная длина строки зависит от размера буфера контроллера, в худшем случае это может быть 71 байт (или 142 символа для строки данных), чего во всех случаях достаточно.

В дальнейшем захваченные строки могут быть скомпонованы в отдельный файл для удобного использования в окне виртуального пульта.

 

Работа в программе с окном виртуального ПДУ "Virtual RC""

Наиболее удобно подготовленные файлы загружать для использования в виртуальный пульт (рис. 4). Управление передачей команд при этом имеет привычный вид, размер кнопок выбран заведомо большой. Названия команд из полей "label" файла отображаются прямо на кнопках. Последовательность загрузки названий команд фиксирована, при чтении строк из файла они появляются на кнопках слева направо и сверху вниз, это легко запомнить (показано на рисунке в виде номеров кнопок). Всего для виртуального пульта возможно 28 команд (по числу кнопок), они всегда загружаются, начиная с первой строки файла независимо от установки пропуска на страничке "Common", исключение - переход к виртуальному пульту со странички "Common", когда названия команд были уже предварительно загружены не с первой строки. Количество и неизменное расположение кнопок призвано защитить от путаницы и упростить понимание логики работы, особенно при обмене файлами, описывающими разные ПДУ. Если количества кнопок не хватает - можно быстро перегружать файлы, набрасывая их мышкой на окно виртуального пульта. Название используемого файла выводится внизу окна, кнопка "Reload" перезагружает текущий файл в случае редактирования полей "label". Файл, описывающий ПДУ, всегда доступен для редактирования внешним редактором, например - "блокнотом" из стандартной поставки Windows. После нажатия кнопки для передачи команды файл открывается на чтение и передается первая найденная от начала файла команда с совпавшим полем "label". То есть, какие-либо изменения, сделанные внешним редактором, будут применены немедленно. Использование переключающего бита "toggle bit" проще проверить на практике, сгенерировав синтезатором несколько команд протокола RC-5 или подобного.

Виртуальный пульт не поддерживает повторную передачу команд при удержании кнопок, поскольку предназначен в основном для целей сервиса. Тем не менее, продуманная логика работы и простота позволяют использовать виртуальный пульт повседневно, например, при утере или поломке пульта какого-либо устройства. Стоит подчеркнуть еще раз простоту, открытость исходных кодов, надежность решения и совместимость USB- и LPT-версии в части использования файлов, описывающих ПДУ.

 

Работа в главном окне программы в режиме "IR CAPTURE"

Главное окно программы в режиме работы с ПДУ не обладает каким-либо расширенным функционалом, однако при работе в нем имеется доступ к прокрутке окна лога. Кнопка "Read" аналогична кнопке "Capture Start" из окна захвата, дополнительно после ее отработки для кнопки "Verify" рабочим файлом устанавливается "ir_capture.irp". Кнопка "Verify" выполняет передачу либо захваченной команды из буфера, либо последней команды из файла, которым может быть "ir_capture.irp" или только что открытый файл. Можно набросить файл мышкой на окно, и кнопка "Verify" выполнит передачу последней команды из него. Это удобно, когда файл состоит всего из одной команды, например - вход в сервисный режим. Кнопка "Write" работает только с файлом "ir_capture.irp" и записывает в его конец захваченную команду, если она есть в буфере. Установки захвата используются с соответствующих страниц и могут быть просмотрены по кнопке "Status" (может потребоваться прокрутка окна лога для просмотра всех данных). Кнопка "Version" (не реализовано на момент написания статьи) анализирует протокол команды, получая данные для анализа аналогично кнопке "Verify" (буфер или файл). В качестве размера буфера выводится "data 70 bytes" для напоминания пользователю, что в целях совместимости нежелательно превышать эту границу при захвате.

 

Особенности подключения программатора Postal для работы с эмуляцией ПДУ

В USB-версии Postal генерация несущей осуществляется аппаратно, катод излучающего ИК диода подключают к выходу PB1 микроконтроллера, одновременно это выход CS на 1-й контакт панельки для spi-flash. Поскольку контакт 8 панельки - это питание, то можно подключить излучающий ИК диод последовательно с резистором 33...100 Ом прямо в панельку между контактами 1 и 8. Чтобы распаять ИК диод на плату постоянно, вместо питания используется выход PD7 микроконтроллера ATmega - на него подается высокий уровень только при эмуляции ПДУ. Фотоприемник также можно подключить непосредсвенно к панельке для spi-flash, его выход подключается к контакту 2 (вход MISO микроконтроллера), общий - к контакту 4, питание - к контакту 8. Фотоприемник предполагается отключаемым, т.к. нужен нерегулярно.

Для LPT-версии фотоприемник и излучающий ИК диод (с генератором несущей или без) можно выполнить отдельным отключаемым модулем. Контакты для подключения можно определить, ориентируясь на подключение обычных I2C-EEPROM. Выход фотоприемника подключается к шине SDA, а ИК диод последовательно с резистором подключают между шиной SCL и питанием (параллельно резистору подтяжки). Обычно микросхема, формирующая сигнал SCL, способна коммутировать достаточный для ИК диода ток. Если используется внешний генератор, то он должен генерировать несущую при низком уровне на SCL.

Интернет-ресурсы

1.http://www.sbprojects.com/knowledge/ir/index.php

2.http://monitor.net.ru/forum/postal2-3-info-317755.html

Автор: Валерия Ершова (г. Москва)

Источник: Ремонт и сервис


Рекомендуем к данному материалу ...