LED Dimmer (PL)

LED Dimmer – sterowanie listwami diodowymi

LED Dimmer – sterowanie listwami diodowymi

Wykorzystanie Raspberry Pi, telefonu z Androidem i modułu z IKEI

Wstęp

Projekt powstał w pewnej chwili wielkiego zwątpienia we własne umiejętności elektronika. W końcu to sam wstyd. Ale przedstawmy wszystko od początku. Jak już sobie kupisz telewizor to oprócz tego, że właściwie go nie oglądasz (no bo i po co) to czasami kiełkują w Twoim elektronicznym sercu pomysły na usprawienia i genialne funkcjonalności dla tego okna na świat. Telewizor, aby był dobrze odbierany przez oko, najlepiej aby nie znajdował się w kontrastowym otoczeniu tj. jeśli mamy bardzo ciemno w pokoju, to niezbyt dobrze dla oka jest patrzeć cały czas w ekran. Zbyt duży kontrast męczy oko. W związku z tym zalecano, aby oświetlenie wokół telewizora było umiarkowane (ale było!). Kiedyś jeden z producentów telewizorów (bodajże Philips) wpadł na pomysł, aby zabudować w telewizorze podświetlenie, które dla większego efektu reagowało na wyświetlany obraz czyli np. w trakcie meczu piłkarskiego podświetlenie było w kolorze dominanty zielonej. Fajnie to wyglądało i mi się takie coś zamarzyło. Efekt końcowy można zobaczyć na filmiku poniżej.

Kompletne rozwiązanie w działaniu

A teraz szczegóły projektu oraz wyjaśnienie zastosowanych technologii oraz konstrukcji sprzętu.

Opis funkcjonalny

Jak już z wstępu wynika, pomysłem jest zbudowanie własnej listwy ledowej, która po zamontowaniu na tylnej powierzchni telewizora dostarczy podświetlenia w dowolnym kolorze. Oczywiście jak mądrzy ludzie gadają, jeśli uważasz, że wymyśliłeś coś odkrywczego dobrze poszukaj, bo na pewno już to ktoś dawno produkuje 🙂 Wiadomo, że takie rozwiązania ją popularne i dość tanie (co w tym jest za chwilę). Można się wyposażyć w różne elementy od podstawowych takich jak listwy LED do kompletnych od źródła zasilania, sterownika do własnie wymienionych listw LED. Każde (prawie) z tych rozwiązań jest jednak uproszczone – sterować można tym właściwie tylko za pomocą dołączonego manipulatora. I tutaj dochodzimy do sedna tego artykułu. Przedstawimy kompletne rozwiązanie zdalnego sterowania listwami LED, które można wykorzystać do różnych, wizualnie atrakcyjnych, celów.

Listwy LED

Ja chcąć jak najprościej wejść w temat postanowiłem po prostu kupić jakieś rozwiązanie i zobaczyć jak to wszystko działa. Wybrałem zestaw sterowania diodowego z IKEI. Jest to zestaw DIODER, który składa się z zasilacza, kontrolera + rozgałęziacza oraz zestawu listw LED. Wszystko ładnie przedstawione na rysunku poniżej. dimmer

Rys. Zdjęcie kontrolera LED i listw LED od IKEI – (c) IKEA

Urządzenie działa całkiem fajnie, nie sprawia problemów i robi to co ma robić. Posiada kilka trybów pracy: kolor definiowany tj. to co wybierzesz na pokrętle, to się tak diody świecą; kolor zmieniany skokowo tj. kolor zmienia się co chwilę z jasnym uwidocznieniem różnych kolorów; kolor zmieniany płynnie – płynnie zmienia się kolor listw LED tak aby przedstawić całe spektrum barw. Interfejsem sprzętowym są wyjścia na listwy diód LED oraz interfejs do zewnętrznego kontrolera. Teraz po poznaniu juz bazowego sprzętu przejdźmy do architektury proponowanego rozwiązania.

Architektura

Główną potrzebą była możliwość sterowania podświetleniem zdalnie tj. bez konieczności podchodzenia do telewizora, tylko z wygodnej kanapy. W związku z tym, aż prosi się o wykorzystanie telefonu (smartphone’a) do tego celu. Dodatkowo, ze względu na sterowanie wymagane do realizacji, komunikację bezprzewodową (Wi-Fi) z chęcią wykorzystam “nową falę” technologii dla wszystkich tj. komputerek RaspberryPi. Aby to wszystko pospinać zaprojektowałem następującą architekturę rozwiązania:

Rys. Architektura rozwiązania sprzętowa

