Urob si sám: Univerzálny Ambilight pre domáci multimediálny systém – Atmosvet

  • 11.05.2019

Televízory s dynamickým podsvietením okolo rámu displeja sú jednou z charakteristických vlastností spoločnosti Philips. A na rozdiel od mnohých iných to funguje. Všetko však niečo stojí a televízory s funkciou Ambilight a zvýšeným pohlcujúcim efektom sú drahšie ako mnohé iné modely.

Ruskí vývojári navrhli metódu, ktorá umožní vybaviť monitory akéhokoľvek výrobcu dynamickým podsvietením. Aby ste to dosiahli, nemusíte si ani brať zariadenie servisné stredisko A: Chce to len trochu času a vytrvalosti.

Vo všeobecnosti je možné takéto podsvietenie zakúpiť vo forme rádiových komponentov a nakonfigurovať ich nezávisle. Ako však ukazuje prax, je to takmer porovnateľné s hotovými možnosťami z PaintPack.

V ponuke sú dva základné modely: verzia monitora (30 LED) a verzia TV (60 LED). Existuje aj jeden veľmi jednoduchý – na 10 LED, no ten je vhodný len pre najmenšie monitory.

Verzia TV je vybavená externým napájaním. V jeho prospech hovorí aj väčší počet LED diód, ktorý dáva veľkú plochu podsvietenia (inými slovami bude svietiť širšie a vyššie). Ak tieto možnosti z akéhokoľvek dôvodu nevyhovujú, môžete kontaktovať vývojárov: za malý príplatok ponúknu upravenú verziu.

mindrunway.ru

PaintPack je v skutočnosti malé puzdro, ku ktorému sú na oboch stranách pripojené odnímateľné LED pásy. Krabička s náplňou nesie indikátory a napájací konektor, ako aj microUSB pre pripojenie k PC. K dispozícii je tiež hlavný konektor (proprietárny) pre sériové pripojenie dve zariadenia.

Telo zariadenia je umiestnené na zadnej strane televízora alebo monitora. Potom sa v súlade s pokynmi položia pásy LED, pripojí sa napájanie a začne sa čarodejníctvo. Pri pripájaní PaintPack k počítaču cez USB konektor je potrebné nainštalovať ovládače a nakonfigurovať zariadenie v pribalenom programe.


mysku.ru

Konfigurácia sa vykonáva pomocou balíka AmbiBox. Musíte prejsť do ponuky "Inteligentné podsvietenie", vybrať metódu snímania obrazovky a jeden z prevádzkových režimov ponúkaných v programe:

  1. Statické pozadie - je nastavená ľubovoľná farba, reguluje sa žiara LED.
  2. Farebná hudba - podsvietenie bude blikať súčasne so zvukom hudby. Farba podsvietenia je nastavená na zeleno-žltú.
  3. Dynamické pozadie - plynulý prechod jednej farby do druhej.
  4. Snímanie obrazovky je hlavným režimom prevádzky.

V tomto režime môžete zachytiť farby z filmov a hier, ktoré sledujete. Farba podsvietenia sa bude meniť podľa obrazu na obrazovke, rozdelená na hornú, spodnú a bočnú zónu (každá samostatne).

PaintPack funguje o niečo pomalšie ako oficiálny analóg od spoločnosti Philips. Ale vzhľadom na rozdiel v nákladoch a možnosti upgradovať akékoľvek zariadenie je voľba zrejmá.

V tomto návode sa naučíme, ako si vytvoriť svoj vlastný ambilight pre TV pomocou Arduino Nano.

Majte na pamäti, že Embilight Arduino bude fungovať iba na počítačoch s softvér Bambilight (stiahnite si knižnicu na GitHub).

Budete potrebovať nasledujúce komponenty:

  • Individuálne adresovateľný RGB LED pásik
  • Malá vývojová doska
  • Viacero káblov
  • 12V DC napájací adaptér
  • Obojstranná lepiaca páska
  • 4-5 sponiek
  • Plastové obláčiky na drôty

Krok 2. Testovanie LED pásika

Bude frustrujúce, ak najskôr nainštalujete pásku do televízora, ale potom si uvedomíte, že jedna LED dióda nefunguje a musíte pásku odstrániť a začať odznova.

Preto je dobré prispájkovať nejaké dočasné vodiče na váš LED pásik a otestovať ho pomocou Arduina, napájacieho adaptéra a súboru .ino (môžete si ho stiahnuť v ďalších krokoch). Stiahnite si .ino do svojho Arduina. Tu zatiaľ nemusíte nič konfigurovať. Mali by ste vidieť zmenu niekoľkých farieb LED pásika.

Krok 3 Schéma zapojenia

Môžete sa pripojiť led pásik pomocou obrázka vyššie uvedeného v tomto kroku.

Náš LED pás používa IC WS2811 na samostatné napájanie 3 LED.

Krok 4. Inštalácia funkcie ambilight na váš monitor/TV

Pred nalepením LED pásika Ambilight Arduino na zadnú stranu monitora alebo televízora povrch čo najlepšie očistite. Aby ste sa zbavili prachu, je lepšie použiť vláknitú handričku.

Keď ste si istí, že je povrch čistý, môžete zmerať dĺžku LED pásika tak, že ho podržíte vedľa monitora a odrežete na požadovanú veľkosť. Uistite sa, že pásik na opačnej strane je rovnako dlhý.

