Эмбилайт для телевизора своими руками через ардуино

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

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

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

DIY / Ambilight подсветка монитора или телевизора своими руками за 10$ и 15минут


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

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

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

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

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

Светодиодная лента 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), шестнадцатеричное значение каждого из основных цветов, а также задается каждый диод в следующем формате:

[light] name right1 #имя, может быть любым, необходимо для удобства чтения конфигурационного файла color red arduino 1 #номер канала, этот канал будет первым в очереди на отправку данных на контроллер color green arduino 2 color blue arduino 3 hscan 80 100 #горизонтальный диапазон сканирования изображения (в процентах), в данном случае для всех диодов по правую сторону экрана значение будет одинаковым, т.к. таким образом задается глубина сканирования. vscan 97 100#вертикальный диапазон сканирования, для диодов справа и слева будет соответствовать участку изображения, откуда берется информация о цвете для данного диода. Т.е. берем за 100 процентов количество диодов по вертикали и делим экран на равные части. Следующий по порядку диод будет, соответственно 94 97.

Еще по теме:  Как установить zala на телевизор Samsung приложение Смарт

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

Скрипт для генерации конфигурационного файла для boblightd

#!/bin/bash # A shell script to make boblight.conf file # Written by: TPertenava, based on default boblight.conf example # Last updated on: 22.10.2013 #set vars # -v vertical LED count # -h horizontal LED count # -d deepness of color detection (in percent) usage() < echo «Usage: $0 [-v <1|100>] [-h <1|100>] [-d <0|100>]» 1> exit 1; > HOR= VER= DEEPNESS= while getopts «v:h:d:» OPTION; do case $ in h) HOR=$ ;; v) VER=$OPTARG ;; d) DEEPNESS=$OPTARG ;; esac #echo «s= $» #$ = $ done if [ -z «$» ] || [ -z «$» ] || [ -z «$» ]; then usage fi echo «#Leds in vertical = $VER» echo «#Leds in horizontal = $HOR» function output < # $1 location # $2 hscan low # $3 hscan high exit > cat

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

# ./boblight_config_generator -h 45 -v 28 -d 20 > /etc/boblight.conf # boblightd -f

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

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

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

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

$ boblight-constant FFFFFF

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

Arduino

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

Скетч для Arduino

// boblightd receiver for WS_2811, boblightd device type=momo, prefix 55 AA // capable at least for 20Hz input stream if LED count (leds, NUM_LEDS); > byte values[NUM_LEDS][3]; // 2-level array, 1 level is for led number, 2 level is for rgb values void WaitForPrefix() < uint8_t first = 0, second = 0; while (second != 0x55 || first != 0xAA) < while (!Serial.available()); second = first; first = Serial.read(); >> void loop() < WaitForPrefix(); for (byte Led = 0; Led> memset(leds, 0, NUM_LEDS * sizeof(struct CRGB)); //filling Led array by zeroes for (byte Led = 0; Led < NUM_LEDS; Led++) < byte red = values[Led][0]; byte green = values[Led][1]; byte blue = values[Led][2]; leds[Led] = CRGB(blue, red, green); >LEDS.show(); >

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

Питание

Самый главный вопрос — электропитание. Arduino в моем случае получает питание по USB, а сама лента — от отдельного блока питания. Для уравнивания потенциалов земли Arduino и источника питания соединены. Правда, через восьмиметровый телефонный провод сопротивлением в пару Ом. Номинальная мощность ленты, указанная на упаковке, 18Вт/м, или 0,3Вт/диод.

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

Лента

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

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

Монтаж

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

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

Еще по теме:  Как настроить пульт movix pro на телевизор

Источник: habr.com

Клон Ambilight на связке Raspberry Pi3, Arduino и ленте WS2812B

К написанию данного опуса меня сподвигло не сколько желание похвастаться красивостью, сколько описать новый гайд для желающих повторить данную конструкцию без «фигурных танцев по граблям».

Проблемма заключается в том, что все существующие гайды и мануалы датируются в лучшем случае 2014-м годом и, в связи с шагнувшими вперед технологиями и переделанными интерфейсами основных програмных продуктов, неприменимы. Пытаемся, к примеру настроить Kodi (libreelec, OpenElec).

Вбиваем в Putty sudo ap-get. а оболочка отбивает ответ в формате «не, ну вы ж тут под рутом уже и так зашли, такшо давайте без этих формальностей. Фыркаешь, забиваешь уже напрямую apt-get install. И шо? Говорят „не, ну то вы под дебианом/убунтой так можете, а тут у нас своя атмосфера“. Пытаешься достать шо-либо с репозитория через wget — N wget — ругается, говорит „параметра такого не знаю“.

Повторяешь команду с длиннющей ссылкой на github — а ответ 404. Переместили, или вообще проект накрылся. Не, ну не свинство?
Итак:
вводные задачи:
Делаем Медиаприставку/медиасервер на Raspberry Pi3 под управлением системы (оболочки, операционки) на базе Kodi ( я использовалOpenElec 8.0.4, а самые свежие гайды — говорили, шо работают с версией 4.0 и конфликтуют с 5.0). Захват экрана выполняет демон (програмная надстройка) Hyperion (с Boblight не сложилось вообще) и отдается управление на ленту WS2812B.

За основу был взят мануал от Christian Moser, опубликованный на techtalk под названием »How to build your own Ambilight TV with Raspberry Pi and XBMC» и датируемыйFebruary 20, 2014 (почти 5 лет назад, шо в условиях современных реалий — ОЧЕНЬ много).

Продолжаем.
Список необходимостей недурственно описан в гайде вверху, только с небольшими изменениями. Блок питания на 5-7ампер только для ленты в принципе неплохо иметь, но чересчур. Для ленты, которую я применил ( Ссылка на Али Куплена за кровные свои, 5метровый рулон без защиты ) с плотностью 60 модулей/метр (при 30 на метр — неравномерная засветка, а 144/метр меня бы разорила и по БП и по деньгам) — потребление тока при 5,15В питающего и 172 штуках светодиодов в итоге на старый Samsung LE37A656 составило чуть более 2А при полной яркости белого свечения

Камера в телефоне слегка краснит

Собственно потребление 172 штук модулей на максимальной яркости в режиме белого света

при красном свечении только по бокам

Потребление 0,6А

Сборка/приклейка/пайка — осталась за кадром.
Фотки готового решения с неудобных ракурсов:

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

За скобками данного опуса оставлю страдания с неработающими устаревшими решениями. Методы с переназначением 12-го пина (GPIO18) с режима SPI в режим PWM с отключением аудиовыхода — не работает по причине изменений в оболочках.
Предполагается, что человек, который будет это повторять — априори не пугается Ардуино и паяльника. Также предполагается, что Raspberry уже сконфигурирована в качестве медиаплеера и подключена по HDMI к телевизору.
Перехожу к собственно методу решения загвоздок с адаптивной подсветкой.

Берем Ардуино Нано. У меня вот такая Куплена тоже за свои для другого проекта, но пришлось пересаддить сюда. (мануалы говорят, что лучше Мега/Уно, но практика показала, что 172 модуля для Нано по зубам). Ардуино Про не пойдет — нам нужен USB вход для связи между Hyperion и Arduino, которая, в свою очередь, управляет лентой из WS2812.

Скетч, который заливаем в Ардуину имеет вид:

