`

Ambilampka

Philips montuje w niektórych modelach swoich telewizorów system Ambilight. Jest to system oświetlania ściany za telewizorem w kolorze zbliżonym do dominującego koloru wyświetlanego obrazu. Warto tu dodać, że wyposażone w to udoskonalenie są tylko droższe modele telewizorów. Okazuje się jednak, że użytkownicy komputerów mogą liczyć na dość tanią alternatywę.
Istnieje projekt nazwany Momolight. Jest to w zasadzie to samo.
Składa się ze:

  • Sprzętu. Jest to mikrokontroler PIC, komunikujący się z PC za pomocą łącza szeregowego
  • Oprogramowania na PC. Jest specjalny filtr do odtwarzaczy, momolight.ax. Jest też programik Boblight, działa cały czas niezależnie od tego, czy oglądamy film czy robimy cokoliwek innego
  • Sterownika "mocy". Element ten steruje intensywnością świecenia poszczególnych barw za pomocą impulsów PWM z procesora.

W końcu wpadłem na pomysł jak wykonać ten projekt w jakiejś zwartej formie. Jak widac wykorzystałem lampkę biurkową i przerobiłem na nieco ciekawsze urządzenie. Co w środku:

  • dioda RGB 3W (kazdy kolor o ok 1W). chodzi o to, żeby swieciło na tyle mocno, na ile się da w rozsądnych kosztach.
  • czujnik pilota RC5.
  • i... gniazdko USB

Oto kilka zdjęć:

Budowa
Projekt Momolight jest bardzo ciekawy i na oko niezbyt skomplikowamy. Ale ma kilka wad. Po pierwsze procesor PIC - trzeba koniecznie miec jakiś PICowy programator. Do tego nie ma żadnej dokumentacji, jak to działa, zatem ciężko to przerobić na inny procesor. Sam, jak widac po moich projektach, robię głównie na AVRach. Kolejna sprawa to łącze szeregowe. Wymaga to posiadania wolnego portu COM, co jest obecnie rzadkością, oraz zastosowania układu MAX232 + kondensatory, albo innego bufora dostosowującego poziomy stanów logicznych. Jest to kłopotliwe - czemu nie USB?
Uzbrojony w takie założenia usiadłem do pracy. Po pierwsze należało "rozgryźć" protokół. Jako, że transisja szeregowa to tylko ciąg bitów, postanowiłem go podejrzeć. Posłużył mi do tego drugi komputer z Hyperterminalem. Dysponowałem informacją, że jest to transmisja 9600bps. System obejmuje 3 lampy (góra, lewa, prawa), każda po 3 kolory (RGB). Okazało się, że dane napływają w dziewięciobajtowych pakietach. Programem Momotest mogłem przesac różne kombinacje kolorów. Bajty wpakiecie oznaczają natężenie barwy od 0 do 255, pozycja bajtu - konkretną Pierwsze 3 bajty to barwa czerwona lamp prawej, górnej lewej, kolejne zielona, ostatnie 3 niebieska. Już sporo wiedziałem. Ale nie było żadnej synchronizacji, synchronizacja odbywała się tylko poprzez zależności czasowe.
Do wyjaśnienia tej kwestii posłużyła mi ATmega16 z timerem i JTAGem. Po chwili wiedzialem już: pakiet 9 bajtów, 30ms przerwy.
Skonstruowałem na szybko więc prototyp. Procesor ATmega16 dekoduje tylko jeden kanał, dla górnej lampy. Posłużyła mi dioda RGB, identyczna jak użyta w lampce.
Jeśli chodzi o interfejs USB to kawałek kabla od teleofnu (Nokia 2610). Kable te zawierają konweter PL2303. Wystarczyło go wypruć. Windows widzi nam COMa, atmega widzi UART i wszystko gra. Tutaj uwaga. Te kabelki chodzą na 3,3V, ale wolno podac tam 5 jako stan wysoki. ATmega zasilana z 5V nie ma problemu z poprawną interpretacją stanu.

Zdjęcia działającego prototypu:

Działanie
Lampka po pierwsze sterowana jest pilotem. Można za jego pomoca ustawic raz pewien kolor swiecenia odpowiednio zmieniając natężenie składowych. Jest tryb stroboskopu, oraz kilka trybów płynnej zmiany barwy. Po wciśnieciu '5' na pilocie lampka przechodzi w tryb sterowania z USB. Wtyk, który widac na zdjeciu to kawalek kabla od telefonu komórkowego z zaszytym PL2303 (jak wyżej wspomniałem). Dlatego do połączenia należy stosowac kabel typu "przedłużacz". Jest to niewielka niedogodność w zamian za cenę takiego konwertera, który kupimy juz za kilka zł.

Ponizej schemat, jest bardzo prosty:

Sterownik zmontowany na płytce uniwersalnej:

Plik:
Tutaj można pobrać projekt w AVR Studio z kodem i wsadem do urządzenia. Częstotliwość pracy ATmegi - 1MHz.

Taki układ wraz z załączonym kodem zapewni nam działanie lampy górnej. Aby dekodować inne lampy, trzeba postąpić analogicznie, jak to jest opisane w projekcie prototypu Ambilight. trzeba wyedytować fragment kodu:

{
 OCR1A = ramka[1];
 OCR1B = ramka[4];
 OCR0 = ramka[7];
}

Aby dekodować lampę lewą liczby 1, 4, 7 zamieniamy na 0, 3, 6. A dla lampy prawej oczywiście: 2, 5, 8. I tyle. Jeśli chcemy dekodowac wszystkie trzy, najprościej powielić układ.

A tutaj prezentacja nakręcona na szybko aparatem: