Magiczna kostka LED RGB na bazie RP2040

Magiczna kostka LED RGB na bazie RP2040

Urządzenia z efektami świetlnymi zawsze są ciekawymi projektami – z łatwością przyciągają uwagę oglądających, nawet, jeśli poza aspektem estetycznym dany system oferuje niewiele lub nic. Tak też jest w przypadku zaprezentowanej kostki LED RGB, która skonstruowana została na konkurs Make it Glow, organizowany przez portal Instructables.com. Ta niezwykle urzekająca konstrukcja może być ciekawym elementem wystroju wnętrza, a jednocześnie projektem edukacyjnym, który pozwoli poznać mikrokontroler RP2040.

Zaprezentowany układ został wykonany całkowicie od podstaw. Autor zaprojektował każdy element tego projektu, urządzenie nie jest zawiera gotowych modułów, jak to często bywa z projektami z działu soft. Magiczna kostka LED przeznaczona jest głównie do wyświetlania świetlnych animacji i zasadniczo pełni tylko rolę dekoracji np. warsztatu elektronicznego. System zawiera niesamowity mikrokontroler RP2040, który jest „młodszym bratem” komputera jednopłytkowego Raspberry Pi. Ta niezwykle ciekawa platforma nie jest tak popularna, jak inne mikrokontrolery korzystające z ekosystemu Arduino, ale warto zwrócić na nią uwagę przy swoich projektach.

Wszystkie elementy użyte w systemie są dokładnie opisane. Można pobrać również wszystkie niezbędne pliki projektowe, które są potrzebne do wykonania kopii urządzenia we własnym warsztacie. Dodatkowo, jak wskazuje w oryginalnym artykule sam autor, projekt ma istotną wartość edukacyjną – pozwala poznać:

  • podstawy konfiguracji mikrokontrolera RP2040,
  • zalety stosowania diod LED RGB WS28xx,
  • podstawy montażu urządzeń elektronicznych.

Ponadto projekt z pewnością będzie inspiracją do tworzenia własnych, podobnych konstrukcji.

Potrzebne narzędzia

Oprócz elementów elektronicznych potrzebnych do zmontowania urządzenia niezbędne będą również narzędzia – tak fizyczne, jak i programistyczne, które umożliwią zbudowanie, uruchomienie i zaprogramowanie. Oto one:

  • lutownica – dowolny rodzaj umożliwiający lutowanie niewielkich elementów SMD. Autor użył do lutowania tzw. hot-plate, który podgrzewa całą płytkę drukowaną. Zamiast niego można zastosować specjalny piec;
  • materiały do lutowania – pasta lutownicza, spoiwo, topnik itp.;
  • szpatułka do nakładania pasty lutowniczej oraz maska do jej naniesienia – konieczne jeśli montujemy wszystkie elementy naraz, korzystając z hot-plate lub pieca reflow;
  • oprogramowanie Arduino IDE – do skompilowania i zaprogramowania układu;
  • aplikacja Cura – do przygotowania elementów do druku 3D;
  • oprogramowanie Altium Designer – jeśli chcielibyśmy ingerować w projekt elektroniczny urządzenia (schematy i płytki);
  • Solidworks – jeśli chcielibyśmy zmodyfikować projekt mechaniczny obudowy.

Spośród wymienionych narzędzi Altium Designer oraz Solidworks mogą być najtrudniejsze do pozyskania – to drogie, profesjonalne pakiety do projektowania (odpowiednio) elektroniki i elementów mechanicznych. Nie są one wymagane, jeśli nie chcemy modyfikować projektów autora. Na stronie z projektem udostępnione są pliki edytowalne, jak i wynikowe pliki CAD, które pozwalają na wyprodukowanie niezbędnych elementów, bez konieczności używania tych drogich programów. Oczywiście programy takie, mają alternatywne, darmowe rozwiązania, które oferują zbliżone możliwości – odpowiednio np. KiCad do projektowania PCB oraz FreeCAD do projektów mechanicznych. Jednak autor projektu zdecydował się korzystać z narzędzi komercyjnych, do których pewnie ma zawodowo dostęp.

