Динамічний підсвічування для телевізора без комп'ютера. Динамічний підсвічування монітора на Arduino

Вступ

Якщо ви любите дивитися фільми на комп'ютері в темряві або грати в ігри, можна розширити можливості вашого монітора. Динамічний підсвічування візуально розширює межі екрану і завдяки йому ваші очі менше втомлюватимуться. Цей проект дуже простий, так як я сам новачок у спілкуванні з Arduino, можу порадити починати створювати щось для дому саме з цього проекту.

Отже, нам знадобиться:

  • Будь-яка Arduino (UNO, Nano не має значення).
  • Від 1-го до 2-х метрів світлодіодної стрічки WS2812B, про яку ви можете почитати, можна замовити на Aliexpress. Раджу брати 60 світлодіодів на метр для якіснішого ефекту, але й 30 зійде.
  • Двостороння липка стрічка або якийсь клей.
  • Джерело живлення 5В 2А (зарядник від планшета, наприклад).
  • Резистор на 220 Ом.
  • Паяльні інструменти.
  • Необхідне ПЗ для комп'ютера, а саме: Arduino IDE, AmbiBox, бібліотека для Arduino IDE - FastLed.

Приступимо.

Підключення

На світлодіодній стрічці є три контакти - Плюс (+), Земля (G, GND) і вхід (IN), а також є стрілочки, що вказує напрямок сигналу стрічкою. Наше завдання відрізати 4 відрізки світлодіодної стрічки таким чином. щоб верхня смужка дорівнювала нижній, права - лівої. Відмірятимемо прикладаючи стрічку із задньої частини нашого монітора. Загалом потрібно зробити так, як на малюнку нижче.

Важливо, щоб кількість світлодіодів зверху і знизу було однаковим, те саме стосується правої та лівої сторони. Також потрібно врахувати напрямок стрілок на самій стрічці і припаяти по порядку, як на картинці.
Тепер нам потрібно підключити стрічку до Arduino згідно зі схемою:

Мінус від харчування йдедо контакту G на стрічці та контакту GND на самій Arduino, Плюс безпосередньо до контакту (+) на стрічці, а керуючий провід через резистор від стрічки до потрібного порту. Головне – запам'ятати порт.

Власне, підключення на цьому закінчили.

Налаштування

Відкриваємо встановлену Arduino IDE та встановлюємо бібліотеку FastLed (У верхньому меню вибрати "Скетч" - "Підключити бібліотеку" - "Додати ZIP бібліотеку" та вибрати завантажений архів з бібліотекою).

Тепер з допомогою Arduino IDE заливаємо в Arduino скетч:

#include "FastLED.h" #define NUM_LEDS 44 // Кількість світлодіодів. #define PIN 6 // Порт, якого приєднаний керуючий провід. #define serialRate 115200 // Adalight відправляє "Магічне слово" (префік) перед відправкою даних. uint8_t prefix = ("A", "d", "a"), hi, lo, chk, i; // Ініціалізація стрічки. CRGB leds; void setup() ( FastLED.addLeds(leds, NUM_LEDS); // Тест світлодіодів. LEDS.showColor(CRGB(255, 0, 0))); delay(500); LEDS.showColor(CRGB(0, 255, 0) );delay(500);LEDS.showColor(CRGB(0, 0, 255)); ("Ada\n"); // Відправляємо «магічне слово» для з'єднання з програмою) void loop() ( // Чекаємо перший байт з магічного слова. for(i = 0; i< sizeof prefix; ++i) { waitLoop: while (!Serial.available()); // Проверка следующего байта из магического слова. if(prefix[i] == Serial.read()) continue; // В противном случае начинаем все с начала. i = 0; goto waitLoop; } // Ждем старший и младший байт, а так же контрольную сумму. while (!Serial.available()); hi = Serial.read(); while (!Serial.available()); lo = Serial.read(); while (!Serial.available()); chk = Serial.read(); // Если контрольная сумма не совпала, начинаем все с начала. if (chk != (hi ^ lo ^ 0x55)) { i = 0; goto waitLoop; } memset(leds, 0, NUM_LEDS * sizeof(struct CRGB)); // Получаем данные и настраиваем соответствующий светодиод. 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; } // Отобразить новое состояние ленты. FastLED.show(); }

Перед заливкою потрібно вказати кількість світлодіодів, яка у вас вийшла в сумі і порт, до якого ви припаяли провід, що управляє.
У мене вийшло 44 світлодіоди та використовувався 6-й порт.
Якщо у вас стрічка та Arduino вже підключена до живлення, то після заливання скетча стрічка повинна змигнути трьома кольорами, якщо цього не сталося, від'єднайте USB кабель і вставте знову.

Тепер нам потрібно встановити програму AmbiBox.
При установці програма запитає, який пристрій використовуватиметься, нам потрібно вказати Adalight.
У ній нам потрібно перейти у вкладку "Інтелектуальне підсвічування монітора".

Потім натисніть "Більше налаштувань", тепер відображаються всі функції.

Нам потрібно вказати порт, до якого підключено Arduino (цифра 1 на зображенні).
Потрібно вказати кількість світлодіодів, яка у нас вийшла (цифра 2 на зображенні).
Вибрати спосіб захоплення екрана. Тут на ваш розсуд, поекспериментуйте та виберіть потрібне. У мене метод Windows 8 (цифра 3 на зображенні).
Також можна натиснути "Показати зони захоплення" (цифра 4) і налаштувати їх так, як наклеєна стрічка. Ну. наприклад, якщо у вас кути залишилися без світлодіодів, зони можна змістити.
Не забудьте увімкнути автозапуск з Windows у вкладці "Параметри програми".
На цьому все. Все вже має працювати.