Po vyrezaní všetkých segmentov správna veľkosť, môžete ich pripevniť na zadnú stranu monitora. Keďže lepidlo zvyčajne nie je najlepšia možnosť Odporúčame použiť niekoľko kusov obojstrannej pásky.

Dôležité!

Uistite sa, že šípky na LED pásoch smerujú okolo vášho monitora! Ak nie, budete musieť začať odznova!

Keď sú pásky na svojom mieste, môžete ich nainštalovať na zadnú stranu monitora. Nezabudnite to nastaviť pohodlné miesto pretože neskôr budete musieť pripojiť kábel USB k počítaču.

Krok 5: Spájkujte všetku elektroniku

Na spájkovanie LED pásika sme použili niekoľko kancelárskych sponiek, ktoré boli ohnuté a narezané na príslušnú veľkosť. Potom som ich prispájkoval k LED pásikom, aby som ich spojil. Na zabránenie skratu môžete použiť niektoré izolátory, ale to sme v našom prípade nepotrebovali. Aby veci vyzerali trochu lepšie, použili sme fixku, ktorá dala sponkám čiernu farbu.

Teraz pripojte LED pásik k Arduinu pomocou rovnakého obvodu ako v kroku vyššie. Pripojte kábel USB, nainštalujte knižnicu FastLED (stiahnite si na GitHub) a stiahnite si kód z ďalši krok, do vášho Arduina. A potom už len stačí pripojiť napájací adaptér, keďže sme urobili všetku kabeláž.

Krok 6 Skica Arduino Ambilight

Nižšie si môžete stiahnuť alebo skopírovať kód pre naše osvetlenie Arduino Embilight.

#include "FastLED.h" #define NUM_LEDS 38 #define LED_DATA_PIN 3 #define NUM_BYTES(NUM_LEDS*3) // 3 farby #define BRIGHTNESS 100 #define UPDATES_PER_SECOND 100 #define TIMEOUT 30_000 REŽIM #define #define TIMEOUT 30BILIGHT1 #define MODE_ANIMATION; byte MESSAGE_PREAMBLE = ( 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09 ); uint8_t PREAMBLE_LENGTH = 10; uint8_t current_preamble_position = 0; unsigned long last_serial_available = -1L; uint8_t led_counter = 0; uint8_t byte_counter = 0; CRGB LED diódy; bajtová vyrovnávacia pamäť; // Atribúty animácie výplne CRGBPalette16 currentPalette = RainbowColors_p; TBlendType currentBlending = LINEARBLEND; uint8_t startIndex = 0; void setup() ( Serial.begin(115200); FastLED.clear(true); FastLED.addLeds (LED, NUM_LEDS); FastLED.setBrightness(BRIGHTNESS); ) void loop() ( switch (režim) ( case MODE_ANIMATION: fillLEDsFromPaletteColors(); break; case MODE_AMBILIGHT: processIncomingData(); break; ) ) void processIncomingData() ( if (waitForPreamble(TIMEOUT)) ( Serial. readBytes(buffer, NUM_BYTES); /* DEBUG for (int i = 0; i< NUM_BYTES; i++) { Serial.write((char)buffer[i]); } */ while (byte_counter < NUM_BYTES) { byte green = buffer; byte blue = buffer; byte red = buffer; leds = CRGB(red, green, blue); } FastLED.show(); byte_counter = 0; led_counter = 0; } else { mode = MODE_ANIMATION; } } bool waitForPreamble(int timeout) { last_serial_available = millis(); while (current_preamble_position < PREAMBLE_LENGTH) { if (Serial.available() >0) ( last_serial_available = millis(); if (Serial.read() == MESSAGE_PREAMBLE) ( current_preamble_position++; ) else ( current_preamble_position = 0; ) ) if (millis() - last_serial_available > timeout) ( return false; ) _position current_preamble 0; vrátiť true; ) void fillLEDsFromPaletteColors() ( startIndex++; // rýchlosť uint8_t colorIndex = startIndex; for(int i = 0; i< NUM_LEDS; i++) { leds[i] = ColorFromPalette(currentPalette, colorIndex, BRIGHTNESS, currentBlending); colorIndex += 3; } FastLED.delay(1000 / UPDATES_PER_SECOND); if (Serial.available() >0) ( režim = MODE_AMBILIGHT; ) )

Krok 7. Nastavenie softvéru

Otvorte súbor .ino a upravte ho nasledujúce riadky aby zodpovedali vašej situácii:

#define NUM_LEDS 38 // počet LED diód #define BRIGHTNESS 100 // jas

Teraz nahrajte skicu do Arduina. Predtým ste si mali stiahnuť knižnicu Bambilight, ale ak nie, môžete si ju teraz stiahnuť na GitHub.

Otvorte Bambilight.exe nachádzajúci sa v:

[Umiestnenie, kde ste uložili priečinok Bambilight]\Bambilight-master\Bambilight-master\Binary

Teraz si nastavte všetko podľa svojich predstáv a vyskúšajte to pomocou testovacieho videa, ako je toto:

Keď budete s výsledkom spokojní, môžete program Bambilight minimalizovať.

Vo všeobecnosti by ste mali mať taký výsledok práce ambilight podsvietenia pre televízor, ktorý ste vytvorili vlastnými rukami pomocou Arduina. Vezmite popcorn, pepsi a vychutnajte si výsledok.

