Niniejszy wpis jest kontynuacją wpisu dotyczącego modułu kontrolera dla listwy LED WS2812B. Ostatni wpis się skończył, gdy gotowy był prototyp płytki z mikrokontrolerem Attiny 85, działającym z zewnętrznym kwarcem 16 Mhz i po wstępnych testach na długiej listwie animacja działała poprawnie. Ten wpis będzie opisywał prace jakie zostały zrobione od tego momentu, do momentu zamontowania listwy w suficie podwieszanym (zobacz filmik z efektem prac). Będzie też trochę o testach stworzonego kontrolera w perspektywie czasu jaki minął od tego momentu. Zapraszam!
Jako, że testy płytki zakończyły się pomyślnie kolejnym krokiem było zamontowanie jej w obudowie. Należało wyciąć dziurę na wtyk DC oraz na kable i usunąć niepotrzebne rozpórki ze środka obudowy. Płytka została przyklejona do obudowy klejem na gorąco. Zdjęcia poniżej:
Kolejnym etapem prac był montaż listwy LED. Żeby listwa dobrze się przykleiła do płyty kartonowo-gipsowej należało ją wyczyścić. Odkurzaczem zebrałem kawałki płyty, które tam się pojawiły po montażu oprawek świetlnych oraz pył powstały po cięciu płyty. Kolejnym etapem było przetarcie powierzchni wilgotną szmatką, żeby zebrać nagromadzony kurz. Było to problematyczne, ponieważ wnęka między sufitem, a listwą była wąska – mniej więcej na grubość ręki. Do odkurzacza musiałem domontować kawałek elastycznej wąskiej rurki (użyłem rurki od pompki od materaca), żeby można było manewrować nią w wąskiej wnęce. Ze szmatką było prościej bo wystarczyło ją tam włożyć i przeciągnąć po całej długości sufitu – ręka się mieściła, więc nie było problemu.
Poniżej zdjęcia przed i po czyszczeniu w jednym miejscu:
Inne miejsca oraz pierwsza przymiarka listwy:
Zacznę od przestawienia projektu sufitu podwieszanego. Przekrój poniżej:
Ok. Mamy już przygotowaną powierzchnię, więc teraz trzeba by zaplanować jak przykleić taśmę, żeby efekt był taki jak na zdjęciach w internecie. Dodatkowo, gdzieś tam obok listwy będzie zasilacz, który jest duży i nie może jej zakrywać, bo w tym miejscu powstanie cień. Sufit jaki mam zakręca – kolejnym pytaniem było: czy skręcać z listwą czy po prostu dojechać do końca? Następny problem to, to że przy końcu sufitu była zrobiona poprzeczka wzmacniająca – ominięcie jej spowoduje brak oświetlenia w tym miejscu, co będzie psuło efekt, a położenie kawałka listwy na niej może spowodować, że światło w tym miejscu będzie jaśniejsze i to także może psuć efekt.
Pomocny przy projektowaniu okazał się ten artykuł, którego głównym punktem był następujący rysunek:
Zależało mi na dużym rozproszeniu poświaty na suficie tak jak to jest na zdjęciach, więc wybrałem opcję 3. Okazuje się jednak, że niedokładnie zapoznałem się z rysunkiem, bo nie zauważyłem, że listwa w tej wersji jest przyklejona do ściany, a nie do półki. Może dlatego efekt nie jest do końca taki jakiego bym oczekiwał – jest dobrze, ale mogłoby być lepiej. Sprawdzę to przy okazji montażu kolejnych listw w mieszkaniu. W każdym razie dzięki maksymalnemu odsunięciu listwy do brzegu półki cień zasilacza nie jest widoczny, bo znajduje się on z samego jej brzegu.
Jeżeli chodzi o zakręcanie z boku półki to zdecydowałem, aby w przypadku tego sufitu dać ten kawałek listwy za zakrętem, ponieważ jest to miejsce „na widoku” i powinno wyglądać ładnie ze wszystkich stron. Z kolei jeżeli chodzi o poprzeczkę wzmacniającą to wybrałem wariant z położeniem na niej kawałka listwy (wyszły 2 diody). Nie widać w ogóle, że listwa jest w tym miejscu przyklejona wyżej – światło jest podobnej jasności i na suficie nie widać różnicy. Myślę, że różnica mogłaby się pojawić w tym miejscu, jeżeli listwa byłaby przyklejona do ściany, więc będę musiał o tym pamiętać, gdy będę montował listwy w pozostałych sufitach w mieszkaniu, gdzie będzie także podobna poprzeczka. Poza tym, gdyby jednak po montażu okazało się, że różnica jest, to miałem taki pomysł, żeby te 2 diody zapalać z mniejszą jasnością, co także powinno rozwiązać problem – ale okazało się, że to rozwiązanie nie jest potrzebne.
Jak już wiemy jak będziemy przyklejać listwę, to teraz możemy przejść do przygotowania jej do montażu i podłączenia. Ważne jest odpowiednie podłączenie zasilania listwy – gdy zostanie ono podłączone standardowo na początku listwy, to dla tak długiej listwy powstaną spadki napięcia i od pewnego momentu będzie widoczny spadek jasności świecenia diod, nawet do całkowitego ich zgaszenia. Rozwiązaniem jest podłączenie zasilania równolegle w kilku miejscach listwy – na początku i na końcu, a najlepiej co 1 metr listwy. Ja podłączyłem listwę do zasilania w 5 miejscach, a listwa dla tego sufitu miała 159 diod. Użyłem do tego kabla głośnikowego o przekroju 1,5 mm. Użyłem jego ponieważ jest elastyczny i akurat miałem taki w zapasie – są do listw LED dedykowane kable żyłki, ale są bardzo podobne w budowie do kabli głośnikowych – różnią się jedynie kolorem izolacji.
Jak widać na powyższym schemacie wystarczy podłączyć masę i +5V do kabla i rozprowadzić to w kilku miejscach listwy. W pinem DIN nie będzie takiego problemu, ponieważ jest to pin sterujący, którego prąd pracy jest mały, w porównaniu z prądem pobieranym z linii +5V przez diody. Po drugie nie powstaną tu spadki napięcia, ponieważ sterownik WS2812B umieszczony obok każdej diody re-dystrybuuje odebrany sygnał dalej, co powoduje, że jest on wzmacniany.
Gdy wszystko jest podłączone i zamontowane, to teraz czas na udoskonalenie kodu. Pamiętajmy, że założeniem na tym etapie dla modułu miała być możliwość zmiany animacji za pomocą przycisku, a wyłączenie listwy poprzez dłuższe przyciśnięcie. Ujednolicone kody 10-ciu animacji dla wersji z i bez buforowania można znaleźć tutaj.
Przy okazji ujednolicania kodu z użyciem buforowania (bilbioteka Adafruit NeoPixel) i bez buforowania (rozwiązanie z hackaday.com omawiane we wcześniejszym poście) objawiła się pierwsza negatywna cecha podejścia bez buforowania, tj. brak możliwości realizacji niektórych animacji. Konkretnie animacje, które wykorzystują obliczenia, które trwają długo (dla testów to było np. mnożenie razy 3 lub jakiekolwiek dzielenie) powodują, że nie jest możliwe wygenerowanie kolejnej „ramki” dla listwy w wymaganym czasie, czego efektem jest zapalenie tylko kilku pierwszych diod. Znalazłem informację, że operacja dzielenia dla niektórych procesorów Atmela zajmuje ok. 60-100 cykli procesora – w przeliczeniu na czas przy kwarcu 16 Mhz daje to 3,75 – 6,25 µs. Przypominam, że przesłanie jednej paczki danych (3 bajtów GRB) zajmuje 30 µs. Wystarczy, więc kilka operacji mnożenia, jedna dzielenia i parę dodatkowych operacji, które wykonuje biblioteka, żeby przekroczyć czas 50 µs, który w dokumentacji sterownika WS2812B oznacza RESET, czyli koniec przesyłania danych. Kolejne przesłane paczki po sygnale RESET zapalają od nowa diody zaczynając od pierwszej. Dlatego tylko pierwsze kilka diod mruga – bo dla nich jeszcze czasy są zachowane.
Także dłuższe testy zamontowanej listwy wykryły kolejny problem, prawdopodobnie także związany z czasami wysyłania danych. Konkretnie, gdy listwa dłużej pracuje (ok. 30 min), to po pewnym czasie animacja zatrzymuje się i mrugają tylko początkowe diody. Być może problemem jest grzanie się mikrokontrolera przy dłuższej pracy i jego spowolnienie, co w konsekwencji daje ten sam efekt, czyli powstawanie sygnału RESET, ze względu na zbyt długie generowanie danych.
W kodzie znajdują się także inne problemy – czasami przycisk nie załapie i nie zmieni animacji. Jest to spowodowane tym, że obsługa przycisku jest w głównej pętli – przycisk łapie tylko w momencie, gdy animacja przechodzi do kolejnego kroku lub przed następnym jej powtórzeniem. Trzeba by było przenieść obsługę przycisku do przerwania, ale myślę, że tym zajmę się w późniejszym czasie.
Przyszła już przejściówka USB na RS485, więc w niedługim czasie pewnie zajmę się drugim podejściem do tego modułu, czyli przesyłaniem animacji przez RS485, które będą generowane przez komputer (docelowo Raspberry Pi). Być może animacje przesyłane bezpośrednio po RS485 rozwiążą problem zbyt długich czasów generowania i wersja bez buforowania da radę w takim podejściu. Zobaczymy. Jak nie to pozostaje przeniesienie się na posiadającą więcej pamięci Atmegę.