Відео

Будь ласка, увімкніть JavaScript для роботи з коментарями.

Компанія Philips у 2007 році запатентувала неймовірно просту, але, без перебільшення, приголомшливу технологію фонового підсвічування ТВ. З таким адаптивним підсвічуванням менше втомлюються очі при перегляді в темряві, збільшується ефект присутності, розширюється область відображення та ін. Ambilight застосовується не тільки до відео та фото контенту, але і до ігор. Ambilight перетворилася на візитну картку телевізорів Philips. З того часу компанія Philips пильно пильнує, щоб ніхто з великих виробників і думати не наважувався зазіхати на святе, створюючи щось подібне. Напевно, ліцензувати цю технологію можна, але умови якісь позамежні, та інші гравці ринку не дуже палають бажанням це робити. Невеликі компанії теж намагалися (і зараз є компанії, які це роблять) впроваджувати аналогічну технологію у вигляді окремих комплектів, але кара від Philips була неминуча. Тож у кращому разі, якщо компанія не продовжить якимось чином патент чи його похідну, інші виробники лише 2027 року зможуть випускати щось схоже.

Але нас, типових споживачів, така кара не стосується. Ми вільні собі робити те, що вважаємо за потрібне. Сьогодні я розповім у деталях, як самостійно зробити адаптивне фонове підсвічування для ТБ або монітора на кшталт Philips Ambilight (далі просто Ambilight). Для деяких стаття нічого нового в собі не міститиме, т.к. таких проектів десятки, а статей написано сотні різними мовами, та людей, які собі вже зробили таке, тисячі. Але для багатьох це може виявитися дуже цікавим. Жодних особливих навичок вам не потрібно. Лише базові знання фізики за 8 клас середньої школи. Ну, і зовсім трохи паяння проводів.

Щоб ви краще розуміли, про що я говорю, наведу свій приклад того, що вийшло. Реальні витрати на ТБ 42" - близько 1000 рублів та 2 години роботи.


Відео не передає всіх відчуттів та ефекту повністю, але діти вперше сиділи з відкритими ротами.

Можливі варіанти реалізації

Існує кілька варіантів реалізації Ambilight. Вони залежать від джерела відеосигналу.

Найдешевший, найпростіший і найефективніший варіант - джерелом сигналу виступає ПК з Windows, Mac OS X або Linux. Зараз дуже поширені Windows-бокси на процесорах Atom, які коштують від 70 $. Всі вони ідеально підходять для реалізації Ambilight. Я вже кілька років використовую різні Windows-бокси (в тумбі під ТБ) у ролі медіаплеєра, написав невелику купу оглядів і вважаю їх за найкращі ТБ-приставки для медіаконтенту. Апаратна реалізація цього варіанта є єдиною для всіх перерахованих операційних систем. Саме про цей варіант я розповім у статті. Програмна частина ставитиметься до Windows системіУ ролі універсальної керуючої програми виступатиме AmbiBox. З Mac OS X і Linux можна використовувати.

Другий варіант - джерелом сигналу виступає медіаприставка на базі Android, яких теж дуже багато. Цей варіант найпроблемніший. По-перше, підсвічування працюватиме лише у медіакомбайні Kodi (і у відгалуженнях цього проекту). По-друге, у переважній більшості випадків все працює тільки з відключеним апаратним декодуванням відео, що для більшості боксів неприйнятно. Апаратна реалізація проекту також накладає певні вимоги. Я його не зачіпатиму, але якщо щось цікавить конкретне, то постараюся відповісти в коментарях.

Третій варіант – незалежне від джерела сигналу рішення. Це найзатратніше, але абсолютно універсальне рішення, т.к. сигнал знімається прямо з HDMI кабелю. Для нього вам знадобиться досить потужний мікрокомп'ютер (типу Raspberry Pi), HDMI спліттер (розгалужувач), конвертер HDMI-RCA AV, USB 2.0 пристрій захоплення аналогового відео. Тільки з таким варіантом ви зможете гарантовано задіяти Ambilight з будь-яким ТВ-приставкою/ресивером, Android-боксами, Apple TV, ігровими приставками(наприклад, Xbox One, PlayStation 4) та ін. пристроями, які мають вихід HDMI. Для варіанта з підтримкою 1080p60 вартість компонентів (без світлодіодної стрічки) буде близько 70 $, за допомогою 2160p60 - близько 100 $. Це дуже цікавий варіант, але по ньому потрібно писати окрему статтю.

Апаратна частина

Для реалізації знадобиться три основні компоненти: керована світлодіодна стрічка RGB, блок живлення, мікрокомп'ютер Arduino.

Спочатку небагато пояснень.

WS2811 - це триканальний канальний контролер/драйвер (мікросхема) для RGB світлодіодів з керуванням по одному дроту (адресація до довільного світлодіода). WS2812B – це RGB світлодіод у корпусі SMD 5050, в який вже вбудований контролер WS2811.

Придатні для проекту світлодіодні стрічкидля простоти так і називають – WS2811 або WS2812B.

Стрічка WS2812B - це стрічка, на якій послідовно розміщені світлодіоди WS2812B. Стрічка працює з напругою 5 В. Існують стрічки з різною густиною світлодіодів. Зазвичай це: 144, 90, 74, 60, 30 на один метр. Бувають різні ступені захисту. Найчастіше це: IP20-30 (захист від попадання твердих частинок), IP65 (захисту від пилу та водяних струменів), IP67 (захист від пилу та захист при частковому або короткочасному зануренні у воду на глибину до 1 м). Підкладка чорного та білого кольору.