Dobrý deň.

Pre svoj prvý článok som si vybral jedno z mojich najúspešnejších remesiel: HDMI-passthrough analóg Ambilight od Philips, ďalej budem túto kompozíciu nazývať „Atmosvet“.

Úvod
Nie je veľmi ťažké nájsť na internete hotové / otvorené riešenia a články o tom, ako urobiť Ambilight pre monitor / TV, ak zobrazujete obraz z počítača. Ale v mojom multimediálnom systéme zaberie zobrazenie obrazu na TV z PC len 5% času používania, viac času hrám z herných konzol, čiže som si musel vymyslieť niečo vlastné.
Počiatočné údaje:
Väčšina zariadení používa HDCP na prehrávanie obsahu aj počas hrania hier.
Požiadavka:
Pre Atmosvet je potrebné zabezpečiť centralizovanú podporu pre všetky zariadenia pripojené k TV.
Implementácia
Ako som na TV pripevnil 4,5m LED pásik a čo treba urobiť s Arduinom vám nepoviem, môžete ho použiť ako základňu.

Jediná výhrada:
Všimol som si, že v spodnej časti obrazovky sa vyskytujú zvláštne blikania, najprv som sa pomýlil v signáli, znova som vybral deflátor, zmenil veľkosť obrázka a vykopal kopu iných vecí, zlepšilo sa to, ale blikanie nepomohlo. Začal sa pozerať. Ukázalo sa, že blikanie bolo iba na konci pásky a potom so svetlými scénami. Pomocou multimetra som zmeral napätie na začiatku, v strede a na konci pásky a uhádol príčinu blikania: na začiatku pásky to bolo 4,9 V (áno, čínsky PSU udáva napätie s odchýlkou, toto nie je významný), v strede 4,5 na konci 4,22 - Pokles napätia je príliš výrazný, problém som musel vyriešiť jednoducho - do stredu pásky som priviedol napájanie zo zdroja, drôt sa rozbehol za televízorom . Pomohlo to okamžite, akékoľvek blikanie úplne prestalo.

Zachytenie snímky webovou kamerou
Prvá testovacia verzia na spustenie myšlienky a jej vizualizácie bola vybraná nasnímaním obrázka cez webovú kameru) vyzerala asi takto:

Nízke podanie farieb a vysoká latencia ukázali, že táto implementácia sa nedá nijako využiť.

Snímanie obrazu cez HDMI

V procese výskumu možnosti Nasledujúca schéma bola vybraná ako najspoľahlivejšia a najrozpočtovejšia:

  • Signál zo všetkých zariadení sa privádza do prepínača HDMI 5in-1out, ktorý podporuje HDCP
  • Výstupný signál je privádzaný do 1in-2out HDMI rozbočovača, ktorý nielen podporuje HDCP, ale ho aj vypína na výstupe (vďaka Číňanom).
  • Jeden z výstupných signálov ide do TV
  • Ďalší výstup ide do HDMI na AV prevodník
  • Signál S-Video ide do zachytávacieho boxu ICONBIT
  • Capture box sa pripája k stále fungujúcemu HTCP cez USB, ktoré je pripojené k páskovému ovládaču Arduino na televízore.

Spočiatku to vyzerá divoko a ako barle, ale:

  • Funguje to.
  • Celá vec je celkom, objednávka z Číny ma stála 3-4 tisíc rubľov.

Prečo som nepoužil zachytávaciu dosku HDMI? Je to jednoduché: najviac lacná možnosť a dostupný je Blackmagic Intensity Shuttle, ale nedokáže spracovať signál 1080p/60fps, iba 1080p/30fps – čo nie je prijateľné ako Nechcel som znížiť snímkovú frekvenciu, aby som mohol zachytiť obrázok. + toto puzdro stálo okolo 10tis. rubľov. - čo nie je lacné s neznámym výsledkom.

Straty pri konverzii HDMI na S-video sú zanedbateľné pre zachytenie farieb pri rozlíšení 46x26 LED podsvietenia.

Spočiatku som sa pokúšal použiť EasyCap na zachytávanie S-videa (má veľa čínskych variácií), ale podstatou je, že čip, ktorý sa tam používa, je extrémne slabý a nedá sa s ním pracovať pomocou openCV.

Jediným negatívom je, že výstupný signál S-Video obsahoval na okrajoch čierne pruhy, ktoré orezali skutočný obsah (asi 2-5%), výstupný obraz som zo zachytávacej dosky orezal, aby som tieto pruhy odstránil, strata obrazu v týchto oblastiach v praxi neovplyvnili výsledok.

Mäkký
Pre mňa to bola najzaujímavejšia časť, pretože. Strašne nerád sa borím so žehličkami.

Na zachytenie obrázku som použil openCV a najmä jeho obal .NET emgu CV.

Tiež som sa rozhodol nejaké aplikovať rôzne techniky následné spracovanie obrazu a príprava pred odoslaním zoznamu farieb do kontroléra.

