Zrób sobie sam świąteczną gwiazdę z Arduino
Od pewnego czasu miałem chęć zrobić sobie ozdobę świąteczną. Coś ze świecącymi diodami, których sekwencję mógłbym sam zaprogramować według gustu. W zeszłym roku kupiłem zestaw do samodzielnego montażu w kształcie gwiazdy z myślą o przerobieniu tego tak, aby sterować światełkami za pomocą Arduino. Jednak okazało się, że nie tylko musiałbym się sporo nalutować bardzo małych elemencików, to na dodatek w płytce nie było nawierceń na układy. Poza tym pozostawał problem jak to połączyć z Arduino. Zabrakło czasu, chęci i determinacji i nic z tego nie wyszło. Nic dziwnego, że gdy w październiku zobaczyłem w popularnym sklepie internetowym produkt AdaFruit NeoPixel Ring od razu pomyślałem o moim niedokończonym projekcie. Ledowe kółko bardzo upraszczało wykonanie pomysłu. Od razu więc kupiłem jedną sztukę.
Jeśli ktoś ma ochotę na bardziej wypasione efekty to może sobie kupić nieco większe kółko, kwadratową płytkę lub taśmę. NeoPixel Ring 16 składa się z 16 lampek, z których każda ma 3 diody: czerwoną, zieloną i niebieską. Pozwala więc na świecenie dowolnym kolorem, powstającym podobnie jak w monitorze LED. Kółko wymaga zasilania napięciem 5V (Power 5V i Ground), które możemy doprowadzić bezpośrednio z Arduino. Trzeci kabelek podłączamy jako sygnał sterujący z dowolnego wyjścia cyfrowego (digital - w moim przypadku nr 3).
Do projektowania i testowania kodu używałem Arduino Mega 2560. Okazało się też, że mogę go użyć również jako programatora dla docelowej płytki dla mojej świątecznej gwiazdy (tu podziękowania dla mojego brata za pomoc). Aby gwiazda była mniejsza i nie blokowała mi moje Mega, kupiłem na eBayu klona Arduino Pro Mini. Na płytce trzeba wypalić Bootloader i wgrać program napisany w ArduinoIDE. Można to zrobić za pomocą konwentera USB uart, albo właśnie z użyciem innej płytki jak w moim przypadku (opis ). (Da się do tego użyć zwykłego programatora USBasp, jednak trzeba trochę pokombinować i dolutować jumperki.)
Do zasilania użyłem zwykłych akumulatorków NiMH AAA. Kupiłem dwie kołyski x2 (nie mogłem znaleźć pojedynczej x4). Do tego użyłem włącznika z odzysku, który pałętał się od jakiegoś czasu wśród reszty części. Po zlutowaniu elektronika wyglądała w następujący sposób:
Pozostało jeszcze zrobienie z tego gwiazdy. Użyłem do tego gotowej ozdoby, do której za pomocą opaski zaciskowej i nitki o kolorze gwiazdy przymocowałem elektronikę (z pomocą syna):
Oprogramowanie
Kod piszemy w ArduinoIDE. Do sterowania wyświetlaniem kółka niezbędna jest biblioteka, którą musimy pobrać z Githuba. Umieszczamy ją w katalogu z innymi bibliotekami (u siebie korzystałem ze standardowego pakietu Ubuntu, co wymagało wgrania pobranych plików [.h, .cpp] do utworzonego katalogu: /usr/share/arduino/libraries/Adafruit_NeoPixel i zrestartowania IDE). W repozytorium znajdują się przykłady kodu, który można wykorzystać i zmienić dla swoich potrzeb. Gotowy kod jaki wgrałem do płytki ma postać:
#include <Adafruit_NeoPixel.h> #define PIN 3 #define NUMPIXELS 16 Adafruit_NeoPixel pixels = Adafruit_NeoPixel(NUMPIXELS, PIN, NEO_GRB + NEO_KHZ800); int delayval = 500; void setup() { pixels.begin(); } void setRed(int nr, uint8_t pow) { pixels.setPixelColor(nr, pixels.Color(pow,0,0)); pixels.show(); } void setGreen(int nr, uint8_t pow) { pixels.setPixelColor(nr, pixels.Color(0,pow,0)); pixels.show(); } void setBlue(int nr, uint8_t pow) { pixels.setPixelColor(nr, pixels.Color(0,0,pow)); pixels.show(); } void setYellow(int nr, uint8_t pow) { pixels.setPixelColor(nr, pixels.Color(pow,pow,0)); pixels.show(); } void switchOff(int nr) { pixels.setPixelColor(nr, pixels.Color(0,0,0)); pixels.show(); } void lightDark() { for(uint8_t p = 1; p < 250; p+=5){ for(int i=0; i < NUMPIXELS; i++) { if (i % 4 == 0) setRed(i, p); else if(i % 4 == 1) setBlue(i, p); else if(i % 4 == 2) setGreen(i, p); else if(i % 4 == 3) setYellow(i, p); } delay(100); } } void rondo() { uint8_t p = 120; for(int b = 0; b < 32; b++){ int nr = b % NUMPIXELS; for(int i=0; i < NUMPIXELS; i++) { if (i % 4 == 0) setRed((i + nr) % NUMPIXELS, p); else if(i % 4 == 1) setBlue((i + nr) % NUMPIXELS , p); else if(i % 4 == 2) setGreen((i + nr) % NUMPIXELS, p); else if(i % 4 == 3) setYellow((i + nr) % NUMPIXELS, p); } delay(500); } } void colorLight() { uint8_t pow = 120; for(int i=0;i<NUMPIXELS;i++){ setRed(i, pow); } delay(1000); for(int i=0;i<NUMPIXELS;i++){ setGreen(i, pow); } delay(1000); for(int i=0;i<NUMPIXELS;i++){ setYellow(i, pow); } delay(1000); for(int i=0;i<NUMPIXELS;i++){ setBlue(i, pow); } delay(1000); } void off() { for(int i=0;i<NUMPIXELS;i++) { switchOff(i); } } void loop() { lightDark(); off(); delay(delayval); colorLight(); off(); delay(delayval); rondo(); colorLight(); delay(delayval); }
Ponieważ chciałem użyć czterech kolorów napisałem 4 funkcje realizujące świecenie wybranego piksela (nr - od 0 do 15) z określoną jasnością (pow - od 0 do 255). Do wyłączania świecenia służy funkcja switchOff. Sekwencja świecenia wykorzystuje trzy efekty napisane w 3 funkcjach + funkcja do wyłączania wszystkich lampek. Pierwszy efekt to kolorowanie czterema kolorami lampek i stopniowe ich rozjaśnianie i gaśnięcie. Drugi to kolejne wyświetlenie jednego koloru na wszystkich lampkach. I wreszcie trzeci to przemieszczanie się kolorów na kółku. Pisanie i sprawdzanie programu najlepiej przeprowadzić na normalnym Arduino i dopiero gdy program będzie gotowy wgrać go na mniejszą płytkę. Po przylutowaniu kabelków z zasilaniem nie będzie możliwe, bez ich ponownego odlutowania, wgranie nowego programu (przynajmniej tak się działo przy użyciu jako programatora Arduino Mega).
Gotowy efekt na filmiku:
Całość dzięki użyciu NeoPixel nie jest zbyt skomplikowana nawet dla początkującego adepta elektroniki. Zaś efekt na żywo wygląda znacznie lepiej niż na filmiku i jest bardzo fajnym ozdobnikiem świątecznej choinki. Najlepsza zabawa polega na samodzielnym programowaniu własnych efektów świetlnych. Pozdrawiam wszystkich miłośników Arduino i życzę miłej zabawy. A wszystkim, życzę Wesołych Świąt i szczęśliwego Nowego Roku.