The LiveLight

Updated English article is available at https://www.henrirantanen.fi/2017/04/22/the-livelight-project/

[size=150]Johdanto[/size]

Tein ammattikoulun päättötyönäni dynaamisen taustavalaistusjärjestelmän televisiooni kun en halunnut ostaa kallista mutta huonokuvaista “ambilight televisiota”, lopputuloksesta tuli paljon odotettua parempi ja päätin sitten jakaa suunnitelmani muiden ruuvipenkkiläisten kanssa!

Kyseessä on siis erillinen “ambilight” järjestelmä, joka sopii esimerkiksi television tai PC:n näytön taakse. Valaistuksen väri mukailee tarkkaan ruudulla esitettäviä värejä eikä siksi aktiivisuudestaan huolimatta häiritse katsojaa.

Järjestelmän etuja:

  • Vähentää silmien rasitusta (silmän iiriksen pumppausliike) pimeässä katseltaessa
  • Vähentää LCD elementin valovuotojen näkymistä
  • Parantaa huomattavasti näytön kontrastivaikutelmaa
  • Suurentaa näytön kokovaikutelmaa
  • Miellyttävämpi katselukokoemus

Ohjelmiston olen todennut toimivan Windows XP:ssä, Windows Vistassa ja Windows 7:ssä. Boblight löytyy myös Linuxille. Uudemmissa Windowseissa on poistettava käytöstä AERO jotta ohjelmisto toimii oikein. Oma käyttökohteeni on HTPC jossa pyörii karsittu XP.

Edit: 10.2017: Windows 10 + Kodi + AmbiBox + Kodi Plugin toimii samalla raudalla kuin rasvattu


[size=85]LED-nauhojen kytkennän sekä kanavajärjestyksen oikeellisuuden testaus[/size]

[size=150]Video[/size]


[size=85]Linkki projektin Youtube- videoon.[/size]

[size=150]Toimintaperiaate[/size]

Koko järjestelmän toiminta perustuu Boblight- nimiseen ohjelmaan, joka laskee tietokoneen näytöltä määriteltyjen alueiden keskivärit ja lähettää ne peräkkäisinä RGB arvoina sarjaportin kautta valo-ohjaimelle. Ohjainpurkki taas vastaanottaa RGB arvot ja säätää niiden mukaan 27 eri kanavan PWM lähtöjen pulssisuhdetta. Tiedonsiirtoon tietokoneen ja ohjaimen välillä käytetään FTDI:n valmistamaa FT232RL konvertteripiiriä, joka näkyy tietokoneella virtuaalisarjaporttina. FT232RL piiri kommunikoi UART väylän kautta ATmega32 mikrokontrollerin kanssa mikä hoitaa viiveet sekä PWM rutiinit.


[size=85]Järjestelmän yksinkertaistettu lohkokaavio.[/size]

[size=150]LiveLight USB interface[/size]

LiveLight USB Interface on LiveLight järjestelmän valo-ohjain jolla LED nauhat kytketään tietokoneeseen. Ohjain ohjaa LED-nauhoja päälle ja pois käyttäen korkeataajuista pulssileveysmodulaatiota. Ohjain kytketään tietokoneeseen käyttäen USB2.0 väylää. Laitteen molemmat prosessorit saavat käyttöjännitteensä USB väylän kautta jolloin “ulkoista” käyttöjännitettä ei tarvitse syöttää kuin LED nauhoille. Sisääntulojännite voi olla 3-20V välillä. Itse käytän oman järjestelmäni virtalähteenä 12VDC 4,5A poweria (54W) vaikka televisioni takana on vain vajaa 17W LED-nauhaa. LED-nauhat on liimattu televisioni taakse omalla tarrallaan, valo-ohjain on kiinnitetty Velcro teipeillä jotta se on helposti irroitettavissa esimerkiksi uudelleen ohjelmointia varten.


[size=85]Valmis laite kytkettynä LED nauhoihin. Kotelon tekstit on jyrsitty piirilevyjyrsimellä.[/size]

Laitteen prosessori käyttää 14.7456MHz kidettä joka on nopein prosessorin tukema kide, jonka taajuus jakautuu 0,0% virheellä eri BAUD nopeuksiksi. Tämä on tiedonsiirron virheettömyyden vuoksi tärkeää.


