[Из песочницы] Адаптивная фоновая подсветка для телевизора на Raspberry Pi – аналог Ambilight

image

Это телевизор с диагональю 50» и 37 RGB точками адаптивной фоновой подсветки по верхней и боковым сторонам экрана. Как сделать аналогичную адаптивную фоновую подсветку для любого экрана или ТВ — тема избитая, но вполне актуальная по ряду причин.

Во-первых, все меняется. Пару лет назад еще не было проекта, работающего без программных или аппаратных костылей. Во всяком случае мне не встречались такие публикации. Те, что описаны на просторах рунета — либо потеряли актуальность в связи с устареванием программных или аппаратных платформ, либо реализуют данную технологию только применительно к мониторам, подключенным к ПК.

Во-вторых, на рынке нет и не будет самсунгов, сони, элджи и прочих ТВ с поддержкой данной технологии, так как она запатентована на многие годы вперед компанией Philips. И наконец — все решения «из коробки», доступные на али и иже с ним — имеют ряд ограничений в гибкости настроек и адаптации к размеру кадра видеоконтента, корректировок цветовой гаммы и т. д, являясь при этом всего лишь аппаратным костылем, анализирующим внешний сигнал и работающий только на формирование подсветки.

«Аппаратный» вариант захвата кадров


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

В первом случае мы получаем некую универсальность — к устройству можно подключать игровую приставку или какой-то плеер. Во втором — собираем этот самый «какой-то плеер» со встроенной функцией подсветки. Экспериментируя, я реализовал оба варианта, но здесь остановлюсь только на втором, и вот почему:

image

На приведенной блок-схеме первого варианта HDMI сигнал от любого источника приходит на сплиттер, где разделяется на два выхода. С первого контент воспроизводится на любом ТВ приемнике или мониторе. Со второго — сигнал синхронно поступает в аппаратный скейлер, где конвертируется в аналоговый сигнал с кадрами небольшого разрешения — 320×480. Аналоговый сигнал поступает в аппаратный USB граббер, который делает «скриншоты» каждого кадра и передает их через USB порт на вход одноплатного мини ПК — Raspberry Pi 3 B+. Программное обеспечение на малине анализирует кадры при помощи программы Hyperion и через один из выходов GPIO выдает управляющие последовательности на вход адресной ленты типа WS2812B или APA102. Все это отлично заработало, но имеет пару недостатков в виде кучи железа с соединениями и небольшой задержки в выдаче сигнала на подсветку. Задержка была заметна только на тестовых видеороликах при резкой смене цветов в бОльшей части кадра. В остальном без нареканий, кроме стоимости всего железа в этой реализации:

Raspberry Pi 3 B+ — около $55.
Корпус-радиатор — $14.
Активный HDMI 1080P сплиттер на 2 выхода — $15.
HDMI 1080P To AV скейлер — $15.
EasyCap USB граббер — $18.
Блок питания — около $10.
MicroSD карта 32GB — $10.
Соединительные кабели и прочая мелочевка — около $10.
Итого, не считая адресной ленты — почти $150.

Не то, чтобы такой вариант сразу в топку — он вполне может пригодиться для организации фоновой подсветки на каких-то больших сборных экранах в рекламе или презентациях, и цена не самая страшная за полученный результат —, но для домашнего использования я остановился на втором варианте — в бОльшей степени «программном». Он вышел проще, дешевле, компактней и шустрее. Для коммерческого использования он так же вполне может сгодиться — Raspberry Pi с плеером можно успешно использовать в проектах, где нужно автоматически с момента включения циклично и бесшовно воспроизводить какой-то контент, отключая плеер, опять же автоматически — по расписанию в конце дня. Написав небольшой скрипт, мы получим рекламный девайс с функцией адаптивной подсветки любых экранов, хоть десятиметровых. Но вернемся к домашнему применению…

«Программный» вариант захвата кадров


Функции медиа-центра и управления подсветкой останутся за этой же Raspberry Pi 3 B+, а все соединения теперь будут сводиться к подключению нескольких разъемов — питания, интернета, выхода на подсветку и HDMI к ТВ. Не больше, чем у любой другой ТВ-приставки:

image

Забегая вперед, хочу отметить, что на Raspberry Pi 3 B+ получилась вполне универсальная ТВ приставка-медиацентр со всеми необходимыми возможностями подобного устройства, плюс гибко настраиваемая адаптивная подсветка любого современного (и не очень) телевизора, имеющего HDMI вход.