Proces spracovania rámu
1. Príjem zachytenej snímky
2. Orežte rám, aby ste odstránili čierne pruhy
Všetko je tu jednoduché:
frame.ROI = new Rectangle(8, 8, frame.Width - 8, frame.Height - 18 - 8);
Orežeme 8 pixelov zhora, 8 sprava a 18 zdola. (Naľavo nie je žiadny pruh)
3. Zmeňte veľkosť rámu na rozlíšenie podsvietenia, nie je potrebné, aby sme so sebou nosili zdravý obraz
Nič zložité, robíme to pomocou openCV:
frame.Resize(LedWidth - 2*LedSideOverEdge,
LedHeight - LedBottomOverEdge - LedTopOverEdge,
INTER.CV_INTER_LINEAR);
Pozorný čitateľ si všimne množstvo premenných. Faktom je, že môj rám TV je dosť veľký, zaberá 1 LED po stranách, 1 hore a 3 dole, takže zmena veľkosti sa vykonáva na LED diódach, ktoré sú priamo oproti displeju a rohy už doplníme neskôr. . Pri zmene veľkosti dostaneme len priemerné farby, ktoré budú musieť mať LED pixely.
4. Mapovanie LED diód z orezaného rámu
Všetko je tu tiež jednoduché, hlúpo prechádzame každou stranou a postupne vypĺňame pole 136 hodnôt farbou LED. Stalo sa tak, že v súčasnosti sú všetky ostatné operácie ľahšie vykonateľné s radom LED ako s rámom, ktorý sa ťažšie spracováva. Pre budúcnosť som tiež pridal parameter „hĺbka“ snímania (počet pixelov od okraja obrazovky, aby som spriemeroval farbu LED), ale v konečnom nastavení sa to ukázalo lepšie bez neho.
5. Vykonajte korekciu farieb (vyváženie bielej / vyváženie farieb)
Steny za televízorom sú vyrobené z dreva, drevo je žlté, takže je potrebné kompenzovať žltosť.
var modrá = 255,0f/(255,0f + modráLevelFloat)*pixelBuffer[k];
var zelená = 255,0f/(255,0f + zelenáLevelFloat)*pixelBuffer;
var red = 255,0f/(255,0f + redLevelFloat)*pixelBuffer;
Vo všeobecnosti som spočiatku bral vyváženie farieb zo zdrojov nejakého open source editora, ale bielu to nezmenilo (biela zostala biela), trochu som zmenil vzorce, preklepol a dostal presne to, čo som potreboval: ak úroveň farebná zložka je negatívna (cháp ako - táto farba chýba), potom pridáme jej intenzitu a naopak. Pre moje steny to fungovalo: RGB (-30,5,85).

Pri korekcii farieb tiež vykonávam vyrovnanie úrovne čiernej (čierna je v RGB približne 13,13,13) jednoduchým odčítaním 13 od každej zložky.

6. Vykonajte desaturáciu (znížte sýtosť obrazu)
Vo finálnom nastavení nepoužívam desaturáciu, ale možno in určitý moment potrebné, v skutočnosti robí farby „pastelovejšími“, ako napríklad Philips Ambilight. Kód nedám, len konvertujeme z RGB -> HSL, znížime zložku Saturation (saturation) a vrátime sa už späť na RGB.
7. Deflecker
Náhodou sa stane, že sa vstupný obrázok „chveje“ – je to dôsledok prevodu do analógový signál ako sa domnievam. Najprv som sa snažil rozhodnúť po svojom, potom som sa pozrel do zdrojov filtra Defleker použitého vo VirtualDub, prepísal ho do C # (bolo to v C ++), uvedomil som si, že to nefunguje, pretože je taký dojem, že zápasí s blikaním medzi rámami, nakoniec som skombinoval svoje riešenie a tento deflátor a dostal som niečo zvláštne, ale fungujúce nad očakávanie. Pôvodný deflovač fungoval len s intenzitou celého rámu, potrebujem to urobiť zvlášť pre každú LED. Pôvodný deflovač porovnával zmenu intenzity ako súčet, lepšie sa mi páči porovnanie dĺžky farebného vektora, pôvodný deflovač porovnával deltu zmeny intenzity oproti predchádzajúcemu rámu, toto nevyhovuje a prerobil som to na priemerná hodnota intenzity v rámci okna predchádzajúcich snímok. A mnoho ďalších drobností, v dôsledku ktorých z počiatočného deflektora zostalo len málo.
Hlavná myšlienka: na základe priemernej intenzity predchádzajúcich snímok upravte aktuálny rámec, ak jeho intenzita nie je vyššia ako určitá prahová hodnota (tento prah mám vo finálnom nastavení 25), ak je prah prekonaný, okno sa resetuje bez úpravy.
Mierne upravený (pre čitateľnosť mimo kontextu) kód môjho defleckera:
Array.Copy(_leds, _ledsStar, _leds.Length); pre (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; ) // Vypočítajte faktor úpravy pre aktuálnu LED. var škála = 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) ( mierka = 1,0f/((priem.+lumSum)/2); var filtr = 0,0f; pre (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; ak (b > max) max = b; dvojité s; if (mierka*max > 255) s = 255,0/max; else s = mierka; r = (int) (s*r); g = (int) (s*g); b = (int) (s*b); // ponechať zvýraznenie 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)); ) ak (sb > _lv) ( k = (sb - _lv)/(double) (255 - _lv); b = (int) ((k*sb) + ((1,0 - k)*b)); ) _leds[i] = Farba .FromArgb(r, g, b); ) /* Fáza dočasného zmäkčenia. */ if (ledChange || _softening == 0) pokračovať; 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; intsum; ak (diffR< _softening) { if (diffR >(_zmäkčenie >> 1)) ( súčet = _leds[i].R + _leds[i].R + _ledsOld[i].R; r = súčet/3; ) ) ak (diffG< _softening) { if (diffG >(_zmäkčenie >> 1)) ( súčet = _leds[i].G + _leds[i].G + _ledsOld[i].G; g = súčet/3; ) ) ak (diffB< _softening) { if (diffB >(_zmäkčenie >> 1)) ( sum = _leds[i].B + _leds[i].B + _ledsOld[i].B; b = sum/3; ) ) _leds[i] = Color.FromArgb(r, g, b); )
Nech _leds je pole LED diód triedy Color, _ledsOld sú hodnoty snímok pred konverziou, LedLumWindow je šírka okna predchádzajúcich snímok, aby som odhadol priemernú zmenu intenzity, v konečnom nastavení som mal okno 100, čo sú približne 3 sekundy pri 30 snímkach za sekundu. _lumData - pole hodnôt intenzity predchádzajúcich snímok.

Nakoniec tento mechanizmus dodal obrazu ešte príjemnejšie neočakávané efekty, je ťažké opísať, ako je vnímaný vizuálne, ale robí ho tmavším tam, kde je to potrebné, a svetlejším tam, kde je to potrebné, ako dynamický kontrast. Cieľ defleckera je široký, nielen eliminovať blikanie, ale aj vo všeobecnosti vyvážiť výstupnú farbu, a to ako v komponentoch, tak aj v čase v rámci okna.

8. Vyhladzovanie LED od susedov.
Vo všeobecnosti sa mi v konečnom nastavení nepáčilo vyhladzovanie a vypol som ho, ale v niektorých prípadoch sa môže hodiť. Tu jednoducho spriemerujeme farbu každej LED cez jej susedov.
var smothDiameter = 2*_smoothRadius + 1; Array.Copy(_leds, _ledsStar, _leds.Length); pre (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 = poz - _ledsOld.Length; ) r += _ledsOld.R; g += _ledsOld.G; b += _ledsOld.B; ) _leds[i] = Color.FromArgb(r/hladkýPriemer, g/hladkýPriemer, b/hladkýPriemer); )
9. Aktuálny stav uložíme tak, aby vlákno odosielajúce paket zachytilo a odoslalo ho do ovládača podsvietenia.
Zámerne som oddelil proces spracovania rámcov a odosielania paketov do radiča: pakety sa posielajú raz v určitom intervale (mám to 40ms) aby arduino spievalo na spracovanie predošlého, pretože častejšie ako 30ms sa dusí, takže Ukázalo sa, že nie sme priamo závislí na snímaní snímkovej frekvencie a nezasahujeme do tohto procesu (a odoslanie paketu tiež stráca čas).
Trochu o arduine
Nemôžete len zobrať a poslať poriadny balík do arduina cez sériu, pretože to presiahne predvolenú vyrovnávaciu pamäť HardwareSerial a stratíte jej koniec.
Toto je vyriešené úplne jednoducho: nastavíme hodnotu veľkosti vyrovnávacej pamäte HardwareSerial na dostatočnú veľkosť, aby sa zmestil celý odosielaný paket s radom farieb, pre mňa je to 410.
UI
Samotný softvér bol implementovaný vo forme vyhrať službu na konfiguráciu všetkých možností + zapnutie/vypnutie som vytvoril webové používateľské rozhranie, ktoré komunikovalo so službou cez webovú službu na službe. Konečné rozhranie na obrazovke mobilného telefónu vyzerá takto:
Výsledok
Výsledkom je, že výsledok splnil všetky očakávania a teraz, keď hrám hry na konzolách, ešte viac sa ponorím do atmosféry hry.

Ako všeobecný výsledok práce som nahral video s prácou atmosféry podľa mojej schémy:

Testovacia ukážka 1: Pacific Rim, bojová scéna v Šanghaji, tento film je dobrý na testovanie a demonštráciu, veľa jasných scén a zábleskov, údery blesku atď.:

Testovacia vzorka 2: Niektoré MLP video uniknuté z YouTube funguje veľmi dobre na testovanie scén s jasnými farbami (páčili sa mi pruhy), ako aj scén s rýchlym tempom (na konci videa môžete vidieť efekt oneskorenia, ktorý je viditeľný iba vo videu, kedy skutočný pohľad nie je to viditeľné, snažil som sa merať oneskorenie na videu - ukázalo sa 10-20 ms):

A nakoniec stojí za zmienku o spotrebe zdrojov z HTPC:
HTPC Mám ASRock Vision 3D na i3, služba atmosféra žerie 5-10% CPU a 32MB RAM.

Ďakujem za pozornosť, naozaj dúfam, že môj článok niekomu pomôže.

  • tutoriál

Videá s pixelovým podsvietením vyzerajú dosť pôsobivo – veľa viacfarebných zábleskov, dynamické odrazy vyzerajú jednoducho skvele a vyzerajú mobilnejšie v porovnaní s inými typmi podobného podsvietenia.
Túžba pracovať s ovládanými svetlami pomocou arduina ma podnietilo vybudovať takýto systém. Ako sa ukázalo, ide o celkom jednoduchú akciu, na ktorú sa celkovo strávilo len niekoľko hodín (v skutočnosti samotná štruktúra trvala 10 minút, zvyšok bol softvér). Podrobnosti o procese montáže a programovania popíšem v tomto článku. Softvér, závery a demo sú priložené.

