Projekt na weekend - lampka nocna sterowana pilotem

diy avr 2018-11-25, 22:11,

Długie, zimowe wieczory czy dzień, który jeszcze się nie zaczął a już robi się ciemno to jeszcze nie powód, by nic twórczego nie dało się zrobić ;-).

A jeżeli w okolicy leży ATtiny85, Neopixel Ring? Wystarczy dołożyć do nich kilka elementów pasywnych, odbiornik podczerwieni i można przerobić starą, nudną lampkę nocną na coś znacznie ciekawszego.

Co potrzebne?

Do złożenia układu potrzebne będą następujące elementy:

  • ATtiny85
  • Odbiornik IR TSOP38438
  • Neopixel Ring 24-led
  • Kondensatory 0,1uF i 470uF
  • Opcjonalnie rezystor 1k
  • Kawałek płytki
  • Złącza do przewodów

Wgranie oprogramowania

Przed wlutowaniem procesora (ewentualnie włożeniu go w podstawkę) trzeba zaprogramować go do pracy z wewnętrznym oscylatorem RC, ustawionym na 8 MHz (flaga CLKDIV8 wyłączona). Cały kod znajduje się na GitHubie. Potrzebne będzie Atmel Studio 7.0, a do zaprogramowania można użyć np. STK500.

https://github.com/sergiusz-roszczyk/ledmoodlamp

Montaż

Całość łączymy wg poniższego schematu. Projekt zakłada wykorzystanie przerwań do dekodowania sygnału z pilota podczerwieni w standardzie SIRC (od TV Sony), więc odbiornik IR ląduje na porcie PB2 (INT0), dzięki czemu możliwe będzie wykrycie opadającego zbocza sygnału pilota.

Do portu PB0 podłączamy linię DATA z pierścienia NeoPixel. Jeżeli przewód jest dłuższy niż kilkanaście centymetrów warto dodać szeregowo nieduży rezystor.

Pozostałe elementy to już formalność, czyli zasilanie do poszczególnych elementów oraz kondensatory. Większy elektrolit ląduje przy złączu zasilania (uwaga na polaryzację!!), mniejszy jak najbliżej linii zasilania mikrokontrolera.

Całość montujemy w lampce, używając do tego np. taśmy dwustronnej. Ja swój układ dodatkowo zabezpieczyłem od spodu klejem uniwersalnym, izolując spód płytki od czynników zewnętrznych.

NeoPixel Ring ma dwie małe dziurki w płytce. Mieści się w nich przewód 0,5mm i oprócz doklejenia gumowych nóżek od spodu ringu to właśnie drucik i dwa otwory posłużyły mi do skutecznego przywiązania pierścienia do lampki. Czarna izolacja osłania śruby, które potencjalnie mogłyby stanowić źródło zwarcia. Sam układ sterujący wylądował od spodu lampki, tak by odbiornik IR mógł odebrać sygnał pilota.

Jak działa oprogramowanie?

Oprogramowanie składa się z trzech głównych bloków funkcjonalnych. Komponentu odpowiedzialnego za dekodowanie sygnału pilota TV (w tym przypadku standard Sony), sterowanie diodami LED, wyświetlanie efektów oraz moduł główny, który zarządza całością.

Dekodowanie SIRC

Protokół SIRC może być dekodowany na kilka sposobów. Dla uproszczenia (w tym projekcie istotne były skromne zasoby ATtiny oraz 4 przyciski na pilocie) przyjąłem, że ramka odebrana z pilota jest po prostu kilkunastobitowym (12, 15, 20) słowem, bez wnikania w kod urządzenia i kod polecenia. Założyłem też, że ostatni bit mogę zawsze odczytywać jako 1. Uprościło to znacząco algorytm.

Przy takim podejściu można przyjąć, że protokół składa się z sygnału początku transmisji, o długości 2,4ms, a następie ciągu zer (0,6ms) i jedynek (1,2ms) oddzielonych od siebie przerwą długości 0,6ms. Specyfikacja tego nie mówi wprost, ale przyjąłem, że jeśli od poprzedniego zbocza minęło 1,8ms to mam do czynienia z jedynką, a jeśli 1,2ms to z zerem.

Przy takim podejściu problemem staje się ostatni bit, gdyż nie ma tam żadnego zbocza do wykrycia. Stąd milczące założenie, że po przekręceniu się licznika przyjmuję ostatni bit jako 1.

Do pomiaru czasu wykorzystałem Timer0, pracujący z dzielnikiem 1/256 (czyli 31250 razy na sekundę) i na tej podstawie wyznaczyłem tolerancję poszczególnych symboli. Ich definicja znajduje się w pliku sirc.h. Po odebraniu kodu jego wartość ustawiana jest w zmiennej sirc_code, a flaga stanu odbiornika ustawiana jest na SIRC_PACKET_RECEIVED, co umożliwia aplikacji przetworzenie polecenia. W celu wyeliminowania odbioru kolejnych kodów w aplikacji dodane jest 200ms opóźnienia po przetworzeniu komendy.

Kolory i efekty

Wybór koloru następuje z predefiniowanej tablicy 27 kombinacji kolorów. Wybrane wartości RGB (z zakresu 0 - 255) przepuszczane są przez tablice korekty gamma, dzięki czemu przejścia kolorów są dla ludzkiego oka bardziej liniowe, a balans kolorów zachowany jest w całym zakresie barw. Zwykłe diody RGB mają bowiem to do siebie, że kolor niebieski jest dominujący i biel wcale nie jest biała, a pośrednie kolory są przekłamane. Ograniczając maksymalną wartość koloru niebieskiego o ponad 40% i częściowo zielonego możliwe jest uzyskanie dużo bardziej przyjemnej palety barw.

Źródłem kodu efektów była strona Tweaking4All, na której zgromadzony jest kod różnych efektów świetlnych, które można zaaplikować na pasku LED. Ja wybrałem kilka z nich, można obejrzeć je na poniższym filmie. W źródłach aplikacji dostosowałem w nich rozmiar liter w nazwach zmiennych i funkcji, typy danych oraz parametry tak, by współpracowały z ATtiny85 oraz kompilatorem C, bez bibliotek Arduino.

Funkcje pilota

Inspiracją do wyboru akurat takiego a nie innego pilota był fakt, że telegazeta u nas w kraju praktycznie umarła i te 4 przyciski nie są w ogóle używane na pilocie. A skoro tak, to można im było dać drugie życie i przypisać następujące funkcje lampki:

  • Czerwony - włączanie i wyłączanie
  • Zielony - zmiana między stałym kolorem a efektami świetlnymi
  • Żółty - wybór koloru
  • Niebieski - wybór efektu

Efekt końcowy

Po dwóch dniach pracy, jednym poświęconym sprzętowi, drugim poświęconym oprogramowaniu mogłem dać drugie życie lampce, która teraz jest nie tylko źródłem normalnego światła, ale może być także źródłem nastrojowego światła na zimowe wieczory, a do tego jest zdalnie sterowana. W razie awarii może być także zasilana z power banka. Przy najciemniejszym ustawieniu i najtańszym power banku może zapewnić 15 - 20 godzin świecenia. W najsilniejszym trybie, gdy pobiera ponad 600 mA można przyjąć godzinę świecenia na każde 1000 mAh pojemności akumulatora.

Lubię takie projekty, szczególnie za to, że z 6 elementów i paru linii kodu można uzyskać fajne rzeczy, które działają i nie potrzeba poświęcać im zbyt wiele czasu ani późniejszej obsługi.

Komentarze