Den 3.5 Zoll RPi Display TFT Touchscreen funktionierend auf Raspbian Desktop einrichten

In meinem letzten Artikel hatte ich ja beschrieben, wie man den 3.5 Zoll RPi Display TFT Touchscreen für Konsole (Lite) und Desktop für das Raspberry Pi OS Version Bullseye einrichtet.

Allerdings wollte er unter dem Desktop nicht so richtig funktionieren: Die Anzeige funktioniert zwar tadellos, nur der Mauszeiger war nach Vorgehen der Anleitung von Waveshare, die auf der Produktseite erwähnt wurde, immer oben links "festgetackert" und überhaupt nicht zu gebrauchen.

Ich hatte mich darum an den Support von Waveshare gewandt, ob die mir nicht weiterhelfen könnten, mit einer detailierten Fehlerbeschreibung und dem Hinweis, dass da Image samt Treiber nicht mehr unter dem gelisteten OneDrive-Link abrufbar ist.


Der Waveshare Support antwortete recht fix, aber außer den Bitte ein Foto der Rückseite der Platine und einen Kaufbeleg einzureichen, kam nicht viel zurück

Also schickte ich ein Foto von der Platine als Anhang und bekam als Antwort, dass dies kein LCD Display von Waveshare sei und man deshalb keinen Support leisten könnte. Nachdem Kaufbeleg fragte man auch noch einmal nach. Den habe ich allerdings nicht geschickt. Warum auch, wenn die mir nicht weiterhelfen wollen? Da will ich deren kostbare Zeit doch nicht weiter verschwenden. Und darauf, dass das Image samt Treibern auf den OneDrive-Seiten nicht mehr vorhanden war oder wo es jetzt liegt bekam ich ja auch keine Antwort. Ich kann ja sehr gut verstehen, wenn man keinen Support für andere Hersteller leisten will, aber muss es denn so wortkarg und fordernd sein?

Als ich mir die Rückseite der Platine so anschaute, fiel mir auf, dass da "XPT2046" stand und nicht "ADS7846" wie im Eintrag der Kalibrierungs-Software. Ich machte mich also noch einmal auf in die Weiten des Internets, auf der Suche nach einer Lösung, diesmal mit dem Suchbegriff "XPT2046" im Gepäck.

Aber ich hatte das Internet schon abgegrast. Wieder nur die alten Bekannten. Auf der GitHub-Seite von GoodTFT fiel mir dann aber, dass dort das XPT2046-Display auch explizit so genannt wurde. Das hörte sich doch vielversprechend an.

Ich hatte ja schon einmal versucht, den GoodTFT-Treiber zu installieren, allerdings vergebens:
git clone https://github.com/goodtft/LCD-show.git
fand und findet das .git-File nicht und installiert nichts.

Also bin ich direkt auf die GitHub-Seite von GoodTFT gegangen und habe mir dort das Master.zip heruntergeladen und es damit probiert.

Als erstes habe ich erst einmal ein ganz frisches Raspberry Pi Os Version Bullseye mit dem Raspberry Pi Imager aufgespielt und habe die ersten Schritte aus der Installationsanleitung aus meinem letzten Artikel ausgeführt, allerdings ohne schon einen LCD-Treiber zu installieren. Und schon gar nicht den xinput-calibrator installieren, der bringt alles nur noch mehr durcheinander, wie sich herausstellen sollte.

Dann habe ich mir erst einmal Samba installiert. Wie das genau geht, kannst du in meinem Artikel Dateifreigabe und Zugriff ?indows auf den Raspi nachlesen.

Dann habe ich mich via SSH auf meinem Pi eingeloggt und im Home-Verzeichnis (da, wo man nach dem Login automatisch rauskommt) ein neues Verzeichnis angelegt:
mkdir LCD-show
In das habe ich dann via Windows-Freigabe die Dateien aus meinem entpackten Master.zip kopiert. Damit waren die Dateien schon mal auf dem Pi, auch ohne git clone. Danach müssen wir das Installations-Script auf dem Pi ausführen
chmod -R 755 LCD-show cd LCD-show/ sudo ./LCD35-show
Ganz ähnlich zu der Installation des Waveshare-Treibers, allerdings unterscheidet sich die Installation im Detail. So gibt es zum Beispiel zum Drehen um 180° ein extra Script
sudo ./rotate.sh 180
das wir auch gleich ausführen, damit der Touchscreen richtig herum ist.