Ось приклад такої стрічки:


WS2811 стрічка – це стрічка, на якій послідовно розміщені WS2811 контролер та якийсь RGB світлодіод. Є варіанти, розраховані на напругою 5 і 12 В. Щільність і захист аналогічні попередньому варіанту.

Ось приклад такої стрічки:


Ще зустрічаються WS2811 «стрічки» з великими потужними світлодіодамияк на фотографії нижче. Вони теж підходять для реалізації Ambilight для якоїсь величезної панелі.


Яку стрічку вибрати, WS2812B та WS2811?

Важливий фактор - харчування стрічки, про що я розповім трохи згодом.

Якщо у вас вдома виявиться відповідний за потужністю блок живлення (часто вдома від старої або зіпсованої техніки залишаються блоки живлення), то вибирайте стрічку, виходячи з напруги блоку живлення, тобто. 5 В – WS2812B, 12 В – WS2811. У цьому випадку ви просто заощадите гроші.

Від себе можу надати рекомендацію. Якщо загальна кількість світлодіодів у системі буде не більше 120, WS2812B. Якщо більше 120, то WS2811 з робочою напругою 12 В. Чому саме так, ви зрозумієте, коли мова зайде про підключення стрічки до блока живлення.

Який рівень захисту стрічки вибрати?

Більшість підійде IP65, т.к. з одного боку вона покрита «силіконом» (епоксидною смолою), а з іншого є поверхня, що самоклеїться 3M. Цю стрічку зручно монтувати на ТБ або монітор та зручно протирати від пилу.

Яку густину світлодіодів вибрати?

Для проекту підійдуть стрічки із щільністю від 30 до 60 світлодіодів на метр (звичайно, можна і 144, ніхто не забороняє). Чим вище щільність, тим більшою буде роздільна здатність Ambilight (кількість зон) і більша максимальна загальна яскравість. Але варто враховувати, чим більше світлодіодів у проекті, тим складніше буде влаштовано схему живлення стрічки, і знадобиться більше потужний блокхарчування. Максимальна кількість світлодіодів у проекті – 300.

Купівля стрічки

Якщо ваше ТБ або монітор висить на стіні, і всі 4 сторони мають поруч багато вільного простору, то стрічку найкраще розмістити ззаду по периметру на всі 4 сторони для максимального ефекту. Якщо ваше ТБ або монітор встановлено на підставку, або знизу мало вільного простору, то стрічку треба розміщувати ззаду на 3-х сторонах (тобто низ без стрічки).