#include «FastLED.h» // How many leds in your strip? #define NUM_LEDS 172 // For led chips like Neopixels, which have a data line, ground, and power, you just // need to define DATA_PIN. For led chipsets that are SPI based (four wires — data, clock, // ground, and power), like the LPD8806 define both DATA_PIN and CLOCK_PIN #define DATA_PIN 2 //#define CLOCK_PIN 13 #define COLOR_ORDER BRG // Adalight sends a «Magic Word» (defined in /etc/boblight.conf) before sending the pixel data uint8_t prefix[] = , hi, lo, chk, i; // Baudrate, higher rate allows faster refresh rate and more LEDs (defined in /etc/boblight.conf) #define serialRate 500000 // Define the array of leds CRGB leds[NUM_LEDS]; void setup() < // Uncomment/edit one of the following lines for your leds arrangement. // FastLED.addLeds(leds, NUM_LEDS); // FastLED.addLeds(leds, NUM_LEDS); // FastLED.addLeds(leds, NUM_LEDS); // FastLED.addLeds(leds, NUM_LEDS); // FastLED.addLeds(leds, NUM_LEDS); FastLED.addLeds(leds, NUM_LEDS); // FastLED.addLeds(leds, NUM_LEDS); // FastLED.addLeds(leds, NUM_LEDS); // FastLED.addLeds(leds, NUM_LEDS); // FastLED.addLeds(leds, NUM_LEDS); // FastLED.addLeds(leds, NUM_LEDS); // FastLED.addLeds(leds, NUM_LEDS); // FastLED.addLeds(leds, NUM_LEDS); // FastLED.addLeds(leds, NUM_LEDS); // FastLED.addLeds(leds, NUM_LEDS); // FastLED.addLeds(leds, NUM_LEDS); // FastLED.addLeds(leds, NUM_LEDS); // initial RGB flash LEDS.showColor(CRGB(255, 0, 0)); delay(500); LEDS.showColor(CRGB(0, 255, 0)); delay(500); LEDS.showColor(CRGB(0, 0, 255)); delay(500); LEDS.showColor(CRGB(0, 0, 0)); Serial.begin(serialRate); Serial.print(«Adan»); // Send «Magic Word» string to host > void loop() < // wait for first byte of Magic Word for(i = 0; i < sizeof prefix; ++i) < waitLoop: while (!Serial.available()) ;; // Check next byte in Magic Word if(prefix[i] == Serial.read()) continue; // otherwise, start over i = 0; goto waitLoop; >// Hi, Lo, Checksum while (!Serial.available()) ;; hi=Serial.read(); while (!Serial.available()) ;; lo=Serial.read(); while (!Serial.available()) ;; chk=Serial.read(); // if checksum does not match go back to wait if (chk != (hi ^ lo ^ 0x55)) < i=0; goto waitLoop; >memset(leds, 0, NUM_LEDS * sizeof(struct CRGB)); // read the transmission data and set LED values for (uint8_t i = 0; i < NUM_LEDS; i++) < byte r, g, b; while(!Serial.available()); r = Serial.read(); while(!Serial.available()); g = Serial.read(); while(!Serial.available()); b = Serial.read(); leds[i].r = r; leds[i].g = g; leds[i].b = b; >// shows new values FastLED.show(); >

Еще по теме:  Как подключить psp vita к телевизору

Для корректной работы необходимо иметь установленную библиотеку FastLED.
В строке #define NUM_LEDS — указываем итоговое количество светодиодов в проекте
Строка #define DATA_PIN — указывает к какому цифровому выходу платы будет подключен первый модуль.
#define serialRate 500000 — важный момент колдунства. Очень важный. Случайно обнаружен на немецком форуме. Только после обьявления данной скорости все завертелось!
В секции
void setup() // Uncomment/edit one of the following lines for your leds arrangement.
// FastLED.addLeds(leds, NUM_LEDS);
снимаем комментарий (два прямых слэша) с строки, соответствующей применяемым модулям.
Компилируем, заливаем. При запуске ардуинки или после перезагрузки — вся лента приветственно переливается цветами. Запоминаем порядок следования цветов ( Видео запуска —

после перебора цветов Ардуиной идет запуск Гипериона и его приветственная радуга). Мы на половине пути к счастью!
Подключаем Ардуинку подходящим кабелем к свободному порту Малины.
Включаем все компоненты
Далее скачиваем на компьютер HyperCon.jar и запускаем его.

На экране появится окно конфигурации нашей адаптивной подсветки. Наступает второй этап сильного колдунства.

Итак:
Строка Configuration name — указываем приятное нам имя, на работоспособность не влияет никак.
Строка Type — в выпадающем меню выбираем Adalight. Данная строка указывает, что наша конструкция управляется внешним устройством с библиотекой Adafruit, которую мы залили в Ардуинку.
Строка Output (этап очень мощного колдунства) — выбираем /dev/ttyUSB0 Конкретно ваш случай может отдичаться от данного перимера — поэтому подсмотрите через консоль Putty командами lsusb и ls /dev где у вас присутствует Ардуина. Некоторые (как у меня — дают ответ типа «СН430. » — имя контроллера порта)
Строка Baudrate — вбиваем 500 000 (чтобы Гиперион и Ардуина общались на одной скорости). Скорости, отличные от 500 000 — НЕ РАБОТАЮТ.
Строка RGB byte order — GRB (порядок адресации цветов в модулях 2812В и подсмотренные при запуске скетча на ардуине)

