W artykule omówiono podłączenie i obsługę modułu projektora DLP LightCrafter Display 2000 produkcji Texas Instruments, do komputera jednopłytkowego Raspberry Pi 3. Moduł ten został pierwotnie zaprojektowany do łatwej współpracy z komputerami jednopłytkowymi BeagleBone. Niestety, pod kątem wydajności, zwłaszcza w aplikacjach multimedialnych, BeagleBone znacznie ustępuje konkurencyjnemu rozwiązaniu, jakim jest Raspberry Pi 3. Jak jednak zostanie to przedstawione w artykule, konfiguracja Raspberry Pi do pracy z modułem LightCrafter Display 2000 jest stosunkowo prosta a radość z samodzielnej budowy bezgłośnego i energooszczędnego projektora multimedialnego – bezcenna.
Projektory DLP. Moduł DLP LightCrafter Display 2000
W świecie elektroniki użytkowej od lat obserwujemy toczące się wojny standardów i rozwiązań technologicznych, jak np. rozstrzygnięte już starcia formatów Blue-ray i HD-DVD czy technologii plazmowej i LCD. W segmencie projektorów multimedialnych klienci wciąż zadają pytanie – wybrać projektor LCD bazujący na panelach ciekłokrystalicznych, czy jednak zdecydować się na technologię mikroluster zastosowaną w projektorach DLP? Nie podejmując się tutaj żadnych prób rozstrzygnięcia tego sporu, warto podkreślić jedno – w świecie projektorów DLP niepodzielny prym wiedzie firma Texas Instruments, która jest autorem i właścicielem patentów z zakresu technologii DLP. Choć przywykło się mówić, że wszystkie wojny technologiczne wygrywa końcowy klient – otrzymujący tańsze i lepsze rozwiązanie – nie mniejsze zwycięstwo odnoszą również… konstruktorzy i programiści.
Firma Texas Instruments swoją przewagę rynkową próbuje wypracować nie tylko na poziomie czysto technicznym (projektory DLP to wyższy kontrast obrazu, głębokie czernie i niższy pobór mocy), ale również w wykorzystywanym modelu biznesowym – dostarczając konstruktorom i producentom urządzeń końcowych kompleksowy zestaw układów, zestawów deweloperskich i narzędzi do szybkiego i łatwego zaadaptowania technologi DLP w konstruowanych projektorach. Przykładem takich działań jest zestaw DLP LightCrafter Display 2000 (DLPDLCR2000EVM) – rysunek 1.
Sercem każdego projektora DLP jest układ DMD (z ang. Digital Micromirror Device), oparty na technologii MOEMS i będący sterowaną cyfrową tablicą tysięcy mikroluster (każde o powierzchni kilkunastu mikrometrów kwadratowych) odbijających lub rozpraszających padający na nie strumień świetlny. W zależności od konstrukcji projektora możemy wyróżnić urządzenia z pojedynczym układem DMD (wówczas światło odbite przepuszczane jest przez wirujący trójkolorowy dysk umożliwiający uzyskanie wielobarwnego obrazu) lub z wieloma matrycami mikroluster (każdy z trzech składowych kolorów RGB jest wyświetlany przez oddzielny układ DMD). Wadą pierwszego z rozwiązań jest efekt tęczy, natomiast drugiego wysoka cena. Układ DMD, filtry, soczewki oraz źródło światła stanowią część optyczną w blokowej budowie typowego projektora DLP. Uzupełnieniem toru optycznego jest część elektroniczna, w skład której zaliczamy układ kontrolera matrycy DMD, układ PMIC do zarządzania zasilaniem i sterowaniem diodami LED, pamięci EEPROM/Flash oraz w zależności od typu pracy projektora – wbudowany mikroprocesor lub układ interfejsowy (do konwersji sygnałów HDMI, VGA, …). Blokowy schemat typowego projektora DLP został przedstawiony na rysunku 2.
W zależności od docelowego przeznaczenia produktu (rynek IoT, projektory mobilne do automatyki domowej, kino domowe, ...) firma Texas Instruments przygotowała szereg układów DMD różniących się m.in. rozmiarem matrycy a tym samym rozdzielczością wyświetlanego obrazu – od standardu nHD (układ DLP2000) poprzez WVGA (DLP2010 i DLP3000), 720p (DLP3010), WXGA (DLP4500) aż do rozdzielczości 1080p (DLP4710) i 4K. Dla każdej z matryc DMD przygotowano również kontroler matrycy oraz układ PMIC. Tak dobrane zestawy tworzą gotowe platformy do budowy własnych projektorów DLP. Co więcej, dla każdego z zestawów przygotowano również platformy referencyjne, ułatwiające pracę na wczesnym etapie prototypowania. Zbiorcze informacje o wybranych układach DMD oraz zalecanych dla nich kontrolerach i układach PMIC przedstawiono w tabeli 1.
Jak pokazano to w tabeli 1, zestaw DLP LightCrafter Display 2000 (DLPDLCR2000EVM) został wyposażony w układ DLP2000 o rozdzielczości nHD (640×480), który jest rekomendowany do budowy najtańszych i najbardziej energooszczędnych projektorów mobilnych. Zestaw ten nie ma wbudowanych kontrolerów interfejsów HDMI, VGA czy MHL – na złącza szpilkowe w rozstawie kompatybilnym z komputerami BeagleBone wyprowadzony został komplet sygnałów interfejsu równoległego RGB (24-bitowy RGB wraz z sygnałami HSYNC, VSYNC, CLK oraz DE), linie I2C do komunikacji z kontrolerem DLPC2607 oraz linie sterujące pracą modułu – rysunek 3.
Raspberry Pi – interfejs DPI oraz schemat przyłączenia projektora
Wszystkie komputery Raspberry Pi zostały wyposażone w kontroler DPI (z ang. Display Parallel Interface) umożliwiający bezpośrednie podłączenie wyświetlaczy LCD/projektorów z interfejsem równoległym RGB, do wyprowadzeń GPIO. W zależności od wybranej konfiguracji, kontroler DPI umożliwia wysterowanie wyświetlaczy pracujących w formacie RGB888/RGB24 (po 8 bitów na kolor), RGB666 (po 6 bitów na kolor) oraz RGB565 (5 linii dla koloru czerwonego i niebieskiego oraz 6 linii dla koloru zielonego). Wszystkie sygnały kontrolera (sygnały R, G, B, HSYNC, VSYNC, CLK oraz DE) zostały wyprowadzone na 40-pinowe złącze rozszerzeń, po uprzedniej konfiguracji wyprowadzeń GPIO do pełnienia alternatywnej funkcji ALT2. Przypisanie poszczególnych linii interfejsu DPI do wyprowadzeń GPIO zostało przedstawione w tabeli 2.
Ze względu na możliwość konfiguracji kontrolera do pracy w trybach RGB888, RGB666 oraz RGB565, poszczególne wyprowadzenia GPIO są mapowane do funkcji linii R[x], G[x] oraz B[x] zgodnie z informacjami z tabeli 3.
Czas przystąpić do konfigurowania komputera Raspberry Pi, którą rozpoczynamy od pobrania ze strony producenta ostatniej wersji dystrybucji Raspbian [1] (będącej modyfikacją Debiana dla komputerów Raspberry Pi) oraz wgrania obrazu systemu na kartę SD. Następnym krokiem jest konfiguracja wyprowadzeń GPIO do pełnienia alternatywnej funkcji ALT2, a więc funkcji przypisanej do kontrolera DPI. Konfiguracja ta zostanie przeprowadzona z wykorzystaniem pliku konfiguracyjnego config.txt – umieszczonego na partycji /boot w obrazie systemu – oraz predefiniowanych warstw opisu Device Tree (dostępnych również na partycji /boot w katalogu overlays). Warstwy opisu Device Tree ułatwiają organizację wsparcia dla wielu konfiguracji sprzętowych z wykorzystaniem tego samego jądra systemu. Listę przygotowanych przez producenta warstw wraz z ich opisem i listą przyjmowanych argumentów można znaleźć w pliku /boot/overlays/README.
Wśród plików z rozszerzeniem *.dtbo (a więc skompilowanych warstw opisu Device Tree), w katalogu /boot/overlays możemy odszukać również pliki dpi18.dtbo oraz dpi24.dtbo, które zgodnie z zawartym w README opisem, konfigurują wyprowadzenia GPIO do pracy w trybie DPI z magistralą 18- lub 24-bitową. Jak możemy szybko przeliczyć, konfiguracja magistrali w trybie 24-bitowym pochłonie wszystkie 28 wyprowadzeń GPIO (24 linie RGB oraz cztery sygnały VSYNC, HSYNC, CLK i DE) – nie zostawiając tym samym możliwości komunikacji z kontrolerem DLPC2607 po magistrali I2C. W tym miejscu użytkownik może zdecydować się na wykorzystanie konwerterów sygnałów USB 1 I2C i pełnej 24-bitowej konfiguracji lub skonfigurować interfejs DPI do pracy w trybie 18-bitowym. Włączenie wybranej warstwy Device Tree jest realizowane poprzez umieszczenie w pliku /boot/config.txt wpisu:
dtoverlay=<nazwa warstwy DTBO>
Dla omawianej konfiguracji 18-bitowej:
dtoverlay=dpi18
Podczas konfigurowania Device Tree należy upewnić się, że skonfigurowana warstwa nie koliduje z inną, uprzednio wykonaną konfiguracją sprzętu. W przypadku warstw dpi18 oraz dpi24 należy wyłączyć sprzętowe kontrolery magistral I2C oraz SPI (o ile zostały one uprzednio włączone):
dtparam=i2c_arm=off
dtparam=spi=off
lub
#dtparam=i2s=on
#dtparam=spi=on
Wiadomo już zatem, że linie interfejsu DPI kolidują z wyprowadzeniami sprzętowego kontrolera magistrali I2C. Aby jednak zachować możliwość konfiguracji projektora, na niewykorzystanych dotychczas wyprowadzeniach GPIO23 oraz GPIO24 włączymy programowy kontroler interfejsu I2C. Do tego celu wykorzystamy warstwę i2c-gpio, która konfiguruje wskazane wyprowadzenia do pracy w trybie linii SDA oraz SCL, obsługiwanych w sposób czysto programowy. Opcje konfiguracji warstwy i2c-gpio umieszczono w tabeli 4.
Zgodnie z informacjami przedstawionymi w tabeli 4, do pliku /boot/config.txt dopisujemy zatem kolejną linię konfiguracji:
dtoverlay=i2c-gpio,i2c_gpio_sda=23,i2c_gpio_scl=24,i2c_gpio_delay_us=2
Zanim przystąpimy do wykonania połączeń sprzętowych, niezbędnym etapem jest konfiguracja parametrów pracy kontrolera DPI. Korzystając z dokumentacji interfejsu DPI, udostępnionej pod adresem:
http://bit.ly/2MsgceG
http://bit.ly/2Lk6qFO
oraz opisującej konfigurację parametrów wideo, w pliku konfiguracyjnym /boot/config.txt umieszczamy wpisy:
enable_dpi_lcd=1
display_default_lcd=1
umożliwiające dołączenie zewnętrznego wyświetlacza do kontrolera DPI oraz wskazujące, że wyświetlacz ten jest domyślny dla systemu (w przeciwnym razie funkcję tę pełni ekran podłączony do interfejsu HDMI). Następnie, do parametrów dpi_group oraz dpi_mode przypisujemy odpowiednio wartości 2 i 87, co pozwoli nam na samodzielną konfigurację parametrów pracy wyświetlacza poprzez pole hdmi_timings (w innych przypadkach pola dpi_group oraz dpi_mode umożliwiają wybór predefiniowanych konfiguracji):
dpi_group=2
dpi_mode=87
Przedostatnim krokiem w edycji pliku
/boot/config.txt jest zatem określenie parametrów pracy wyświetlacza/projektora poprzez umieszczenie wpisu hdmi_timings, którego pełny format został przedstawiony w tabeli 5.
Jednym z najprostszych sposobów ustalenia prawidłowych wartości dla wpisu hdmi_timings – bez potrzeby żmudnego analizowania dokumentacji modułu projektora – jest wykorzystanie gotowego fragmentu opisu Device Tree dla komputera BeagleBone (który w oficjalnych obrazach systemu zawiera wsparcie dla zestawu DLP LightCrafter Display 2000). Fragment opisu Device Tree dotyczący projektora DLP został przedstawiony na listingu 1.
Bazując na danych zawartych na listingu 1, w prosty sposób możemy uzupełnić plik
/boot/config.txt o wpis konfigurację hdmi_timings:
hdmi_timings=640 0 14 4 12 360 0 2 3 9 0 0 0 60 0 32000000 3
Ostatnim krokiem konfiguracji Raspberry Pi jest określenie trybu pracy interfejsu DPI – tryb pracy RGB565/RGB666/RGB888, włączenie/wyłączenie sygnałów polaryzacji pionowej i poziomej, ustalenie polaryzacji sygnałów HSYNC/VSYNC, itd. Konfiguracja ta jest realizowana poprzez zapis do parametru dpi_output_format wartości liczbowej, wyliczonej na podstawie konfiguracji poszczególnych pól bitowych, jak przedstawiono w tabeli 6.
Na podstawie tabeli 6, do pliku /boot/config.txt dopisano konfigurację parametru dpi_output_format, przypisując mu wyliczoną wartość 458773:
dpi_output_format=458773
Finalna postać pliku /boot/config.txt została przedstawiona na listingu 2. Po zakończonej konfiguracji programowej można przystąpić do wykonania połączeń sprzętowych. Na bazie informacji zawartych na rysunku 3 oraz w tabeli 3 (dla trybu pracy RGB666), wykonujemy zestaw połączeń w sposób pokazany na rysunku 4.
Po włączeniu zasilania moduł projektora wyświetli wyłącznie domyślny ekran startowy (obraz ten może zostać nadpisany grafiką zdefiniowaną przez użytkownika). Aby wyświetlić obraz generowany przez komputer Raspberry Pi, należy nawiązać za pomocą magistrali I2C komunikację z układem kontrolera DLPC2601, a następnie do rejestru 0x0B (rejestr Input Source Selection) wpisać wartość 0, która jako źródło sygnału wybiera interfejs równoległy RGB. Dostępność kontrolera DLPC2601 (o adresie sprzętowym 0x1B) na magistrali I2C możemy sprawdzić poprzez wykonanie skanowania za pomocą narzędzia i2cdetect, np.:
0 1 2 3 4 5 6 7 8 9 a b c d e f
00: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
10: -- -- -- -- -- -- -- -- -- -- -- 1b -- -- -- --
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
70: -- -- -- -- -- -- -- --
Wybór źródła sygnału i ustawienie rozdzielczości wejściowej:
i2cset -y 0 0x1b 0x0b 0x00 0x00 0x00 0x00 i
i2cset -y 0 0x1b 0x0c 0x00 0x00 0x00 0x07 i
Powyższe komendy można umieścić np. w pliku /etc/rc.local, tak aby wybór źródła sygnału odbywał się automatycznie po włączeniu Raspberry Pi.
Kompletny zbiór rejestrów i komend umożliwiających m.in. skalowanie i obracanie obrazu, wybór źródła sygnału, wyświetlanie obrazów testowych, został kompleksowo opisany w dokumencie DLPC2601 and DLPC2607 Software Programmer's Guide [2].
Przykład działania modułu DLP LightCrafter Display 2000 podłączonego do komputera jednopłytkowego Raspberry Pi został przedstawiony na filmie: http://bit.ly/2MwuieY.
Łukasz Skalski
contact@lukasz-skalski.com