Bezprzewodowy ambilight do komputera PC

Ambilight to system zaprezentowany przez firmę Philips doświetlający brzegi ekranu telewizora tworząc wrażenie poszerzenia obrazu. Dzięki Ambilightowi wieczorowe oglądanie telewizji nie męczy wzroku w taki sposób w jaki to robi jasny ekran w ciemnym pomieszczeniu.



Przez pewien czas system ten był zarezerwowany dla telewizorów Philips, ale niewiele minęło aż pojawiły się open-source'owe rozwiązania umożliwiające stworzenie podobnego oświetlenia dla sprzętu innych marek, a także dla komputerów osobistych.

Poniżej przedstawię krótki opis jak zrobić coś takiego w domu. Podobnych poradników znajdziecie w Internecie sporo, aczkolwiek ja wprowadziłem do projektu małą innowację, otóż zastąpiłem połączenie przewodowe pomiędzy płytką Arduino i komputerem bezprzewodową transmisją Bluetooth.

Muszę wspomnieć, że poradnik przeznaczony jest dla osób, które znają podstawy elektroniki, programowania i maiły styczność z platformą Arduino.

Będziemy potrzebowali:

- Arduino Uno lub Nano,
- Moduł Bluetooth HC-06 (Breakout Board),
- Taśma (samoprzylepna) LED WS2812B o długości odpowiadającej obwodowi monitora, do monitora 23" potrzebowałem 43 LED - 1,5m taśmy,
- zasilacz 5V (2A dla 50 LED i proporcjonalnie dla innej liczby),
- płytka veroboard, przewody, druciki, rezystor 100 - 470 omów, goldpiny do zmontowania w całość,
- komputer z modułem Bluetooth,
- oprogramowanie Arduino IDE.

Wszystkie potrzebne elementy znajdziemy w popularnym polskim serwisie aukcyjnym. Przed zakupem taśmy warto zmierzyć telewizor, tak aby objęła ona wymagany obwód ekranu.

Narzędzia:

- lutownica,
- obcinaczki,
- ściągacz izolacji z kabli,
- klej na gorąco lub taśma dwustronna.

Montaż taśmy LED

Montaż rozpoczynamy od przyklejenia taśmy LED do monitora. Taśma ta jest kierunkowa, symbolizuje to strzałka przy każdej z diod. Klejenie zaczynamy od środka dolnej krawędzi zgodnie ze wskazówkami zegara patrząc na tył ekranu.

Proponowane rozmieszczenie taśmy LED na monitorze.

W narożnikach musimy posiłkować się lutownicą i przylutować przewody łączące kolejne fragmenty taśmy.

Połączenie taśmy w narożniku.


Montaż układu sterowania

W następnej kolejności możemy przejść do przygotowania układu sterującego diodami LED. Składa się on z Arduino oraz modułu Bluetooth. Instalację wykonujemy według przedstawionego schematu. Dodam, że montaż wykonałem na płytce stripboard, jednak sposób połączenia elementów pozostawiam każdemu z Was. Warto także zainstalować przewód zasilający (Vcc) modułu HC-06 w taki sposób, aby był on łatwy do odpięcia - będziemy potrzebowali to zrobić podczas programowania Arduino.

Schemat połączeniowy układu sterowania.

W skrócie: piny VCC, VDD, 5V łączymy do dodatniego bieguna zasilania, piny VSS, GND do masy.
Pin D3 Arduino łączymy do wejścia DIN na początku taśmy LED poprzez rezystor. Moduł HC-06 z Arduino łączymy pinami TXD do RXD oraz RXD do TXD (na krzyż).

W specyfikacji HC-06 znajdziemy informację, że piny przyjmują napięcia do 3.3V, aczkolwiek z powodzeniem używam bezpośrednio połączonym płytek. Ostrożni mogą dołożyć dzielnik napięcia na wyjściu TX Arduino.

Programowanie modułu HC-06

Aby osiągnąć jak najwyższą szybkość działania systemu (maksymalny odświeżanie) musimy ustawić dla modułu Bluetooth najwyższy baud rate - szybkość transmisji szeregowej. W tym celu konfigurujemy go przy pomocy komend AT, dodatkowo będziemy mogli także zmienić wykrywaną nazwę oraz kod PIN modułu.

Aby to zrobić wrzucamy na Arduino program, który prześle komendy do HC-06, ważne jest aby w tym momencie zasilanie samego moduł BT było odpięte, inaczej Arduino nie zaprogramuje się.

  1. Serial.begin(9600);
  2. delay(10000);
  3. // AT+NAMEXXX gdzie XXX jest nazwą wykrywaną
  4. Serial.print("AT+NAMEXXX");
  5. delay(2000);
  6. // AT+PINXXXX gdzie XXXX jest kodem PIN
  7. Serial.print("AT+PINXXXX");
  8. delay(2000);
  9. Serial.print("AT+BAUD8");