Дальнейшие действия — обьявление количества светодиодов и их конфигурация на плоскости, нулевой (начальный) светодиод, глубина захвата, создание файла конфигурации, установка Hyperion через SSH и отправка конфигурационного .json-файла не отличаются от всех известных мне гайдов в Сети.

После перезапуска Гипериона (команды в вкладке SSH — сначала Stop потом Start) — лента должна ожить сначала скетчем ( сначала перебор 3х основных цветов, потом инициализируется Hyperion и выдает вращающуюся радугу).

Коротенькое видео работы данного решения:


Планирую купить +48 Добавить в избранное Обзор понравился +67 +117

  • Xnbada,
  • Xnbada WS2812,
  • Светодиодные ленты
  • 02 февраля 2019, 22:33
  • автор: violet_Cat
  • просмотры: 23299

Источник: mysku.club

DIY | Ambilight Using Arduino Nano

license

RGBFreak

By RGBFreak RGBFreak’s YouTube Channel Follow

More by the author:

DIY Fidget Spinner Accelerator for UNDER https://content.instructables.com/FTD/ZNAX/J7UQYRQM/FTDZNAXJ7UQYRQM.jpg?auto=webpframe=1wires

Now connect the LED strip to the Arduino using the same schematic as shown in step 1. Plug in the USB cable, install the FastLED library and upload the code provided in this step into your Arduino.

You may also connect the power adapter now since we’re done wiring.

Attachments

Add Tip Ask Question Comment Download

Step 5: Configuring the Software

Download the Bambilight files (link in the introduction).

Open up the .ino file and edit the following lines to fit your situation:

#define NUM_LEDS 38
#define BRIGHTNESS 100

Now upload the file to your Arduino.

Open up Bambilight.exe located in «[Location you saved the Bambilight folder]Bambilight-masterBambilight-masterBinary».

Now configure it to your likings and test it using a test video like this one.

Once you’re satisfied with the result you can minimize the Bambilight program.

Add Tip Ask Question Comment Download

Step 6: Sit Back, Relax and Enjoy!

And. you’re done! Now all that’s left is to grab some popcorn and some soda and enjoy your favorite movies!

Add Tip Ask Question Comment Download

4 People Made This Project!

  • DIY | Ambilight Using Arduino Nano

DIY | Ambilight Using Arduino Nano

DIY | Ambilight Using Arduino Nano

DIY | Ambilight Using Arduino Nano

Did you make this project? Share it with us!

Recommendations

Retro Battery Powered Bluetooth Speaker

Retro Battery Powered Bluetooth Speaker by exposedwire in Electronics

Creating a Stylish Triangular Pixels LED Clock Using WS2812 Leds and Wemos D1 Mini Module

Recycled Spool Smart Lamp - With Sound Reactivity, MQTT, Hue  Alexa by DIY Machines in LEDs</p><p><img decoding=Battery-Powered Contest

Battery-Powered Contest

Big and Small Contest

Big and Small Contest

3D Printing Student Design Challenge

3D Printing Student Design Challenge

83 Comments

miro123456

Question 2 years ago on Step 4

Answer Upvote

I want to ask, I builded all by instructions, I have board chines Arduino nano, LED strip WS2812B, no power adapter only on USB, I installed FastLed library last version 3.3.3
com port baud rate 115200, DATA_PIN is 3, NUM_LEDS is 30, my laptop is Windows 10 Home, com port settings are 115200,8,none,1,none
my test working, I see multiple colors waving through the LED strip
but when I checked LED output in bambilight program all leds goes off, and nothing happens.
I’ve noticed that RX LED on board doesn’t blinking at this time, it’s blinking only when I check Test-Overlay, it’s all right?
Can someone help?

ThePureblood

ThePureblood miro123456

Answer 4 months ago

Reply Upvote

Same situation. Can you manage to find any solution?

Источник: www.instructables.com

Оцените статью
Добавить комментарий