Hardvér

Pre takéto podsvietenie potrebujeme nasledujúce položky a zariadenia:

Schéma (ak je toto hrdé slovo vhodné na spojenie dvoch produktov so štyrmi vodičmi) je znázornené na obrázku:

Proces montáže je jednoduchý na hanbu. Nemá zmysel to podrobne popisovať (z rovnakého dôvodu neexistujú žiadne fotografie hotového „produktu“ - arduin so štyrmi drôtmi je na internete plný).

  1. Spájkujte všetko, ako je znázornené na obrázku.
  2. Pripojte vodiče k arduinu, pripojte samotné arduino k PC, pripojte napájanie.
  3. Nahrajte skicu do arduina (pozri nižšie), spustite spustiteľný súbor na počítači (pozri aj odkazy na softvér nižšie), nastavte v programe požadovaný COM port.
    Ak používate Windows Vista/7, nezabudnite vypnúť Aero. V opačnom prípade je rýchlosť práce jednoducho žalostná, ako to chápem, problém nízkej rýchlosti snímania obrazovky so zapnutým Aerom neexistuje.
  4. Uistite sa, že všetko funguje, vypnite ho.
    Treba spomenúť, že softvér funguje len v 32-bitovej farbe. Dá sa to ľahko opraviť, ale podľa mňa takáto úprava nemá veľký zmysel.
  5. Pripojte pásku k monitoru. Pásku musíte začať od ľavého dolného rohu po obvode v smere hodinových ručičiek (LN-> LV-> PV-> PN-> LN). Netreba nič strihať, páska sa dobre ohýba takmer kdekoľvek, takže by nemali byť žiadne problémy. Na opravu som použil obojstrannú pásku - páska je veľmi ľahká a to je viac než dosť.
Tým je zostava hotová. Zostáva vypočítať a nastaviť počet pixelov vertikálne a horizontálne a môžete sledovať videá, prehrávať atď. a radovať sa.

Softvérová časť

Softvérová časť pozostáva z dvoch komponentov:
  • Skica pre Arduino;
  • Ovládací program pre PC.
Skica pre Arduino
V arduine musíte vyplniť kód nižšie. Používa sa knižnica SmallUART (ktorá však nie je ničím výnimočným, ak chcete, vystačíte si so štandardnými nástrojmi).
/*** ARDUINO KÓD PRE PIXEL LIGHT ***/ #include #include nepodpísané dlho naposledy; // Časový pás bol naposledy aktualizovaný const unsigned long fadeTimeout = 3000; ////////////////////////////////////////////////// / ////////// // void setup() ( UART_Init(115200); SPI.begin(); SPI.setBitOrder(MSBFIRST); SPI.setDataMode(SPI_MODE0); SPI.setClockDivider(SPI_CLOCK_DIV8); blackoutAll (); delay(1); lastTime = milis(); ) ////////////////////////////////// / //////////////////////// // void loop() ( uint8_t data; UART_SendByte("R"); // Bajt "Sme pripravení " bool valid = false; data = uartRead(valid); if (valid) ( uint16_t pix_num = data * 3; // Celkový počet nasledujúcich bajtov pre (uint16_t i=0; i< pix_num; i++) { data = uartRead(valid); if (!valid) break; SPI.transfer(data); // Transfer byte to SPI } lastTime = millis(); } if (millis() - lastTime >fadeTimeout) blackoutAll(); ) ///////////////////////////////////////////////// / ////////////// vypnúť všetkých možných 256 LED void blackoutAll() ( for (int16_t i = 0; i< 768; i++) SPI.transfer(0); //погасить все пикселы ленты } //////////////////////////////////////////////////////////// // Read byte with timeout unsigned char uartRead(bool& valid) { uint8_t res = 0; valid = false; for (uint8_t i = 0; i < 255; ++i) { // Max timeout 256*10 if(UART_ReadByte(res)) { valid = true; break; } delayMicroseconds(10); } return res; }

Všetko je tu veľmi jednoduché:

  1. Vysielame signál, že sme pripravení prijímať údaje o podsvietení;
  2. Očakávame údaje za krátke časové obdobie;
  3. Ak údaje prišli, potom prvý bajt týchto údajov je počet diód, ktoré sú v prevádzke. Vynásobením 3 (RGB) zistíte počet nasledujúcich bajtov;
  4. Prijaté údaje prepošleme na pásku;
  5. Aktualizujte časovú pečiatku najnovšia aktualizácia páska (je potrebná na vypršanie časového limitu a vymazanie všetkých pixelov pásky).
