Taśmy LED i Raspberry Pi: Faza 2

Wszystkie fazy projektu: Mój AmbientLight


Faza 2

W tej fazie planuję uniezależnić się od kupnego sterownika LED i przeprowadzić pierwsze eksperymenty z podświetleniem ekranu. Pomysł polega na podłączeniu taśmy LED do niezależnego kontrolera. Opcji jest kilka:

  • Bezpośrednio do Raspberry: kuszące, ale może będzie inna opcja…
  • Do Arduino a potem 'jakoś’ do Raspberry – tanie, choć nie wiem czy Arduino się wyrobi, no i trzeba je jakoś podłączyć do Raspberry…
  • Do ESP8266… hmm – WiFi za darmo…

Podświetlenie telewizora ma być jednym z komponentów projektowanego przeze mnie systemu multimedialnego. Jego centralnym elementem ma być Raspberry Pi z OSMC. W tej roli Raspberry będzie miało co robić. Postanowiłem więc wyizolować zarządzanie diodami do zewnętrznego układu.

ESP jest bardzo atrakcyjne, ale po ostatnich doświadczeniach z NodeMCU i LUA – zrezygnowałem z niego. Jego główną zaletą jest wbudowane WiFi. Ta opcja nie będzie mi jednak przydatna. Zdecydowałem się na Arduino UNO. To chyba najtańsza opcja:)

Pomysł przedstawia się następująco:

  • Połączę Raspberry z Arduino kablem USB;
  • Raspberry (OSMC + Hyperion) generuje instrukcje sterowania w standardzie pi-blaster i wysyła ja na port szeregowy (przez USB);
  • Szkic na Arduino odbierze dane z Raspberry i wygeneruje sygnał PWM dla poszczególnych kanałów diod.

Jest kilka sposobów na połączenie Raspberry z Arduino. USB jest najbezpieczniejszy. Nie musicie martwić się o poziomy napięć (RPi to 3,3v a Arduino 5v). Jedynym minusem jest 'kapryśność’ połączenia szeregowego.

Schemat blokowy takiego rozwiązania wygląda więc tak:
cnfig_01
Zwróćcie uwagę, że nie mogę podłączyć Arduino bezpośrednio do taśmy LED. Nie będzie ono w stanie przenieść wymaganej mocy. Zastosuję więc zestaw tranzystorów, które będzie przełączać Arduino.
Do wykonania takiego układu wystarczy dosłownie kilka elementów:

  • Arduino UNO R3 lub klon;
  • Płytka rozwojowa dla Arduino;
  • 3xTranzystor IRLZ34N (lub inny N-MOSFET o podobnych parametrach);
  • 3xRezystory 1kΩ;
  • Kabel USB;
  • Raspberry Pi:)

Schemat (na podstawie blogu popoklopsi i dyskusji na electronics-exchange):

sketch_nmosfet_bb_arduino
Jeżeli chodzi o konfigurację OSMC pod Hyperiona: wszystko opisano dokładnie na tym blogu. Jedyna różnica polega na tym, że dane zamiast na /dev/pi-blaster wysyłane będą na /dev/ttyACM0 – czyli Arduino podłączone do Raspberry za pomocą USB .

Pozostało skleić płytkę:

Płytka do sterowania taśmą LED przez Arduino
Płytka do sterowania taśmą LED przez Arduino
Płytka do sterowania taśmą LED przez Arduino
Płytka do sterowania taśmą LED przez Arduino

Następnie Arduino wylądował na płytce z LED’ami:

led_board_0 led_board_1 led_board_2I w końcu z tyłu telewizora:

led_board_3_tvCóż – wieczorem testy!

Testy

Pierwszy błąd w projekcie znalazłem… przypadkiem. Zaczęło się od całkiem innego tematu nie związanego bezpośrednio z taśmami LED, ale generowaniem sygnału PWM. Bawiłem się z pewnym doświadczonym przez użytkownika Leonardo, który generował dość dziwne przebiegi PWM:

damaged_leonardo

Potem zacząłem porównywać przebiegi generowane na różnych portach różnych Arduino. Co ciekawe… okazało się, że mogą mieć różną częstotliwość…strange_fqPowyższy wykres pokazuje przebieg PWM ustawiony na pinie 3 (żółty) i 5 (niebieski) za pomocą instrukcji analogWrite(). Okazuje się, że o ile na pinie 3 ma on częstotliwość 460Hz – na pinie 5 była ona 2 razy większa!

Gdy doczytałem, okazało się, że jest to zachowanie całkowicie normalne:

The frequency of the PWM signal on most pins is approximately 490 Hz. On the Uno and similar boards, pins 5 and 6 have a frequency of approximately 980 Hz. Pins 3 and 11 on the Leonardo also run at 980 Hz.

Oczywiście (jak na złość) użyłem pinów 3, 6, 9. Czyli mam je do przelutowania:)

Rozszerzenia…