Основой программной части является открытая ОС Libreelec, специально заточенная под плеер Kodi. Сайт проекта содержит всю необходимую информацию.

Про возможности одной из самых мощных и гибких платформ для воспроизведения видео-аудио контента, IPTV и т.д. можно почитать, забив в любой поисковик «kodi описание возможностей». Информации на русском по этой теме очень много. Я использую, пожалуй, 1/10 от всех возможностей платформы и мне этого хватает. Платформа активно поддерживается, имеет отзывчивое сообщество. Следовательно, читаем, изучаем — на вики этих проектов и на форумах есть практически вся необходимая информация и ответы на вопросы. Дистрибутив и инструкции по установке и настройке платформы берем на сайте проекта Libreelec. Так как ОС является кроссплатформенной, не забываем, что наш проект строится на Raspberry.

Нарушая странную, но устоявшуюся традицию начинать подобные публикации с описания видов адресных лент и способов их корявой поклейки на задние стенки домашних ТВ — начну с установки и настройки ПО одноплатника. К сожалению, пошаговую инструкцию по настройке сделать практически нереально — она заняла бы пол сотни страниц текста без скриншотов. Ко всему, платформа плеера активно развивается, версии ОС и Kodi меняются, актуальная на текущий момент информация — вскоре перестает быть таковой. Поэтому здесь — только основные моменты плюс ссылки на источники полезной информации.

Для настройки программной части подсветки, управления ИК пультом и самого плеера нужно иметь начальные представления о том, как устроены каталоги Libreelec, как работает локальная сеть, консоль, что делать с командной строкой и т. д., так как в процессе некоторые вещи будем делать вручную. Посредством установщиков на microSD карту встанут только ОС Libreelec и надстройка для подсветки — Hyperion.

Поскольку Raspberry Pi не имеет встроенных часов реального времени, БИОСа и резервного питания, все, что необходимо для работы — находится на microSD карте. Для установки ОС на карту необходимо скачать либо пакет NOOBS с сайта проекта Raspberry (на момент установки я использовал версию сборки 3.2.1), либо специальный инструмент — «LibreELEC USB-SD Creator».

Карта памяти должна иметь хорошие показатели скоростей чтения и записи — т. е. быть не ниже 10 класса. По объему ОС Libreelec занимает немного места, для работы вполне хватит карты 16GB, если не возникнет желание приобрести объем побольше. Его можно будет использовать для хранения любого контента.

В случае с NOOBS содержимое zip архива распаковывается в корень отформатированной в FAT32 microSD карты, карта вставляется в слот обесточенной малины, включается питание и далее, выбрав в установщике нужную ОС и следуя инструкциям, разворачиваем Libreelec. Однако разработчики платформы рекомендуют установку при помощи LibreELEC USB-SD Creator, который сам загружает и записывает дистрибутив на карту, затем карта так же вставляется в слот малины, где установщик после включения питания разворачивает ОС. При этом разделы карты переформатируются, после чего из-под Windows вы не увидите весь реальный объем носителя. Если по какой-либо причине возникнет необходимость вернуть разделы в начальное состояние, вам придется сначала очистить карту штатной утилитой Windows — DiskPart, затем в разделе «Управление дисками» создать на свободном пространстве носителя новый раздел и отформатировать его.

Для упрощения установки и настройки ОС я временно подключал к малине отдельный монитор и клавиатуру с мышкой.

Так же для конфигурирования и настройки ПО малины понадобится ее связь с ПК и доступ в интернет, желательно проводной. Софт, устанавливаемый на ПК для соединения по SSH — PuTTY и WinSCP, а также виртуальная машина Java (jre-8u231-windows-x64) и конфигуратор демона Hyperion — HyperCon (HyperCon.jar). Можно использовать другой удобный файловый менеджер c панелями, например — Total Commander. Где скачать и настроить — много информации на профильных сайтах, достаточно поискать информацию поисковым запросом «работа с PUttY и WinSCP». У проекта Hyperion так же есть свой форум и вики.
На этом скриншоте три способа соединения малины с ПК под win через SSH — через консоль Putty, файловый менеджер WinSCP и Total Commander:

image