Projekt układu

Pierwszym i najważniejszym krokiem jest dobór kluczowych komponentów z jakich będzie się składał system. Ponieważ autor zdecydował się na mikrokontroler RP2040 to kluczowe komponenty dobrał bazując na jego karcie katalogowej. Następnie autor postępował zgodnie z zaleceniami projektowymi, aby utworzyć projekt obwodu w programie Altium Designer. Na rysunku 1 został pokazany uzyskany schemat urządzenia. Jest on podzielony na cztery główne bloki.

Rysunek 1. Schemat sterownika układu

RP2040

W tym bloku znajduje się sam mikrokontroler oraz wszystkie elementy niezbędne do jego do pracy. Są to przede wszystkim obwody filtrujące zasilanie (kondensatory), układ resetu w postaci przycisku oraz oscylator kwarcowy do taktowania procesora. Wszystkie te podzespoły są kluczowe dla działania układu. Jakkolwiek np. bez kondensatorów filtrujących zasilanie system powinien działać, to ich stosowanie jest zdecydowanie zalecane, a ich brak może przełożyć się na nieprzewidywane zachowanie układu np. resetowanie się w najmniej spodziewanym momencie. Autor poleca zastosować tutaj kondensatory 100 nF (zgodnie z ogólnie przyjętą praktyką), po jednym na każdy pin zasilania układu, umieszczone blisko wyprowadzeń układu.

Układ pamięci

Mikrokontroler RP2040 jest skonstruowany trochę inaczej niż typowe układy tej klasy, ponieważ potrzebuje zewnętrznej kości pamięci, do której ładowany jest kod programu. W omawianym systemie zastosowano układ pamięci z interfejsem QSPI – układ W25Q128JVS. Jest to pamięć Flash o pojemności 128 Mb. To maksymalny rozmiar pamięci, jaki może zaadresować ten mikrokontroler.

Stabilizator napięcia

Mikrokontroler RP2040 zasilany jest napięciem 1,1 V (rdzeń układu) i 3,3 V (układy peryferyjne i systemy I/O). Pierwsze z tych napięć generowane jest wewnętrznie, przez wbudowany stabilizator napięcia, ale 3,3 V musi być dostarczone z zewnątrz. W module zintegrowano stabilizator liniowy 3,3 V. Stabilizuje on napięcie zasilania, pochodzące z USB, do poziomu wymaganego przez mikrokontroler. Jako że układ ten pobiera niewielki prąd (diody LED zasilane są bezpośrednio z 5 V z USB) liniowy element nie jest problemem nie będzie on wytwarzał nazbyt dużo problematycznego ciepła. Wejście zasilania zabezpieczone jest nadprądowo – bezpiecznikiem (F1) oraz diodą (D1), która zabezpiecza przed odwrotnym podłączeniem zasilania do systemu i przepięciami, które mogłyby uszkodzić port USB w komputerze.

USB-C

Złącze USB-C, mimo że obecne jest już jakiś czas na rynku, to do projektów hobbystycznych i płytek deweloperskich trafiło dopiero niedawno. Autor projektu, jak sam zaznacza w jego opisie, długi czas miał dylemat nad zastosowaniem tego złącza w swoim urządzeniu. Jednak finalnie zdecydował się na zastosowanie tego rozwiązania. Układ zaprezentowany na schemacie na rysunku 1 można nazwać modelowym rozwiązaniem USB-C dla układów hobbystycznych. Moduł ten można bez problemu przenieść do własnego systemu bez modyfikacji.

Diody LED