[size=85]Laitteen prosessorit on kaikkien muiden osien ohessa juotettu käsin lankatinalla (Sn 60%, Pb 40%)[/size]


[size=85]Laite avattuna. Suurempi kuva klikkaamalla (Latautumista saatkin odotella, kuva 6.7Mpix)[/size]

LED-nauhat kytketään valo-ohjaimeen miniUSB-B liittimillä. MiniUSB valittiin liittimeksi sen alhaisen hinnan, pienen koon sekä RGB LED-nauhalle sopivan 4-pinnisen rakenteen takia. Valinnan ainoa huono puoli on se, että mikäli laitteeseen kytketään käyttöjännite ja LED lähdöstä kytketään johto tietokoneeseen, rikkoo se toidennäköisesti tietokoneesta emolevyn USB ohjaimen.

[size=150]FTDI FT232[/size]

FT232RL on FTDI:n valmistama USB-UART välinen muunninpiiri, erittäin yksinkertainen ja helppo tapa rakennella omia USB laitteita. Piiri ilmestyy tietokoneen laitehallintaan COM porttina. Kun kirjoitat jostakin ohjelmasta tietoa COM porttiin tulee se piirin TX pinnistä ulos asetetulla BAUD nopeudella. Piirin ulostulo on jännitteeltään TTL tasoa eli siis 0-5V välillä. Tämän ansiosta ulostulo ja sisääntulo on käytettävissä suoraan mikrokontrollerin RX ja TX pinneillä ilman erillisiä komponentteja!

Piirillä on myös ohjelmoitava EEPROM muisi jonne voi askarrella mieleisensä VID:n eli valmistaja- tiedon sekä PID:n eli tuotetiedon. Oman laitteeni nimeksi ohjelmoin “LiveLight USB Interface” ja valmistajaksi oman nimeni.


[size=85]Windows tunnisti laitteen ohjelmoimillani tiedoilla ennenkuin ehdin asentaa edes FTDI:n ajurit![/size]

Tietojen ohjelmointi onnistuu kätevästi valmiiseen laitteeseen USB yhteyden yli käyttäen joko FTDI:n omaa ohjelmaa tai esimerkiksi Dangerous Prototypesin PirateRenamea.
Linkki piirin datalehdelle

[size=150]Piirilevy[/size]

Suunnittelin laitteen piirilevyn Labcenterin Proteus ohjelmistopaketilla piirilevyjyrsimelle sopivaksi. Levyssä on globaali 0,2mm eristeväli [size=50](oikein mukava kolvailla)[/size]. Piirilevy on suunniteltu mahtumaan Hammond Mfg:n halpaan mutta käytännölliseen 1591AFLBK koteloon, toleransseja on korkeintaan 0,5mm suunnassaan. Levyn tähän vaiheeseen saaminen otti pari viikkoa aikaa ja yhteensä 16 prototyyppiä.

Piirilevyn kasaamiseen pyörähti kokeneeltakin muutama tunti:

  • Levyn koko 9.3cm x 4,3cm
  • 152 komponenttia
  • 426 juotettavaa pinniä
  • 45 läpivientiä
  • 104 reikää
  • 199,4cm johdinta


[size=85]Valo-ohjaimen piirilevy on mallennettu Proteuksella.[/size]


[size=85]Piirilevy päältä[/size]


[size=85]Piirilevy alta, ylhäältä piirilevyn läpi katsottuna[/size]


[size=85]Kotelon reijät on tehty kirurgiveitsellä ja viilalla, pyöreä reikä lexan-poralla. Siistiä suomalaista käsityötä![/size]

[size=150]Lähdekoodi[/size]

Koskee ohjelmistoversiota 1.3! V2.0 tulossa pian!
Kirjoitin lähdekoodin laitteelleni joka toimii mielestäni muutamaa bugia lukuunottamatta mainiosti. Kerron tässä kohtaa ohjelmani toiminnan mikäli se auttaisi ymmärtämään koodin toimintaa.

Pääohjelma (main(void))
Pääohjelma pitää sisällään kutsun suorittaa laitteen alustukset sekä asettaa käynnistyksen yhteydessä vasemmat ja oikeat sivukanavat punaisiksi. Pääohjelma terminoituu pyörimään tyhjään while(1) looppiin jossa kaikki toiminnot suoritetaan erilaisilla keskeytyksillä.

UART vastaanottokeskeytys ISR(USART_RXC_vect)
Mikrokontrolleri ajaa tämän ohjelmapätkän aina kun UART vastaanottimelle on ilmestynyt uusi merkki. Ohjelmapätkä nollaa laitteen “sammutusajastimen” (TIMER0) ja lukee sen jälkeen saapuneen datan UART muistista vastaanottopuskuriin (rxBuffer[x]).

Tämän jälkeen ohjelma tarkastaa onko vastaanottopuskurin ensimmäinen merkki 0xAA eli 170. Jos ensimmäinen, joka kerta lähetettävä ns. otsikkobitti (PREFIX) on kohdallaan, on vastaanotettu data todennäköisesti oikein ja arvo siirretään vastaanottopuskurista kanavan PWM pulssisuhteen arvoksi (channel[x]) käyttäen maksimi muutoksena globaalia viivemäärittelyä (LATENCY). Jos taas otsikkobitti ei ole se mitä pitäisi, aloitetaan datan vastaanottaminen alusta (hylätään siis kyseisen syötteen loppu data ennen seuraavaa otsikkobittiä). UART keskeytyksessä sallitaan lisäksi ehkä kielletty TIMER0 keskeytys.

TIMER0 Ajastimen ylivuotokeskeytys (ISR(TIMER0_OVF_vect))
Tämä ohjelmapätkä ajetaan noin 18ms välein. Ohjelma kasvattaa sammutusviivelaskinta (NoInputCounter) ja hylkää sen hetkisen saapuneen datan nollaamalla otsikkobitin vastaanottopuskurista (rxBuffer[0] = 0;). Tämä tehdään siksi että voidaan myöhemmin verrata saapuuko puskuriin enää uutta dataa.

Mikäli viivelaskinmen arvo ylittää alun määrittelyissä asetetun ShutDownDelayn arvon, nollataan laskuri, kielletään TIMER0 keskeytys, himmennetään taustavalot pois ja sytytetään reunoille punaiset ledit. Laite asetetaan siis “seisovaan tilaan”. Mikäli ShutDownDelay on määritelty numeroksi 10, alkaa “sammutusrutiini” 0,18 sekunnin päästä siitä kun viimeinen data on vastaanotettu.

TIMER2 Ajastimen ylivuotokeskeytys (ISR(TIMER2_OVF_vect))
TIMER2 ajastin sisältää kutsun PWMswitch() funktioon, joka pitää sisällään ohjelmallisen PWM:än vaatimat 27 If ja else lausetta kanavien kytkemiseksi päälle ja pois. Sen lisäksi ajastinkeskeytyksessä määritellään ajastimen uusi aloituskohta käyttäen TCNT2 rekisteriä. Olen todennut silmälle parhaimmaksi nopeimman toimivan arvon, 250. PWM taajuutta voidaan pudottaa laskemalla tätä arvoa, esimerkiksi kuvasin youtube videon käyttäen arvona 166 jolloin taajuus ei mene kameran kuvataajuuden kanssa ristiin.

PWM kytkinfunktio PWMswitch(void)
Funktio sisältää yksinkertaisesti 27 reillistä if- lausetta peräkkäin. Kanavan pulssisuhteen arvoa channel[x] verrataan sen hetkiseen PWM indeksimuuttujaan, sytytetään tai sammutetaan kulloinkin voimassa olevan arvon mukaisesti. Funktion lopussa PWM indeksiä kasvatetaan yhdellä. Mikäli indeksin arvo ylittää 255, pyörähtää se muuttujatyypilleen ominaisesti takaisin nollaan. (volatile unsigned char). Näin saadaan TIMER2 kanssa riittävän tarkka 27 kanavainen ohjelmallinen PWM ulostulo.

Mikrokontrollerin alustus Initialize(void)
Tämä funktio kutsutaan kerran laitteen käynnistyessä pääohjelmasta ja pitää sisällään määrittelyt ajastimille, UARTin alustuksen, porttien suunta-asetukset, keskeytyksien sallmimisen sekä kutsu sytyttää sivukanaviin punaiset ledit.

Red something of something RedStripes(void)
Funktio yksinkertaisesti feidaa globaalia viivettä (LATENCY) käyttäen LB, LT, RB, ja RT kanavien punaiset LEDit hiljaa päälle, ilmoittamaan siitä että sisään ei tule signaalia. Huomaa että funktio kieltää väliaikaisesti TIMER2 keskeytyksen ja sallii sen lopetettaessaan.

Kaikkien kanavien sammutus FadeOut(void)
No mitä luulet? Keittää kahvit?
Funktio vähentää jokaisesta kanavasta yhden ja ajaa PWM kytkinfunktion läpi. Tämä siis tietenkin himmentää kaikki kanavat mustiksi.

[size=150]Hyviä tiedonlähteitä jatkokehitykseen[/size]

MoMo Light, Ralfke P:n suunnittelema järjestelmä
Philipsin verkkosivut
Maailmanlaajuinen patenttitietokanta
Ambilight 4 PC Foorumi

Kiitokset Tuggelle C-ohjelmoinnin tutoroinnista sekä piirilevyn tarkastamisesta!
Kiitokset myös masalle erinomaisesta C-koodi artikkelista!

LiveLight on kehittämäni avoin, ilmainen projekti. Mikäli kuitenkin haluat tukea uusien laiteversioiden ja piirilevyjen kehitystä, lahjoituksia otetaan vastaan!

Edit 1.10.2017: Linkkejä korjailtu ajantasaisiksi ja lisätty tieto win10 yhteensopivuudesta.
Tässä artikkelissa liittenä olevat tiedostot ovat kehityksessä vanhentuneita mutta toimivat keskenään hyvin. Jos kuitenkin haluat uusimmat tiedostot joista rakennella, ne löytyy täältä.

© Henri Rantanen 4.6.2011, 22.10.2011 ja 1.10.2017
ruuvipenkki.fi
https://www.henrirantanen.fi/2017/04/22/the-livelight-project/
Boblight_for_V5.zip (1.07 MB)
LiveLight_5_Schematic.pdf (243 KB)
LiveLight_5_Parts_List.pdf (41.1 KB)
LiveLight Firmware V2.zip (28.1 KB)
LiveLight_5_PCB.zip (1.8 MB)

Mielenkiintoista ja varmasti sopii hyvin ison (40", ehkä jo 32") television taakse. Isoa (tai edes litteää) telkkaria ei ole, mutta olisi kyllä kiva joskus tehdä jotain tuollaista, pitää tästä ottaa oppia sitten. On selvästi myös nähty vaivaa. Hienoa. :slight_smile:

Miten toteutit kotelon kaiverrukset?

Löysin pienen virheen koodistasi:

