Świąteczna gwiazda choinkowa RGB na WS2812b

gwiazdka HSV

Jak co roku święta są już za rogiem, a razem z nimi jeden z ich symboli – choinka. Zawsze staramy się ubrać je jak najładniej, nie zapominając o jej czubku, czyli pięknej gwieździe. Stworzona z ledów rozbłyśnie na różne kolory i pozwoli wyróżnić się na tle zwykłych ozdób.

WS2812b – tęcza kolorów

Pomysł na świąteczną gwiazdę pojawił się przy spojrzeniu na rolkę z paskiem LED, którego zostało mi jeszcze parę metrów. Nie chciałem też komplikować tak prostej rzeczy, a z zastosowaniem pasków wystarczyło je odpowiednio przykleić do wyciętej gwiazdy, podłączyć sterownik i gotowe.

Konstrukcja

Gwiazdka powstała na kawałku białej dykty, którą miałem pod ręką. Jej kształt jest wpisany w koło o średnicy 19cm, co jest idealnym wymiarem na ułożenie pasków w równych odstępach. 

Gwiazdka po wycięciu
Gwiazdka po wycięciu

Oświetlenie składa się z 5 kawałków paska o ilości 60 diod na metr. Na każdym odcinku jest 7 sztuk ledów.

Jak teraz ułożyć te paski? Sprawa nie jest oczywista, gdyby przykleić je na krawędziach konturu, to będą się one na siebie nakładać. Z tego powodu potrzebne będzie wylutowanie po jednej diodzie z każdego paska, na czwartym miejscu.

Po jej usunięciu trzeba jeszcze pamiętać o szynie danych,  bez diody sygnał nie będzie przechodził dalej. Należy połączyć dwa pady tak jak na zdjęciu:

Gotowe pięć pasków led do gwiazdy
Gotowe pięć pasków led

Po przyklejeniu pasków połączyłem je tak jak na poniższych zdjęciach: 

Podłączenie pasków led
Łączenie pasków led
Podłączenie pasków led
Podłączenie pasków led

Na koniec miejsca przecięcia pasków zalałem klejem na gorąco, przez co wyglądają jak jedna całość:

sklejone paski
Sklejone paski

Sterowanie

Najprostszym sterownikiem byłoby arduino, ale chciałem użyć czegoś mniejszego. W moich zapasach znajdowało się sporo układów Attiny13, dla tego też jego użyłem w tym projekcie.

Część elektroniczną wykonałem na płytce prototypowej. Pod mikrokontrolerem znajduje się kawałek taśmy kaptonowej. Jest to podstawowy układ, gdzie oprócz układu scalonego jest kondensator filtrujący zasilanie i rezystor pullupu do resetu.

Sterownik gwiazdy, podłączony do niej
Podłączony do gwiazdy sterownik, razem z przewodami do programowania

Małym problemem okazał się sam program. 64B RAMu jest zbyt małą ilością do pomieszczenia bufora dla 35 diod WS2812.

Z tego powodu wszystkie obliczenia muszą dziać się w locie, gdzie maksymalny czas na nie to 50uS. Powyżej tego czasu dioda nie przepuści paczki danych do następnych, lecz sama odczyta ją jako własny kolor.

Aby uzyskać ciekawe efekty świetlne, najlepiej operować na przestrzeni barw HSV. Niestety czas potrzebny na wykonanie mojej funkcji do konwersji z HSV na RGB to około 70uS. Warto wspomnieć, że ATtiny13 pracuje tutaj na najwyższym taktowaniu dostarczanym przez wewnętrzny oscylator, czyli 9.6Mhz.

Ale… czy wszystkie parametry HSV są tutaj potrzebne? Nasycenie będzie maksymalne, a jasność mogę przecież ustawić na jednym poziomie. Kontrola odcienia będzie w zupełności wystarczająca.

hsv

Na powyższym obrazku przedstawiony jest wykres poszczególnych kolorów w zależności od stopnia odcienia barwy (H od hue w HSV). Jak można zauważyć kolory zmieniają się liniowo przez co przeliczanie wartości jest bardzo proste.

Funkcję uprościłem minimalnie, dla zakresu wejściowego od 0 do 240 (240, ponieważ jest podzielne przez 6), wygląda ona następująco:

inline void hsvToRgb(uint8_t h) {
	if (h < 40) {
		wsBuffer[1] = 240;
		wsBuffer[0] = h * 6;
		wsBuffer[2] = 0;
	} else if (h < 80) {
		wsBuffer[1] = (40 - (h - 40)) * 6;
		wsBuffer[0] = 240;
		wsBuffer[2] = 0;
	} else if (h < 120) {
		wsBuffer[1] = 0;
		wsBuffer[0] = 240;
		wsBuffer[2] = (h - 80) * 6;
	} else if (h < 160) {
		wsBuffer[1] = 0;
		wsBuffer[0] = (40 - (h - 120)) * 6;
		wsBuffer[2] = 240;
	} else if (h < 200) {
		wsBuffer[1] = (h - 160) * 6;
		wsBuffer[0] = 0;
		wsBuffer[2] = 240;
	} else {
		wsBuffer[1] = 240;
		wsBuffer[0] = 0;
		wsBuffer[2] = (40 - (h - 200)) * 6;
	}
}

Czas na jej wykonanie to tylko około 5uS, więc zostaje jeszcze sporo czasu na inne obliczenia.

Czasy
Ramki danych pomiędzy którymi są wykonywane obliczenia

Niestety 1024B pamięci FLASH nie pozwala na pomieszczenie dużej ilości efektów, ale nie zamierzałem robić ich dużo. W zupełności wystarcza mi parę zapętlonych, podstawowych efektów, które i tak robią ogromne wrażenie.

Kompletny kod znajduje się na moim githubie:

https://github.com/leonos2000/avr/tree/master/Gwiazdka_led

Zasilanie i mocowanie

Do zasilania użyłem akumulatora Li-Ion 18650 o pojemności 2Ah. Na jednym ładowaniu starczy na bardzo długo, nawet przy maksymalnej jasności.

Natomiast jako uchwyt montażowy na czubku choinki, użyłem przyklejone na gorący klej dwie obejmy do rur:

 

gwiazdka
Tył gwiazdki.

Nie wyglądają one profesjonalnie, ale sprawdzają się znakomicie. Tak czy siak, tył gwiazdy nie jest u mnie widoczny, a przód wygląda przepięknie, dużo lepiej niż na zdjęciach.

Dodaj komentarz

avatar
  Subskrybuj  
Powiadom o