Темы



VOX для «зомбоящика». Пет-проект

После перехода с аналогового телевещания на DVB-T — в доме появилась приставка к телевизору со своим пультом управления. Наличие двух пультов меня ничуть не волновало, так как сам смотрю телевизор очень мало. Но в какие-то из новогодних праздников бытовое пьянство приелось настолько, что я решил сделать что-нибудь несложное и быстрое головой и руками. Целью оказалось объединение двух пультов в один.

Спойлер: Не настолько быстро, как предполагалось. Но проект был завершён в приемлемый срок.

Disclaimer:

  • Почему ATtiny15, а не  от ? Потому, что он был в наличии.

  • Почему именно такой способ? Потому что. Но Ваш способ, несомненно, должен быть отражён в комментариях.

  • Почему что-то ещё? Потому что это достойно обсуждения.

После краткого рассмотрения вопроса — решил оставить пульт приставки (переключение каналов — всё равно через неё). Значит — нужна некая добавка к телевизору, которая будет включать и выключать его более-менее синхронно с приставкой.

Сейчас я забегу немного вперёд, к результату и окончанию работы. Первоначальная идея была принята к исполнению сразу, а вде самые многообещающие альтернативы — были рассмотрены post factum:

  • Использование HDMI-CEC (в далёком прошлом — AV.link в составе SCART). Изучение инструкции к приставке и её меню показало, что эта функция в ней отсутствует.

  • Захват и декодирование ИК-посылок от пульта приставки через ИК-приёмник телевизора. Метод слишком избитый и возможны проблемы с чувствительностью при разных несущих частотах (33–38 кГц, ЕМНИП).

Первоначальной и единственной идеей — был анализ аналогового сигнала от приставки к телевизору и его включение при превышении средним уровнем сигнала «уровня чёрного». Поскольку такой метод давно и широко используется в радиосвязи, то проект получил название VOXtele (название TeleVOX по данным поисковиков — более избито).

Осциллограф, подключенный к линии Video между приставкой и телевизором, — показал, что всё выглядит именно так, как ожидается:

https://ru.wikipedia.org/wiki/Видеосигнал

А при переводе приставки в режим ожидания — сигнал активно притягивается к нулю.

В качестве мозга VOX был назначен немолодой, но бодрый микроконтроллер ATtiny15. Ассемблер я ещё не забыл, а АЦП или аналоговый компаратор (в паре с ШИМ) — вполне способны обработать предлагаемый приставкой сигнал и определить искомое повышение его уровня.

Для большей тренировки — я решил захватывать видеосигнал напрямую через АЦП (поскольку интересен средний уровень, то преобразование спектра видео сигнала при дискретизации меня ничуть не волновало) и пропустить через простейший цифровой БИХ (рекурсивный) фильтр вида

Yi = [Y (i-1)*(N-1) + Xi]/N где Y — выходные, X — входные данные, N — параметр (N = 2M), i — данные на очередном и предыдущем моментах времени.

Который, используя только сдвиги (умножения и деления на степени 2, благодаря введённому ограничению на N), сложения и вычитания, будет выделять среднее значение видеосигнала.

Целочисленную реализацию такого фильтра я уже пробовал применить в другом случае, но результат был неудовлетворительным и я вернулся к классическому фильтру скользящего среднего. Теперь — представился случай разобраться, как следует. Пробные расчёты (например — для N = 4) в электронных таблицах — предоставили достаточно информации о необходимости перехода, как минимум, к арифметике с фиксированной точкой. Значения с плавающей точкой вычислены по приведённой выше общей формуле, целочисленные значения — по формуле Yi = [(Y (i-1)<<2) - Y(i-1) + Xi]>>2:

Шаг

Вход 1

Целочисл. 1

Плав. 1

Вход 2

Целочисл. 2

Плав. 2

0

100

100

100

100

100

100

1

104

101

101

103

100

100,75

2

104

101

101,75

103

100

101,31

3

104

101

102,31

103

100

101,73

4

104

101

102,73

103

100

102,05

5

104

101

103,05

103

100

102,28

6

104

101

103,28

103

100

102,46

7

104

101

103,46

103

100

102,59

8

104

101

103,59

103

100

102,69

…

…

…

…

…

…

…

13

104

101

103,90

103

100

102,92

…

…

…

…

…

…

…

16

104

101

103,95

103

100

102,96

…

…

…

…

…

…

…

21

104

101

103,99

103

100

102,99

…

…

…

…

…

…

…

30

104

101

103,99

103

100

102,99

