Советские телевизоры 2УСЦТ и 3УСЦТ можно и сегодня увидеть во многих домах. Добротность их сборки не вызывает сомнений. Одно «НО» — не все они оборудованы системами дистанционного управления, хотя во многих из них существуют технологические отделения (отсеки), позволяющие установить модуль ИК-приемника. Я стал обладателем именно такого телевизора и начал подумывать о самостоятельном изготовлении ИК-комплекта для дистанционного управления.
Итак, передо мной встали 3 основных вопроса:
- какими функциями необходимо управлять
- какие команды необходимо подавать
- на какой базе собирать пульт и приемник
Для себя я определил, что вполне разумным и достаточным будет управление громкостью (больше, меньше, вкл, выкл) и переключением каналов (вперед, назад). Пульт я решил использовать от старого видеомагнитофона – наличие небольшого количества кнопок подходило под мои запросы. Ну а ИК-модуль я решил реализовать на PIC16F628.
Итак, я решил привязать следующие команды к кнопкам пульта:
Схема собранного приемного модуля получилась такой:
О схеме:
- устройство питается от стабилизированного источника +5В;
- используется внешний кварц на 4 МГц
- в качестве ик-детектора используется сборка от старого DVD (наименование к сожалению не знаю), для улучшения чувствительности и увеличения дальности приема она подключается к одному из аналоговых входов компаратора, чувствительность приемника можно регулировать соответствующим резистором, подключенным ко второму входу компаратора;
- переключение каналов осуществляется подачей логической «1» на один из портов RB0-RB7 (что как раз соответствует количеству каналов на моем телевизоре), диоды блокируют втекающие токи по закрытым портам;
- регулировка громкости осуществляется посредством изменения напряжения на порту RA2 (он является выходом регулируемого источника напряжения VREF)
Подключение ИК-модуля к селектору выбора каналов и блоку управления:
Теперь самое сложное: необходимо было понять каким образом происходит передача пакета от пульта к модулю и выяснить коды для каждой задействованной кнопки. Для этой цели я решил использовать собранный модуль.
Первое что я выяснил, в отсутствии ИК-сигнала на выходе ИК-приемника присутствует лог. «0». А при появлении – лог. «1». Стало быть сигнал иневертируется. Далее необходимо было подсчитать количество импульсов, их длительность, а так же длительность пауз между ними. Итак для каждой задействованной на пульте кнопки. Для этого была написана программа, в которой подсчет длительностей фронтов и пауз производился дискретно, т.е. за счет периодических выборок (понятное дело чем больше выборок, тем точнее подсчет).
Интервал выборок должен быть таким, что бы их количество по низкому фронту и по высокому фронту не превышало 255 – поскольку для записи выборок используется один 8 разрядный регистр памяти. Далее эти данные были записаны во флеш память пика и прочтены на программаторе.
Было установлено, что первый низкий фронт и первый высокий фронт имеют одинаковую длительность для всех команд (кнопок). Их можно считать «запускающими». Измерив их длительность, можно считать что посылка от пульта достоверно и следует далее продолжать обработку пакета.
Далее следуют информационные посылки, причем их верхний фронт изменяется, интервал между ними остается неизменным.
Допустим, что длинный верхний фронт примем за 1 бит, а короткий – за 0, тогда получается:
Таким образом в каждой команде (кнопки) передается по 2 байта информации, причем старший байт для всех команд одинаков, а младший – меняется:
В процессе приема и обработки пакета старший байт можно попросту игнорировать.
На основе полученных данных мною была написана и отлажена программа, которая принимает посылки ИК-пульта, обрабатывает их и выполняет переключение каналов и регулировку громкости телевизора.
Теперь о программе:
- для анализа и обработки пакета выделены 8 байт оперативной памяти, к которым осуществляется косвенная адресация;
- подсчет времени каждой посылки (фронтов) происходит в режиме реального времени. Анализ длительности фронта происходит в интервалах (времени на это более чем достаточно). Тут же формируется байт посредством сдвига записанного ранее бита.
- после успешного приема и обработки команды загорается светодиод;
- в зависимости от того какая команда была принята происходит сравнение младшего байта с установленными значениями (213, 222, 237,238, 239) и выполняется переход на подпрограмму выполнения действий;
- подпрограммы выполнения действий (переключение каналов и регулировка громкости) работают по принципу счетчика и далее передают на подпрограммы табличной конвертации (преобразование кода в позиционный). Далее полученный код загружается в регистры портов;
- реализована возможность тихого переключения каналов (перед переключением громкость отключается, затем восстанавливается до предыдущего значения);
- после выполнения команды управление передается на подпрограмму ожидания новой посылки от пульта и т.д…
Фото готового модуля: