Амбилайт от легкого к сложному

Без сомнения в сети много статей про подсветку мониторов и телевизоров по технологии аналогичной Филлипсовской Амбилайт, но тут я решил собрать методы, как сделать такую подсветку от самого простого — 4 лампочки, закрепленной сзади дисплея, до сложного — 140 светодиодных ламп.

.

И так начнем с легкой версии:

Супер мега дешевую и простую ambilight подсветку для PC можно сабрать так.

В роли дирижера будет выступать микроконтроллер ATtiny44, а в роли оркестра 4 RGB-светодиода.

Несколько картинок, дабы пробудить интерес:

bfd2efa744b5b39fdb7f16acb8898012
d151dfe1c90fd1afd584228c69cde1b9Писатель из меня не очень, так что перейдем сразу к делу:

Список деталей

Компонент Корпус/Размер Количество
ATTINY44-20SSU SOIC 1
74HC595 SOIC 2
RGB LED SMD 5x5mm 4
Resistor 10k 0805 1
Resistor 1.5k 0805 1
Resistor 100R 0805 12
Resistor 68R 0805 2
Resistor 0R 1206 1
Cap tantalum 4.7uF 1206 1
Cap ceramic 20pF 0805 2
Quartz 12Mhz HC-49/US 1
Zener diode 3.6V MiniMELF (1206) 2
MiniUSB Type B (SMD) 1
PLS-40S DIP 1
Шлейф ~0.3 m 5 проводов
Стеклотекстолит ~160×80 mm 1
Двусторонний скотч толстый 1

Итого: не более 20 AZN.

К ноутбуку девайс приклеен на двусторонний скотч:

Возможно не айс, но меня полностью устраивает, держит мертво, usb можно подключать, отключать не придерживая плату. Если отклеить, останутся разводы, которые легко шлифуются наждачкой стираются влажными салфетками. Вообще они мне не мешают, размеры плат позволяют не парится по этому поводу.

35feac7259b679396fffa27b26756fa0 261236fe43d9e74a576b71dd205ffefe

Микроконтроллер подключен к эвм по USB. Фундамент проекта — библиотека V-USB от obdev. Первое, что было проверено, испытано и сразу заработало — v-usb/examples/hid-data. HID работает везде, драйверы стандартны, работать с данным классом USB устройств очень просто. Тем более, что всю работу за нас уже сделали, в примере hid-data можно найти файлы hiddata.c и hiddata.h. В них реализован стандартный интерфейс для работы с USB HID для windows (win api) и unix (libusb).

Софт захватывает 4 области экрана, преобразует в 4 точки и отправляет в девайс, разбив на цветовые составляющие Red, Green, Blue. Все в рамках С++, Qt и USB HID.

4f82f57d2f2a1a11ace509ea5d5c09b5

Делаем плату AmbilightUSB.lay (текущая версия hw v2.1), запаиваем.
Прошиваем фьюзы:
avrdude -pt44 -cusbasp -u -Ulfuse:w:0xee:m -Uhfuse:w:0xdf:m -Uefuse:w:0xff:m

И заливаем прошивку AmbilightUSB_v2.8.hex
avrdude -pt44 -cusbasp -u -Uflash:w:AmbilightUSB_v2.8.hex:a

Подключаем кабелем USB A to miniUSB B:

Отлично железо готово!

Установка, настройка софта

Если пользуемся Win32 (Windows XP), то складываем в одной папке библиотеки Qt, gcc, mingw (скачать) и последнюю версию софта (AmbilightUSB_v2.7.7.exe). Запускаем и радуемся (=

Для Ubuntu x86_64:
1) Качаем AmbilightUSB_v2.7.7
2) Проверяем/ставим Qt4: $ sudo apt-get install libqt4-gui
3) Запускаем: ./AmbilightUSB_v2.7.7

Последние версии доступны в downloads.

Приложение сразу после запуска сворачивается в трей:

Double-клик на иконке в области уведомлений переключает состояние on/off.

Тестировал в Ubuntu 10.04 (x86_64) и в Windows XP (x86):

e9052a9f61b41955a2788946d02eae80

Ширина и высота захватываемых областей очень просто настраивается, можно подогнать под разрешение фильма. Кстати сразу отвечу на вопрос «Почему сверху нет светодиодов?», все фильмы в основном широкоформатные и в верхней части экрана темно, так что я подумал, что в этом нет необходимости. Правда если очень хочется, то можно сравнительно легко добавить сдвиговых регистров и светодиодов. С железом все просто, а вот прошивку и софт придется допиливать =)

0ef40a862ff996e5e1f321286dc8e26f

Сборка из исходников (Qt4, gcc)

0) Проверяем/ставим Qt4
    $ sudo apt-get install libqt4-dev
    $ sudo apt-get install libqt4-gui
1) Качаем исходники с github:
Последняя версия из репозитария: tar.gz или zip
Либо все дерево проекта: $ git clone git@github.com:brunql/AmbilightUSB.git
2) Распаковываем архив tar.gz или zip:
    tar xzvf brunql-AmbilightUSB-v*.tar.gz
    unzip brunql-AmbilightUSB-v*.zip
3) Сборка:
    $ cd {path/to/AmbilightUSB}/Software/
    $ ./update_locales.sh
    $ qmake AmbilightUSB.pro
    $ make
4) Запуск!
   $ ./build/AmbilightUSB

Логи пишутся в следующие файлы:
    Linux: ${HOME}/.AmbilightUSB.log
    Windows: C:\Documents and Settings\UserName\.AmbilightUSB.log

Настройки сохраняются здесь:
    Linux: ${HOME}/.config/brunql.dev/AmbilightUSB.ini
    Windows: C:\Documents and Settings\UserName\Application Data\brunql.dev\AmbilightUSB.ini

Чтобы сбросить настройки в default достаточно просто удалить файл AmbilightUSB.ini.

Интерфейс: English, Russian

Исходники на GitHub, всякое разное в downloads.

видео в работе:

.

.

И сложная версия: ambilight из LED ленты WS2812, arduino

Ambilight — разработанная Philips технология боковой подсветки пространства за телеящиком, которая, по мнению создателей, помогает зрителю еще больше погружаться в происходящее на экране. В сети можно найти довольно много упоминаний о DIY Ambilight-like проектах, известны также коммерческие реализации подобного функционала в продуктах сторонних производителей / opensource-проектах, например, Lightpack.

Около года назад я практически случайно приобрел LED ленту на базе управляемых RGB диодов WS2812, рассчитывая задействовать её в каком-нибудь Arduino-проекте. Нехватка времени и противоречивая информация о возможности совместной работы с AVR контроллерами (сиречь Arduino) привела к тому, что реализация отодвинулась почти на год. Каково же было мое удивление, когда весь мини-проект по созданию Ambilight и организации его совместной работы с XBMC занял всего два вечера, т.е. 5-6 часов, включая поиск рабочего решения, написание скетча для arduino и конфигурационного скрипта к boblight, отладку их совместной работы, резку, пайку и монтаж ленты, а также прокладку 8м кабеля от arduino к телевизору.
Цель данного топика — поделиться с сообществом опытом и удивлением по поводу того, насколько все было просто, и задать направление желающим повторить это у себя дома. Мне кажется, что при наличии необходимых компонентов, повторение моего опыта «на столе» займет не более получаса.

Пластиковый контейнер от киндер-сюрприза, использованный в качестве корпуса для LED контроллера, красиво светится в темноте:

Что у меня было

  1. Домашний медиасервер/NAS на базе Intel Celeron G1610 с установленным Ubuntu Server 13.10
  2. Готовая arduino-совместимая плата, купленная на ebay
  3. 4 метра вот такой RGB LED ленты (для 32″ экрана потребовалось менее трех метров, около 140 диодов из 240)
  4. Около 8 метров симметричного четырехжильного телефонного кабеля (таким, например, подключается ADSL-модем к сплиттеру), т.е. не «витая пара»

Итого затрат чуть более 2000 рублей, из которых 1800 руб. — LED лента с доставкой и 250 рублей за Arduino (провода и коробочка из-под киндер-сюрприза были найдены в закромах).

Как это работает

Светодиодная лента WS2812

Каждый метр ленты состоит из 60 SMD светодиодов типоразмера 5050 WS2812 со встроенным в каждый диод трехканальным ШИМ-контроллером. Отличие WS2812 от WS2811, с которыми их иногда путают, заключается собственно в наличии светодиодов (WS2811 — отдельная микросхема контроллера, WS2812 — светодиоды со встроенным контроллером). Не углубляясь в подробности, опишу в двух словах протокол управления диодами:
На ленте всего три шины: земля, питание и управление. С первыми двумя все очевидно из названия (требуется стабилизированный источник напряжения +5V), а управление работает так:
В течение первых 50 ms происходит инициализация ленты путем заземления управляющей шины. После этого контроллером отправляется пачка из пакетов по 24 бита (8 бит на каждый цветовой канал), содержащих информацию о яркости, каждый пакет предназначается для одного диода. Данные в пачке ничем не разделяются, т.е. каждый следующий пакет идет непосредственно за предыдущим. Получив всю пачку (длина пачки равна 24 бита x количество диодов в ленте), контроллер первого диода «откусывает» от нее свой пакет, использует информацию по назначению, а остальную пачку ретранслирует вперед. Таким образом, до последнего диода доходит пачка из одного 24-битного пакета.
Мне повезло: на глаза попалась библиотека для Arduino FastSPI_LED2, авторам которой удалось не только реализовать этот протокол, но и оставить нетронутым некоторое количество ресурсов контроллера. Общая логика её работы такова: необходимо инициализировать ленту (задается тип контроллера, управляющий пин arduino, количество диодов и их максимальная яркость), задать массив из восьмибитных значений яркости каждого цвета для каждого диода и дать команду на отображение данных, после чего происходит посылка управляющей пачки на ленту, и диоды меняют свой цвет.

Boblight

