Sivu 1/2

The LiveLight

ViestiLähetetty: 4.6.2011, 19:30
Kirjoittaja SunWind
Updated English article is available at www.livelightproject.com!

Johdanto

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.

KuvaKuvaKuva
LED-nauhojen kytkennän sekä kanavajärjestyksen oikeellisuuden testaus

Video

Kuva
Linkki projektin Youtube- videoon.

Toimintaperiaate

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.

Kuva
Järjestelmän yksinkertaistettu lohkokaavio.

LiveLight USB interface

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.

Kuva
Valmis laite kytkettynä LED nauhoihin. Kotelon tekstit on jyrsitty piirilevyjyrsimellä.

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ää.

KuvaKuva
Laitteen prosessorit on kaikkien muiden osien ohessa juotettu käsin lankatinalla (Sn 60%, Pb 40%)


Kuva
Laite avattuna. Suurempi kuva klikkaamalla (Latautumista saatkin odotella, kuva 6.7Mpix)

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.

FTDI FT232

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.

Kuva
Windows tunnisti laitteen ohjelmoimillani tiedoilla ennenkuin ehdin asentaa edes FTDI:n ajurit!

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

Piirilevy

Suunnittelin laitteen piirilevyn Labcenterin Proteus ohjelmistopaketilla piirilevyjyrsimelle sopivaksi. Levyssä on globaali 0,2mm eristeväli (oikein mukava kolvailla). 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
Kuva
Valo-ohjaimen piirilevy on mallennettu Proteuksella.

Kuva
Piirilevy päältä


Kuva
Piirilevy alta, ylhäältä piirilevyn läpi katsottuna


Kuva
Kotelon reijät on tehty kirurgiveitsellä ja viilalla, pyöreä reikä lexan-poralla. Siistiä suomalaista käsityötä!

Lähdekoodi

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.

Hyviä tiedonlähteitä jatkokehitykseen

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!

© Henri Rantanen 4.6.2011 ja 22.10.2011
http://www.ruuvipenkki.fi
http://www.livelightproject.com

Re: The LiveLight

ViestiLähetetty: 4.6.2011, 21:40
Kirjoittaja Tomin
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. :)

Re: The LiveLight

ViestiLähetetty: 5.6.2011, 12:54
Kirjoittaja ATS_
Miten toteutit kotelon kaiverrukset?

Re: The LiveLight

ViestiLähetetty: 5.6.2011, 13:33
Kirjoittaja Andrei
Löysin pienen virheen koodistasi:
Koodi: Valitse kaikki
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:
Koodi: Valitse kaikki
if(TIMSK & 0x01)

Re: The LiveLight

ViestiLähetetty: 5.6.2011, 15:46
Kirjoittaja SunWind
Hyvä huomio, olen aika uusi C ohjelmoinnille joten syntaksi on hukassa...

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

ATS_ kirjoitti:Miten toteutit kotelon kaiverrukset?

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

Re: The LiveLight

ViestiLähetetty: 5.6.2011, 19:08
Kirjoittaja Lauri Jämsä
Millaisia LED-nauhoja käytät? Löytyykö niistä kuvaa tai speksejä?

Re: The LiveLight

ViestiLähetetty: 5.6.2011, 19:49
Kirjoittaja SunWind
Lauri Jämsä kirjoitti: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.

Kuva
Vanhan asetelman mukaisesti asetellut LED nauhat, samaa rullatavaraa.

Re: The LiveLight

ViestiLähetetty: 6.6.2011, 8:11
Kirjoittaja n2o_skillz
Todella nätti toteutus! :D

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

Re: The LiveLight

ViestiLähetetty: 7.6.2011, 2:38
Kirjoittaja lobbster
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?

Re: The LiveLight

ViestiLähetetty: 7.6.2011, 8:41
Kirjoittaja SunWind
lobbster kirjoitti: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.

Re: The LiveLight

ViestiLähetetty: 8.6.2011, 12:00
Kirjoittaja jeremys
Sounds absolutely Great, gotto get me one of these. :)
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?

Re: The LiveLight

ViestiLähetetty: 8.6.2011, 17:56
Kirjoittaja SunWind
jeremys kirjoitti: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.

Re: The LiveLight

ViestiLähetetty: 9.6.2011, 7:34
Kirjoittaja jeremys
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.. :)

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..

Re: The LiveLight

ViestiLähetetty: 12.6.2011, 11:02
Kirjoittaja SunWind
jeremys kirjoitti: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. :geek:

Re: The LiveLight

ViestiLähetetty: 12.6.2011, 18:58
Kirjoittaja SunWind
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!

Kuva

Re: The LiveLight

ViestiLähetetty: 13.6.2011, 8:46
Kirjoittaja jeremys
Excelent! I talked with Xbmc people http://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 :)

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? :)

Re: The LiveLight

ViestiLähetetty: 13.6.2011, 16:32
Kirjoittaja jaripetteri
jeremys kirjoitti: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? :)


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

Re: The LiveLight

ViestiLähetetty: 13.6.2011, 16:33
Kirjoittaja SunWind
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.