Touchscreen als Mausersatz

Auf das Kalibrierungsprogramm xinput-calibrator verzichten wir, das war ja das Problem, dass unsere Touchscreen-Klicks den Mauszeiger immer oben links hingesetzt haben.

Stattdesssen editierten wir die /etc/X11/xorg.conf.d/99-calibration.conf mit
sudo nano /etc/X11/xorg.conf.d/99-calibration.conf
und schreiben da rein:
Section "InputClass" Identifier "calibration" MatchProduct "ADS7846 Touchscreen" Option "Calibration" "227 3936 3880 268" Option "SwapAxes" "0" EndSection
Da stand bei mir nämlich Option "SwapAxes" "1", was ich zu einer "0" geändert haben. Die Werte bei "Calibration" haben so gepasst. Evtl. muss man die - hat man ein schlecht eingestelltes Touch-Display - von Hand ändern. Von der Installation des xinput-calibrator-Tools kann ich aber nur abraten, das bringt alles durcheinander.

Und siehe da, beim nächsten Reboot auf den Raspberry Desktop funktioniert der Touchscreen wie er soll: die Maus wird da positioniert, wo ich mit dem Stift hintippe. Erster Erfolg!

Fehlt noch der rechte Mausklick. Der funktioniert nicht. Das ist ja normalerweise (unter Windows z. B.) ein langes Halten. Nach einer knappen Sekunde auf der selben Stelle tippen und halten geht dann das Kontextmenü auf bzw. wird der rechte Mausklick ausgeführt. Dazu müssen wir die 99-calibration.conf noch ein wenig ergänzen auf jetzt
Section "InputClass" Identifier "calibration" MatchProduct "ADS7846 Touchscreen" Option "Calibration" "227 3936 3880 268" Option "SwapAxes" "0" Option "EmulateThirdButton" "1" Option "EmulateThirdButtonTimeout" "500" Option "EmulateThirdButtonMoveThreshold" "100" EndSection
Und nach einem Neustart funktioniert dann auch die Sache mit dem Tippen und halten für das Kontextmenü

Ich habe auch noch mit der Option "EmulateWheel" herum experimentiert, habe es aber nicht geschafft, ein Mausrad mit dem Touchscreen zu emulieren, um ein komfortables Scrolling zum Beispiel im Browser zu ermöglichen. Die Dokumentation zur Xorg-Konfiguration ist zwar lang, aber nicht so richtig aussagekräftig. Irgendwann hatte ich das Rumprobieren dann satt und habe es bezüglich des Scrollings aufgegeben.

Ich halte aber meine Augen offen nach einer Lösung und werde die hier veröffentlichen, sollte ich eine finden. Wenn ihr wisst, wie das geht oder auf eine Lösung zum Scrolling gestoßen seid: schreibt mir gerne eine e-mail.

Unser Touchscreen als Mausersatz funktioniert also schon mal einwandfrei.

Virtuelle Tastatur

Sehr schön wäre es, wenn man eine einblendbare Tastatur haben würde und auf eine externe Tastatur verzichten könnte. Klar lässt es sich auch schon mit einer Mini-Tastatur wesentlich besser tippen als mit so einer Bildschirmtastatur, aber für den Notfall ist es gut, eine installiert zu haben.


Dann installieren wir uns doch eine. Ich habe mich für das "Matchbox-Keyboard" entschieden. Mit sudo apt-get install matchbox-keyboard ist die auch schnell installiert.

Man findet sie dann im Himbeer-Menü unter Accessories / Keyboard.

Jedesmal, wenn man das auswählt, wird eine kleine Tastatur eingeblendet...


... die man mit einem Klick auf das x oben rechts wieder schließen kann.