Osobnym elementem systemu jest łańcuch złożony z 25 diod LED RGB. Są to sterowane cyfrowo moduły diodowe typu WS2812. Diody te sterowane są szeregowo, za pomocą tylko jednego sygnału wejściowego, co istotnie ułatwia ich implementację w systemie. Dodatkowo, diody WS2812 (i podobne) mogą być łączone ze sobą szeregowo. Moduły mają wejście cyfrowe (DIN) oraz wyjście (DOUT), pomiędzy którymi, w strukturze sterownika diod, znajduje się rejestr przesuwny. Powoduje to, że dioda pobiera dane, które potrzebne są do jej wysterowania, ale może też przekazywać dalsze dane dalej. Dzięki temu można łączyć te diody szeregowo – jedna za drugą, podłączając wejście (DIN) to wyjścia (DOUT) poprzedniej diody. Dzięki temu można sterować łańcuchem takich diod za pomocą jednego wyprowadzenia cyfrowego mikrokontrolera. Na rysunku 2 pokazano schemat ideowy elementu z diodami LED RGB. Są one połączone ze sobą szeregowo, jak opisano powyżej. Ponadto każda dioda podłączona jest do zasilania VBUS (5 V) oraz masy. Projekt uzupełniają kondensatory filtrujące zasilanie (100 nF) podłączone do linii VBUS równolegle z diodami RGB.

Rysunek 2. Schemat łańcucha diod LED RGB

Projekt płytek drukowanych

Projektując PCB można zdecydować, jaki kształt będzie miało całe urządzenie. W przypadku tego projektu, autor zdecydował się na kształt sześcianu, dlatego wszystkie kawałki kostki muszą mieć kształt kwadratów (w tym przypadku założono wymiary 40×40 mm). Można oczywiście wybrać większy rozmiar, ale ten wybrany jest odpowiedni do tego, aby równomiernie rozmieścić diody LED RGB na jednej płytce. Układ rozbity jest na dwa rodzaje płytek. Pierwszą z nich jest kontroler z mikrokontrolerem i elementami zasilania systemu. Jest to także pierwszy moduł w szeregu, podczas łączenia ze sobą poszczególnych modułów. Kolejne moduły to macierze diod LED – po jednej płytce na każdą ze ścianek.

Rysunek 3. Wizualizacja projektu płytek drukowanych kontrolera oraz modułu diod LED RGB

Montaż elementów

Po zamówieniu i otrzymaniu płytek PCB, kolejne, co trzeba zrobić, to przylutowanie elementów elektronicznych na górnej i dolnej stronie płytki drukowanej kontrolera układu, a następnie przylutowanie diod LED RGB na pozostałych płytkach. Wraz z zamówieniem PCB autor zamówił również szablon do nakładania pasty lutowniczej, co znacznie uprościło montaż całego systemu. Jeśli nie macie doświadczenia w montażu elementów na PCB, można zamówić gotowy, zmontowany układ. Wystarczy, że wraz z zamówieniem PCB (z plikami GERBER) wyślemy również listę materiałową (BoM) oraz plik z lokalizacjami poszczególnych elementów (tzw. plik pick&place). Pliki te można pobrać można ze strony z projektem – link na końcu artykułu.

Jeśli jednak zdecydujemy się na samodzielny montaż systemu możemy, tak jak autor, skorzystać z domowej wersji procesu reflow, który pozwala szybko i łatwo zmontować układ w technologii SMD. Pierwszym krokiem jest naniesienie pasty lutowniczej. Służy do tego wspomniany powyżej szablon. Przykłada się go do laminatu i przez niego nanosi pastę. Po zdjęciu szablonu pasta pozostaje tylko na polach lutowniczych, czyli tam, gdzie jest potrzebna. Po naniesieniu pasty na płytce układane są poszczególne elementy elektroniczne. Do lutowania potrzebne jest odpowiednie źródło ciepła, które pozwoli na roztopienie lutowia i złączenie go z lutowanymi elementami. Autor konstrukcji użył w tym celu specjalny hot-plate do montażu elementów marki Cube. Jest to podgrzewana płaska powierzchnia – kładziemy na nią PCB z pastą i elementami, a ciepło powoduje stopienie pasty i polutowanie wszystkich elementów. Zamiast takiego podgrzewacza można stosować dowolny piec, zdolny osiągnąć odpowiednią temperaturę – nawet piekarnik się do tego nadaje, jeśli zastosuje się pastę o odpowiednio niskiej temperaturze topnienia. Jednak trzeba pamiętać o tym, że pasty lutownicze, z uwagi na stosowanie chemicznych topników, często pozostawiają po sobie szkodliwe dla człowieka pozostałości. Można także do lutowania płytki wykorzystać lutownicę na gorące powietrze, roztapiając pastę pod poszczególnymi elementami. Po zakończonym montażu elementów należy usunąć pozostałości topnika ze zmontowanych płytek. Można w tym celu umyć je np. w izopropanolu. Na fotografii 1 pokazano gotowe płytki drukowane, przygotowane do uruchomienia.

