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

Моя цель - предложение широкого ассортимента товаров и услуг на постоянно высоком качестве обслуживания по самым выгодным ценам.

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

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


Disclaimer:
  • Почему ATtiny15, а не <other_MCU> от <other_manufacturer>? Потому, что он был в наличии.

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

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

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

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

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

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


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

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

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

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


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

Для большей тренировки - я решил захватывать видеосигнал напрямую через АЦП (поскольку интересен средний уровень, то преобразование спектра видео сигнала при дискретизации меня ничуть не волновало) и пропустить через простейший цифровой С бесконечной импульсной характеристикой</p>" data-abbr="БИХ">БИХ (рекурсивный) фильтр вида

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 года.

Источник: https://habr.com/ru/articles/749750/


Интересные статьи

Интересные статьи

Разбираемся, что общего у компьютерных игр, «Дома-2», граффити, Билли Айлиш и Коко Шанель, а также глубоко копаем тему личного бренда и пет-проектов. Гость выпуска — Миша Синя...
Привет, меня зовут Мария, и в этой статье я расскажу о полезных сервисах для генерации нейминга для вашего нового продукта/бренда/приложения/магазина (нужное подчеркнуть), а ещё оценим результат мозго...
Обычно пет-проект — это что-то такое для души, на несколько вечеров в свободное от работы время. Зачастую никому, кроме его создателя, не нужное. Но бывают случаи, когда всё заходит куда дальше, неожи...
Каждый разработчик делал пет-проект, который так и не увидел свет. У меня таких проектов набралась чёртова дюжина, а на этой неделе я был близок к тому, чтобы пополнить список неудач ...
В этом выпуске: 00:27 Как китайские стратагемы помогают в работе, romas1982 13:26 Рамблер дал заднюю, и зачем это вообще было нужно? baragol 21:22 Как программисту защитить свой пет-проект...