PC softvér
Zdá sa, že áno riešenia na kľúč za to, ale to, čo som videl, sa mi kategoricky nepáčilo a vo všeobecnosti je to nešportové, márne sa používa arduino. Preto pri žuvaní sendviča bol ľavou nohou napísaný program na zachytenie oblastí obrazovky, ich spracovanie a prenos potrebných údajov na pásku. Celý program s drobmi je dostupný na githube na github.com/sergrt/pixie (nekopať za kód).
Používa sa Qt 5.0.1 - pre zaujímavosť, nie sú zahrnuté žiadne špeciálne veci obsiahnuté v tejto konkrétnej verzii, takže to bude fungovať celkom dobre a posledné 4 úpravy boli vykonané pomocou nových tried, takže teraz je zdrojový kód nekompatibilný s verziou 4. Pokiaľ ide o najviac Svoju zábavu robím pod Windowsom, projekt je na to ako stvorený – Visual Studio 2012, GDI capture alebo DirectX. Poctivo som sa snažil vygenerovať .pro súbory pre Qt Creator, ale tento proces je s novým VS Qt Add-inom strašne zabugovaný, v dôsledku toho tieto súbory nefungovali hneď, nerozumel som. Ale všetko sa dá bez problémov skompilovať pod linuxom, pozri UPD #3.
Nastavenia programu
Hlavným nastavením je určenie počtu LED diód vertikálne a horizontálne, ako aj nastavenie veľkosti snímaných oblastí. Do mojich 22" sa zmestí 10 kusov vertikálne a 17 horizontálne:


Obmedzenie snímkovej frekvencie je rozumné nastaviť okolo hodnoty 30. Hodnota „0“ slúži na to, aby bežal čo najvyššou rýchlosťou.

Musíte tiež správne určiť port na výmenu s Arduino a výmenný kurz. Predvolená rýchlosť v náčrte je 115200:

Na úpravu jasu, prahu odozvy a obmedzovača bola vytvorená samostatná karta „Spracovanie“. Parametre, ktoré sú tam uvedené, sa upravujú v reálnom čase:

Pre uľahčenie práce s programom ho môžete nakonfigurovať tak, aby automaticky spustil zachytávanie pri spustení, ako aj minimalizovať ho do oblasti oznámení.

Trochu o vnútornostiach softvéru pre záujemcov
Hlavnou myšlienkou je spustiť stream, ktorý zachytí oblasti podľa daného mechanizmu, s nastaviteľnými fps, a tieto oblasti prenesie na spracovanie a následný prenos na pásku. Oblasti sú zachytené v súlade s nastaveniami (koho by to napadlo), farba pixelu je určená jednoduchým priemerom troch RGB kanálov príslušnej plochy obrazovky. Voliteľne môžete povoliť (príkazmi preprocesora) konverziu do Lab a jeho spriemerovanie silou, ale tento kus kódu nie je nijako optimalizovaný (prevzatý z internetu), spomaľuje sa, takže je štandardne vypnutý . Navyše niektoré špeciálne výhody Lab nie sú v kontexte tejto úlohy viditeľné, takže to nie je dôvod na smútok.
Oblasti sa spracovávajú vertikálne a horizontálne a na pásku sa posiela sekvencia farieb, ktorá začína od ľavého dolného rohu a potom v smere hodinových ručičiek po obvode (spôsob, akým sme pásku navíjali na monitor pri montáži).
Rýchlosť snímania DirectX je približne rovnaká ako rýchlosť snímania pomocou GDI, napriek tomu, že v prvom prípade je zachytená celá obrazovka av druhom - iba potrebné časti. Pravdepodobne existuje rezerva na optimalizáciu.
Hojné používanie memcpy je primárne spôsobené rýchlosťou práce - všetky ostatné metódy sa ukázali byť v tej či onej miere pomalšie.

Závery a dojmy

Okraj jasu pásky je jednoducho obrovský, čo je dobré - môžete ho použiť, aj keď existujú iné zdroje svetla. V úplnej tme je lepšie posúvať posúvače a robiť to mäkšie. Samotná páska môže dobre slúžiť ako nezávislý zdroj osvetlenia, stačí len prerobiť náčrt.
Myslím, že uhlopriečka monitora / TV nemá malý význam. Čím väčšie, tým lepšie.
Mali by ste tiež nainštalovať obrazovku tak, aby sa v blízkosti nenachádzali žiadne povrchy, od ktorých sa LED diódy odrážajú (v mojom prípade sú to bočné povrchy reproduktorov) - to nie je obzvlášť kritické, ale je lepšie, aby boli ostro vyčnievajúce pixely nie je vôbec vidieť - keďže je medzi nimi slušná vzdialenosť, nie je tým najlepším spôsobom ovplyvňuje obrázok.

Čo sa nám páčilo:
Sledovanie videí a hranie hier s takýmto podsvietením subjektívne zaťažuje oči – mizne ostré zaostrovanie na obraz monitora. Pocit unavených očí príde neskôr, ak to nepreženiete s jasom. Pozeranie videa je prinajmenšom nezvyčajné, na dotvorenie efektu je lepšie to robiť z určitej vzdialenosti.

Čo sa nepáčilo:
K samotnému systému podsvietenia nie sú žiadne špeciálne sťažnosti, ale ako už bolo spomenuté, pre úplnosť potešenia potrebujete správne prostredie - absenciu oslňujúcich plôch, jednotné farebné pozadie za obrazovkou atď. Počas prevádzky sa ukázalo, že dizajnové vylepšenia môjho monitora trochu rušia normálna operácia pásky - predný panel je vyrobený z priehľadného plastu a vyčnieva hore zadný kryt po celom obvode o niekoľko milimetrov, najmä v spodnej časti vystupujúce. Preto aj napriek tomu, že páska je upevnená pomerne ďaleko, na okrajoch tohto panelu sú viditeľné jednotlivé LED diódy. Predpokladám, že sa s tým stretne málokto, no aj tak nech sú informácie dostupné vopred.