if (TOIE0 == 0) { TIMSK |= (1 << TOIE0); // Re-enable TIMER0 interrupt }
TCNT0 on määritetty iom32.h tiedostossa nollaksi eli tämä ehtolause on silloin aina totta. Jos haluat tarkistaa onko ajastimen ylivuotokeskeytys sallittu vai ei, niin ehtolause pitäisi kirjoittaa muotoon:

if(TIMSK & 0x01)

Hyvä huomio, olen aika uusi C ohjelmoinnille joten syntaksi on hukassa…

if (TIMSK & ~0x01) { TIMSK |= (1 << TOIE0); // Re-enable TIMER0 interrupt }[size=85]Korjattu, toimiva koodipätkä[/size]
Laitteen toiminnassa ei tapahtunut muutosta, muutaman softakäynnistyksen jälkeen jumittuu ohjelma edelleen punaisille raidoille. Jossakin kohtaa tiedostiirto rxBufferista Channeliin loppuu (joku kusee otsikkobitin?).

Kotelon kaiverrukset on tehty koulumme kolmiakselisella CNC-piirilevyjyrsimellä, jossa jyrsintäkorkeuden saa säädettyä.

Millaisia LED-nauhoja käytät? Löytyykö niistä kuvaa tai speksejä?

Kaikki järjetelmän komponentit löytyvät komponenttiluettelosta. Itse käytin DealExtremen 6W/m 12V RGB LED-Nauhaa.


[size=85]Vanhan asetelman mukaisesti asetellut LED nauhat, samaa rullatavaraa.[/size]

Todella nätti toteutus! :smiley:

SunWind:n artikkeli pääsi myös Hack a Day:n sivuille.

Moi, olen nähnyt sinun laite Hack a Day. im käyttäen Google Translate niin pahoillani, jos tämä ei ole mitään järkeä.

Olen erittäin kiinnostunut ja haluaisin tietää, jos ne ovat saatavilla ostaa?

Hi! And welcome to the Forum! Unfortunately i do not sell these devices, if you want one you have to build one yourself. All the know-how needed is in here.

Sounds absolutely Great, gotto get me one of these. :slight_smile:
Question: My plans is to use this with Xbmc on Win7_x64, so turning Aero off would have a performance impact to Xbmc’s DXVA2 decoding, perhaps…
Has anynone tested this with h264 / DVD material with Xbmc?

I run XBMC on XP, with no aero ofcourse. XBMC is also running on the youtube video although it’s not shown. I haven’t noticed any change in performance in my WIN7 PC BUT You have to run XBMC on a “full-screen window” (looks the same as full-screen) in order it to work correctly. Otherways it refreshes the light like once per 10 seconds or so. Same apples to few games.

I shut the Aero off on my Win7 SP1 x64 OS running XBMC Dharma+. There seemd to have no performance impact to H264 (1080i) or any other media formats, so This could actually work with my Setup… :slight_smile:

Zotac ID40 HW (SSD & 4GB)
http://pden.zotac.com/index.php?page=shop.product_details&flypage=flypage_images.tpl&product_id=287&category_id=118&option=com_virtuemart&Itemid=1

EDIT: I just got this: “full-screen window”!? In this case I’m sure the performance might suffer a lot… Have to test this. I’m afraid this is not good solution…

EDIT: I just tested Xbmc in Window mode in maximizing view, there were no performance impact: all H264 videos (1080i) played with 0 framedrop, but the problem is that the whole view looks hidious: xbmc got frames like any other windows… This is not good…

Hey, Turn “Use a fullscreen window rather than true fullscreen” option from your XBMC settings ON. AERO has to be disabled for this as well. It gives you a full-screen window that doesn’t have borders, looks the same as regular full screen. This is how i run my XBMC setup. :nerd:

Suunnittelin ja optimoin laitteen piirilevyn tehdastuotantoa varten. Laita YV mikäli haluat yhden. Hintaa levylle tulee arviolta 5€ + kirjepostimaksu. Tilaan koe-erän tehtaalta ja kasaan proton. Mikäli piirilevyssä ei ole sen suurempia virheitä voin alkaa lähetellä niitä.
Ilmoitan foorumilla kun levyjä löytyy hyllytavarana!

Excelent! I talked with Xbmc people forum.xbmc.org/showthread.php?t=103221 about direct support for boblight and I believe something might even be done… I also test the SunWinds suggest about xmbc windows mode again :slight_smile:

I’m consern about the flashing issues involved here: If one is to build this, the chip needs to be flahsed. How and with what? :slight_smile:

There is ISP connector on board so you probably can use any AVR ISP programmer.

You did good! If LiveLight can get native support for XBMC, this thing might take off like crazy! :mrgreen: It would be kick-ass to get a settings menu for LiveLight, no need to reflash every time you want parameters changed…

Programming might be a problem for some, I personally suggest anyone intrested to get AVR ISP MKII. You can flash everything else that is AVR based with this. Other way would be to borrow one from school/friend/fire-department and program something like an arduino bootloader in there. That way you can always re-flash it over the USB.

If XBMC supported Boblight natively, could I use this thing under Linux too? Is there any Linux support currently?

Eli kiinnostaisi miten tuo toimii Linux järjestelmissä, itse olen perinteisesti ollut Ubuntu-käyttäjä ja kiinnostusta on myös Fedoran suuntaan.

Mitä nyt Boblightin googlettaneena voin kertoa että boblight on suunniteltu Linuxille josta se on myöhemmin portattu windnows ympäristöön Cygwinnillä. Siltä varalta ettei tiedonhaku onnistu, tässä vielä linkki Bobin blogin lataussivulle.