Привет! Сегодня я расскажу вам о замечательном проекте, который я реализовал уже почти 3 года назад, в мае 2014 года, и до сих пор не просто ежедневно пользуюсь созданным устройством, но и действительно восхищаюсь им: речь пойдёт о самодельной подсветке на монитор, аналоге Philips Ambilight на базе светодиодной ленты ws2812b и платформы Arduino.
Работать за компьютером без усталости глаз от контраста между ярким изображением и тёмной стеной и наоборот; создавать приятную световую и цветовую атмосферу в комнате и, самое главное, смотреть фильмы и сериалы с полноценным эффектом погружения - вот те основные задачи, которые выполняет эта замечательная подсветка и сегодня я расскажу, как без особого труда сделать такую же для любого монитора!
О проекте
Для начала поведаю немного об этом замечательном проекте.
С чего всё началось
Несколько лет назад родители попросили меня, как единственного в семье нормально шарящего в технике человека, выбрать им хороший большой телевизор преимущественно для просмотра спутникового ТВ в формате FullHD: на НТВ+ тогда уже было несколько HD каналов, в том числе один 3D и только-только анонсировали Первый Канал HD, который родители смотрят больше всего. Я уже давным-давно знаю, что у Филипса есть замечательная технология Эмбилайт, подсвечивающая стену, как-бы продолжая изображение, поэтому первым делом я обратил внимание именно на телевизоры этого производителя. После долгого изучения различных тестов и сравнений характеристик с другими производителями я всё-таки принял решение, остановившись на замечательном телевизоре Philips 47PFL6907T/12 с двухсторонней подсветкой Ambilight по бокам.
Поиск решения
Установил, настроил, посмотрел как он работает и понял - хочу такую штуку и себе. Начал гуглить, как же устроить подобную подсветку на компьютере и нашёл кучу скетчей для Arduino, управляющих различными лентами. В основном я обращал внимание на скетчи, работающие с протоколом Adalight, поддерживаемым многими программами под Windows, предназначенными как раз для реализации такой подсветки. Так как Arduino в количестве нескольких штук у меня на тот момент уже были, осталось лишь выбрать, что же будет источником света. После очередного сеанса гугления и поиска на Aliexpress я остановился на светодиодной ленте на ws2812b - это пятивольтовая лента, каждый светодиод которой снабжён чипом ws2812b, благодаря которому можно по одному проводу на всю ленту управлять каждым RGB-диодом в ней абсолютно индивидуально!
Решение найдено, покупка пяти метров ленты совершена и осталось лишь дождаться заветной посылки из Китая!
Первый запуск
И вот, наконец, лента пришла! Так как жрёт она по максимуму 90W, то есть 18A, запускать её я осмелился только от работающего компьютера: моему БП Corsair AX860i такие токи как семечки. Я подкинул питание от молекса проводами средней толщины, подключил ленту к Ардуине...
...и написал пробный тестовый скетч:
Тогда я понял, что работать проще всего с замечательной библиотекой FastLed, на базе которой я также нашёл реализацию нужного мне протокола Adalight.
Монтаж ленты
Вдоволь наигравшись с лентой и убедившись, что всё работает как нужно, я сделал замеры задней части монитора, придумал, как я буду крепить туда ленту и принялся её нарезать:
Отрезать мне нужно было 2 пары полосок: верхнюю с нижней и боковые. Данную ленту можно нарезать, как вы уже поняли, между любыми двумя светодиодами, так что отрезать нужные полосы не составило труда.
Между собой получившиеся полоски ленты я соединял гибкими проводами, подпаивая их к соответствующим контактам и разделяя кембриками:
После чего места соединений скреплял термоусадкой:
Вот это же место с другой стороны:
Получалось достаточно неплохо:
Для крепления ленты к монитору я воспользовался карточками БайФлая, позагибав их нужным образом и приклеив к монитору термоклеем:
Ну а к самим карточкам, разумеется, я приклеил саму ленту:
Так как лента с обратной стороны сидит на двухстороннем скотче от 3M, она легко прилепилась к карточкам и по сей день надёжно на них сидит (а вот сами карточки время от времени отклеиваются от моника, если их случайно задеть).
Всего на монитор ушло 102 светодиода. Так как они по максимуму могут выжрать ток до 6 ампер, я подключил их толстыми проводами (и одним проводком к специально подведённой Арудине):
Которые, в свою очередь, также воткнул в молекс, сделав у них на конце подходящие по размеру шткеры из каких-то советских коннекторов:
Пыль на этих фотках как-бы говорит о том, что там всё настолько надёжно, что я уже давно туда не лазил (на самом деле при последней уборке надо было воспользоваться кисточкой, но я - ленивая жопа). Как видите, у меня к молексам таким макаром подключено довольно много всего навесного, стараюсь использовать свой БП на полную, т.к. у него сертификат энергоэффективности 80 PLUS PLATINUM, а значит, ни от чего больше я так эффективно эту ленту не запитаю. Тут главное по ошибке не воткнуть ленту в 12V, иначе будет печалька.
Проверка
После успешного монтажа необходимо было проверить, всё ли работает как надо, поэтому на помощь пришла вариация скетча с новогодними огоньками:
Ну вот, всё работает, можно переворачивать монитор и заливать скетч для работы по протоклу Adalight!
Прошивка (скетч Arduino)
Я уже не помню где я нашёл этот скетч, но с небольшими коррективами я использую его и по сей день:
////////// // // Arduino interface for the use of ws2812 operated LEDs // Uses Adalight protocol and is compatible with Boblight, Prismatik etc // "Magic Word" for synchronisation is 'Ada' followed by LED High, Low and Checksum // #include <FastLED.h> //Используется библиотека FastLed 3.1.0 ///// User definitions ///// #define colorOrder GRB //Порядок цветов // Define the number of LEDs #define NUM_LEDS 102 //Количество светодиодов // Define SPI Pin #define PIN 11 //Пин, по которому будет управляться лента // Baudrate, higher rate allows faster refresh rate and more LEDs (defined in /etc/boblight.conf) #define serialRate 2000000 //Скорость виртуального COM-порта // Adalight sends a "Magic Word" (defined in /etc/boblight.conf) before sending the pixel data uint8_t prefix[] = {'A', 'd', 'a'}, hi, lo, chk, i; // initialise LED-array CRGB leds[NUM_LEDS]; void setup() { pinMode(13, OUTPUT); digitalWrite(13, LOW); FastLED.addLeds<WS2812B, PIN, colorOrder>(leds, NUM_LEDS); //Инициализация с указанием типа используемой ленты byte del=2; // initial RGB flash for(i=0;i<255;i++) { LEDS.showColor(CRGB(i, 0, 0)); delay(del); } for(i=1;i<255;i++) { LEDS.showColor(CRGB(255, i, 0)); delay(del); } for(i=255;i>1;i--) { LEDS.showColor(CRGB(i, 255, 0)); delay(del); } for(i=1;i<255;i++) { LEDS.showColor(CRGB(0, 255, i)); delay(del); } for(i=255;i>1;i--) { LEDS.showColor(CRGB(0, i, 255)); delay(del); } for(i=0;i<255;i++) { LEDS.showColor(CRGB(i, 0, 255)); delay(del); } for(i=255;i>1;i--) { LEDS.showColor(CRGB(255, 0, i)); delay(del); } for(i=255;i>1;i--) { LEDS.showColor(CRGB(i, 0, 0)); delay(del); } Serial.begin(serialRate); Serial.print("Ada\n"); // 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(); }
Обратите внимание: скорость COM-порта в скетче стоит 2 мегабода, это не ошибка, это необходимая скорость для управления таким большим количеством светодиодов с высокой частотой кадров! Очень важно, что такую скорость должен поддерживать не только ваш USB-контроллер на материнке и его драйвера, но и сам USB-COM чип на шилде Arduino, поэтому максимально дешёвые китайские шилды тут не подойдут - я пробовал, такую скорость они тянут с большим количеством ошибок. У меня китайский аналог оригинального шилда, с оригинальным МК Atmega16u2 для передачи данных. Вот в этом лоте, судя по описанию, такие продают за $5,57.
Такую же скорость, соответственно, надо устанавливать и в управляющей программе, о ней я сейчас и расскажу.
Программное обеспечение
Как я понимаю, есть несколько вариантов программного обеспечения для этой системы, но для себя я остановился на замечательной софтине под названием Prismatik. Раньше он, насколько я помню, был опенсурсным, теперь им занимается контора, торгующая готовыми комплектами того, что мы щас собирали. Тем не менее, с протоколом adalight он работает без проблем.
Естественно, после установки, выбора виртуального COM-порта, на котором висит Ардуина, рулящая нашим Эмбилайтом, надо для каждого светодиода настроить зону захвата изображения:
Сделать это, конечно, можно и вручную, что при таком большом количестве светодиодов может быть очень геморройно, а можно и путём пакетного редактирования конфигурационного файла программы, с помощью, например, Notepad++. Собственно, и настройки программы можно отредактировать так же. Открываем папку Users\%Имя пользователя%\Prismatik и там видим файл main.conf. Вот, что он содержит у меня:
[General] MainConfigVersion=4.0 ProfileLast=1200p - копия Language=<System> DebugLevel=0 IsExpertModeEnabled=true IsKeepLightsOnAfterExit=false IsKeepLightsOnAfterLock=false IsPingDeviceEverySecond=true IsUpdateFirmwareMessageShown=false ConnectedDevice=Adalight SupportedDevices="Lightpack,Adalight,Ardulight,Virtual" LastReadUpdateId=0 IsNotFirstStart=true [API] IsEnabled=true ListenOnlyOnLoInterface=false Port=3636 AuthKey= [Adalight] SerialPort=COM18 BaudRate=2000000 NumberOfLeds=102 ColorSequence=RGB [Ardulight] SerialPort=COM1 BaudRate=115200 NumberOfLeds=10 ColorSequence=RGB [AlienFx] NumberOfLeds=1 [Lightpack] NumberOfLeds=10 [Virtual] NumberOfLeds=10
Собственно, тут интересны лишь разделы [General], в котором указаны общие настройки программы, не связанные с каким-то определённым профилем, [API] - для внешнего управления, об этом позже и [Adalight], где указаны как раз номер последовательного порта, скорость на нём, количество светодиодов и порядок цветов.
Переходим к описанию профиля там же в папке Profiles:
[General] LightpackMode=Ambilight IsBacklightEnabled=true [Grab] Grabber=WinAPI IsAvgColorsEnabled=false IsSendDataOnlyIfColorsChanges=true Slowdown=30 LuminosityThreshold=0 IsMinimumLuminosityEnabled=true IsDX1011GrabberEnabled=false IsDX9GrabbingEnabled=false [MoodLamp] LiquidMode=false Color=#ffaa00 Speed=50 [Device] RefreshDelay=100 Brightness=100 Smooth=100 Gamma=2.004 ColorDepth=128 [LED_1] IsEnabled=true Position=@Point(1671 1142) Size=@Size(249 62) CoefRed=1 CoefGreen=1 CoefBlue=1 [LED_2] IsEnabled=true Position=@Point(1671 1080) Size=@Size(249 62) CoefRed=1 CoefGreen=1 CoefBlue=1 [LED_3] IsEnabled=true Position=@Point(1671 1022) Size=@Size(249 62) CoefRed=1 CoefGreen=1 CoefBlue=1 [LED_4] IsEnabled=true Position=@Point(1671 960) Size=@Size(249 62) CoefRed=1 CoefGreen=1 CoefBlue=1 [LED_5] IsEnabled=true Position=@Point(1671 902) Size=@Size(249 62) CoefRed=1 CoefGreen=1 CoefBlue=1 [LED_6] IsEnabled=true Position=@Point(1671 840) Size=@Size(249 62) CoefRed=1 CoefGreen=1 CoefBlue=1 [LED_7] IsEnabled=true Position=@Point(1671 778) Size=@Size(249 62) CoefRed=1 CoefGreen=1 CoefBlue=1 [LED_8] IsEnabled=true Position=@Point(1671 720) Size=@Size(249 62) CoefRed=1 CoefGreen=1 CoefBlue=1 [LED_9] IsEnabled=true Position=@Point(1671 662) Size=@Size(249 62) CoefRed=1 CoefGreen=1 CoefBlue=1 [LED_10] IsEnabled=true Position=@Point(1671 600) Size=@Size(249 62) CoefRed=1 CoefGreen=1 CoefBlue=1 [LED_11] IsEnabled=true Position=@Point(1671 542) Size=@Size(249 62) CoefRed=1 CoefGreen=1 CoefBlue=1 [LED_12] IsEnabled=true Position=@Point(1671 480) Size=@Size(249 62) CoefRed=1 CoefGreen=1 CoefBlue=1 [LED_13] IsEnabled=true Position=@Point(1671 418) Size=@Size(249 62) CoefRed=1 CoefGreen=1 CoefBlue=1 [LED_14] IsEnabled=true Position=@Point(1671 360) Size=@Size(249 62) CoefRed=1 CoefGreen=1 CoefBlue=1 [LED_15] IsEnabled=true Position=@Point(1671 302) Size=@Size(249 62) CoefRed=1 CoefGreen=1 CoefBlue=1 [LED_16] IsEnabled=true Position=@Point(1671 240) Size=@Size(249 62) CoefRed=1 CoefGreen=1 CoefBlue=1 [LED_17] IsEnabled=true Position=@Point(1671 182) Size=@Size(249 62) CoefRed=1 CoefGreen=1 CoefBlue=1 [LED_18] IsEnabled=true Position=@Point(1671 120) Size=@Size(249 62) CoefRed=1 CoefGreen=1 CoefBlue=1 [LED_19] IsEnabled=true Position=@Point(1671 62) Size=@Size(249 62) CoefRed=1 CoefGreen=1 CoefBlue=1 [LED_20] IsEnabled=true Position=@Point(1671 0) Size=@Size(249 62) CoefRed=1 CoefGreen=1 CoefBlue=1 ... и так далее, ну вы поняли ... [LED_253] IsEnabled=true Position=@Point(2420 0) Size=@Size(250 250) CoefRed=1 CoefGreen=1 CoefBlue=1 [LED_254] IsEnabled=true Position=@Point(2430 0) Size=@Size(250 250) CoefRed=1 CoefGreen=1 CoefBlue=1 [LED_255] IsEnabled=true Position=@Point(2440 0) Size=@Size(250 250) CoefRed=1
Как видите, тут, кроме основных настроек, просто перечислены все возможные 255 светодиодов (судя по всему, прога большее количество не поддерживает) с их координатами на экране и размерами. То есть, проведя на листе бумаги нужные расчёты, можно записать положение и размеры всех СД- я именно так и сделал.
Важное замечание: обязательно храните резервную копию вашего текущего профиля, т.к. если у вас случится какой-нибудь конфуз в виде BSOD или отключения света - прога может случайно затереть текущий файл, у меня такое было уже много раз, поэтому файл и называется "1200p - копия.ini"
Кроме настроек на самом первом скрине Призматика, там ещё есть парочка интересных экранов:
Вы можете регулировать яркость и насыщенность цветов (гамма-коррекция), так же там есть функция захвата из 3D приложений (то есть игр), но с большинством игр она не работает (точно работала в Saints Row IV), или работает только в оконном режиме. Короче, в играх я эту штуку не юзаю - просто включаю равномерный спокойный свет, чтобы глааз не уставали - это правда помогает!
Просмотр видео
Лучше всего эта подсветка проявляет себя, разумеется, именно при просмотре видео. Только вот сам по себе Prismatik нормально видео из проигрывателя не захватывает: вам придётся либо смотреть кино в окне, либо как-то с рендерами изголяться, но не стоит расстариваться, ведь на помощь приходит замечательный проект от отечественных разработчиков: SmoothVideo Project, основная функция которого - просчитывание промежуточных кадров в реальном времени для растягивания видеопотока любой частоты кадров до частоты обновления вашего монитора: получается максимально плавное и приятное изображение, как на современных телевизорах. Так вот, там есть поддержка API Призматика, который я упоминал выше, благодаря которому SVPшка сама управляет вашей подсветкой за монитором во время просмотра видео, независимо от конфигурации плеера, ведь все настройки подсветки у неё вынесены отдельно:
Благодаря этому, подсветка при просмотре видео работает гораздо лучше оригинальной Филипсовской, более того, каждый может настроить её под себя.
Единственное, если вы хотите использовать SVPLight (именно так называется расширение SVP для нашей подсветки) бесплатно - вам придётся использовать старую версию SVP, SVP 3, т.к. начиная с версии 4 SVPLight доступен лишь в платной версии Pro. Для граждан России она стоит копейки, а вот белорусам придётся раскошелиться. Правда, мне они дали Pro версию по российской цене, т.к. я старый участник этого проекта.
Но не отчаивайтесь - в третьей версии функционал не намного беднее, я 2 года пользовался ей до выхода четвёрки и горя не знал, так что можете смело ставить, если вы не из России. Хотя, если вы уже отдали баксов 30 на покупку ленты и ардуины - можно и выложить пятнашку за SVPху. Она реально того стоит! Либо, если вы хотите купить её по российской цене, можно, например, сказать им следующее:
Да, на данный момент Prismatik не адресует через API светодиоды с номерами выше 99, так что в настройках SVPLight надо указывать не более 99 светодиодов, это выливается в то, что при просмотре видео у меня последние 3 светодиода (100й,101й и 102й) не работают. Учитывайте это при проектировании своей подсветки!
Кстати, в SVPшке тоже есть функция проверки светодиодов с новогодним эффектом:
Заключение
Это реально крутая вещь, затраты не такие уж серьезные, особенно теперь, когда 5 метров ленты стоят ниже $25, а я в своё время её за $55 покупал. Советую всем реализовать этот несложный и очень интересный проект!
Вот, специально для статьи снял на видео, как это работает:
И предновогоднее видео двухлетней давности, тут я ещё и в Borderlands 2 играю:
Очень полезная вещь! Кто не смотрел на Филипке с амбилайтом фильмы - не поймет, это надо прочувствовать! Для монитора - шикарная вещь, такую и в магазине не купишь! Автору респект и уважуха!