Rys. Architektura programowa

Do realizacji pełnej założonej przeze mnie funkcjonalności potrzebne są:

  • projekt sprzętu sterującego listwami LED podłączonego do RaspberryPi
  • oprogramowanie dla RasbperryPi w celu sterowania warstwą sprzętową oraz umożliwiająca komunikację z innymi aplikacjami zewnętrznymi
  • oprogramowanie testowe w celu weryfikacji i sprawdzenia działania sprzętu
  • oprogramowanie dla telefonu umożliwiające zdalne sterowanie sprzętem. Ze względu na własne wyposażenie wybrano telefon z systemem operacyjnym Android

Wszystko powinno zadziałać i pięknie się prezentować 🙂 Zobaczmy w takim razie jak zostały wykonane poszczególne etapu projektu. Zacznijmy od sprzętu.

Sprzęt

Bazą całego pomysłu jest RaspberryPi i na nim został oparty cały schemat blokowy. Jednak aby Pi mogło coś widzieć i czymś dyrygować potrzebne są elementy odczytujące stan (przyciski), zestaw zasilania oraz bloki odpowiedzialne za wysterowanie świecenia listw LED. Schemat przedstawia się następująco:

Rys. Schemat sprzętu

Zasada działania jest bardzo prosta. Aby wygenerować dowolny kolor, korzystamy z diod RGB, które po odpowiednim połączeniu kolorów dostarczają dowolnego koloru z palety barwnej. Aby to wykonać, nie możemy podłączyć takiej listwy LED do wyjść RaspberryPi, więc potrzebujemy trochę mocniejszych driverów prądowych. Wszystkie takie elementy wraz z ich sterowaniem za pomocą PWM (tak aby uzyskać odpowiednią addytywność kolorów podstawowych) pozwalają na uzyskanie dowolnego koloru. Dodatkowo, w celu umożliwienia sterowania urządzeniem nie tylko zdalnie z innych urządzeń pozwoliłem sobie dodać trzy przyciski kopiujące funkcjonalność sterownika z IKEI. Jeden z nich włącza/wyłącza urządzenie i przechodzi do trybu sterowania kolorem za pomocą tablicy barwnej. Drugi włącza tryb płynnej zmiany kolorów a ostatni przycisk zmienia na tryb skokowej zmiany kolorów. Oczywiście oprócz elementów funkcjonalnych umieściłem konwerter napięć z +12V (zasilanie listw) do +5V, które wchodzi bezpośrednio na gniazdo rozszerzeń RaspberryPi i już samo Pi zajmuje się konwersją tego na inne niezbędne zasilania. czyli wystarczy tylko jeden zasilacz do wysterowania diód jak i do zasilania RasbperryPi.

Jak widać niewiele elementów dodatkowych, ale to chyba dobrze. Trzeba było przyjąć określony sposób podłączenia listw diodowych. Postanowiłem wykorzystać standard, który daje IKEA, czyli złącza Phoenix. Schemat podłączeń widać na rysunku poniżej. Jeśli korzysta się z innych listw, trzeba dopasować wyjścia do tego, co zaprojektowałem na płycie głównej.

Ze względu na to, iż Pi nie posiada kilku sprzętowych kontrolerów PWM postanowiłem skorzystać z programowo generowanego wyjścia PWM. W związku z tym, można było wykorzystać dowolne wyjścia Pi. Aktualnie wykorzystałem wyjścia GPIO0-4 do odczytu stanu klawiatury a wyjścia GPIO9-11 do sterowania poszczególnymi kolorami za pomocą Pi. Wszystkie schematy i layouty płyt znajdują się na repozytorium (szczegóły na końcu artykułu).

Oprogramowanie

Teraz krótka informacja o zaprojektowanym oprogramowaniu. Aby skorzystać z zaprojektowanej (i kupionej) warstwy sprzętowej należało jeszcze coś napisać na kilka różnych architektur sprzętowych. Dla RaspberryPi zdecydowałem się napisać oprgramowanie sterownika w języku C++ oraz z wykorzystaniem biblioteki Qt, która zapewniła spójną warstwę sieci TCP. Do komunikacji z tym oprogramowaniem używamy pakietów TCP oraz sposobu wymiany danych za pomocą struktur protobuf. Struktury przekazują zarówno informacje sterujące jak i dane pomiarowe.

Oprogramowanie sterownika

