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)