Админская учетка Libreelec по умолчанию имеет логин и пароль root@libreelec, которые лучше изменить в целях безопасности. После успешной установки в настройках системы производим несложные действия — включение SSH, SMB, назначение статического IP, отключение обновлений:

image

Предполагается, что малина подключена к вашей домашней сети, и вы можете узнать IP адрес подключенных к ней устройств на вашем домашнем ПК. Обновления я отключил для того, чтобы однажды настроенная система адаптивной подсветки не слетела, если разработчик изменит какие-либо связанные с ней компоненты в Libreelec.

В настройках системы в службах нужно включить SSH и включить авторизацию по паролю, так же поставить минимальную версию протокола SMB2, максимальную — SMB3. SMB понадобится для того, чтобы видеть каталоги Raspberry Pi и подключенные к ней флеш-накопители с ПК:

image

Под Windows 10 на ПК в настройках придется найти и включить поддержку SMB, так как она по умолчанию в ней отключена:

image

Так же в настройках ищем и добавляем русскую раскладку клавиатуры. С физической клавиатурой ничего не произойдет — будет только ввод на английском, зато в виртуальной экранной клавиатуре появится возможность ввода текста на русском. Для удобного доступа к каталогам на карте microSD и подключенным к малине флешкам можно в Тотал Коммандер создать и вынести на панель инструментов ярлык с адресом удаленного каталога:

image

Файлы в локальной сети будут передаваться со скоростью, ограниченной пропускной способностью вашего домашнего роутера, и значительно быстрее, чем в доступе через SSH. Во всяком случае скопировать фильм или музыку таким образом будет удобнее, чем таскать флешку от приставки к ПК. Вы будете видеть внутреннюю структуру каталогов в /storage на карточке малины и подключенные к USB портам накопители. У меня при проводном соединении 100 Мбит/сек. через роутер максимальная скорость загрузки файлов с ПК на USB накопитель в малине составила около 12 Мбайт/сек, что примерно соответствует пропускной способности моего проводного соединения.

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

После установки и настройки доступа к малине с ПК через SSH при помощи программ PUttY и WinSCP можно приступать к установке и настройке демона Hyperion. На ПК должна присутствовать виртуальная машина Java.

Работать все будет примерно так — при старте Raspberry вместе с Kodi будет запускаться в фоновом режиме специальная программа — Hyperion. Она будет анализировать все видеокадры, и в зависимости от настроек, записанных в файле конфигурации — управлять адресной лентой через один из выходов GPIO малины. Т. е. после настроек все будет работать автономно, никакой связи или взаимодействия с ПК не потребуется. Но для быстрого создания файла конфигурации и установки Hyperion на малину есть удобный конфигуратор, запускаемый на ПК. Эта программа поможет быстро создать файл конфигурации для работы демона, загрузить и установить его в Raspberry и проверить работоспособность системы, используя удобный графический интерфейс.

HyperCon


Конфигуратор называется HyperCon, установки не требует, просто запускаем исполняемый файл HyperCon.jar на ПК и видим такое окно:

image

В правой части изображен виртуальный экран, для которого будет настраиваться подсветка — зоны захвата цвета, их нумерация (начинается с 0), направление, расположение, отступы, перекрытие и глубина. В левой части — пять вкладок с настройками.

Вкратце по вкладкам конфигуратора:

Hardware (железо)

  • device → Configuration Name — любое удобное имя текущей конфигурации
  • device → Type — тип чипа адресной ленты, модуля или чего другого
  • device → Amount LEDs — количество адресуемых пикселей (сколько светодиодов в ленте)
  • device → RGB Byte order — следование цветов в используемом протоколе


Construction (расположение источников света)

  • чекбоксы –> (led top left итд) — наличие источника света в углах конструкции
  • LEDs horizontal → Количество пикселей по верхнему краю конструкции
  • LEDs Left→ Количество пикселей по левому краю конструкции
  • LEDs Right → Количество пикселей по правому краю конструкции
  • Bottom gap → Количество пропущенных зон по нижней части конструкции (для обхода ножки ТВ или всей нижней зоны)
  • 1-st LED offset → Поправка на смещение пикселей для установки первого в удобном углу.


Image process (обработка зон)

  • Image process → Horizontal depth — глубина зон по горизонтали, %
  • Image process → Vertical depth — глубина зон по вертикали, %
  • Image process → Horizontal gap — отступ зон от края по горизонтали, %
  • Image process → Vertical gap — отступ зон от края по вертикали, %
  • Image process → Overlap — перекрытие соседних зон, %