Fotografia 1. Zmontowana płytka kontrolera (a i b), zmontowana płytka diod LED RGB (c i d)

Oprogramowanie

Po zmontowaniu płytek, aby urządzenie zaczęło działać, należy je zaprogramować. Mikrokontrolery RP2040 mogą być programowane w Arduino IDE, co czyni je łatwymi w użyciu. Autor konstrukcji zastosował popularną w Arduino IDE bibliotekę Neopixel, która pozwala w prosty sposób sterować diodami LED RGB WS2812. Wszystkie połączone szeregowo diody mogą być sterowane jednym wyjściem mikrokontrolera. Za pomocą biblioteki Neopixel można wysterować setki diod LED (realnie ich ilość ograniczona jest pamięcią operacyjną mikrokontrolera), co oznacza, że wszystkie 150 diod LED RGB w omawianym systemie nie stanowi dla niej problemu.

W programie, pokazanym na listingu 1 autor zawarł kilka animacji świetlnych, które posortowane są według niektórych funkcji. Programując płytkę z mikrokontrolerem Raspberry Pi trzeba pamiętać, aby do Arduino IDE dodać wsparcie dla Raspberry Pi Pico za pomocą menedżera płytek, ponieważ ta płytka Raspberry ma taki sam mikrokontroler (RP2040), jaki jest używany w tym projekcie.

Listing 1. Program sterujący pracą kostki napisany w Arduino IDE

#include <NeoPixelConnect.h>

NeoPixelConnect MyCube(9, 150);

void setup() {
}

void loop() {
 discoMode(5);
 glowLightRandom(2);
 randomLightShow(1000);
 smoothColorShow(3);
 slideMoveFast(3);
}

void discoMode(int repeat) {
 for(int i=0; i<repeat ; i++){
   int colorSetRed=random(0,255)/32;
   int colorSetGreen=random(0,255)/32;
   int colorSetBlue=random(0,255)/32;
   int brightnessRed=colorSetRed*5;
   int brightnessGreen=colorSetGreen*5;
   int brightnessBlue=colorSetBlue*5;
   for(int j=0 ; j<30 ; j++){
     int firstPixel=random(0,149);
     for(int i=0; i<3 ; i++){
       MyCube.neoPixelFill(
colorSetRed,
colorSetGreen,
colorSetBlue,true);
       delay(1);
       MyCube.neoPixelSetValue(
firstPixel,
brightnessRed,
brightnessGreen,
brightnessBlue,true);
       delay(1);
       MyCube.neoPixelClear();
     }
   }
 }
}

void slideMoveFast(int repeat) {
 for(int i=0 ; i<repeat ; i++){
   MyCube.neoPixelClear(true);
   for(int i=0 ; i<150 ; i++){
     MyCube.neoPixelSetValue(i,
random(0,128),
random(0,128),
random(0,128),true);
     delay(10);
   }
   for(int i=0 ; i<150 ; i++){
     MyCube.neoPixelSetValue(
i,0,0,0,true);
     delay(10);
   }
 }
}