Pierwszą z modyfikacji, którą wykonałem, było dodanie przekaźnika. Masa z zasilacza LED (12v) idzie jak poprzednio – do Arduino. Plus idzie na wejście przekaźnika i dalej – przez normalnie otwarte (NO) wyjście przekaźnika do płytki Arduino.

scheme_1Sam przekaźnik zasilony jest z 5v Arduino. Jego pin sterujący (IN) podłączyłem do pinu D12 Arduino. W ten sposób wystawiając sygnał wysoki na pin D12 – włączam zasilanie diod; stan niski – wyłącza diody.

IMG_back

Format danych pi-blaster

W tym projekcie będę się posługiwał formatem danych jak dla oprogramowania pi-blaster. Pi-blaster to narzędzie dla Raspberry, które umożliwia generowanie sygnału PWM (na dowolnym z pinów). Składnia jest bardzo prosta:

  • Podajemy numer GPIO, na który ma być wysłana informacja;
  • Znak „=”;
  • Podajemy jasność z zakresu 0..1, gdzie 1 to maksymalne świecenie a 0 to wygaszenie.

Stąd np. „17=1.0” wygeneruje na pinie 17 (BCM) sygnał o stopniu wypełnienia 100%.

Specyficzne…

Jednym z ostatnich dodatków w projekcie było rozszerzenie płytki na telewizorze o przekaźnik. Przekaźnik sterowany jest z Arduino i umożliwia odłączenie oświetlenia, gdy nie jest potrzebne.

W związku z tym zmodyfikowałem trochę protokół rozszerzając go o możliwość „nadpisania” rozkazów przychodzących z hyperiona. Zamiast wiadomości jak powyżej, wystarczy wysłać: „ov=komenda.wartość”. „wartość” jest podawana dla spójności z oryginalnymi ramkami pi-blastera; nie używam jej.

Wtedy:

  • ov=1.0: włączenie przekaźnika (świeci),
  • ov=0.0: wyłączenie przekaźnika (nie świeci),
  • ov=17.0: pełny czerwony (w konfiguracji hyperiona kolor czerwony podłączyłem do GPIO17),
  • ov=22.0: pełny zielony (w konfiguracji hyperiona kolor zielony podłączyłem do GPIO22),
  • ov=24.0: pełny czerwony (w konfiguracji hyperiona kolor zielony podłączyłem do GPIO24),
  • ov=255.0: wyłączenie trybu nadpisywania (wyświetlanie przejmuje z powrotem hyperion).

Oprogramowanie na Arduino

Oprogramowanie na Arduino ma za zadanie:

  • Odebrać dane po USB z Raspberry,
  • Sparsować jasności dla poszczególnych kanałów kolorów,
  • Wysterować odpowiednie wyjścia, do których podłączone są tranzystory.

Kod  pi_blaster_parser dla Arduino znajdziecie na githubie.

Oprogramowanie dla Raspberry

Arduino połączyłem z Raspberry kablem USB. Arduino pojawiła się w linuxie jako nowe urządzenie typu port szeregowy „/dev/ttyAMA0”. Postanowiłem  sprawdzić działanie programu na Arduino za pomocą prostego skryptu w Pythonie.

W tym celu pobrałem na Raspberry pakiet pyserial.

Prosty (i brzydki) program w Pythonie powinien zapalić nam podświetlenie:

Teraz zacząłem instalację oprogramowania Hyperion. Oprogramowanie to jest dedykowane do rozwiązań typu ambientlight.  Analizuje to, co jest wysyłane na ekran i w zależności od sceny – dobiera jasności i kolory diod podświetlenia.


Do instalacji hyperiona będziecie potrzebowali praw root’a. Dla nowo zainstalowanego linuxa może być nie ustawione. Ustawcie je komendą:

Teraz podajcie nowe hasło.

Do instalacji Hyperion’a na Raspberry wystarczy wpisać:

Kluczową sprawą jest odpowiedni plik konfiguracyjny: /opt/hyperion/config/hyperion.config.json. Jego zawartość w moim przypadku wygląda tak:

Więcej o konfiguracji piBlaster dowiecie się tutaj: https://hyperion-project.org/wiki/pi-blaster

Już wkrótce: ciąg dalszy!

Koszty fazy 2

Materiały:

  • Arduino UNO R3 lub klon: 30 PLN (tutaj z 328 DIP)
  • Płytka rozwojowa dla Arduino: 15 PLN (aliexpress)
  • 3xTranzystor IRLZ34N (lub inny N-MOSFET o podobnych parametrach): 7.5
  • 3xRezystory 1kΩ: grosze
  • Śrubki fi2/16mm i dystanse 6mm: 6PLN
  • Kabelki połączeniowe: 2 PLN
  • Kabel USB: 8 PLN
  • Raspberry Pi: cóż – komplet ok. 250 PLN

Razem: niecałe 70 PLN (bez Raspberry)

Uzupełnienie

Instalacja pi-blaster:

Jeżeli wszystko zainstalowało się poprawnie, powinniście widzieć urządzenie „pi-blaster” w katalogu /dev:

Arkadiusz Merta