Przeszukaj forum
Pokazywanie wyników dla tagów 'ws2811'.
Znaleziono 2 wyniki
-
Jeszcze jeden mały projekt z diodami RGB. Jest to mała lampka nocna zrobiona dla mojej córki. Sprzęt Lampka posiada pięć diod WS2811, pokrętło z przyciskiem i jeszcze jeden przycisk, wszystko polutowane na płytce uniwersalnej. Procesorem jest Seeeduino Xiao (czyli najtańsze co znalazłem niewymagające budowania programatora i innych takich rzeczy których nie mam ochoty robić), przyklejone do płytki taśmą dwustronną 🙂 Dorzuciłem też rezystor i kondensator, tak jak sugerowali w opisie diod. Gałka jest zrobiona z sugru. No i obudowa ze sklejki 3mm. Jakbym miał drukarkę 3D to być może obudowę bym wydrukował, ale nie mam, a uważam że efekt nie jest najgorszy. Oprogramowanie Lampka ma kilka trybów pracy: W trybie podstawowym wszystkie diody świecą na ten sam kolor, gałką wybiera się kolor (hue) oraz jasność (naciśnięcie gałki przełącza pomiędzy tymi dwoma parametrami). Jest też trzeci parametr, określający saturation tak z grubsza, żeby go regulować trzeba długo nacisnąć gałkę. Regulacja jasności próbuje na mniej więcej odwzorować postrzeganie jasności przez człowieka, czyli nie jest liniowa od 0 do 255 (w przestrzeni RGB), tylko im niższa, tym wolniej zmienia jasność, a przy bardzo niskich ustawieniach jasność jest ułamkowa, przykładowo jasność 2.4 uzyskuję świecąc dwiema diodami z jasnością 3 i trzema z jasnością 2. Więcej o charakterystyce w sekcji poniżej. Tryb automatycznego przyciemniania - podobny jak poprzedni, ale jasność diod samoistnie maleje, z założenia w takim tempie jak oko dostosowuje się do ciemności. Ten tryb służy do włączenia zaraz po zgaszeniu światła. Tryb tęczy - po diodach przesuwa się cyklicznie "tęcza" hue. W tym trybie można regulować czterema parametrami: jasnością, szybkością przesuwania, saturation oraz rozpiętością. Ten ostatni parametr określa jaką długość łuku hue pokazują diody w każdym momencie. W ustawieniu maksymalnym (zdjęcie powyżej) suma kolorów diod jest zawsze biała, co widać dobrze gdy patrzy się na sufit pokoju - jego kolor się nie zmienia, natomiast przy niskich ustawieniach jest istna dyskoteka, bo wszystkie diody mają w danym momencie podobny kolor, ale zmienny w czasie. Sumowanie RGB (pierwsze zdjęcie poniżej): pierwsza dioda świeci na czerwono, druga na zielono a trzecia na niebiesko, reguluje się niezależnie siłą każdej z nich, a ostatnia świeci sumą tych kolorów. Sygnalizator świetlny, przełącza kolejno światła, samoistnie albo po naciśnięciu przycisku. Wyłączona. Tryby przełącza się przytrzymując dodatkowy guzik i kręcąc gałką. Samo sterowanie diod wygląda (mniej więcej) następująco: WS2812::WS2812(byte pin): pin(pin), portGroup(digitalPinToPort(pin)), pinBitMask(digitalPinToBitMask(pin)){ pinMode(this->pin,OUTPUT); } void WS2812::writeLEDs(const std::vector<RGB>& leds){ noInterrupts(); for(auto led=leds.begin();led!=leds.end();led++) writeLED(*led); interrupts(); } void WS2812::writeLED(const RGB& led){ this->writeByte(led.r); this->writeByte(led.g); this->writeByte(led.b); } void WS2812::writeByte(byte b){ writeBit(b&0x80); writeBit(b&0x40); writeBit(b&0x20); writeBit(b&0x10); writeBit(b&0x08); writeBit(b&0x04); writeBit(b&0x02); writeBit(b&0x01); } void WS2812::writeBit(byte b){ if(b) write1(); else write0(); } void WS2812::write0(){ up(); up(); down(); down(); } void WS2812::write1(){ up(); up(); up(); up(); down(); } void WS2812::up(){ portGroup->OUTSET.reg=pinBitMask; } void WS2812::down(){ portGroup->OUTCLR.reg=pinBitMask; } Uwagi: Muszę używać OUTSET i OUTCLR, bo digitalWrite jest za wolne. Liczba powtórzeń w write0 i write1 została wyznaczona eksperymentalnie, z użyciem oscyloskopu. Mógłbym zamiast powtarzać funkcję dodać tam jakąś dobrze skalibrowaną pustą pętlę wykonującą się n razy, ale tak mi było prościej i jest dostatecznie dobrze. Charakterystyka diod Tak jak wspomniałem, chciałem, żeby regulacja jasności wyglądała na liniową, co jak wiadomo oznacza, że taka nie jest. Robiłem sporo pomiarów jasności diod i długo się grzebałem w excelu, i ustaliłem taką oto funkcję przeliczającą level od 0 do 50 na jasność od 0 do 1 (przeliczaną następnie już liniowo na wartości RGB: float levelToLight(float level){ if(level<=15) return max(78e-5*level,0); if(level<=34) return 22e-4*pow(1.117,level); return min(55e-6*pow(1.221,level)+47e-3,1); } Nie żebym sądził, że się komuś ta funkcja przyda 🙂 ale w każdym razie działa dość dobrze. Dzięki temu, że do 15 jest liniowa, od RGB(0,0,0) do RGB(3,3,3) ustawia się jasność z dokładnością do 0.2/255, co się w sam raz tłumaczy na wzmacnianie kolejno diod w trybie podstawowym. Powyżej 15 zmiany są coraz szybsze, na przykład przy wartości 16 trzy diody świecą RGB(3,3,3) a dwie RGB(4,4,4), a przy 17 już tylko jedna RGB(3,3,3) a cztery RGB(4,4,4) - oczywiście jeśli aktualnie wybranym kolorem jest biały. Niestety, dla wartości RGB 1 i 2 diody zachowują się ekstremalnie nieliniowo, mianowicie przy wartości 1 świeci tylko składowa G, a R oraz B w ogóle nie świecą, a z kolei przy wartości 2, G chyba świeci tak samo jak przy 1, a R i B robią się dużo jaśniejsze, przy czym R jaśniejsza od B. Na ostatnim zdjęciu widać też, że są różnice pomiędzy samymi diodami, mimo że były kupione razem - druga i czwarta wydają się bardziej czerwone. Wszystkie anomalie występują tylko przy niskich wartościach, przy wysokich świecą równo, albo w każdym razie gołym okiem nie widać między nimi różnicy. Ogólnie w porównaniu z diodami użytymi w tym projekcie, te tutaj dla niskich jasności są po prostu tragiczne - ale na lampkę dla dziecka nadają się w sam raz 🙂 Ale w niektórych trybach, na przykład tęczy, nie pozwalam na zbytnie obniżenie jasności, bo efekt przestaje dobrze wyglądać.
-
Jako, że zbliżały się pierwsze urodziny pewnego młodego człowieka w mojej rodzinie wpadłem na pomysł, żeby wreszcie z długiej fazy mówienia o jakimś projekcie przejść do fazy robienia go. I tak o to padł pomysł zbudowania kolorowej lampki nocnej. Koncepcja Jako, że lampka to bardziej mebel niż zabawka to całość musiała być solidna a przy tym najlepiej nie brzydka. Jako klosz (obudowa) na początku myślałem o użyciu rury z plexi ale cena okazała się niestety nie akceptowalna. Wpadłem na pomysł użycia opakowania spożywczego z plastiku. Przeszukałem kilka sklepów gospodarstwa domowego i znalazłem pasujące pudełko. No to już z górki. Potem jeszcze trochę diod led,jakieś zasilanie i sterowanie. Dno lampki przykręcone jest na dwie śruby M3 ze stożkowym łbem, wewnątrz przyklejone są dwie tulejki dystansowe robiące za gwint. Wnętrze "klosza" to "choinka" zbudowana z plastikowej rurki, jej podstawy oraz łańcucha diod. Podstawa całości oraz choinki to płytki wycięte z deski do krojenia kupionej właśnie w tym celu. Nie jest to sztywne tworzywo ale do takiego zastosowania sprawdza się super, łatwo się obrabia, wygląda dobrze i trudno zgadnąć z czego to jest 🙂 Całość pomalowana sprejem na jasny niebieski (celowałem w błękitny, chyba nie wyszło źle). Elektronika Potrzebna była, przede wszystkim, pełna dowolność koloru a jako, że nie chciałem bawić się w skomplikowane (w sensie kabelkologii) sterowanie tradycyjnymi ledami RGB padło na diody WS2811. Kupiłem łańcuch 50 diod 12mm. Całość może pobrać do 15W (50 x 60mA przy 5V) więc zastosowałem zasilacz 12V 2A oraz trzy moduły przetwornic na układach LM2596. Dlaczego aż trzy? Widząc grubość tych przewodów w łańcuchu obawiałem się, że na końcu może być już zauważalnie niższa jasność. Żeby tego uniknąć podzieliłem go na 3 sekcje zasilania bez rozłączania przewodu sygnałowego ze wspólna masą (przetwornice są nieizolowane). Do sterowania diodami wziąłem arduino pro mini (w moim przypadku klona), peryferiami się trochę marnuje ale to akurat miałem w szufladzie a cena jest bardzo atrakcyjna. Jako interfejs użytkownika użyłem enkodera z przyciskiem, poza tym jest tylko włącznik zasilania na tyle obudowy. Schemat jako taki nigdy nie powstał, jest to dość prosta konstrukcja, wszystkie połączenia można wywnioskować z kodu. Arduino jest zasilane z jedn z przetwornic, miałem jakiś problem z zasilaniem go z 12V, podłączyłem do 5V i działa (a już myślałem, że odejdzie do krainy wiecznych łowów, na szczęście nie). Program Napisany w arduino z bibliotekami do obsługi enkodera, diod i przyciśnięć (tutaj podziękowania dla @ethanak, sam bym nie wpadł, żeby takiej biblioteki poszukać). Dzięki nim nie musiałem się zajmować szczegółami ich sterowania zwłaszcza, że orłem programowania to ja nie jestem. Dzięki nim poszło w miarę szybko a efekty są co najmniej zadowalające. Jeżeli chodzi o efekty świetlne to na początku bazowałem na przykładach od adafruit ale niestety są one oparte na delayach a tutaj jest to nie do przyjęcia. Później, kiedy nie udało mi się samodzielnie przerobić ich, żeby je usunąć znalazłem w internecie ten kod , który temat rozwiązał. Menu napisałem sam z użyciem biblioteki Rotary.h oraz PMButton.h. Obsługa lampki Lampka domyślnie jest wyłączona (diody się nie świecą, arduino jest zasilone) dwu sekundowe przytrzymanie przycisku włącza lampkę z domyślnym trybem pierwszym w menu oraz najmniejszą jasnością. Jednorazowe kliknięcie to zmiana trybu, kręcenie enkoderem zmienia jasność świecenia. Kolejne dwusekundowe przytrzymanie wyłącza świecenie. W czasie pracy na maksymalnej mocy dół lampki nagrzewa się do ok 30*C, uważam to za bardzo dobry wynik. Dławiki przetwornic mają ok. 30-35*C. Trudności, przemyślenia Z całego tego projektu najprostsza okazała się część elektroniczna, kawałek płytki uniwersalnej, 4 moduły i trochę czasu. Trudności zaczęły się gdy przyszło do wykończenia obudowy, bardzo obawiałem się wiercenia w tym plastiku z obawy o pęknięcie. Swoją drogą robienie małych otworów też nie jest takie proste, dremel na najmniejszych obrotach i tak kręci się za szybko, topi plastik i trzeba wiercić na kilka razy. Wycinanie otworu na gniazdo zasilające poszło gładko, diamentowa tarcza dała sobie radę bez problemu. Pozostałą szparę nad nim zakleiłem klejem montażowym. Jak już się z całą resztą uporałem to przeszedłem do pisania programu. Bardzo doceniam wszystkich twórców, którzy wstawiają swoje, działające, kody do internetu, bardzo pomogły i ten etap przeszedłem z tarczą. W sumie to z tego też powodu źródło zostawiam w załączniku, jak ktoś potrzebuje jakiś kawałek albo chce sobie zbudować (a może nawet ulepszyć) to można brać do woli. Podsumowanie Budowa tej lampki zajęła mi około miesiąca i cieszę się, że wreszcie zbudowałem coś takiego od początku do końca. Młodemu (a w szczególności jego rodzicom) się bardzo spodobało więc myślę, że cel zrealizowany. Ja też się trochę nauczyłem i za to bardzo sobie to cenię. Kilka zdjęć z budowy: Niestety zapomniałem o zdjęciu lampki w całości, w działaniu. Postaram się to nadrobić. Jeżeli macie jakieś pytania albo czegoś nie napisałem/napisałem niezrozumiale to proszę o zwrócenie uwagi, odpowiem i uzupełnię opis. lampaRGB.zip