Opensource-проект boblight, по заверению разработчиков, является набором инструментов для управления светодиодами, подключенных к внешнему контроллеру. Я выбрал его по причине поддержки USB serial интерфейса, незатейливости его реализации, и, главное, наличия нативного клиента для XBMC.
С точки зрения пользователя, т.е. нас с вами, все достаточно прозрачно. Есть демон boblight, который получает информацию о выводимом на экран изображении по TCP/IP (с учетом наличия официального плагина boblight для XBMC, разбираться в работе этого протокола нет необходимости).
При поступлении данных со стороны клиента, демон проводит анализ видео в соответствии со своей конфигурацией и посылает внешнему контроллеру информацию о том, что и как должно гореть, в понятном контроллеру виде. Я выбрал вариант, в котором данные побайтно передаются через USB serial порт. Как и в случае с лентой, посылка данных предваряется инициализационной последовательностью, затем подряд идут данные для всех диодов.
Необходимым условием для запуска boblightd является наличие конфигурационного файла, в котором задается устройство вывода (у меня /dev/ttyACM0), количество каналов (равное утроенному количеству диодов, по каналу на каждый цвет каждого диода), инициализационная последовательность (по умолчанию 0x55AA), шестнадцатеричное значение каждого из основных цветов, а также задается каждый диод в следующем формате:

Писать такое вручную было лень, поэтому я написал небольшой скрипт, который принимает в качестве аргументов количество диодов по вертикали и горизонтали и глубину сканирования в процентах, и выдает готовый конфигурационный файл для boblightd (внимание, для смены устройства вывода, скорости последовательного интерфейса или частоты обновления, необходимо отредактировать скрипт):

Синтаксис использования скрипта создания конфигурации (у меня 45 диодов по горизонтали и 28 по вертикали, глубина сканирования — 20 процентов, лента начинается из правого нижнего края экрана и наклеена против часовой стрелки):

Таким образом мы настроили boblightd и запустили его на исполнение в фоновом режиме (с ключом -f).

Подробное описание конфигурационного файла можно найти в официальном репозитории проекта boblight.

Официальный плагин для boblight ставится прямо из меню “дополнения” XBMC:

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

, лента загорится белым светом с максимально разрешенной контроллером яркостью. Я использовал эту программу для отладки взаимодействия boblightd и скетча Arduino, к которому мы сейчас перейдем.

Arduino

Как ни странно, этот этап тоже дался поразительно легко, благодаря вышеупомянутой библиотеке FastSPI_LED2. Скетч для Arduino прост до безобразия, он ждет начальной последовательности (0x55AA) с последовательного порта, дождавшись, инициализирует массив данных для LED, а затем запускает встроенную в библиотеку функцию вывода массива на ленту. Стоит отметить отдельно, что, строго говоря, WS2812 является не RGB, а BRG диодом, т.е. первой по порядку идет информация синего, затем красного и зеленого каналов.

Скетч для Arduino

Аппаратно-железячная часть

Питание

Самый главный вопрос — электропитание. Arduino в моем случае получает питание по USB, а сама лента — от отдельного блока питания. Для уравнивания потенциалов земли Arduino и источника питания соединены. Правда, через восьмиметровый телефонный провод сопротивлением в пару Ом. Номинальная мощность ленты, указанная на упаковке, 18Вт/м, или 0,3Вт/диод. Таким образом, номинальная мощность отрезка ленты из 140 диодов — 42Вт. В качестве источника питания ленты я использовал компактный импульсный БП от USB-хаба, 5В 3A, т.е. максимальная выдаваемая мощность БП равна 15Вт. В соответствии с этим расчетом была уменьшена максимальная яркость диодов (см. выше скетч Arduino). (Да, я знаю, что в datasheet на диоды указано напряжение питания 6..7В, по этому поводу ничего не могу сказать, работает хорошо на +5В, потребление линейки не измерял).

Лента

При ближайшем рассмотрении лента выглядит так:

Обратите внимание на направление стрелок, у каждого диода есть вход и выход!
Лента подключалась к контроллеру довольно длинным кабелем (~8м), здесь была доля риска, однако мои опасения не подтвердились — судя по всему, коэффициент битовых ошибок при передаче очень низок — иначе в отсутствии сигнала некоторые диоды время от времени «моргали» бы вместо того, чтобы быть выключенными. Впрочем, возможно, в других условиях, при наличии электромагнитных помех на частотах, близкой к несущей сигнала управления (ок. 800 кГц и гармоники), результат был бы иным.
Подозреваю, что неплохо бы было защитить выход Arduino ограничительным резистором для предотвращения последствий случайного замыкания информационного входа на плюс питания или от внешних наводок (например, от грозы) на длинный провод. Я этого делать не стал, т.к. мысль пришла позже, а паять внутри киндер-сюрприза было бы очень неудобно.

Монтаж

Монтаж благодаря клейкому основанию ленты также не составил труда:

Для уменьшения просадки по питанию, стыки ленты в поворотах я осуществлял довольно толстым проводом AWG26:

«Ну а сейчас будут слайды», или видео работы моего Ambilight

Напоследок, хочу привезти вам пример построения системы «амбилайт», со всеми исходниками, которая доступна в коммерческом варианте:

https://code.google.com/p/lightpack/
Спасибо за внимание!

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

wp-puzzle.com logo