void smoothColorShow (int repeat) {
 for(int i=0 ; i<repeat ; i++){
   for(int i=255; i>=0; i--){
     MyCube.neoPixelFill((0/10),
(255/10),(i/10),true);
     delay(3);
   }
   for(int i=0; i<256; i++){
     MyCube.neoPixelFill((i/10),
(255/10),(0/10),true);
     delay(3);
   }
   for(int i=255; i>=0; i--){
     MyCube.neoPixelFill((255/10),
(i/10),(0/10),true);
     delay(3);
   }
   for(int i=0; i<256; i++){
     MyCube.neoPixelFill((255/10),
(0/10),(i/10),true);
     delay(3);
   }
   for(int i=255; i>=0; i--){
     MyCube.neoPixelFill((i/10),

(0/10),(255/10),true);
     delay(3);
   }
   for(int i=0; i<256; i++){
     MyCube.neoPixelFill((0/10),
(i/10),(255/10),true);
     delay(3);
   }
 }
}

void glowLightRandom(int repeat) {
 int glowRed=0;
 int glowGreen=0;
 int glowBlue=0;
 for(int i=0 ; i<repeat ; i++){
   int Red=random(0,25);
   int Green=random(0,25);
   int Blue=random(0,25);
   for(int i=0; i<25; i++){
     MyCube.neoPixelFill(
glowRed,glowGreen,i,true);
     delay(50);
     if(glowRed<Red)
     glowRed++;
     if(glowGreen<Green)
     glowGreen++;
   }
   for(int i=25; i>=0; i--){
     MyCube.neoPixelFill(
glowRed,glowGreen,i,true);
     delay(50);
     if(glowRed>0)
     glowRed--;
     if(glowGreen>0)
     glowGreen--;
   }
   Red=random(0,25);
   Blue=random(0,25);
   for(int i=0; i<25; i++){
     MyCube.neoPixelFill(
glowRed,i,glowBlue,true);
     delay(50);
     if(glowRed<Red)
     glowRed++;
     if(glowBlue<Blue)
     glowBlue++;
   }
   for(int i=25; i>=0; i--){
     MyCube.neoPixelFill(
glowRed,i,glowBlue,true);
     delay(50);
     if(glowRed>0)
     glowRed--;
     if(glowBlue>0)
     glowBlue--;
   }
    Green=random(0,25);
    Blue=random(0,25);
   for(int i=0; i<25; i++)
   {
     MyCube.neoPixelFill(
i,glowGreen,glowBlue,true);
     delay(50);
     if(glowGreen<Green)
     glowGreen++;
     if(glowBlue<Blue)
     glowBlue++;
   }
   for(int i=25; i>=0; i--){
     MyCube.neoPixelFill(
i,glowGreen,glowBlue,true);
     delay(50);
     if(glowGreen>0)
     glowGreen--;
     if(glowBlue>0)
     glowBlue--;
   }
 }
}

void randomLightShow(int repeat) {
 for(int i=0; i<repeat ; i++){
   int firstPixel=random(0,149);
   MyCube.neoPixelSetValue(
firstPixel,
random(0,255),
random(0,255),
random(0,255),
true);
   delay(1);
   MyCube.neoPixelClear();
   delay(1);
 }
}

Konstrukcja tego programu jest identyczna, jak każdego innego szkicu Arduino – składa się on z dwóch funkcji: setup() oraz loop(). Pierwsza z nich jest uruchamiana jednorazowo po resecie mikrokontrolera. Typowo używana jest do konfiguracji systemu, jednak w tym przypadku jest pusta. Druga z funkcji, to nieskończona pętla, która wywołuje po kolei preprogramowane przez autora efekty (funkcje), gdzie parametr przekazywany do funkcji jest liczbą powtórzeń układu.

Kluczowa funkcjonalność realizowana jest za pomocą obiektu zdefiniowanego na samym początku programu:

NeoPixelConnect MyCube(9, 150);

Parametry podane do tego obiektu to, odpowiednio, numer pinu układu, do którego dołączone są diody (w tym przypadku 9) oraz ilość połączonych ze sobą szeregowo diod (w tym przypadku 150). Funkcje z poszczególnymi efektami używają rozmaitych wbudowanych w bibliotekę efektów, takich jak neoPixelFill, neoPixelSetValue czy neoPixelClear. Dokładny opis działania poszczególnych funkcji znaleźć można w dokumentacji biblioteki (link na końcu artykułu).

