Digispark, Raspberry Pi 3 (OSMC) i sterowanie paskami LED

Ten post jest częścią serii o budowie komponentu multimedialnego.

Mój komponent multimedialny ma podświetlany front. Podświetlenie informuje o jego stanie – np. kolor czerwony – stan oczekiwania, zielony – odtwarzanie itp. Do podświetlenia użyłem pasków LED RGB. Paski te sterowane są Digispark’iem. W szczególności:

  • Paski LED umieściłem na panelu przednim komponentu,
  • Digispark generuje sygnał PWM do sterowania paskami (przez tranzystory),
  • Digispark’a podłączyłem do Raspberry za pomocą portu szeregowego,
  • Polecenia sterujące wysyłam z Raspberry.

Brzmi ciekawie, prawda?

Paski LED

Pasek LED – epiLED

O paskach LED pisałem już kilkakrotnie:

Paski LED to elastyczne taśmy na których osadzono diody świecące (LED) oraz dodatkowe elementy, jak rezystory czy kontrolery sterujące zachowaniem diod. Same taśmy mają zatopione kontakty łączące elementy. Stąd można je ciąć jedynie w określonych miejscach: na granicach segmentów. Segmenty są wyraźnie oznaczone, gdyż kończą się stykami. Przecinając taśmę na granicy segmentu musicie się do nich przylutować przewodami.

W sprzedaży znajdziecie różne rodzaje pasków. Można je podzielić na:

  • Jednokolorowe, gdzie wszystkie segmenty paska świecą się w tym samym kolorze (i nie można tego zmienić),
  • Kolorowe (RGB), gdzie wszystkie segmenty paska świecą się w tym samym kolorze, który możemy zmieniać zadając wartość komponentów czerwonego (R), zielonego (G) i niebieskiego (B),
  • Kolorowe sterowane, gdzie możecie sterować kolorem każdego segmentu osobno (zob. Stojak na kartridże – wersja IoT) – o cenie około 100 zł za metr.
  • Z diodami w obudowach 3528, 5050 lub innych – różnią się wielkością i jasnością; np. najbardziej popularne 5050 mają rozmiar 5mmx5mm (3528 – odpowiednio 3.5×2.8mm); każdy typ diod ma właściwą sobie maksymalną jasność (mierzoną w lumenach na wat mocy),
  • Z różną ilością diod na metr, np. 30, 60 (różną długością segmentów),
  • Zasilane 5v, 12 lub 24v,
  • Spełniające różne poziomy normy odporności IP.

Do tego projektu użyłem paska RGB (a więc można zmieniać kolor świecenia całej taśmy), z diodami 5050. Każdy segment ma długość 10cm i znajdują się na nim 3 diody RGB – czyli na metr jest 30 diod – a na rolkę (5m) – 150.

Każda dioda 5050 pobiera maksymalnie 20mA (biały kolor, komponenty R, G i B świecą maksymalnym natężeniem). Jeden segment z 3-ma diodami pobiera więc 60mA.

P = U*I, stąd: jeden odcinek pobierze 0.72 W (12* 60), 1m taśmy ze 150 diodami 5050 pobierze 7,2W, a rolka – 36 W.

Do tego projektu zużyłem 8 segmentów – czyli maksymalny pobierany prąd  może wynieść 60*8=480mA. Ponieważ zasilanie idzie na trzy kolory – na każdy będzie przypadać 160mA.

PWM – i (nie) konflikt z USB

LED sterowane są za pomocą sygnału PWM. W moim projekcie sygnał ten generuje mały Digispark.

Dla Digispark, sprzętowy sygnał PWM może być wygenerowany na 3 portach P0, P1 i P4. Generowanie sygnału PWM na P4 wyklucza możliwość jednoczesnej komunikacji po USB. Piny P3 i P4 podłączone są do portu USB.

Pierwotny plan zakładał podłączenie Digispark do Raspberry za pomocą kabla USB. Eleganckie, prawda? Niestety jak dotychczas nie udało mi się tego osiągnąć. O ile DigiCDC działa z „normalnym” linuksem (np. Mint 18)- na razie nie udało mi się go w pełni uruchomić z Raspbianem. Owszem, urządzenia tty się tworzą, ale nie mogę z nich odebrać żadnej transmisji.

DigiUSB nie udało mi się uruchomić w ogóle – ani na Raspbianie, ani na Mint.

Jeżeli jednak zdecydujecie się na USB, nadal możecie wygenerować 3 sygnały PWM za pomocą biblioteki TinySoftPwm. Jest trochę bardziej skomplikowana w obsłudze, ale daje radę.

W prostszym przypadku, podobnie jak dla Arduino, do wygenerowania sygnału PWM na P0, P1 lub P4 służy instrukcja analogWrite().

Połączenie Digispark z LED

Mamy teraz trzy porty Digispark’a, które generują sygnał PWM, i paski LED, które na ten sygnał mają reagować. Jak je połączyć?

Ja zdecydowałem się na sterowanie za pomocą tranzystorów MOSFET. Schemat jest podobny dla wszystkich kanałów R, G i B:

  • Kanał koloru łącze z drenem tranzystora (D),
  • Źródło tranzystora (S) łączę z masą,
  • Bramkę tranzystora (Gate) łączę przez rezystor 150Ω z pinem Digisparka oraz przez rezystor 10kΩ z masą.

Razem wygląda to tak:

Pozostała kwestia dobrania tranzystorów.

IRLz34N vs IRFz44N vs Bs170

Dowcip z tranzystorami MOSFET polega na tym, że bramką (gate) sterujemy napięciem. Jest to znacząca różnica w porównaniu do tranzystorów bipolarnych (BJT, np. ulubiony 2n2222), których bazą („odpowiednik” bramki MOSFET) steruje się natężeniem prądu. Rezystor dodany w szeregu z bazą reguluje natężenie prądu, które wzmacniane przez tranzystor zapewnia zasilanie obwodowi podłączonemu przez kolektor (colector) do emitera (emiter).

Problem polega na tym, że nie zawsze można zapewnić odpowiedni prąd bazy. Przykładowo: piny kontrolera mogą nie dawać dostatecznie dużo prądu, żeby w pełni „otworzyć” tranzystor. Wtedy wzmocnienie będzie zbyt małe, żeby uruchomić podłączony do tranzystora układ.

MOSFETy są sterowane napięciem. Problem polega jednak na tym, że prąd, jaki przeniesie MOSFET zależy od napięcia na bramce (cóż, właściwie między bramką-gate a źródłem-source). Jeżeli napięcie to będzie za małe (poniżej Vgsth) – tranzystor nie będzie przewodził w ogóle. Im wyższe napięcie (oczywiście do pewnego poziomu charakterystycznego dla każdego tranzystora), tym większy prąd tranzystor będzie przenosił.

Spójrzmy na charakterystyki wyjściowe trzech różnych tranzystorów: IRFz44N, IRLz34N i BS170:

Jak widać, przy napięciu źródło (source) – dren (drain) 12v (wymaganym przez paski LED) oraz napięciu sterującym 5v (bramka-źródło, z portu Digispark):

  • IRFz44N: może przesłać nawet 25A (teoretycznie, ograniczenie na rozpraszaną moc), ale napięcie bramka – źródło jest niewiele ponad progowe,
  • IRFl44N: może przesłać nawet… 35A (teoretycznie, ograniczenie na rozpraszaną moc) a napięcie bramka-źródło jest bardzo bezpiecznie ponad progowym,
  • BS170… maksymalnie 300mA! (powyżej poziomy progowego Vgsth dla napięcia bramka-źródło)

Jak widać nawet 5v napięcia z portu kontrolera jest w stanie otworzyć MOSFETA. Chociaż zarówno BS170 jaki i IRFz44n są na granicy włączenia (lekko powyżej Vgsth – napięcia progowego bramka-źródło).

Zwróćcie uwagę na IRLz34N. W odróżnieniu do pozostałych – otwarty 5v ma się całkiem dobrze! IRLz34 jest MOSFETEM, którego sterowanie bramką zostało specjalnie przygotowane na potrzeby kontrolerów (logic-level). Do pełnego otwarcia wystarczą im znacznie niższe napięcia, niż w przypadku innych MOSFETów. Dzięki temu mogą być one swobodnie używane np. z Raspberry Pi (logika 3.3v).  Niestety są też dużo droższe…