Sterownik posiada uproszczoną strukturę. Wykorzystuje klasy QTcp* do obsługi połączeń TCP oraz napisane własne kontrolery, które dekodują pakiety protobuf i w zależności od typu Message/Command odpowiednio wykonują żądane operacje. W osobnym wątku działa kontroler PWM, który w zależności od trybu pracy oraz sposobu sterowania realizuje odpowiedni kod sterujący. Protobuf wykorzystano jako mechanizm zarówno przesyłania danych jak i rozkazów/statusu. Pozwala na to wprowadzenie odpowiedniego schematu opakowywania danych.

Aplikacja wykorzystuje bibliotekę WiringPi oraz jej oprogramowanie GPIO do ustawienia odpowiednich parametrów wejść/wyjść. Aplikacja ze względu na bezpośredni dostęp do zasobów sprzętowych Pi wymaga uruchomienia z prawami roota. Po włączeniu aplikacja przechodzi do interaktywnej konsoli i zamknąć aplikację można za pomocą tekstu “exit” oraz ENTER. Domyślnie aplikacja słucha na porcie 8888 w celu realizacji zdalnego sterowania. W repozytorium umieszczono dodatkowe skrypty, które umożliwiają uruchamianie aplikacji jako demona (w tle przy starcie systemu).

Tester Java Swing

Dla celów testowych został opracowany program w języku Java oraz wykorzystujący bibliotekę Swing. Pozwala w prosty sposób skomunikować się z RaspberryPi i w pełni sterować kontrolerem głównym.

Rys. Wygląd okna testującego

Sterowanie zdalne Android

Dla celów zdalnego sterowania napisano aplikację natywną dla systemu operacyjnego Android. Służy ona do komunikacji z sterownikiem i wykonywaniem takiego sterowania jak jest dostępne lokalnie w urządzeniu. Do sterowania wykorzystano opracowany dodatkowy komponent czyli pokrętło Jog, które w łatwy sposób pozwala na zmianę żądanego koloru. Ekran sterujący jest jeden i pozwala pracować w dowolnej orientacji ekranu. Ustawienia pozwalają na określenie podstawowych parametrów kontrolera – adres IP oraz port na którym działa (domyślnie 8888).

Rys. Wygląd ekranu sterującego

Rasbperry Pi

Teraz trochę informacji o samym RaspberryPi. Jak go skonfigurować, co zainstalować i w jaki sposób przygotować sobie w pełni środowisko programistyczne.

System operacyjny – zastosowany referencyjną wesję systemu Raspbian dostępną bezpośrednio ze strony RaspberryPi tj. Raspbian

Qt5 – do celów developerski oraz przygotowania sobie środowiska programistycznego zainstalowałem na RPi wersję 5.0.x biblioteki Qt. Szczegóły budowania, przygotowywania sobie środowiska QtDevelop najlepiej szukać na stronie projektu Qt. Jeśli będą takie potrzeby opiszę sposób przygotowania RPi do pracy z tą biblioteką w osobnym artykule.

JRE8 + JavaFX – JRE8 jest nadal dostępne w trybie ‘early preview’ ale już obecnie warto z niej skorzystać. Instrukcja konfiguracji środowiska znajduje się w sekcji budowanie kodu.

WiringPi + narzędzia – wykorzystano wersję HEAD z repozytorium WiringPi. Należy pamiętać, aby program gpio znajdował się w ścieżce uruchamiania (path), gdyż biblioteka wykorzystuje ten program do konfiguracji wejść/wyjść i konfiguracji przerwań inicjalizujących zdarzenia (naciśnięcie przycisków).

Usługa serwisowa LedController – w repozytorium (katalog data) znajduje się przykład skryptu init.d, który pozwala na uruchomienie aplikacji jako demon w tle

Efekt

OLYMPUS DIGITAL CAMERA

Licencja

Licencja dla kodu i schematów/layoutów: Gnu GPLv3

Licencja dla artykułu i rysunków: CC BY-SA 3.0 Attribution-ShareAlike

Kod źródłowy/schematy/layouty PCB

Adres URL – Bitbucket: Bitbucket

Schemat repozytorium:

Budowanie Kodu

Kontroler główny Qt – użyć Qt 4.x dostępnego w dystrybucji Debian lub zainstalowania Qt5 wykorzystując informacje dostępne na stronie Rpi Beginners Guide oraz za pomocą skryptu wymienionego na tej stronie tj. bakeqtpi

Aplikacja JavaFX, Android, Swing – wykorzystanie NetBeans 7.x lub innego środowiska do budowania aplikacji (skrypty Ant)

Instalacja JavaFX na Rpi – za pomocą oficjalnego poradnika Oracle: JavaFX8 ARM

Linki