Kod programu można pobrać ze strony z projektem. Wystarczy uruchomić go w Arduino IDE, aby po zainstalowaniu sterowników do odpowiedniej płytki możliwe było załadowanie go do pamięci mikrokontrolera.

Uwaga: przy pierwszym uruchomieniu płytka nie pojawi się na liście portów Arduino po podłączeniu jej przez USB, ale wystarczy kliknąć upload i zaakceptować kod, aby przy kolejnym podłączaniu do komputera, moduł pojawiał się na liście portów.

Projekt obudowy

Elementy mechaniczne kostki są wykonane przy użyciu drukarki 3D (fotografia 2).

Fotografia 2. Obudowa w trakcie drukowania

Wszystkie potrzebne elementy zostały pokazane na rysunku 4, a pliki STL są dostępne na stronie projektu.

Rysunek 4. Projekt elementów przeznaczonych do wydruku 3D

Wszystkie zaprojektowano w Solidworks, aczkolwiek można je zaprojektować w dowolnym programie CAD 3D, także w darmowym, takim jak FreeCAD. Po złożeniu elementów kostki trzeba połączyć je ze sobą, aby uzyskać stabilny kształt sześcianu. Autor zaprojektował elementy w taki sposób, aby montaż był możliwie łatwy. W zestawie plików do wydruku znajduje się także podstawka pod kostkę, która pozwala na estetyczną prezentację gotowej konstrukcji.

Montaż i uruchamianie urządzenia

Urządzenie składa się z pojedynczej płytki kontrolera oraz pięciu płytek z diodami, jak pokazano na fotografii 3.

Fotografia 3. Moduły składowe układu

Konstrukcja jest realizowana przez wykonanie lutowanych połączeń pomiędzy płytkami (fotografia 4), które są wystarczająco wytrzymałe.

Fotografia 4. Sposób połączenia poszczególnych modułów

Płytki należy łączyć po kolei, łącząc linie zasilania (VDD) i masy (VSS) ze sobą, a także łącząc po kolei linie danych, podłączając DOUT jednego modułu do DIN kolejnego, zaczynając od płytki kontrolera. Drugim elementem do złożenia, jest podstawka, w której znajduje się włącznik i gniazdo zasilania, które można podłączyć do klasycznego zasilacza wtyczkowego. Podstawkę pokazano na fotografii 5.

Fotografia 5. Kostka RGB LED na podstawce

Po złożeniu konstrukcji jest ona gotowa do działania zaraz po zaprogramowaniu kontrolera – nie wymaga żadnej dalszej konfiguracji. Może być natomiast doskonałym punktem wyjścia do dalszych projektów z diodami LED RGB czy mikrokontrolerem RP2040.

Nikodem Czechowski, EP

Źródła:

Artykuł ukazał się w
Elektronika Praktyczna
czerwiec 2022

Elektronika Praktyczna Plus lipiec - grudzień 2012

Elektronika Praktyczna Plus

Monograficzne wydania specjalne

Elektronik maj 2024

Elektronik

Magazyn elektroniki profesjonalnej

Raspberry Pi 2015

Raspberry Pi

Wykorzystaj wszystkie możliwości wyjątkowego minikomputera

Świat Radio maj - czerwiec 2024

Świat Radio

Magazyn krótkofalowców i amatorów CB

Automatyka, Podzespoły, Aplikacje kwiecień 2024

Automatyka, Podzespoły, Aplikacje

Technika i rynek systemów automatyki

Elektronika Praktyczna kwiecień 2024

Elektronika Praktyczna

Międzynarodowy magazyn elektroników konstruktorów

Elektronika dla Wszystkich maj 2024

Elektronika dla Wszystkich

Interesująca elektronika dla pasjonatów