W powyższym kodzie według preferencji ustawiam nazwę oraz PIN urządzenia (polecam ustawić coś trudniejszego niż 1111). Kod wrzucamy do Arduino IDE, wybieramy odpowiedni rodzaj płytki i port, a następnie kompilujemy kod i wrzucamy na płytkę Arduino.

Przechodzimy do programowania HC-06, aby to zrobić podłączamy ponownie zasilanie do modułu i restartujemy Arduino. Odczekujemy ok. 20s i powinniśmy się cieszyć nową nazwą i baud rate'm. Ważne jest, aby moduł Bluetooth nie był sparowany z żadnym urządzeniem, gdyż uniemożliwi to programowanie.
Po odłączeniu i podłączeniu zasilania sprawdzamy nazwę modułu, w przypadku gdyby nie nastąpiła oczekiwana zmiana powtarzamy całą procedurę od początku, jednakże zmieniając baud rate w funkcji Serial.begin(). Polecam sprawdzić wartości 38400, 57600 oraz 115200.

Programowanie Arduino

Gdy mamy zaprogramowany moduł Bluetooth wykonujemy podobne czynności dla samego Arduino. Najpierw musimy zaopatrzyć się w bibliotekę FastLed (http://fastled.io/). Wrzucamy folder z nią do katalogu bibliotek (zazwyczaj znajduje się w Dokumentach -> Arduino).
Pamiętamy o odłączonym zasilaniu dla HC-06 i wrzucamy na Arduino następujący kod.

  1. //////////
  2. //
  3. // Arduino interface for the use of ws2812 operated LEDs
  4. // Uses Adalight protocol and is compatible with Boblight, Prismatik etc
  5. // "Magic Word" for synchronisation is 'Ada' followed by LED High, Low and Checksum
  6. //
  7. #include <FastLED.h>
  8. ///// User definitions /////
  9. // Define the number of LEDs
  10. #define NUM_LEDS 43
  11. // Define SPI Pin
  12. #define PIN 3
  13. // Baudrate, higher rate allows faster refresh rate and more LEDs (defined in /etc/boblight.conf)
  14. #define serialRate 115200
  15. // Adalight sends a "Magic Word" (defined in /etc/boblight.conf) before sending the pixel data
  16. uint8_t prefix[] = {'A''d''a'}, hi, lo, chk, i;
  17. // initialise LED-array
  18. CRGB leds[NUM_LEDS];
  19. void setup()
  20. {
  21.   FastLED.addLeds<WS2812B, PIN, GRB>(leds, NUM_LEDS).setCorrection(Typical8mmPixel);
  22.   FastLED.setBrightness( 255 );
  23.   FastLED.setTemperature( 0xFFBAAF );
  24.   // initial RGB flash
  25.   LEDS.showColor(CRGB(25500));
  26.   delay(500);
  27.   LEDS.showColor(CRGB(02550));
  28.   delay(500);
  29.   LEDS.showColor(CRGB(00255));
  30.   delay(500);
  31.   LEDS.showColor(CRGB(000));
  32.   Serial.begin(serialRate);
  33.   Serial.print("Ada\n"); // Send "Magic Word" string to host
  34. }
  35. void loop() {
  36.   // wait for first byte of Magic Word
  37.   for(= 0; i < sizeof prefix; ++i) {
  38.     waitLoop: while (!Serial.available()) ;;
  39.     // Check next byte in Magic Word
  40.     if(prefix[i] == Serial.read()) continue;
  41.     // otherwise, start over
  42.     i = 0;
  43.     goto waitLoop;
  44.   }
  45.   // Hi, Lo, Checksum
  46.   while (!Serial.available()) ;;
  47.   hi=Serial.read();
  48.   while (!Serial.available()) ;;
  49.   lo=Serial.read();
  50.   while (!Serial.available()) ;;
  51.   chk=Serial.read();
  52.   // if checksum does not match go back to wait
  53.   if (chk != (hi ^ lo ^ 0x55))
  54.   {
  55.     i=0;
  56.     goto waitLoop;
  57.   }
  58.   memset(leds, 0, NUM_LEDS * sizeof(struct CRGB));
  59.   // read the transmission data and set LED values
  60.   for (uint8_t i = 0; i < NUM_LEDS; i++) {
  61.     byte r, g, b;    
  62.     while(!Serial.available());
  63.     r = Serial.read();
  64.     while(!Serial.available());
  65.     g = Serial.read();
  66.     while(!Serial.available());
  67.     b = Serial.read();
  68.     leds[i].r = r;
  69.     leds[i].g = g;
  70.     leds[i].b = b;
  71.   }
  72.   // shows new values
  73.  FastLED.show();
  74. }

Mały komentarz odnośnie kodu: musimy zdefiniować posiadaną przez nas liczbę diod LED - NUM_LEDS w linii 12. Dodatkowo dla bardziej ciekawskich w liniach 30 - 32 ustawiana jest maksymalna jasność oraz temperatura barwowa. Chętni mogę przyjrzeć się dokumentacji biblioteki FastLED. Ewentualną korekcję balansu bieli diod można także przeprowadzić w oprogramowaniu sterującym na komputerze.

Po wgraniu programu diody powinny rozbłysnąć w kolorach RGB. Podłączamy z powrotem zasilanie HC-06 i jesteśmy gotowi do kolejnego kroku.

Parowanie modułu HC-06 z komputerem

Operację tę przeprowadzamy standardowo - dodajemy nowe urządzenie Bluetooth, wpisujemy kod PIN i sparowane. Teraz musimy się dowiedzieć jaki numer portu szeregowego ma nasz moduł. Możemy to zrobić przechodząc w Panelu Sterowania do apletu Urządzenia i Drukarki.  Po wybraniu interesującego nas urządzenia przechodzimy do zakładki Sprzęt. Odczytujemy numer portu, u mnie jest to port 9.

Okno właściwości modułu Bluetooth

Instalacja Prismatik

Oprogramowanie sterujące pobieramy stąd: https://github.com/psieg/Lightpack/releases.
Instalujemy i konfigurujemy. Gdyby kreator nie uruchomił się automatycznie przechodzimy do zakładki Device i wybieramy Run configuration wizard.
Wybieramy typ urządzenia jako Adalight, następnie wybieramy odpowiedni port szeregowy, baud rate 115200 oraz format kolorów.

Konfiguracja Prismatik

W kolejnych krokach wybieramy z którego monitora mamy pobierać obraz oraz definiujemy nazwę profilu.
Przed nami najciekawszy krok, czyli definiowanie stref. Polecam samemu pobawić się ustawieniami, tak aby dobrać ułożenie stref zgodnie z posiadaną konfiguracją. Dodatkowo dla każdej strefy można skorygować odcień.

Konfiguracja rozmieszczenia stref

Ostatnim krokiem jest globalna korekcja balansu bieli, ustawiamy tak, aby światło za ekranem jak najbardziej odwzorowywało barwę na monitorze. To koniec konfiguracji.

W zakładce Mode możemy wybrać tryb działania oświetlenia:
- Screen grabbing, czyli przechwytywanie obrazu, możemy tu ustawić interwał odświeżania, wzmocnienie oświetlenia, martwe strefy, itp.
- Mood lamp, czyli jednolite oświetlenie (z ewentualną zmianą odcienia),
- Sound Visualization, czyli kolory zmieniające się w rytm muzyki (należy wybrać odpowiednie urządzenie audio).

Okno programu Prismatik

W zakładce Device dodatkowo możemy ustawić jasność LED oraz współczynnik gamma.

Podsumowanie

Po wykonaniu powyższych kroków powinniśmy otrzymać w pełni funkcjonalny system w stylu ambilight. Możemy teraz przykleić Arduino z HC-06 na tył monitora według własnego upodobania. Ze swojej strony polecam ustawić interwał odświeżania ok. 16ms, dzięki temu otrzymamy częstotliwość ok. 60Hz, dając płynne dla oka przejścia kolorów. Podczas zmian kolorów program może obciążać procesor, jednak nie są to duże liczby (u mnie na Intelu i7-4770 jest to maksymalnie 5% czasu procesora). 
Prismatik umożliwia także przechwytywanie z wielu ekranów, wystarczy tylko przenieść strefy na dalsze pulpity. Aby więc otrzymać podświetlenie wielu ekranów należy wymyślić jak połączyć taśmę między nimi. Przy większej ilości diod warto zadbać o dobry zasilacz i pomysleć o zasilaniu taśmy z jej dwóch końców, aby zredukować wpływ spadku napięcia na jasność diod.
I to w zasadzie tyle. W razie pytań problemów, chęci podzieleniem się spostrzeżeniami zapraszam do komentowania powyższego wpisu.

Popularne wpisy

Reverse engineering wzmacniacza FirstWatt F7 - schemat

Kontroler MIDI do efektu gitarowego Line 6 M5