Na pierwszy rzut oka wychodzi stąd, że spokojnie mogłem użyć bs170. Przy napięciu bramka-źródło 5v  spokojnie się otworzy a te 300mA powinno wystarczyć na zastosowane 8 segmentów taśmy.  Nietety…

 IRFz44  IRFl34  bs170
 Vgsth  2-4v  1-2v  0.8-3v
Maksymalny prąd dren-żródło dla napięcia bramka-źródło 5v i napięcia dren-źródło 12v  25A  40A  0.3A
 Rozpraszanie mocy [W]  94 68  0.35
 Cena za szt  1.7 zł 2.7 zł  0.5 zł

Każdy kanał paska RGB zasilany jest osobno. Jak wyliczyłem, będę potrzebował około 160mA na kanał, ale przy 12v. Stąd moc na kanał będzie na poziomie… prawie 2W (0.16*12). Niestety, BS170 jest w stanie rozproszyć jedynie… 0.35W.

Do projektu użyłem IRFz44:) Oczywiście to trochę przesada, ale nic innego nie miałem na miejscu.

Płytka

Płytka z Digispark gotowa:

Sterowania paskiem LED

Do sterowania kolorami paska LED będę generował sygnał PWM na poszczególnych kanałach koloru. Biorąc pod uwagę, że kanały czerwony, niebieski i zielony podłączyłem pod porty odpowiednio P0, P1 i P4:

Wyjaśnienie znaczenia #define RASPBERRY_* znajdziecie poniżej w podpunkcie „PiBlaster”.. W tym momencie wystarczy, że:

  • PWM generuje się za pomocą „analogWrite()”,
  • używam tablicy „lastPWMValues”, żeby niepotrzebnie nie zmieniać wartości PWM. Zapamiętując poprzednie wartości możecie również ustawić progi, gdzie np. wartość PWM nie zmieni się, jeżeli różnica między starą a nową wartością nie jest większa niż pewien określony próg.

Port szeregowy Digispark

O obsłudze portu szeregowego dla Digispark pisałem już np. tutaj. Wystarczy dodać bibliotekę DigisparkSoftSerial:

Mój Digispark będzie tylko odbierał; wysyłanie nie będzie podłączone do Raspberry.

UWAGA: Digispark posługuje się logiką 5v, Raspberry 3.3v. Bezpośrenie podłączenie TX Digispark do RX Raspberry może doprowadzić do uszkodzenia Raspberry.

Port szeregowy Raspberry (OSMC)

Port szeregowy Raspberry Pi wyprowadzono na piny 14 (TX, nadawanie) i 15 (RX, odbiór). Problem polega na tym, że w Raspberry Pi 3  domyślnie wykorzystuje go… moduł Bluetooth.

Zalogujcie się do Raspberry; pod linux możecie użyć ssh (np. „ssh osmc@192.168.1.7”) lub putty.

  1. Z pliku „/boot/cmdine.txt” usuńcie wpisy typu: „console=serial0,115200 console=tty1”,
  2. Dodajcie „dtoverlay=pi3-disable-bt” do „/boot/cmdline.txt”.

Raspberry Pi połączone z Digispark:

PiBlaster

Dlaczego zdecydowałem się na wysyłanie instrukcji w formacie PiBlaster? Ano ten sam format używam do sterowania podświetleniem w telewizorze z Hyperionem.

Hyperion wykorzystuje zdefiniowane piny Raspberry, gdzie:

  • Pin 17: kolor czerwony,
  • Pin 22: kolor zielony,
  • Pin 24: kolor niebieski,

Format wywołania, np:

  • „17=0”: wyłączenie kanału czerwonego,
  • „22=0.5”: kanał zielony na 50%,
  • „24=0.89”: kanał niebieski na 89%,
  • „17=1”: kanał niebieski w pełni włączony.

Do wysłania komendy z raspberry, można użyć komendy „echo”, np.: „echo „17=0.2\r” > /dev/ttyAMA0″. Znak „\r” kończy linię.

Kod dla Digispark odbierający polecenia z Raspberry Pi

Ostatecznie kod dla Digispark:

Zdjęcia montażowe

Pasek LED wkleiłem w korytko:

I demo:

I wmontowane w komponent:

Źródła

Dodaj komentarz

Proszę dodaj swój komentarz. Pamiętaj, żeby nie podawać żadnych danych osobowych.