Wie man allerdings sieht, ist die Tastatur im Auslieferungszustand sehr spartanisch. Wie soll man damit nur eine URL wie "cool-web.de" eingeben?

Okay, man könnte jedesmal den Umweg gehen und über Google suchen, aber toll ist das bestimmt nicht.


Also habe ich für mich (und für euch) das Tastatur-Layout verändert, damit alle nötigen Tasten zur Verfügung stehen. Die einzelnen Tasten sind damit zwar kleiner, mit einem Stift kann man sie aber noch sicher treffen..

Wie man sein Tastatur-Layout ändert, steht auf der GitHub-Seite des Autors beschrieben.

Die Mühe könnt ihr euch aber sparen, denn die Arbeit habe ich schon für euch gemacht.

Ihr braucht nur einzugeben sudo nano /usr/share/matchbox-keyboard/keyboard.xml und dann das dort geschriebene löschen (Zeile löschen mit STRG+k) und danach hineinkopieren:
<keyboard> <options> <!-- not yet implemented --> </options> <layout id="Cool-Web.de QWERTZ denglisch"> <row> <space width="500" extended="true"/> <key fill="true"> <default display="Esc" action="escape" /> </key> <key> <default display="`" /> </key> <key> <default display="1" /> <shifted display="!" /> </key> <key> <default display="2" /> <shifted display='"' /> <mod1 display="½" /> </key> <key> <default display="3" /> <shifted display="£" /> <mod1 display="¾" /> </key> <key> <default display="4" /> <shifted display="$" /> </key> <key> <default display="5" /> <shifted display="%" /> </key> <key> <default display="6" /> <shifted display="^" /> </key> <key> <default display="7" /> <shifted display="&" /> </key> <key> <default display="8" /> <shifted display="*" /> </key> <key> <default display="9" /> <shifted display="(" /> </key> <key> <default display="0" /> <shifted display=")" /> </key> <key> <default display="-" /> <shifted display="_" /> </key> <key> <default display="=" /> <shifted display="+" /> </key> <key fill="true"> <default display="←" action="backspace"/> </key> <space width="1000" extended="true"/> <key width="4000" extended="true"> <default display="Home" action="home"/> </key> <key width="4000" extended="true"> <default display="PgUp" action="pageup"/> </key> <space width="500" extended="true"/> </row> <row> <space width="500" extended="true"/> <key width="1800"> <default display="Tab" action="tab"/> </key> <key obey-caps='true'> <default display="q" /> <shifted display="Q" /> </key> <key obey-caps='true'> <default display="w" /> <shifted display="W" /> </key> <key obey-caps='true'> <mod1 display="?" /> <default display="e" /> <shifted display="E" /> </key> <key obey-caps='true'> <default display="r" /> <shifted display="R" /> </key> <key obey-caps='true'> <default display="t" /> <shifted display="T" /> </key> <key obey-caps='true'> <default display="z" /> <shifted display="Z" /> </key> <key obey-caps='true'> <default display="u" /> <shifted display="U" /> </key> <key obey-caps='true'> <default display="i" /> <shifted display="I" /> </key> <key obey-caps='true'> <default display="o" /> <shifted display="O" /> </key> <key obey-caps='true'> <default display="p" /> <shifted display="P" /> </key> <key> <default display="{" /> <shifted display="[" /> </key> <key> <default display="}" /> <shifted display="]" /> </key> <key> <default display="+" /> <shifted display="*" /> </key> <key> <default display="\" /> <shifted display="|" /> </key> <space width="2200" extended="true"/> <key width="4000" extended="true"> <default display="End" action="end"/> </key> <key width="4000" extended="true"> <default display="PgDn" action="pagedown"/> </key> <space width="500" extended="true"/> </row> <row> <space width="500" extended="true"/> <key width="2500"> <default display="Caps" action="modifier:caps"/> </key> <key obey-caps='true'> <default display="a" /> <shifted display="A" /> </key> <key obey-caps='true'> <default display="s" /> <shifted display="S" /> </key> <key obey-caps='true'> <default display="d" /> <shifted display="D" /> </key> <key obey-caps='true'> <default display="f" /> <shifted display="F" /> </key> <key obey-caps='true'> <default display="g" /> <shifted display="G" /> </key> <key obey-caps='true'> <default display="h" /> <shifted display="H" /> </key> <key obey-caps='true'> <default display="j" /> <shifted display="J" /> </key> <key obey-caps='true'> <default display="k" /> <shifted display="K" /> </key> <key obey-caps='true'> <default display="l" /> <shifted display="L" /> </key> <key> <default display=";" /> <shifted display=":" /> </key> <key> <default display="#" /> <shifted display="~" /> </key> <key fill="true" width="3000"> <default display="Return" action="return"/> </key> <space width="500" extended="true"/> <key obey-caps='true'> <default display="?/> <shifted display="¢ /> </key> <key obey-caps='true'> <default display="?> <shifted display="? /> </key> <key obey-caps='true'> <default display="?<shifted display="? /> </key> <key obey-caps='true'> <default display="? /> <shifted display="? /> </key> <key obey-caps='true'> <default display="?" /> <shifted display="?" /> </key> <space width="300" extended="true"/> <key> <default display="↑" action="up" /> </key> <space width="1800" extended="true"/> </row> <row> <space width="500" extended="true"/> <key width="3000"> <default display="Shift" action="modifier:shift"/> </key> <key obey-caps='true'> <default display="y" /> <shifted display="Y" /> </key> <key obey-caps='true'> <default display="x" /> <shifted display="X" /> </key> <key obey-caps='true'> <default display="c" /> <shifted display="C" /> </key> <key obey-caps='true'> <default display="v" /> <shifted display="V" /> </key> <key obey-caps='true'> <default display="b" /> <shifted display="B" /> </key> <key obey-caps='true'> <default display="n" /> <shifted display="N" /> </key> <key obey-caps='true'> <default display="m" /> <shifted display="M" /> </key> <key> <default display="," /> <shifted display="<" /> </key> <key> <default display="." /> <shifted display=">" /> </key> <key> <default display="-" /> <shifted display="_" /> </key> <key> <default display="/" /> <shifted display="?" /> </key> <key width="3000"> <default display="Shift" action="modifier:shift"/> </key> <space width="8000" extended="true"/> <key> <default display="←" action="left" /> </key> <key> <default display="↓" action="down" /> </key> <key> <default display="→" action="right" /> </key> <space width="500" extended="true"/> </row> <row> <space width="500" extended="true"/> <key width="2500"> <default display="Fn" action="modifier:mod1"/> </key> <key width="2500"> <default display="Ctrl" action="modifier:ctrl"/> </key> <key width="2500"> <default display="Alt" action="modifier:alt"/> </key> <key width="9000"> <default display=" " action="space" /> </key> <key> <default display="@" /> <shifted display="'" /> </key> <key width="2000"> <default display="F11" action="f11" /> </key> <space width="1000" extended="true"/> <key width="6000"> <default display="cool-web.de" /> </key> <space width="3000" extended="true"/> </row> </layout> </keyboard>
... und mit STRG+O, Y, STRG+X speichern und wieder aus dem Editor rausgehen.

Danach hat man auch eine vernünftige Tastatur, mit der man auch URLs eingeben kann. Ein Neustart ist diesmal nicht nötig. Die Tastatur zu schließen und neu aufzurufen reicht.

Das Tastatur-Layout ist eine Art "denglisch". Es hat eine amerikanisches Layout als Basis, aber da wo man deutsche Tasten vermissen würden, sind diese eingefügt. Außerdem sind Z und Y wie auf einer deutschen Tastur positioniert. Die Interpunktion und die Slashes sind wie im amerikanischen Layout, was Programmierern sehr zu gute kommt.

Die deutschen Umlaute finden sich abgesetzt weiter rechts und sogar Cursor-Tasten habe ich eingebaut.

Alles in Allem also eine brauchbare Tastatur.

Benutzung im Browser

Von Haus aus brauchbar ist der Browser so ziemlich die einzige Anwendung; der Taschenrechner ist zu groß, um überhaupt komplett dargestellt zu werden. Und auch die meisten anderen Programme passen nicht auf den 480x320 Screen.

Falls ein Fenster zu groß ist, und man nicht überall ran kommt, dann hilft der folgende Trick, allerdings nur, wenn eine Tastatur (z. B. eine Wireless Mini-Tastatur) angeschlossen ist. Dann auf der Tastatur die Alt-Taste halten und mit dem Stift das Fenster verschieben (Tippen, halten, bewegen).