Для себе я вибрав білу стрічку WS2812B IP65 із 30 світлодіодами на метр. Підходящий блок живлення на 5 В у мене вже був. Вирішував, 60 чи 30 світлодіодів на метр, але вибрав останнє після перегляду відео з готовими прикладами реалізації – яскравість та дозвіл мене влаштували, та й харчування легше організувати, менше дротів. На Аліекспрес величезна кількість лотів стрічок WS2812B. Я замовляв 5 метрів за 16 $. Для мого ТБ (42", 3 сторони) потрібно було тільки 2 метри, тобто можна було купити за 10 $, що залишилися три метри для друга. Ціни часто змінюються у продавців, пропозицій багато, так що просто оберіть на Аліекспрес дешевий лот з високим рейтингом ( ключові словадля пошуку - WS2812B IP65 іди WS2811 12V IP65).




Купівля блоку живлення для стрічки

Блок живлення підбирається за потужністю та напругою. Для WS2812B – напруга 5 В. Для WS2811 – 5 або 12 В. Максимальна споживана потужність одного WS2812B світлодіода 0,3 Вт. Для WS2811 найчастіше аналогічно. Тобто. потужність блоку живлення повинна бути не нижче N*0,3 Вт, де N – кількість світлодіодів у проекті.

Наприклад, у вас ТВ 42", ви зупинилися на стрічці WS2812B з 30 світлодіодами на метр, вам потрібно 3 метри стрічки всі 4 сторони. , тобто 5 В/6 А. У моїй реалізації використовуються лише 3 сторони, всього 60 світлодіодів (якщо бути точним, то 57) - потужність від 18 Вт, тобто 5 В/4 А.

У мене давно вже без справи багатопортова USB-зарядка ORICO CSA-5U (8 А), що залишилася після старого огляду. Харчування портів у неї паралельно (це критично важливо), це ЗУ ідеально підходить у ролі БП, т.к. підключати стрічку я буду через 2 паралельні з'єднання (пояснення будуть трохи пізніше в статті).


Якби цього ЗУ у мене не було, то я вибрав би (є інформація, що саме в цей БП ставлять нутрощі на 2,5 А, так що треба детальніше вивчити це питання у продавця, або подивитися інші моделі).

Купівля мікрокомп'ютера

Керувати Ambilight буде мікрокомп'ютер Arduino. Arduino Nano на Аліекспрес стоїть за штуку.

Витрати мій варіант (для ТБ 42"):

10$ - 2 метри WS2812B IP65 (30 світлодіодів на метр)
4$ - блок живлення 5 В/4 А (грошей на БП не витрачав, наводжу вартість для ясності)
2,5 $ - Arduino Nano
-----------
16,5$ або 1000 рублів

Реалізація апаратної частини

Найголовніше – це правильно організувати харчування стрічки. Стрічка довга, напруга просідає при великому струмі, особливо при 5 В. Більшість проблем, які виникають у тих, хто робить Ambilight, пов'язані саме з харчуванням. Я користуюсь правилом - потрібно робити окреме підведення живлення на кожні 10 Вт споживаної максимальної потужності при 5 В і 25 Вт споживаної потужності при 12 В. Довжина підведення живлення (від блоку живлення до самої стрічки) повинна бути мінімальною (без запасу), особливо при 5 Вт. Ст.

Загальна схема підключення виглядає так (на схемі відображено підключення живлення для мого варіанту):


До стрічки з обох кінців підведено живлення - два паралельні підключення. Для прикладу, якби я робив підсвічування на всі 4 сторони, а стрічка була по 60 світлодіодів на метр (тобто максимальна потужність 54 Вт), то я зробив би таке підведення живлення:


Провід підводки потрібно використовувати відповідні, чим менше калібр (AWG), тим краще, щоб їх із запасом вистачало для розрахункової сили струму.

До Arduino від стрічки йдуть два контакти. GND, який потрібно підключити до відповідного піну Arduino. І DATA, який потрібно підключити до шостого цифрового піна через резистор 300-550 Ом (краще 470 Ом). Якщо резистора у вас немає, то в більшості випадків все чудово працюватиме і без нього, але краще, щоб він був. Резистор можна купити за пару копійок у будь-якому радіомагазині. Сам мікрокомп'ютер Arduino можете розмістити в будь-якому зручному корпусі, багато хто використовує для цього яйце Кіндер-сюрпризу. Arduino потрібно розміщувати якомога ближче до стрічки, щоб підведення DATA мало мінімальну довжину.

Припаювати дроти до стрічки просто. Головне правило – час контакту з паяльником має бути мінімальним, «возюкати» паяльником не можна.

У моєму випадку вийшло так:



Два чорні якісні USB кабелюпішли на живлення, а білий для підключення до комп'ютера. Білі термозбіжні трубки у мене закінчилися, я використав червоні. Не так «гарно», але мене влаштовує (все одно це заховано за ТБ).

Важливе питання – як вигинати стрічку під прямим кутом? Якщо у вас стрічка на 60 світлодіодів, то стрічку потрібно розрізати і з'єднувати короткими проводами (розмістивши все це в термозбіжній трубці). Можете купити спеціальні кутові конектори на три контакти для світлодіодних стрічок (на знімку 4 контакти, просто для прикладу):


Якщо у вас стрічка на 30 світлодіодів, то відстань між світлодіодами велика, ви легко можете зробити кут без різання. Видаляєте шматочок «силіконового» покриття, ізолюйте (можна навіть «скотчем») контактний майданчикта згинаєте за схемою:

Я відрізав шматок стрічки, щоби практикуватися. Головне, не потрібно перестаратися - трохи зігнули один раз і все. Тюди-сюди не треба перегинати, сильно здавлювати лінію вигину не потрібно.


Ось вид ззаду ТБ, всі дроти через отвір йдуть усередину тумби:

Програмна частина

Це найпростіше.

Підключаємо мікрокомп'ютер Arduino USB. Драйвер (послідовний інтерфейс CH340) встановлюється автоматично. Якщо цього не сталося, то в папці Arduino IDE є тека Drivers з усім необхідним.

Запускаємо Arduino IDE та відкриваємо файл Adalight.ino.


Змінюємо кількість світлодіодів у коді. Маю 57.


Інструменти > Плата > Arduino nano
Інструменти > Порт > Вибираєте COM-порт (там буде потрібний варіант)

Натискаємо кнопку «Завантажити»:


Програма проінформує, коли завантаження буде завершено (це буквально кілька секунд).

Готово. Потрібно відключити Arduino від USB та підключити заново. Стрічка загориться послідовно червоним, зеленим та синім кольором - Arduino активувався та готовий до роботи.

Завантажте та встановіть програму. У програмі натисніть «Більше налаштувань» та вкажіть пристрій – Adalight, COM-порт та кількість світлодіодів. Виберіть кількість кадрів для захоплення (до 60).


Далі натисніть «Показати зони захоплення» > «Майстер налаштування зон». Виберіть конфігурацію стрічки.


Натисніть «Застосувати» та «Зберегти налаштування». На цьому базові налаштуваннязакінчуються. Потім ви зможете поекспериментувати з розмірами зон захоплення, зробити корекцію кольору стрічки та ін. У програмі багато різних налаштувань.


Щоб активувати профіль, достатньо двічі натиснути мишею на відповідну іконку (профілів AmbiBox) в області сповіщень Windows. Стрічка одразу загориться. Відключається також подвійним натисканням.

Ось у принципі і все. Результат ви бачили на початку статті. Нічого складного, дешево та здорово. Впевнений, що у вас вийде краще, тому ділитесь своїми виробами в коментарях.

Доброго дня.

Для своєї першої статті я вибрав одну з найуспішніших своїх виробів: HDMI-passthrough аналог Ambilight від Philips, далі я називатиму цю композицію "Атмосвіт".

Вступ
В інтернетах не дуже складно знайти готові/відкриті рішення та статті як зробити Амбілайт для монітора/телевізора, якщо ти виводиш картинку з ПК. Але в моїй мультимедіа системі виведення картинки на телевізор з ПК займає тільки 5% часу використання, більшу кількість я граю з ігрових консолей, а значить потрібно було придумати щось своє.
Вихідні дані:
  • 60" Плазмовий телевізор
  • HTPC на базі Asrock Vision 3D 137B
  • Xbox 360
Більшість пристроїв використовують HDCP для відтворення вмісту навіть під час гри.
Вимога:
Необхідно забезпечити централізовану підтримку Атмосвітла для всіх пристроїв, підключених до телевізора.
Реалізація
Я не розповідатиму, як я прикріплював 4.5м світлодіодну стрічку до телевізора і що потрібно зробити з Arduino, в якості бази можна використовувати .

Єдиний нюанс:
Я помітив, що внизу екрана йдуть дивні мерехтіння, спочатку погрішив на сигнал, переколупав дефлікер, змінив ресазинг картинки і ще купу всього перекопав, стало краще, але від мерехтіння не допомогло. Почав спостерігати. Виявилося, що мерехтіння було лише наприкінці стрічки і то за яскравих сцен. Взявши мультиметр, я виміряв напругу на початку, середині і кінці стрічки і вгадав з причиною мерехтіння: на початку стрічки було 4.9В(так китайський БП дає напругу з відхиленням, це не суттєво), у середині 4.5 наприкінці 4.22 - Падіння напруга надто суттєво , Довелося вирішити проблему просто - до середини стрічки я підвів харчування від бп, провід пустив за телевізором. Допомогло миттєво, якісь мерехтіння припинилися взагалі.

Захоплюємо картинку вебкамерою
Перша тестова версія для обкатки ідеї та її візуалізації була обрана через захоплення картинки через вебкамеру) виглядало це якось так:

Низька передача кольорів і високий latency показав, що ця реалізація не може бути ніяк використана.

Захоплення картинки через HDMI

У процесі дослідження можливих варіантівбула обрана наступна схема, як сама надійна та бюджетна:

  • Сигнал з усіх пристроїв подається на 5in-1out HDMI свитч, який підтримує HDCP
  • Вихідний сигнал подається на 1in-2out HDMI splitter, який мало того, що підтримує HDCP, так ще відключайте його на виході (слава китайцям).
  • Один із вихідних сигналів йде на телевізор
  • Інший вихідний сигнал йде на HDMI to AV конвертер
  • S-Video сигнал йде на коробочку захвату від ICONBIT
  • Коробочка захоплення підключається до HTCP, що вічно працює, по USB, який підключений до Arduino контролера стрічки на телевізорі.

Спочатку виглядає дико і як милиці, але:

  • Це працює.
  • Сумарно все це, замовляючи з китаю, мені обійшлося тисяч в 3-4 тис. рублів.

Чому я не використовував плату для HDMI захоплення? Все просто: найдешевший варіант і доступний - Blackmagic Intensity Shuttle, але вона не може працювати з сигналом 1080p/60fps, тільки з 1080p/30fps - що не прийнятно, т.к. я не хотів знижувати фреймрейт, щоб можна було захоплювати картинку. + ця справа коштувала в районі 10 тисяч. карбованців. - що не дешево за невідомого результату.

Втрати на конвертації HDMI to S-video несуттєві для захоплення кольору в роздільній здатності 46х26 світлодіодного підсвічування.

Спочатку для захоплення S-video я пробував використовувати EasyCap (у нього багато китайських варіацій), але суть у тому, що чіп, що використовується там, вкрай убог, і з ним не можна працювати за допомогою openCV.

Єдиний мінус - вихідний сигнал S-Video містив чорні смуги по краях, що зрізає реальний контент (близько 2-5%), вихідну картинку з плати захоплення я обрізав, щоб видалити ці смуги, сама втрата зображення в тих областях на практиці не позначилася на результаті.

Софт
Для мене це була сама цікава частина, т.к. з залозками я не дуже люблю колупатися.

Для захоплення картинки я використав openCV і зокрема його.NET вперпер emgu CV.

Я вирішив також застосувати кілька різних технік постобробки зображення та його підготовки, перш ніж віддавати список кольорів на контролер.

Процес обробки кадру
1. Отримання захопленого кадру
2. Кроп кадру, для виключення чорних смуг
Тут все просто:
frame.ROI = new Rectangle(8, 8, frame.Width - 8, frame.Height - 18 - 8);
Обрізаємо 8 пікселів зверху, 8 праворуч та 18 знизу. (зліва смуги немає)
3. Ресайзим кадр у дозвіл підсвічування, нема чого нам тягати з собою здорову картинку
Теж нічого складного, робимо це засобами openCV:
frame.Resize(LedWidth - 2*LedSideOverEdge,
LedHeight - LedBottomOverEdge - LedTopOverEdge,
INTER.CV_INTER_LINEAR);
Уважний читач помітить, велика кількість змінних. Справа в тому, що у мене рамка телевізора досить велика, займаючи 1 світлодіод з боків, 1 зверху та 3 знизу, тому ресайз робиться на світлодіоди, які знаходяться безпосередньо навпроти дисплея, а кути ми вже доповнюємо потім. При ресайзингу ми отримуємо усереднені кольори, які повинні мати пікселі світлодіодів.
4. Виконуємо мапінг світлодіодів із відреcайзенного кадру
Ну тут теж все просто, тупо проходимо по кожній стороні та послідовно заповнюємо масив із 136 значень кольором світлодіодів. Так сталося, що зараз всі інші операції простіше виконувати з масивом світлодіодів, ніж з кадром, який важчий в обробці. Також на майбутнє я додав параметр «глибини» захоплення (кількість пікселів від межі екрану, для усереднення кольору світлодіода), але в кінцевому сетапі, виявилося краще без неї.
5. Виконуємо корекцію кольору (баланс білого/колірний баланс)
Стіни за телевізором у мене із бруса, брус жовтий, тому потрібно компенсувати жовтизну.
var blue = 255.0f/(255.0f + blueLevelFloat)*pixelBuffer[k];
var green = 255.0f/(255.0f + greenLevelFloat)*pixelBuffer;
var red = 255.0f/(255.0f + redLevelFloat)*pixelBuffer;
Взагалі я спочатку з вихідників якогось опенсорс редактора взяв колірний баланс, але він не змінював білий (білий залишався білим), я поміняв формули трохи, опечатався, і отримав пряме те, що потрібно: якщо level компонента кольору негативний (я поінмаю як - цього кольору не вистачає), то ми додаємо його інтенсивність і навпаки. Для моїх стін це вийшло: RGB(-30,5,85).

У корекції кольору я також виконую вирівнювання рівня чорного (чорний приходить десь на рівні 13,13,13 RGB), просто віднімаючи 13 з кожної компоненти.

6. Виконуємо десатурацію (зменшення насиченості зображення)
У кінцевому сетапе, я не використовую десатурацію, але може в певний момент знадобиться, фактично це робить кольори «пастельнішими», як у Філіпсівського амбілайту. Код наводити не буду, ми просто конвертуємо з RGB -> HSL, зменшуємо компонент Saturation (насиченість) і повертаємося назад вже в RGB.
7. Дефлікер
Так виходить, що вхідне зображення «тремтить» - це наслідок конвертації в аналоговий сигнал, як я вважаю. Я спочатку намагався вирішити по своєму, потім підглянув у вихідні записи Defliker фільтра, що використовується в VirtualDub, переписав його на C # (він був на С + +), зрозумів, що він не працює, бо він таке враження, що бореться з мерехтіннями між кадрами, в результаті я поєднав своє рішення і цей дефлікер отримавши щось дивне, але працююче краще, ніж очікувалося. Початковий дефлікер працював лише з інтенсивністю всього кадру, мені потрібно по кожному світлодіоду окремо. Початковий дефлікер порівнював зміну інтенсивності як суми, мені більше подобається порівняння довжини вектора кольору. Початковий дефлікер порівнював дельту зміни інтенсивності порівняно з попереднім кадром, це не підходить, і я переробив на середню величину інтенсивності в межах вікна попередніх кадрів. І ще багато інших дрібниць, внаслідок чого від початкового дефлікера мало що лишилося.
Основна ідея: виходячи із середньої інтенсивності попередніх кадрів, виконувати модифікацію поточного кадру, якщо його інтенсивність не вища за певний поріг (у мене цей поріг у кінцевому сетапі 25), якщо поріг долається, то проводиться скидання вікна, без модифікації.
Трохи модифікований (для читання поза контекстом) код мого дефлікера:
Array.Copy(_leds, _ledsOld, _leds.Length); for (var i = 0; i< _leds.Length; i++) { double lumSum = 0; // Calculate the luminance of the current led. lumSum += _leds[i].R*_leds[i].R; lumSum += _leds[i].G*_leds[i].G; lumSum += _leds[i].B*_leds[i].B; lumSum = Math.Sqrt(lumSum); // Do led processing var avgLum = 0.0; for (var j = 0; j < LedLumWindow; j++) { avgLum += _lumData; } var avg = avgLum/LedLumWindow; var ledChange = false; if (_strengthcutoff < 256 && _lumData != 256 && Math.Abs((int) lumSum - avg) >= _strengthcutoff) (_lumData = 256; ledChange = true; ) // Calculate adjustment factor for the current led. var scale = 1.0; int r, g, b; if (ledChange) ( for (var j = 0; j< LedLumWindow; j++) { _lumData = (int) lumSum; } } else { for (var j = 0; j < LedLumWindow - 1; j++) { _lumData = _lumData; } _lumData = (int) lumSum; if (lumSum >0) ( scale = 1.0f/((avg+lumSum)/2); var filt = 0.0f; for (var j = 0; j< LedLumWindow; j++) { filt += (float) _lumData/LedLumWindow; } scale *= filt; } // Adjust the current Led. r = _leds[i].R; g = _leds[i].G; b = _leds[i].B; // save source values var sr = r; var sg = g; var sb = b; var max = r; if (g >max) max = g; if (b > max) max = b; double s; if (scale*max > 255) s = 255.0/max; else s = scale; r = (int) (s * r); g = (int) (s * g); b = (int) (s * b); // Keep highlight double k; if (sr > _lv) ( k = (sr - _lv)/(double) (255 - _lv); r = (int) ((k*sr) + ((1.0 - k)*r)); ) if ( sg > _lv) (k = (sg - _lv)/(double) (255 - _lv); g = (int) ((k*sg) + ((1.0 - k)*g)); ) if (sb > _lv) ( k = (sb - _lv)/(double) (255 - _lv); b = (int) ((k*sb) + ((1.0 - k)*b)); ) _leds[i] = Color . від Argb (r, g, b); ) /* Temporal softening phase. */ if (ledChange || _softening == 0) continue; var diffR = Math.Abs(_leds[i].R - _ledsOld[i].R); var diffG = Math.Abs(_leds[i].G - _ledsOld[i].G); var diffB = Math.Abs(_leds[i].B - _ledsOld[i].B); r = _leds[i].R; g = _leds[i].G; b = _leds[i].B; int sum; if (diffR< _softening) { if (diffR >(_softening >> 1)) ( sum = _leds[i].R + _leds[i].R + _ledsOld[i].R; r = sum/3; ) ) if (diffG< _softening) { if (diffG >(_softening >> 1)) ( sum = _leds[i].G + _leds[i].G + _ledsOld[i].G; g = sum/3; ) ) if (diffB< _softening) { if (diffB >(_softening >> 1)) ( sum = _leds[i].B + _leds[i].B + _ledsOld[i].B; b = sum/3; ) ) _leds[i] = Color.FromArgb(r, g, b); )
Нехай _leds - масив світлодіодів класу Color, _ledsOld - значення кадру до конвертації, LedLumWindow - ширина вікна попередніх кадрів, для оцінки середньої зміни інтенсивності, у кінцевому сетапі вікно у мене було 100, що приблизно при 30кад/с дорівнює 3-секундам. _lumData – масив значення інтенсивності попередніх кадрів.

Зрештою даний механізмдав ще приємні несподівані наслідки на картинку, складно описати як це сприймається візуально, але він робить темніше де треба і яскравіше де треба, немов динамічний контраст. Мета дефлікера в результаті вийшла широка, не тільки усунення мерехтіння, а й загальне врівноваження кольору, що виводиться, як і по компонентах, так і за часом у межах вікна.

8. Згладжування світлодіодів сусідами.
Взагалі в кінцевому сетапі, згладжування мені не дуже сподобалося, і я його відключив, але в деяких випадках може стати в нагоді. Тут ми просто усереднюємо колір кожного світлодіода за його сусідніми.
var smothDiameter = 2*_smoothRadius + 1; Array.Copy(_leds, _ledsOld, _leds.Length); for (var i = 0; i< _ledsOld.Length; i++) { var r = 0; var g = 0; var b = 0; for (var rad = -_smoothRadius; rad <= _smoothRadius; rad++) { var pos = i + rad; if (pos < 0) { pos = _ledsOld.Length + pos; } else if (pos >_ledsOld.Length - 1) (pos = pos - _ledsOld.Length; ) r += _ledsOld.R; g + = _ledsOld.G; b + = _ledsOld.B; ) _leds[i] = Color.FromArgb(r/smothDiameter, g/smothDiameter, b/smothDiameter); )
9. Зберігаємо поточний стейт, щоб відправка пакетів схопив і відправив його на контролер підсвічування.
Я навмисне розділив процес обробки кадрів і відправлення пакетів на контролер: пакети відправляються раз у певний інтервал (у мене це 40мс), щоб ардуїно заспівала обробити попередній, бо частіше ніж 30мс вона захлинається, таким чином виходить, що ми не залежимо безпосередньо від частоти кадрів захоплення і не заважаємо тому процесу (адже відправка пакета теж витрачає час).
Трохи про ардуїно
Не можна просто так взяти і відправити по серіалу великий пакет на ардуіно, бо він вийде за межі дефолтного буфера HardwareSerial і ти втратиш його кінець.
Вирішується це досить просто: виставляємо значення розміру буфера HardwareSerial достатнього розміру, щоб влазив весь пакет з масивом кольорів, для мене це 410.
UI
Сам софт був реалізований у вигляді win служби, щоб налаштовувати всі параметри + вмикати/вимикати я зробив Web UI, який зв'язувався зі службою через WebService на службі. Підсумковий інтерфейс на екрані мобільного телефону виглядає так:
Результат
У результаті результат виправдав усі очікування, і тепер граючи в ігри на консолях, я отримую ще більше занурення в атмосферу гри.

Як загальний результат роботи я записав відео з роботою атмосвіту за моєю схемою:

Досліджуваний зразок 1: Pacific Rim, сцена битви в Шанхаї, цей фільм добре підходить для тестування та демонстрації, багато яскравих сцен і спалахів, ударів блискавки і т.д.:

Випробуваний зразок 2: Якийсь ролик з MLP, злитий з ютуба, дуже добре підходить для тесту сцен з яскравими квітами (мені сподобалися смуги), а також сцен, що швидко змінюються (під кінець вигляді можна розглянути наслідки затримки, видних тільки на відео, при реальному перегляді цього не помітно, намагався виміряти затримку по відео - вийшло 10-20мс):

І насамкінець варто помітити про споживання ресурсів від HTPC:
HTPC у мене ASRock Vision 3D на i3, служба атмосвіту віджирає 5-10% CPU та 32MB RAM.

Дякую за увагу, дуже сподіваюся, що комусь моя стаття допоможе.

Що таке Hyperion Ambilight
Технологія фонового підсвічування для телевізорів, яка була винайдена та запатентована компанією Philips Electronics.

Є підсвічуванням, яке, аналізуючи колірну картинку кадру на екрані телевізора, відтворює розсіяне світло по периметру телевізора. Завдяки цьому поверхня стіни за корпусом телевізора динамічно освітлюється, тим самим доповнюючи ореолом інтенсивність зображення на екрані і візуально як би збільшуючи розмір зображення.

1. Основне залізо

Оскільки технологія запатентована, ще багато років ми її не бачимо у телевізорах, відмінних від марки Philips. До речі, я володів таким телевізором, з тристороннім підсвічуванням, але він був настільки повільним, що я продав його через 6 днів після покупки. Ну що ж, доведеться зробити самим... Для цього нам знадобляться:

  • Raspberry Pi 3 посилання (42$)- просто візьміть саму останню версіюмалинки, якщо планується використовувати як медіа-сервер, то раджу взяти щось потужніше, наприклад Asus Tinker Board . Якщо завалялася Raspberry Pi 2, то і на ній все буде добре працювати, без затримок.
  • Світлодіодна стрічка APA102 (8$/метр)- Тут тільки два варіанти, або брати оригінал АPA102, або її аналог SK9822, який дешевше, але працює так само. Я використовую аналог. Раджу взяти Black IP67 30/метр. IP67 йде в силіконовому захисті, який не жовтіє від часу, захищає від пилу та перешкод. Щодо кількості діодів, 30 на метр цілком достатньо, і блок живлення можна буде знайти у "ноутбучному" виконанні. Беріть на всі чотири сторони ТБ, навіть якщо він стоїть на підставці. На телевізор 48 дюймів йде рівно 3 метри стрічки. Рекомендую взяти відразу всю необхідну стрічку в одного продавця і в одному замовленні, оскільки різні партії стрічки можуть мати різні відтінки, це різатиме око.Ніколи не вірте, що систему можна побудувати на основі ws28*, просто погляньте на характеристики:

У мене був вкрай сумний досвід зі стрічкою ws2801: по-перше, вона відверто гальмує, не вистачає їй частоти оновлення, по-друге, білий не білий, потрібно підлаштовувати, по-третє, постійно довільне миготіння діодів, по-четверте, банально відвалюються чіпи з цієї стрічки, по-п'яте, треба паяти.

  • Блок живлення 5V 8A (11$)- Вибір блоку залежить від конфігурації стрічки, я просто наведу свій приклад розрахунку: стрічка 30 діодів/метр споживає 9Вт на 1 метр (у випадках коли включений білий, в реальності значно менше), вважаємо по максимуму: 9Вт * 3 (кількість метрів) + 20% резерву = 32.4Вт, блок живлення видає 5 * 8 = 40Вт цілком підійде, і від нього ж можна буде запитати всі інші пристрої.
  • Конектори- п аять не будемо, навіщо ускладнювати, візьмемо і замовимо деякі конектори:

2. Складання заліза

Збираємо по наступною схемою. Важливо задати початок і кінець стрічки, щоб світіння було рівномірним. Обов'язково з'єднайте живлення стрічки з малиною загальною землею. Щоб уникнути можливих перешкод сигналу, можна використовувати феритові фільтри, але я робив без них проблем не виявлено.

Приміряємо, обрізаємо, з'єднуємо куточками, клеїмо.

Світлодіодна стрічка поставляється зі стандартною липкою основою – на ній стрічка не тримається, швидко відвалиться. Я купував у будівельному гіпермаркеті спінену клейку стрічку для кріплення дзеркал. Обов'язково знежирити поверхню ТБ. Корпус ТБ може бути округленим, з'являється можливість наклеїти стрічку під кутом, щоб діоди світили більше на всі боки, але я цього робити не раджу. Варто наклеїти стрічку строго перпендикулярно до стіни. Ідеальна відстань від стіни 15см-20см. У моєму випадку, вийшло 24см, через форму підставки ТБ.

Малинку можна також наклеїти на задню частину ТБ. Я приклеїв на липучку від одягу, щоби була можливість знімати.

Я читав, що такий scart перехідник працює не на всіх ТБ, але раджу спробувати це дешево. Перехідник необхідно встановити в режим OUT.

Телевізори з динамічним підсвічуванням навколо рамки дисплея – одна з фірмових фішок компанії Philips. І на відміну багатьох інших вона працює. Однак за все доводиться платити, і телевізори з Ambilight і підвищеним ефектом присутності коштують дорожче за багато інших моделей.

Російські розробники запропонували спосіб, який дозволить оснастити динамічним підсвічуванням та монітори будь-якого виробника. Для цього навіть не доведеться везти пристрій у сервісний центр: знадобиться лише трохи часу та посидючості.

Взагалі, подібне підсвічування можна придбати у вигляді радіодеталей і налаштувати самостійно. Але, як показує практика, це майже порівняно з готовими варіантами від PaintPack.

Пропонується дві основні моделі: версія для монітора (30 світлодіодів) та версія для телевізора (60 світлодіодів). Є і зовсім проста – на 10 світлодіодів, але вона підходить тільки для найменших моніторів.

Версія для телевізорів обладнана зовнішнім блокомхарчування. Також на її користь говорить більше світлодіодів, що дає більшу площу підсвічування (світитиметься ширше і вище, тобто). Якщо такі варіанти не підходять з будь-яких міркувань, можна зв'язатися з розробниками: за невелику доплату вони запропонують модифікований варіант.

mindrunway.ru

PaintPack, по суті, є невеликим корпусом, до якого з двох сторін підключаються знімні світлодіодні стрічки. Коробочка з начинкою несе на собі індикатори та роз'єм живлення, а також microUSB для з'єднання з ПК. Є ще майстер-роз'єм (пропрієтарний) для послідовного підключення двох пристроїв.

Корпус пристрою знаходиться на задній панелі телевізора або монітора. Потім прокладаються LED-стрічки відповідно до інструкції, підключається живлення та починається чаклунство. При з'єднанні PaintPack з комп'ютером через USB-роз'єм необхідно встановити драйвери та налаштувати пристрій у комплектній програмі.


mysku.ru

Налаштування здійснюється за допомогою AmbiBox . Необхідно перейти в меню «Інтелектуальне підсвічування», вибрати спосіб захоплення екрану та один із запропонованих у програмі режимів роботи:

  1. Статичне тло - встановлюється будь-який колір, регулюється світлодіодів.
  2. Кольорова музика - підсвічування блиматиме в такт звучання музики. Колір підсвічування встановлюється на зелено-жовтий.
  3. Динамічний фон - плавне перетікання одного кольору до іншого.
  4. Захоплення екрана – основний режим роботи.

У цьому режимі можливе захоплення кольору з фільмів та ігор, що переглядаються. Колір підсвічування змінюватиметься відповідно до зображення на екрані, поділяючись на верхню, нижню та бічні зони (кожна окремо).

Працює PaintPack трохи повільніше ніж офіційний аналог від Philips. Але з урахуванням різниці у вартості та можливості модернізації будь-якого пристрою вибір очевидний.