После перехода с аналогового телевещания на 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/Видеосигнал

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


В качестве мозга 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 и прочими файлами - тут (спасибо@sim2qза замеченную опечатку в ссылке на архив). Поскольку ATtiny15 давно снят с производства, то в коде предусмотрено использование его наследников - ATtiny25, 45 или 85.

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

Комментарии (9)


  1. tormozedison
    27.07.2023 16:59
    +1

    У приставки есть вход для флешки. Если напряжение питания появляется там только когда приставка включена с пульта (а не выводится туда всегда при включённом БП), задача решается проще.


    1. VT100 Автор
      27.07.2023 16:59

      Возможно. Но появляется лишний провод. И, как выяснилось, после blackout приставка всегда включается в рабочий режим.

      Была ещё мысль, что надо взять приставку в питанием 5 В и включать её от телика... Но она не успела оформиться к моменту покупки. И, опять же, - как переключать каналы на приставке? Как ни крути - она в этой связке получается главной. И её пульт.

      Ну и конечно - разложение на атомы прошивок на обеих концах. Но моё красноглазое mojo ещё не настолько велико. Я даже с залоченным на РТК роутером - только планирую пободаться. Binwalk сходу не распарсил его прошивку на понятные регионы.


  1. sim2q
    27.07.2023 16:59
    +1

    О, первый раз вижу блок схему полностью точь в точь как у меня!)
    Часто рисую, в основном на листочке с карандашиком и ластиком, потом в тулзах если надо красиво. И каждый раз глядя на меню с десятком квадратиков - ощущение лёгкой неполноценности:) Но с другой стороны, в коде всё равно всё сводится к условию да/нет.


    1. VT100 Автор
      27.07.2023 16:59
      +1

      Graphwiz.dot, если правильно помню первое слово.


      1. sim2q
        27.07.2023 16:59
        +1

        да ещё до visio так и рисовал, вот прям вот эти y/n на ветках как в посте, наверное всё же в какой то умной книжке тех времён было?
        upd: О, на самом деле за ATtiny15 зацепился. Есть у меня они и ещё какие-то беспамятные... А у вас в проекте : avr-gcc -c -mmcu=atmega88 Degauss.c
        На асм категорически зарёкся писать и стало интересно - как оно без стека?
        Там же вон - функции в коде (хотя они в inline вроде уходят). Извиняюсь если вопросы не очень, честно когда-то гуглил можно ли для AT90s1200 на Си писать, но нашёл только, что т.к. без стека не получится.


        1. VT100 Автор
          27.07.2023 16:59
          +1

          Там есть 3-х уровневый аппаратный стек для call/ret(i).

          А вообще - один зарубежный энтузиаст кодировал на Си под ATtiny15. Перед кодированием я прочитал ту историю и, взвесив, решил остаться на asm для быстроты. Всё равно, время работы на проектом оказалось в полтора-два раза больше предполагаемого.

          А у вас в проекте : avr-gcc -c -mmcu=atmega88 Degauss.c

          Вот с этим - спасибо большое. Это проект от предыдущей статьи... мэйлрушка глючит...


          1. sim2q
            27.07.2023 16:59

            Вот с этим - спасибо большое. Это проект от предыдущей статьи...

            Ну вот, так всегда )
            Подумал, что собирается в совместимый по командам код, но без подпрограмм и всё в регистрах. Буфер UART в коде при этом меня не смутил :)


  1. NutsUnderline
    27.07.2023 16:59

    если это "несложное и быстрое головой и руками " то чтобы можно было бы сделать если еще и не пить.


    1. VT100 Автор
      27.07.2023 16:59
      +1

      Вопрос интересный. Но, КМК, - риторический.