Mit der Tastatur kann man jetzt auch URLs eingeben. Um den Inhalt scrollen zu können, muss man allerdings das Browserfenster ein paar Pixel nach links verschieben, damit man rechts die Scrollleiste sieht, mit der man dann durch den Inhalt der Web-Seite scrollen kann.

Alles andere als ideal, viel schöner wäre es, den Browser im Vollbildschirm-Modus auszuführen und mit dem Touchscreen scrollen zu können. Das kann man jetzt schon mit einer externen Tastatur, aber ohne wäre noch schöner.

Video

In folgendem Video demonstriere ich das Touchscreen als Mausersatz und zeige euch, wie ihr im Browser scrollt (und mehr):


Sinnvolle Anwendungsfällee

Aber seien wir mal ehrlich: Wir alle haben ein Smartphone, dass mehr Bildschirm und mehr Aufl?g hat und zudem Webseiten flüssiger darstellt. Und das haben wir doch alle ständig dabei. Wozu dann den Raspi mit Touchscreen dazu nutzen?

Nun, ich kann mir gut vorstellen, auf dem eigenen Server eine Webseite zu hosten, bei der man ein paar Buttons anklicken kann. So 20 Stück sollte man lesbar auf dem kleinen Bildschirm unterbringen können. Man könnte ja auch zudem Untermenüs benutzen, um noch mehr Buttons unterzubringen. Und mit diesem Knöpfen kann man dann etwas an- und ausschalten, vielleicht seine Smart-Home-Geräte.

Oder man hat eine dynamische Webseite, dessen Inhalt sich automatisch ändert. Dann stellt man den Raspi mit Display einfach hochkant und hat dann zum Beispiel eine Anzeige von Börsenkursen, Nachrichten, Wetter, Auslastungsanzeigen etc.

Wenn man den Webserver lokal auf dem Raspi laufen lässt, kann man auch von Sensoren gelieferte Daten anzeigen lassen, vielleicht zur Maschinensteuerung. Der eine Teil misst die Temperatur einer Heizung oder ähnliches (Sensor an GPIO angeschlossen) und zeigt diese an und schaltet ein Relais, damit die Maschine über Nacht aus ist. Und dann gibt es noch einen großer Notaus-Knopf, den man manuell betätigen kann und ein in Reihe geschaltetes zweite Relais unterbricht.

Ich denke, ein Webserver mit Webseite mit Anzeige im Kiosk-Modus (Vollbild) ist die einfachste Art, etwas auf dem Screen darzustellen. Ansonsten gibt es sicher auch die Möglichkeit, eine eigene Anwendung auf dem System laufen zu lassen.

Fazit

Der Desktop des Raspi 3B+ ist mit dem kleinen Touchscreen langsam, klein und nur für Spezialanwendungen wirklich sinnvoll. Und zwar für alles, wo der Raspi seine Stärken ausspielen kann, nämlich, dass er direkt Hardware (Sensoren / Aktoren) auswerten und steuern kann. Alles andere können wir auch mit dem Smartphone realisieren.

Dem Ziel entgegen steht allerdings das etwas "unglückliche" Design mit dem breiten und langen Header, auf dem sich der Touchscreen stützt. Das gibt eine stabile Konstruktion für den Touchscreen, klaut aber so viele GPIO-Pins. Und das Design der RPi Display-Platine ist leider so unglücklich, dass man da auch nirgendswo etwas an die GPIO-Pins anlöten kann. Welch Verschwendung. Das ist echt schade.