Если лучше знать математику — то можно вывести некоторую формулу, показывающую потребное число разрядов после запятой в зависимости от N? Что-то вроде минимум M разрядов? А может и M-1 достаточно? Комментарии приветствуются.

Поскольку сверхвысокая точность обработки не требовалась — были использованы 8-разрядные данные с АЦП, 16-битный буфер для накопления оперативных данных фильтра и упомянутые выше сдвиги, сложения и вычитания (простейшая математика, выполняемая за 1 такт). За 4–5 подходов (1–2 полных рабочих дня) это было утоптано в обработчик прерывания по готовности данных от АЦП с автоматическим запуском нового преобразования по готовности очередной порции данных (каждые 108 тактов основной частоты, F_CPU = 1,6 МГц). Выполнение прерывания занимает от 19 до 27 тактов (в зависимости от M, определяющего число требуемых сдвигов).

Вот АЧХ фильтра с N=32 (M=5), измеренная программой RMAA. Вполне сходно с -6 дБ/октава простого RC ФНЧ.

АЧХ цифрового фильтра

АЧХ цифрового фильтра

После этого — настало время наметить и реализовать логику работы VOX. Первое, конечно, — автоматическое включение и выключение по наличию видеосигнала на «тюльпане» RCA. Второе — отслеживание внешнего (собственным пультом или кнопкой) включения/выключения телевизора и возврат в режим автоматической работы через 30 сек. после выключения телевизора извне. Третье, после полугода опытной эксплуатации, — удержание телевизора в выключенном состоянии при наличии сигнала от приставки сразу после подачи питания на телевизор. Приставка всегда включается в рабочий режим при подаче питания на неё и, придя домой после отключения электричества, — можно было найти включенный телевизор.

Затем — ознакомление со схемой материнской платы телевизора (MT8223.3B) для определения источника питания прибора, его выходного сигнала и необходимых сигналов обратной связи от телевизора. Питанием была выбрана линия STB3V3 (3,3 В дежурного режима) с выхода стабилизатора U3. Выходным сигналом была назначена цепь K0 (6 вывод разъёма CN7), параллельная кнопке включения/выключения. Так как телевизор использует АЦП для опроса кнопок, то выход микроконтроллера VOX реализует «открытый сток». Для обратной связи и определения внешнего включения телевизора был выбран сигнал ~PW_ON (рабочее питание включено, активный уровень для VOX — программируется) в точке соединения резисторов R33 и R51.

Фрагмент mainboard MT8223.3B и подключение VOX

Фрагмент mainboard MT8223.3B и подключение VOX

Для оперативного контроля работы — добавлен светодиод «Отсутствует видеосигнал» с программируемым режимом включения (к питанию или к общему проводу).

Кодирование «бизнес-логики» заняло 5–7 вечеров уже после праздников. Основной цикл работы программы занял 55–56 тактов плюс 12 тактов на обработчик прерывания меток времени. Для повышения устойчивости программы к сбоям аппаратуры — все прерывания, не используемые явно, вызывают перезапуск всего VOX с помощью сторожевого таймера. Для повышения устойчивости переключений — данные мажорируются в течении 1 с на включение телевизора, 5 с на выключение и 10 с при подаче питания. Да — отфильтровать, гайку, контргайку, заварить и в синюю изоленту.

Алгоритм основной программы получился таким:

Video_In - вход видеосигнала и current_data - его переменная. Power_SW - выход на кнопку телевизора. Feedback - вход обратной связи и hw_state - его переменная. Битовые переменные - do_on (начать включение телевизора), do_off (начать выключение), External (включен вручную), Internal (включен автоматически), Powered_on (питание только что включено). Слова с двоеточиями в конце - метки.

Video_In — вход видеосигнала и current_data — его переменная. Power_SW — выход на кнопку телевизора. Feedback — вход обратной связи и hw_state — его переменная. Битовые переменные — do_on (начать включение телевизора), do_off (начать выключение), External (включен вручную), Internal (включен автоматически), Powered_on (питание только что включено). Слова с двоеточиями в конце — метки.

Поскольку проект разовый и состоит из менее чем 10 деталей и пары десятков паек, то VOX был собран на кусочке макетной платы и приклеен в удобном месте корпуса телевизора. Условно — 1–2 вечера.

VOX в естественной среде обитания - cлева в середине

VOX в естественной среде обитания — cлева в середине

Архив с проектом AVR Studio и прочими файлами — тут. Поскольку ATtiny15 давно снят с производства, то в коде предусмотрено использование его наследников — ATtiny25, 45 или 85.

VOX успешно работает 2,5 года.

© Habrahabr.ru