Lampki choinkowe LED USB sterowane za pomocą mikrokontrolera

Zgodnie z małą niepisaną tradycją, na mojej choince zwykle świecą się lampki wykonane przeze mnie. Dawno temu, gdy rodzice kupili mi pierwszy komputer PC, były one nawet sterowane bezpośrednio z tego komputera, z użyciem portów COM i LPT oraz programu napisanego w języku BASIC. Dziś takie rozwiązanie nie miałoby większego sensu: ani energetycznego, ani użytkowego, ani tym bardziej estetycznego, ponadto czasy dyskotek w moim życiu już dawno minęły i obecnie preferuję bardziej statyczne świecenie.

Mimo to znalazłem powód, by sięgnąć po mikroprocesor. Tym razem jego rola jest czysto instrumentalna: steruje on przetwornicą typu step-up, która z niskiego napięcia zasilania (USB 5 V) generuje około 50…60 V potrzebne do zasilania łańcucha diod LED połączonych szeregowo. Zastosowanie dwurdzeniowego procesora do generowania sygnału PWM to niemal uosobienie over-engineeringu 🙂

Zastosowanie połączenia szeregowego ma oczywiste zalety: nie trzeba dbać o wyrównanie napięć na diodach, jak również okablowanie jest maksymalnie uproszczone. Ceną za to jest jednak konieczność wygenerowania stosunkowo wysokiego napięcia.

Co istotne, przetwornica nie jest wyposażona w sprzężenie zwrotne. Jasność lampek wybierana jest skokowo, spośród czterech poziomów, za pomocą przycisku. Mikrokontroler Raspberry Pi Pico ustawia odpowiedni współczynnik wypełnienia sygnału PWM, którym sterowany jest klucz przetwornicy (tranzystor MOSFET). Układ pracuje w trybie DCM (Discontinuous Conduction Mode), co w praktyce oznacza, że energia przekazywana do obciążenia jest naturalnie ograniczona w każdym cyklu pracy i jest wprost proporcjonalna do czasu otwarcia klucza i napięcia zasilania oraz odwrotnie proporcjonalna do indukcyjności cewki. Dzięki temu nie ma ryzyka „przepompowania” nadmiernej mocy do diod, nawet przy prostym algorytmie sterowania (a gwoli ścisłości – przy jego braku).

W zależności od wybranego poziomu jasności, cały układ pobiera od około 100 mW do maksymalnie 2 W mocy. To w zupełności wystarcza do uzyskania wyraźnego, przyjemnego światła.

Efekt końcowy to proste, energooszczędne lampki LED, zasilane z powszechnie dostępnego źródła USB, z odrobiną elektroniki. Nie zawiera żadnych smaczków programowych czy sprzętowych, ale daje satysfakcję wynikającą z tego, że nawet tak prozaiczny element świątecznej dekoracji może być pretekstem do wykonania małego DIY.

Krótki komentarz do do schematu przetwornicy:

  • Warto pamiętać o diodach typu Transil albo Zenera na jej wyjściu. Bez użycia tego zabezpieczenia – jeżeli zdarzy się nawet chwilowe rozwarcie łańcucha diod, to klucz MOSFET natychmiast kończy życie na skutek przepięcia. Ja zastosowałem dwie połączone szeregowo diody typu Transil na 30 V.
  • Rozważam zastosowanie diody i kondensatora na wyjściu przetwornicy, bo obecnie łańcuch LED jest prawdopodobnie źródłem istotnych zakłóceń na częstotliwościach adekwatnych do:
    • częstotliwości powtarzania impulsów (90 kHz),
    • częstotliwości drgań gasnących charakterystycznych dla DCM (około 800 kHz) ,
    • czasu narastania i opadania zboczy (rząd kilku…kilkudziesięciu MHz).

AKTUALIZACJA

Przyjrzałem się załączonemu tutaj oscylogramowi napięcia na łańcuchu diod i wywnioskowałem, że wziąwszy pod uwagę, iż szeregowo połączonych jest tutaj jest jedynie 16 diod, to napięcie szczytowe o wartości około 60 V jest zdecydowanie zbyt wysokie. Powinno być około 40 V. Wywnioskowałem z tego, że prostownik wyjściowy w postaci łańcucha diod jest niedoskonały, prawdopodobnie zbyt powolny dla detekowania krótkich impulsów prądowych. Postanowiłem zmodyfikować ten układ dodając na wyjście diodę przełączającą i kondensator wyjściowy, jak ma to miejsce w zwyczajnej przetwornicy step-up. Efekt jest taki, że mimo wydłużenia łańcucha diod do 24, napięcie maksymalne na kluczu (czyli analogiczne, do załączonego wyżej oscylogramu) jest nadal równe 60 V, a przy tym, subiektywnie, jasność diod jest większa. Zapewne ta modyfikacja korzystnie wpłynęła na emisję zakłóceń.

AKTUALIZACJA 2

Załączam program realizujący PWM. Nawet tak prosty program, który jedynie generuje przebieg PWM oraz reaguje na naciskanie przycisku zmieniając współczynnik wypełnienia, jest okazją do nauczenia się czegoś ciekawego o Raspberry Pico. Okazało się, mianowicie, że software-owo realizowany PWM, obarczony jest zauważalnym jitterem o wartości około 1 µs. Wynika to z faktu, iż Pico podłączone do USB komputera realizuje funkcję komunikacji z PC jako CDC (Communications Device Class) i okresowo zajmuje się obsługą USB. W pierwszej iteracji nowej wersji programu przerzuciłem zatem pętlę główną do drugiego rdzenia Pico – pomogło, jitter się zmniejszył, ale nadal był widoczny. Zasięgnąłem opinii w Internecie i dowiedziałem się, że dwa rdzenie mimo, iż teoretycznie są w stanie realizować dwa zupełnie niezależne programy, tak jednak bezustannie walczą o zasoby głównie w postaci pamięci flash programu. W celu pozbycia się tej rywalizacji, przerzuciłem główną pętlę programu do pamięci RAM i stamtąd ją uruchomiłem. Problem walki o zasoby może nadal się pojawiać i być związany z dostępem do tego samego sektora pamięci RAM – da się tego całkowicie uniknąć, ale wymaga to zadeklarowania miejsc, w których znajdować się będą zmienne programu.

Można oczywiście zastosować znacznie bardziej sensowne rozwiązanie w postaci wykorzystania timera w trybie PWM albo bloku PIO, zamiast męczyć procesor niezbyt ambitnym realizowaniem opóźnień. Na razie jednak zostanie jak jest, a ja w niedalekiej przyszłości zamierzam zgłębić temat programów realizowanych na obydwu rdzeniach.

Program C, VSCode: https://fimo-elektronika.pl/wp-content/uploads/2025/12/lampki_choinkowe_C_PROGRAM.zip

Obudowa (STEP): https://fimo-elektronika.pl/wp-content/uploads/2025/12/Obudowa-STEP-files.zip

Leave a Comment