.~~.   .~~.
		    '. \ ' ' / .'
		     .~ .~~~..~.                       _                          _
		    : .~.'~'.~. :      ___ ___ ___ ___| |_ ___ ___ ___ _ _    ___|_|
		   ~ (   ) (   ) ~    |  _| .'|_ -| . | . | -_|  _|  _| | |  | . | |
		  ( : '~'.~.'~' : )   |_| |__,|___|  _|___|___|_| |_| |_  |  |  _|_|
		   ~ .~ (   ) ~. ~                |_|                 |___|  |_|
		    (  : '~' :  )
		     '~ .~~~. ~'
			 '~'
		

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

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:

7-inch-display

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ł).

7-inch-waveshare

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:

  1. Konfiguracja wyświetlania obrazu w pliku config.txt
  2. Dokumentacja opcji w pliku /boot/config.txt
  3. Zdjęcie chińskiego klona wyświetlacza WaveShare
  4. Zdjęcie przedstawiające tył oryginalnego wyświetlacza
  5. Scieżka do pliku autostartu
  6. Co należy wpisać w pliku autostartu

~xf0r3m