Blackborder detection (обнаружение черных краев экрана) — Чувствительность и режим обработки. Работает по идее так — демон анализирует края экрана по указанному уровню и вычисляет ширину темных краев для исключения из обрабатываемых зон. Это для случаев, когда воспроизводится широкоформатная картинка.

Process (обработка кадров)

  • Smoothing → Enabled (чекбокс включения сглаживания)
  • Smoothing → Type (тип сглаживания)
  • Smoothing → Time (время переходов)
  • Smoothing → Update freq (частота обновления)
  • Smoothing → Update delay (задержка перед обновлением кадра)
  • Color calibration (настройка передачи цветов) — интуитивно понятные пункты, позволяющие отдельно для каждого из 3-х основных цветов задать минимальный и максимальный уровень свечения, насыщенность, температуру, уровень свечения фона без сигнала и т.д.


Отмеченный чекбокс Send Continuous позволяет видеть изменения в процессе настройки уже на собранной конструкции.

Grabber (Граббер — захватчик кадров, самая интересная вкладка)

  • Internal Frame grabber (Программный граббер)
  • Internal Frame grabber→ Enabled (чекбокс включения внутреннего граббера)
  • Internal Frame grabber→ Width (ширина зоны)
  • Internal Frame grabber→ Heigth (высота зоны)
  • Internal Frame grabber→ Interval (интервал захвата граббера)
  • Internal Frame grabber→ Priority Channel (приоритет этого канала)


Здесь нужны некоторые пояснения. Фишка в том, что мы на базе Raspberry Pi делаем медиаплеер, который сам будет крутить контент с локальной сети, флешки, или IP TV на платформе LibreElec. Поскольку контент и так крутится плеером малины, захват будет происходить программно, без внешнего EasyCap граббера, и демон сам разберется с кадрами, так как в этом случае источником сигнала будет HDMI выход самой Raspberry Pi. Есть возможность использовать так же внешний граббер для другого источника, не отключая внутренний — для этого предусмотрены приоритеты каналов, это последний пункт настройки программного граббера. Чем больше число — тем ниже приоритет канала.

Именно так, здесь нет ошибки.

  • Grabber V4L2 (Настройки драйвера аппаратного граббера))
  • Grabber V4L → Device (USB устройство, с которого делается захват — /dev/video0 по умолчанию)
  • Grabber V4L → Input (Используемый вход — 0 по умолчанию)
  • Grabber V4L → Width (ширина зоны — -1 по умолчанию)
  • Grabber V4L → Heigth (высота зоны — -1 по умолчанию)
  • Grabber V4L → Frame decimation (сжатие кадра)
  • Grabber V4L → Size decimation (коэффициент сжатия)
  • Grabber V4L → Priority Channel (приоритет этого канала)
  • Grabber V4L → 3D mode (выбор режима 2D/3D)
  • Grabber V4L → Crop Left (обрезка кадра слева)
  • Grabber V4L → Crop Right (обрезка кадра справа)
  • Grabber V4L → Crop Top (обрезка кадра сверху)
  • Grabber V4L → Crop Bottom (обрезка кадра снизу)
  • Grabber V4L → три последних пункта (порог включения каналов по цветам)


External (Внешние настройки)

  • External → Kodi Checker (Настройки для плеера Kodi, в случае если он используется как плеер. Отмеченные чекбоксы будут отключать работу подсветки при выполнении указанных функций плеера. Можно настроить так, что подсветка будет работать только при воспроизведении контента, и отключаться во всех остальных случаях)
  • External → Json/Proto/Boblight Server (Настройки портов серверов, оставить как на скрине)
  • External → Booteffect / Static color (Настройки демо-эффектов при старте демона)
  • External → Json/Proto Forvard (Настройки портов вывода, оставить как на скрине)