Nižšie je video, ako to vyzerá v dynamike. Operátor sa ospravedlňuje za posiaty horizont.

Aby som trochu rozriedil recenzie plaviek, poviem vám o mojich skúsenostiach s vytváraním dynamického podsvietenia pre televízor. dosť na to, aby sa z pižma vytvoril habr
Hlavná časť osvetlenie je stále LED pásik, a tak sa ho rozhodla dať do titulku práve ona. hoci na stavbe sa podieľalo o niečo viac komponentov.

Ak ste už dlho chceli priskrutkovať podsvietenie na televízor inej značky ako Philips, no báli ste sa to vyskúšať, skúste to. je to jednoduchšie, ako to vyzerá.

Pre osivo krátke video výsledok.


IN tento moment- podsvietenie funguje ešte chladnejšie - v nastaveniach som nastavil vyšší jas a vyššiu obnovovaciu frekvenciu, teraz v akčných filmoch alebo scénach v klube (keď je v zábere záblesk) - celá stena len exploduje svetlom

Ako na to je celkom jednoduché:
+
+
+
trochu odvahy =
Ambilight

Viac podrobností o bodoch:
1 Už vtedy som mal malinovku. Kúpil som to tam na Amazone, ale myslím, že pôvod tu úlohu nehrá - doska je zjednotená a môžete ju kúpiť úplne kdekoľvek - hlavné je, že neodporúčam brať BU. Mám po nejakom čase pracovať na maximálna frekvencia bez ďalších radiátorov sa začalo podglyuchivat. Pripisujem to prehrievaniu, ale môže to byť aj hlúpa výrobná vada. Maliny sú mimoriadne citlivé na zdroj energie - preto sa okamžite zásobte bežným zdrojom s nízkou úrovňou vlnenia ... (a aby sa pri záťaži nepotopil)
2 Samotná páska. Ako to funguje, je podľa mňa celkom dobre vidieť na videu. v samotnej páske nie je nič zvláštne - odrezal som kúsky tak, aby to stačilo presne na 3 okraje TV. Miesta ohybu som zaspájkoval kúskami drôtu (spočiatku som spájal konektormi, ale rýchlo ma rozzúrilo, že kúsky drôtu dlho vytŕčajú - všetko som odrezal a nadpájal na malé kúsky)
3 Brilantný program hyperion. Inštaluje sa na maliny (ako OS mám multimediálny OpenElec) podľa návodu pre tupcov. Dokonca sa mi to podarilo hneď na prvýkrát. V procese práce - hlúpo zachytáva farebné údaje okrajov obrazovky, priemeruje a posiela riadiace signály na pásik LED. Páska žmurká všetkými farbami dúhy, publikum sa teší. V procese hrania fullHD s hmotnosťou 30 giga je dodatočná záťaž na percentá 5-10%. Nijako neovplyvňuje rýchlosť.

Výsledok presahuje najdivokejšie očakávania:
pri hustote LED 30 ton na meter je celá stena za televízorom (vzdialenosť cca 10-15 centimetrov) zafarbená do farieb obrazovky. vizuálne sa scéna vzďaľuje... no, nakoľko je tu práve táto stena. žiadne oneskorenie prenosu. prinajmenšom nemožné sledovať okom. všetko je hladké a jasné. Pre smartfón je cool program pomocou ktorého môžete prepnúť podsvietenie do režimu lounge - nastaviť požadovanú farbu \ jas, alebo spustiť niektorý z navrhnutých vzorov (napríklad bežiace červené svetlo, alebo len dúhu, alebo napríklad farebné prechody).
Keď je pri sledovaní karikatúr vypnuté podsvietenie, dcéra je rozhorčená a žiada vrátiť všetko späť.)))

Aby sme dodržali zásady MySKU, samotná kontrola podrobností:
LED pásik - mnohokrát recenzovaný. Dostal som presne ten istý. Veľmi dobre. kvalita je vynikajúca. zobrazuje, ak ma pamäť neklame - 16 miliónov odtieňov. nepočítal presne. vyžaduje doplnkové jedlo- zavesené plus mínus na bloku 5v 2A - 2 metre sú viac než dosť. Myslím, že na 3 to bude stačiť, ale nezaručím. Ovládacie kontakty som doniesol na GPIO malinovku.

Malinka- jednodoskový počítač. Neprehliadnuteľné len pre lenivcov. Skvelá vec na učenie sa základov Linuxu a na vybudovanie minimalistického a flexibilného mediálneho centra. Ukázalo sa, že je to pre mňa ideálna možnosť: roluje cez akýkoľvek obsah, ktorý mám k dispozícii, funguje ako internetový televízny prijímač-indikátor, vydáva sa za prijímač signálu AirPlay, keď chcem niečo spustiť z telefónu alebo notebooku. Skvelá vec - 3 watty a veľa zábavy + podpora HDMI CEC hneď po vybalení - všetko sa ovláda z natívneho diaľkového ovládača televízora.

A na záver doplňujúce video:

Pred pár dňami som sa rozhodol urobiť ďalšie demovidos, už v novom byte.

farba steny je pistáciová, nastavenia som nemenil a ani nebudem. takže farby sú trochu zelené. Páči sa mi to, ale je mi jedno, čo si myslíš

Plánujem kúpiť +69 Pridať do obľúbených Páčila sa recenzia +16 +48