После перехода с аналогового телевещания на DVB-T - в доме появилась приставка к телевизору со своим пультом управления. Наличие двух пультов меня ничуть не волновало, так как сам смотрю телевизор очень мало. Но, в какие-то из новогодних праздников, бытовое пьянство приелось настолько, что я решил сделать что-нибудь несложное и быстрое головой и руками. Целью оказалось объединение двух пультов в один.
Спойлер: Не настолько быстро, как предполагалось. Но проект был завершён в приемлемый срок.
Disclaimer:
Почему ATtiny15, а не <other_MCU> от <other_manufacturer>? Потому, что он был в наличии.
Почему именно такой способ? Потому что. Но Ваш способ, несомненно, должен быть отражён в комментариях.
Почему что-то ещё? Потому что это достойно обсуждения.
После краткого рассмотрения вопроса - решил оставить пульт приставки (переключение каналов - всё равно через неё). Значит - нужна некая добавка к телевизору, которая будет включать и выключать его более-менее синхронно с приставкой.
Сейчас я забегу немного вперёд, к результату и окончанию работы. Первоначальная идея была принята к исполнению сразу, а две самые многообещающие альтернативы - были рассмотрены post factum:
Использование HDMI-CEC (в далёком прошлом - AV.link в составе SCART). Изучение инструкции к приставке и её меню показало, что эта функция в ней отсутствует.
Захват и декодирование ИК-посылок от пульта приставки через ИК-приёмник телевизора. Метод слишком избитый и возможны проблемы с чувствительностью при разных несущих частотах (33-38 кГц, ЕМНИП).
Первоначальной и единственной идеей - был анализ аналогового сигнала от приставки к телевизору и его включение при превышении средним уровнем сигнала "уровня чёрного". Поскольку такой метод давно и широко используется в радиосвязи, то проект получил название VOXtele (название TeleVOX по данным поисковиков - более избито).
Осциллограф, подключенный к линии Video между приставкой и телевизором, - показал, что всё выглядит именно так, как ожидается:
А при переводе приставки в режим ожидания - сигнал активно притягивается к нулю.
В качестве мозга 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.
Для оперативного контроля работы - добавлен светодиод "Отсутствует видеосигнал" с программируемым режимом включения (к питанию или к общему проводу).
Кодирование "бизнес-логики" заняло 5-7 вечеров уже после праздников. Основной цикл работы программы занял 55-56 тактов плюс 12 тактов на обработчик прерывания меток времени. Для повышения устойчивости программы к сбоям аппаратуры - все прерывания, не используемые явно, вызывают перезапуск всего VOX с помощью сторожевого таймера. Для повышения устойчивости переключений - данные мажорируются в течении 1 с на включение телевизора, 5 с на выключение и 10 с при подаче питания. Да - отфильтровать, гайку, контргайку, заварить и в синюю изоленту.
Алгоритм основной программы получился таким:
Поскольку проект разовый и состоит из менее чем 10 деталей и пары десятков паек, то VOX был собран на кусочке макетной платы и приклеен в удобном месте корпуса телевизора. Условно - 1-2 вечера.
Архив с проектом AVR Studio и прочими файлами - тут (спасибо@sim2qза замеченную опечатку в ссылке на архив). Поскольку ATtiny15 давно снят с производства, то в коде предусмотрено использование его наследников - ATtiny25, 45 или 85.
VOX успешно работает 2,5 года.
Комментарии (9)
sim2q
27.07.2023 16:59+1О, первый раз вижу блок схему полностью точь в точь как у меня!)
Часто рисую, в основном на листочке с карандашиком и ластиком, потом в тулзах если надо красиво. И каждый раз глядя на меню с десятком квадратиков - ощущение лёгкой неполноценности:) Но с другой стороны, в коде всё равно всё сводится к условию да/нет.VT100 Автор
27.07.2023 16:59+1Graphwiz.dot, если правильно помню первое слово.
sim2q
27.07.2023 16:59+1да ещё до visio так и рисовал, вот прям вот эти y/n на ветках как в посте, наверное всё же в какой то умной книжке тех времён было?
upd: О, на самом деле за ATtiny15 зацепился. Есть у меня они и ещё какие-то беспамятные... А у вас в проекте :avr-gcc -c -mmcu=atmega88 Degauss.c
На асм категорически зарёкся писать и стало интересно - как оно без стека?
Там же вон - функции в коде (хотя они в inline вроде уходят). Извиняюсь если вопросы не очень, честно когда-то гуглил можно ли для AT90s1200 на Си писать, но нашёл только, что т.к. без стека не получится.VT100 Автор
27.07.2023 16:59+1Там есть 3-х уровневый аппаратный стек для call/ret(i).
А вообще - один зарубежный энтузиаст кодировал на Си под ATtiny15. Перед кодированием я прочитал ту историю и, взвесив, решил остаться на asm для быстроты. Всё равно, время работы на проектом оказалось в полтора-два раза больше предполагаемого.
А у вас в проекте :
avr-gcc -c -mmcu=atmega88 Degauss.c
Вот с этим - спасибо большое. Это проект от предыдущей статьи... мэйлрушка глючит...
sim2q
27.07.2023 16:59Вот с этим - спасибо большое. Это проект от предыдущей статьи...
Ну вот, так всегда )
Подумал, что собирается в совместимый по командам код, но без подпрограмм и всё в регистрах. Буфер UART в коде при этом меня не смутил :)
NutsUnderline
27.07.2023 16:59если это "несложное и быстрое головой и руками " то чтобы можно было бы сделать если еще и не пить.
tormozedison
У приставки есть вход для флешки. Если напряжение питания появляется там только когда приставка включена с пульта (а не выводится туда всегда при включённом БП), задача решается проще.
VT100 Автор
Возможно. Но появляется лишний провод. И, как выяснилось, после blackout приставка всегда включается в рабочий режим.
Была ещё мысль, что надо взять приставку в питанием 5 В и включать её от телика... Но она не успела оформиться к моменту покупки. И, опять же, - как переключать каналы на приставке? Как ни крути - она в этой связке получается главной. И её пульт.
Ну и конечно - разложение на атомы прошивок на обеих концах. Но моё красноглазое mojo ещё не настолько велико. Я даже с залоченным на РТК роутером - только планирую пободаться. Binwalk сходу не распарсил его прошивку на понятные регионы.