SSH (Настройки соединения ПК с Raspberry Pi)

  • SSH — Connection → System (Выбор ОС, установленной на Raspberry Pi)
  • SSH — Connection → Target IP (IP адрес Raspberry Pi)
  • SSH — Connection → Port (как на скрине — (22))
  • SSH — Connection → Username/password (имя — пароль, заданные на Raspberry Pi)
  • SSH — Connection → Connect/Disconnect (кнопка соединения-разъединения с Raspberry Pi)
  • SSH — Connection → Show Traffic (Кнопка вызова консоли с выводом информации)
  • SSH — Manage Hyperion from HyperCon → Inst/Upd. Hyperion (Кнопка установки демона на Raspberry Pi или обновление демона через сеть. Никаких sudo get-install, соединяемся с Raspberry Pi, тыркаем и ждем вывода в консоль HyperCon-а)
  • SSH — Manage Hyperion from HyperCon → Remove Hyperion (Кнопка деинсталляции демона)
  • SSH — Manage Hyperion from HyperCon → Start/Stop (Кнопки остановки-запуска демона)
  • SSH — Manage Hyperion from HyperCon → Get Log (Вывод в консоль логов демона, удобно для
  • поиска не стыковок и чтения кодов ошибок)
  • SSH — Send Hyperion Configuration → Local Config Path (Отправка файла конфигурации в указанное локальное место на ПК)
  • SSH — Send Hyperion Configuration → Send Config (Отправка файла конфигурации через SSH на Raspberry Pi)
  • SSH — Colorpicker (интуитивно понятный тестер палитры — можно проверить вывод всех цветов.
  • Кнопки под вкладками сохраняют-загружают настройки HyperCon-а (не сам файл конфигурации демона!)
  • HELP — понятно, а Create Hyperion Configuration позволяет локально сохранить сам файл конфига демона для Raspberry Pi — hyperion.config.json


Как видно из приведенного списка — возможностей по настройке достаточно много, и это делает инструмент очень гибким для любых хотелок и задач.

Как пример, моя конфигурация по вкладкам:

image

image

В первой вкладке располагаем зоны так, как будут физически расположены пиксели подсветки на задней стенке ТВ. Можно выполнить заполнение всего периметра или его части, задать направление, начало и т д. Тип ленты, который я использовал — WS2812B, поэтому на скриншоте соответствующее поле выбрано как WS281x. Количество пикселей у меня определила плотность светодиодов на имеющейся в распоряжении ленты и диагональ экрана. Остальные вкладки согласно описанию выше, а в самой последней выбираем нашу ОС на Raspberry Pi, настраиваем связь через SSH и устанавливаем демон Hyperion на одноплатник. Затем сохраняем конфиг HyperCon, создаем новый файл конфигурации Hyperion, отправляем созданный конфиг на Raspberry Pi, стартуем и пробуем в ColorPicker проверить соответствие цветов палитре. Если все совпадает, любой воспроизводимый плеером Kodi контент будет управлять фоновой подсветкой. Сигнальный вывод GPIO — 18 (физический пин гребенки — 12).

Подробно про все соединения будет рассказано ниже, после описания всех программных настроек.
Автозапуск я никак не настраивал, демон запускается одновременно с началом работы плеера. Однако было так, что подсветка все равно не включалась. Тогда пробуем проверить, прописался ли автозапуск демона в »/storage/.config/ autostart.sh» и пробуем переустановить демон, чтобы снова отправить на Raspberry Pi его конфиг. Сам конфиг программа отправляет в директорию

Raspberry Pi –
»/storage/.config/ hyperion.config.json».
Проверить работу демона можно так же, отправляя цвет на вкладке SSH HyperCon, поставив галочку «Autoupdate» и нажав кнопки стоп-старт для его перезапуска.
Если демон не стартует после перезагрузки Raspberry Pi, пробуем изменить автостарт в файле

/storage/.config/autostart.sh
//---------------------------------------------------------------------------------------------------------------
#!/bin/sh
sleep 5
/storage/hyperion/bin/hyperiond.sh /storage/.config/hyperion.config.json > /storage/logfiles/hyperion.log 2>&1
//---------------------------------------------------------------------------------------------------------------


тем самым дав задержку перед выполнением запуска демона.

Дистанционное управление любым ИК пультом


Так как кроме подсветки приставка будет полноценным медиацентром — к ней необходимо прикрутить и настроить пульт ДУ. Если ваш ТВ поддерживает технологию CEC (Consumer Electronics Control, т.е протокол управления через HDMI, в Kodi можно настроить и использовать уже имеющийся с ТВ пульт ДУ для управления медиа-приставкой. Так как все производители называют этот протокол в своих ТВ по-разному, (например, LG — SimpLink, Samsung -Anynet, Sony — BRAVIA Sync), поищите в настройках своего ТВ поддержку этой функции. У меня не очень удачный пульт ДУ на ТВ, поэтому я пошел другим путем — взял тот, что был со старой TV-приставкой на андроиде (пока с Китая идут другие заказанные пульты для этого проекта):

image

На гребенке Raspberry понадобятся пины +5V, земля и сигнальный на GPIO23 (физический пин — 16), поскольку GPIO18 (физический пин — 12), который настроен для IR девайсов по умолчанию — уже занят выводом пакетов на подсветку.

Процесс:

Для подключения драйвера ИК-приемника редактируем файл /flash/config.txt, в самый конец которого пишем строку (здесь и далее без кавычек):
«dtoverlay=gpio-ir, gpio_pin=23»

Подключив ИК-приемник к малине, необходимо получить скан-коды нужных нам кнопок пульта ДУ и привязать к ним команды. После определения в консоли командой «ir-keytable» типа протокола, привязываем скан-коды к командам, полученным в консоли с помощью
«irrecord -l | grep ^KEY», вручную делаем сопоставления и создаем таблицу такого вида:
table ireltex, type: NEC

0x8f64d KEY_0
0x8f642 KEY_1
0x8f641 KEY_2
0x8f640 KEY_3
0x8f646 KEY_4


И так — все нужные нам кнопки и команды. У меня вышло 34 строки соответствий. Первой строкой –название таблицы и протокол ДУ. Следующие строки — слева скан-код кнопки. Справа, через пробел — выполняемая Kodi команда управления. И так далее, по порядку.

Таблицу необходимо сохранить. Для этого создается файл, (я его обозвал ireltex), из которого будут читаться эти привязки. Файл нужно разместить в папке »/storage/.config/rc_keymaps/ireltex», затем создаем файл
»/storage/.config/rc_maps.cfg», в нем записываем строку:
»* * ireltex» (есс-но все без кавычек).

Через консоль Putty загружаем полученную таблицу в драйвер:
«ir-keytable -c -w /storage/.config/rc_keymaps/ireltex», перезагружаем Raspberry Pi и изменяем последнюю строчку в файле
»/flash/config.txt»
Теперь она выглядит так:
«dtoverlay=gpio-ir, gpio_pin=23, rc-map-name=ireltex»
В файл
»/storage/.config/autostart.sh» нужно добавить автозагрузку протокола пульта, так чтобы запись выглядела так (для моего пульта ДУ и его протокола):

#!/bin/sh
(
sleep 5
ir-keytable -p nec
)&
sleep 5
/storage/hyperion/bin/hyperiond.sh /storage/.config/hyperion.config.json > /storage/logfiles/hyperion.log 2>&1 &


Снова перезагружаю Raspberry Pi и теперь Kodi откликается на команды с пульта.
Более подробно весь процесс настройки с примерами в оригинале расписан здесь.

Можно так же набрать в поисковике запрос «LibreElec + ИК Пульт» и получить по данной теме несколько статей на русском.

Если повесить выход ИК приемника кроме GPIO 23 так же на вход GPIO3 — Raspberry Pi будет включаться по команде с пульта. Минус такого метода управления в том, что сигнал на включение будет приниматься любой и с любого ИК пульта, но других способов дистанционно включать малину я не нашел. Значит нужно сделать дополнительный детектор, принимающий одну команду и передающий только этот сигнал на вход GPIO3 Raspberry Pi.

Чтобы не было чудес с самопроизвольным хаотичным мерцанием пикселей, земля ленты кроме пина GND GPIO должна соединяться непосредственно с минусовой клеммой внешнего источника питания проводом соответствующего току сечения, а сигнальный провод D-IN иметь минимальную длину.

Необходимо помнить, что различные ИК приемники могут имеют разное напряжение питания (3,3 или 5V) и назначение выводов. Чтобы не вывести из строя приемник или порты Raspberry Pi, подключение нужно делать в соответствии с документацией на используемый приемник!
В итоге пока все соединения на выводах GPIO Raspberry Pi выглядят так:

image

Правильное включение Raspberry Pi с ИК пульта ДУ


Теперь нужно сделать именно «правильное» включение Raspberry Pi от назначенной кнопки на ИК пульте ДУ. Сейчас устройство загружается при поступлении любого сигнала на пин GPIO3 (пятый физический пин), а так как приемнику нет разницы, что принимать в этом ИК диапазоне, загрузка происходит от сигнала с любого пульта, иногда даже при включении освещения в комнате, что не есть удобно. Для решения этой проблемы между GPIO3 и сигнальным пином ИК приемника нужен посредник, который будет декодировать сигнал, и только при совпадении команды с заранее назначенной — включать Raspberry Pi. Кроме того, нужно иметь возможность использовать разные пульты или же кнопки одного пульта. Конечно, можно написать прошивку для какого-либо ATiny стоимостью пол доллара рублей и все будет прекрасно работать, но раз уж речь идет о повторяемом и простом конструкторе — гораздо проще использовать относительно недорогой и компактный контроллер — Arduino Nano. Плата будет постоянно работать в дежурном режиме, контролируя все входящие сигналы от любых ИК источников. И только при декодировании одного из определенных заранее сигналов — давать команду на включение Raspberry Pi. Контроллер так же обеспечит простую перепрошивку при необходимости смены пульта для Raspberry Pi.

Запитываться Arduino Nano будет не совсем стандартно — от пина +5V GPIO RPi — на пин +5V Arduino. Ничего страшного в таком включении нет — со стороны USB в плате Arduino будет вход внутреннего стабилизатора, со стороны пина Vin — катод диода Шоттки. Никакой нагрузки, кроме ИК приемника к выводам Arduino nano подключаться не будет.

Таблица соединений Arduino-Raspberry будет такой — Физический вывод Raspberri Pi 3 B+ / Физический вывод Arduino Nano
4 (+5v) / +5V
6 (GND) / GND
5 (GPIO3) / D8
Кроме того, ИК приемник подключится к пинам питания на плате Arduino — (GND, +5V или 3.3V), а вывод выходного сигнала — через резисторы номиналом 100R — к пину D7 Arduino и через 510R к пину 16(GPIO23) Raspberry Pi. Таким образом ИК приемник будет напрямую передавать все команды на вход GPIO23, а на GPIO3 будут появляться один или два коротких импульса только при получении заранее прописанных в скетче команд.

Схема подключения IR приемника, Arduino nano и адресной ленты к Raspberry Pi:

image

Верхний по схеме джампер »5V External» позволяет питаться Arduino и Raspberry от внешнего источника питания вместе с подсветкой от разъема XS1 «Power», если, например количество пикселей небольшое и не создает большой нагрузки. Нижним по схеме джампером можно выбрать напряжение питания ИК приемника — 3.3 или 5V. Устройство будет оформлено в виде внешнего, подключаемого к разъему GPIO шилда, в который подключена плата Arduino nano, ИК приемник и все разъемы.

Для проверки достаточно предварительно считать и внести в скетч коды любых кнопок, например «OK» или «ENTER», от любых пультов. Так же можно сделать массив команд, чтобы запускать приставку нажатием любой из определенной группы кнопок или какой либо последовательности нажатий. В скетче использована библиотека iarduino_IR-master, архив которой можно легко найти в интернет. В архиве библиотеки есть скетчи-примеры, используя один из них, например — receiver_GetProtokolAll, можно получить коды команд любых кнопок используемого пульта. В последующем эти коды нужно записать в заливаемый на Arduino Nano скетч:

//*******************************************************************************
#include   // Подключаем библиотеку для работы с ИК-приёмником
iarduino_IR_RX IR(7);  // Объявляем объект IR, с указанием вывода к которому подключён ИК-приёмник
const int Out_GPOI_3 = 8;  // Объявляем пин выхода на GPIO RPi
uint32_t Code_001 = 0xFF708F;  // RX code опрошенных ранее кнопок
uint32_t Code_002 = 0x106FA857;
void setup()
{
  pinMode(Out_GPOI_3, OUTPUT);
// Инициируем передачу данных в монитор на скорости 9600 бит/сек
 Serial.begin(9600);
  IR.begin(); // Инициируем работу с ИК-приёмником
}
void loop()
{
  if(IR.check()) // Если была принята команда от какого либо ДУ
   {      
      // Проверяем совпадение кодов на включение, дергаем вывод
      if(IR.data == Code_001 or IR.data == Code_002)
        {
          digitalWrite(Out_GPOI_3, HIGH);       // Передаем команду на RPi
          delay(5);
          digitalWrite(Out_GPOI_3, LOW);        // Возвращаем выход в исходное состояние
          delay(5);
          digitalWrite(Out_GPOI_3, HIGH);       // Передаем команду на RPi
          delay(5);
          digitalWrite(Out_GPOI_3, LOW);        // Возвращаем выход в исходное состояние
          delay(5);
        }
   }
}
//*******************************************************************************


Поскольку библиотека iarduino_IR-master использует тот же таймер, что и некоторые стандартные «wiring» функции среды Arduino — в этом скетче нельзя использовать micros (), millis (), tone () и возможно некоторые другие, иначе попытка компиляции приведет к невнятной ошибке. Несмотря на такой подход авторов к написанию кода — свои функции библиотека исправно выполняет и четко определяет ИК посылки, их тайминги, структуру и используемые протоколы, а возможность быстро считать коды команд любого пульта сводят его настройку к простой замене переменных в скетче.

Вся надстройка была оформлена в виде шилда, для которого были нарисованы и заказаны в Китае такие заводские доски:

image

В этот шилд подключается плата ардуино nano, разъем одного общего блока питания 5В, разъем на подсветку телевизора, а сам шилд включается в гребенку GPIO Raspberry Pi. После монтажа всех комплектующих выглядит это так:

image

image

Планировал оформить угловую акриловую полупрозрачную крышку на предусмотренных для крепления стоек отверстиях –, но руки как-то не дошли, да и под ТВ приставку все равно не видно…

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

Сначала про мифы.

«WS2812 не годится для адаптивной подсветки, надо использовать SK9822 или вовсе APA102»

Обосновывают это тем, что частота передачи данных у аналогов APA102 значительно выше ввиду наличия тактовой линии, да и сами светодиоды имеют более широкую цветовую гамму и более надежны.

Все это верно, но, если мы поделим рабочую частоту WS2812B на количество пикселей и на 32 бита информации для каждого из них — получим частоту обновления почти 300Гц для моих 91 светодиода. Это в разы превышает необходимый порог. А все «мерцания» и «неработающие» случаи — 146% следствие кривой разводки земли и сигнального провода.

По цветовой гамме аналогично — Hyperion формирует 8-ми битные посылки для каждого цвета в каждом пикселе. Это в любом случае только 256 градаций яркости каждого из трех цветов на любой ленте. Разница в цветах будет заметна только в калькуляторе на экране хорошего монитора, но разницу в реальном свечении на ± одну или даже несколько градаций наши глаза в любом случае не увидят — это анатомия нашего зрения и ничего с ней не поделать. Ко всему, в конфигураторе есть средства для корректировки цветовой гаммы — при желании можно добиться практически идеального белого цвета при близкой к максимальной яркости. Но даже этих телодвижений скорее всего не потребуется — фоновая подсветка всего лишь создает фон на стене за ТВ, а не картинку на экране… При анализе зон захвата — и Hyperion, и Philips берут не одну конкретную точку, а усредненный цвет всей заданной зоны, поэтому оттенки всегда будут чем то отличаться от тех, что в динамике воспроизводятся на краях экрана. Учитывая все это — стрелять из пушки по воробьям никакого смысла нет, что собственно подтверждает конструкция подсветки в оригинальных телевизорах Phillips, где на диагональ 50» выведено всего 37 точек, а ширина зон составляет 5–6 см.

Еще один миф — «WS2812B недолговечны, через месяц начали выходить из строя пиксели».

Естественно, начнут. Причем на любой ленте. Каждый цвет в каждом светодиоде 2812B на полной яркости потребляет 18–20 мА. К примеру, у меня 91 светодиод. 91×3Х20=5,5А. КПД около 30–40%, а это значит, что больше трех ампер уходит в тепло. Единственный эффективный путь отвода тепла от подложек кристаллов — медные дорожки ленты, которая приклеена к какой-то поверхности. Подключенная к питанию, но несветящаяся лента так же заметно теплая — сами чипы в статике имеют какое-то потребление тока. Задняя пластиковая крышка ТВ — не самый лучший теплоотвод для длительной эксплуатации ленты, поэтому лучше и правильнее использовать специальный металлический профиль. К тому же он бывает в комплекте с рассеивателем, различной глубины, ширины и формы. Вы не будете видеть отражений в виде цветных точек на глянцевых поверхностях интерьера комнаты, что тоже иногда важно.

image

<

© Habrahabr.ru