Podłączanie 7-calowego ekranu dotykowego (1024x600) do Raspberry Pi
W długi weekend majowy, kolega poprosił mnie podłączenie 7-calowego wyświetlacza do Raspberry Pi. Oczywiście przez podłączenie należy rozumieć fizczne podłączenie oraz skonfigurowanie systemu w taki sposób, aby wyświetlał obraz, dopasowany do właściwości ekranu. Mój zleceniodawca utknął przy ładowaniu środowiska graficznego. Po powrocie do pracy, wziąłem od niego wyświetlacz i przystąpiłem do działania, nie brałem jego maliny ponieważ chciałem na początku sam dowiedzieć się jak to się podłącza. Na naprawę jego konfiguracji przyjdzie jeszcze czas...
Jak każdą świeżą zabawę z malinką, rozpoczynam od pobrania najnowszego obrazu i załadowania go na kartę microSD. Dla celów testowych, najlepiej użyć obrazu z preinstalowanym środowiskiem graficznym, najlepiej bez zbędnego (rekomendowanego) oprogramowania.
$ wget https://downloads.raspberrypi.org/raspios_armhf/images/raspios_armhf-2022-04-07/2022-04-04-raspios-bullseye-armhf.img.xz $ unxz 2022-04-04-raspios-bullseye-armhf.img.xz $ sudo dd if=2022-04-04-raspios-bullseye-armhf.img bs=1M of=/dev/sdX status=progress
Na powyższym listingu /dev/sdX
jest
plikiem urządzenia
reprezentującym podłączoną kartę microSD. Obraz po rozpakowaniu ma lekko
powyżej 4 gigabajtów. Po nagraniu obrazu, zanim włóżymy kartę do
urządzenia
możemy dokonać niezbędnych modyfikacji, tak aby nie trzeba było się
przełączać między ekranami.
Zmian dokonujemy w pliku config.txt na partycji boot. Na samym końcu pliku zapisujemy poniższe linie.
max_usb_current=1 hdmi_group=2 hdmi_mode=87 hdmi_cvt=1024 600 60 6 0 0 0 hdmi_ignore_edid=0xa5000080 config_hdmi_boost=2
max_usb_current
- załączenie maksymalnego możliwego natężenia prądu na USB. Normalnie jest 600 mA, jednak przy użyciu tej opcji, prąd wzrasata do 1,2 A.hdmi_group
- określa grupę wyświetlaczy korzystających z HDMI. Na przykład telewizory oraz monitory korzystają zupełnie innych standardów. Monitory podłączane do komputerów jak i omawiany tutaj wyświetlacz należą do grupy oznaczonej przez cyfrę2
.hdmi_mode
- definiuje domyślną rodzielczość, odświeżanie oraz aspekt ekranu. Na stronie podanej w źródłach znajduje się tabela z trybami HDMI dla grupy 2, nie ma tam trybu 87. Nadanie tej opcji takiej wartości, pozwoli użyć stworzonego przez opcjęhdmi_cvt
tryby w drugiej grupie.hdmi_cvt
- umożliwia wpisanie własnych ustawień standardu VESA CVT, dając możliwość zdefiniowania rozdzielczości, częstotliwości obrazu oraz jego formatu. Pozostałe trzy zera odnoszą się głównie do cech ekranów kineskopowych i mogą zostać pominięte, ponieważ w naszym przypadku są to domyślne wartości. Użycie tej opcji wiąże się ze wskazaniem nowego trybu z pomocą opcjihdmi_group
orazhdmi_mode
.hdmi_ignore_edid
- opcją załącza ignorowanie danych identyfikacyjnych wyświetlacza, jeśli wyświetlacz ich nie posiada. Użycie wartości0xa5000080
chroni tę opcję przed omyłkowym przełączeniem.config_hdmi_boost
- złacza wzmocnienie sygnału HDMI. Ta wartość jest ignorowana przez Raspberry Pi 4. W źródle podano konkretne przypadki, który należy użyć odpowiednich wartości tej opcji.
Zapisujemy zmiany w pliku. Teraz możemy włożyć kartę do maliny a następnie podłączyć nasz wyświetlacz.
7-calowych wyświetlaczy do RPi jest dostępnych na rynku bardzo wiele, różnią się one rodzielczością oraz ilością dostępnych złączy. Część z nich to po prostu chińskie klony oryginalnego produktu marki WaveShare, i ja również otrzymałem taki klon. Głowną różnicą są chyba złącza znajdujące się z tyłu wyświetlacza. Wyświetlacz, który ja otrzymałem wyglądał mniej więcej tak:
Mniej więcej, ponieważ zdjęcia nie zrobiłem, a obrazek powyżej jest tylko zdjęciem poglądowym. Oryginalny wyświetlacz 7-calowy firmy WaveShare został przedstawiony poniżej (przynajmniej jego tył).
Istotną w naszym przypadku różnicą są złącza. W oryginalny wyświetlacz
mamy tylko jedno złącze USB, natomiast w klonie dwa i oba podpisane jako
"touch". Więc jeśli dysonujemy klonem Kabel USB
podłączamy po drugiego portu USB, nad przełącznikiem
"Backlight". Z HDMI to chyba wiadomo. Po podłączeniu
możemy uruchomić Raspberry. Po nieco dłuższym procesie uruchamiania,
na wyświetlaczu pojawi się fragment obrazu. Obraz wyświetlany przez
system operacyjny jest w znaczanie większej rozdzielczości niż
obsługiwana przez wyświetlacz. Serwer X Window, nie był wstanie dobrać
odpowiedniej rozdzielczości dlatego też musimy ją wymusić. Aby to zrobić
tworzymy mały skrypt powłoki z poniższych poleceń. Jednak przed
przystąpieniem do pisania skryptu należy jeszcze poznać nazwę wyjścia
wideo jaka figuruje na serwerze X Window, za pomocą polecenia
xrandr jesteśmy w stanie wypisać dostępne w systemie
wyjścia wideo, nazwy znajdują się na początku linii nad listą dostępnych
rozdzielczości dla danego wyświetlacza. W moim przypadku było to
HDMI-2
.
#!/bin/bash xrandr --newmode "1024x600_60.00" 49.00 1024 1072 1168 1312 600 603 613 624 -hsync +vsync xrandr --addmode HDMI-2 1024x600_60.00 xrandr --output HDMI-2 --mode 1024x60_60.00
Wartości użyte w poleceniu xrandr --newmode
zostały uzyskane za pomocą poniższego polecenia:
$ cvt 1024 600 60
Polecenie to generuje ustawienia obrazu w standardzie VESA CVT,
które są niezbędne przy tworzeniu niestandardowych trybów wyświetlania.
Niestety aby wyjaśnić kolejne wartości zwracane przez to polecenie,
trzeby by zagłegić się w lekturę standardu, co wykracza poza ramy tego
materiału. Najlepiej jest poprostu skopiować fragment wyjścia polecenia
cvt
, do argumentu polecenia
xrandr --newmode
.
Skrypt zapisujemy pod wygodną dla nas nazwą, w miejscu gdzie nie zostanie przypadkowo usunięty. Następnie, musimy zmusić system do tego aby uruchomił on ten skrypt przed wyświetleniem użytkownikowi pulpitu. Do tego posłużymy się plikiem /etc/xdg/lxsession/LXDE-pi/autostart. Nad linią @xscreensaver -no-splash zapisujemy poniższą linię:
@lxterminal -e "<ścieżka_do_skryptu>"
Następnie zapisujemy zmiany, dla pewności możemy przekopiować również ten plik do katalogu /etc/xdg/lxsession/LXDE, aby mieć pewność, że na pewno się uruchomi.
Teraz moży uruchomić ponownie Raspberry. Po uruchomieniu pulpit powinien być idealnie dopasowany do używanego przez nas wyświetlacza.
Źródła:
- Konfiguracja wyświetlania obrazu w pliku config.txt
- Dokumentacja opcji w pliku /boot/config.txt
- Zdjęcie chińskiego klona wyświetlacza WaveShare
- Zdjęcie przedstawiające tył oryginalnego wyświetlacza
- Scieżka do pliku autostartu
- Co należy wpisać w pliku autostartu
~xf0r3m