Einrichtung und Tücken des XPT2046 3.5 Zoll RPi Display TFT Touchscreens auf Raspbian Desktop und Konsole

Als ich kürzlich über ein 3,5" Display für Raspberry Pi mit resistivem Touchscreen im Sale bei Berrybase stolperte, konnte ich nicht widerstehen und musste das Schnäppchen für Display, Gehäuse und Versand für 20 Euro erstehen.

Die technischen Daten lesen sich auch nicht schlecht für den Preis: Mit halben 480 x 320 Pixeln lässt sich einiges an lesbarem Text ausgeben, dass ist schließlich halbes VGA (640 x 480). Für den Desktop allerdings wird das zu wenig sein, um vernünftig damit arbeiten zu können.

Und auch eine Pinbelegung wird aufgeführt:

PinFunktionBeschreibung
1, 173.3VPower positive (3.3V power input)
2, 45VPower positive (5V power input)
3, 5, 7, 8, 10, 12, 13, 15, 16NCNC
6, 9, 14, 20, 25GNDGround
11TP_IRQTouch Panel interrupt, low level while the Touch Panel detects touching
18LCD_RSInstruction/Data Register selection
19LCD_SI / TP_SISPI data input of LCD/Touch Panel
21TP_SOSPI data output of Touch Panel
22RSTReset
23LCD_SCK / TP_SCKSPI clock of LCD/Touch Panel
24LCD_CSLCD chip selection, low active
26TP_CSTouch Panel chip selection, low active

Hier fällt auf, dass eine ganze Menge Pins belegt, aber gar nicht angeschlossen sind.

Anwendungsfälle

Ich hatte auch gleich einen Anwendungsfall im Auge: Mein nur gelegentlich mit Retropie (Installationanleitung hier) genutzter Raspberry Pi 3B+ sollte damit eine neue Aufgabe bekommen.

Und zwar soll er als mobiler Serial Monitor dienen. Die halbe VGA-Auflösung Auflösung von 480 x 320 Pixeln wird wohl zur Ausgabe von den Meldungen reichen, die von meinen Mikrocontrollern und Modulen so kommen. Normalerweise steht ja zuhause der PC, der als Textausgabe für den Serial Monitor dient während der Programmierung von Arduino, STM32, ESP8266 und ESP32.

Doch was ist, wenn ich eine Aufgabe "in the field", also unterwegs brauche, zum Beispiel bei einem zukünftig angedachten Projekt mit GPS-Modul? GPS-Empfang ist nur unter freiem Himmel möglich und da ist mein PC weit weg. Natürlich könnte man einen sperrigen Laptop verkabeln, aber wäre es nicht viel schöner, seinen Raspi und eine Powerbank mit ein paar herausgeführten Jumper-Kabeln (RX, TC, 3.3V, GND) zu haben, an die man dann das Modul direkt anschließt und die Ausgabe auf dem Touchscreen verfolgt? Klein, kompakt, mobil, stromsparend, genau das richtige, so denke ich mir.

Und als zweites wollte ich natürlich mal den Desktop testen. Das wird mit halber VGA-Auflösung zwar nicht toll werden, denn so manches Fenster wird man nicht ganz sehen können und z. B. den OK-Button nicht erreichen können, aber vielleicht kann man ja den Taschenrechner bedienen oder vielleicht sogar den Web-Browser und mit dem eine Seite auf dem eigenen Webserver anzeigen, die einem aktuellen Informationen anzeigt, so wie das von mir entwickelte Always on Display, aber halt nur mit Grafik und einfacher in HTML zu programmieren? Vielleicht liefe sogar javascript im Browser?

Auch könnte man die Ausgaben von anderen IoT-Geräten über eine Webseite anzeigen lassen. Das wäre doch ganz praktisch.

Und dann gibt es scheinbar noch ein Projekt, wobei man den Touchscreen mit Retropie zusammen benutzen kann, das habe ich mir aber noch nicht näher angeschaut.

Mit dem einfachen und schnellen Austausch der im Raspberry Pi 3B steckenden Micro-SD-Karte könnte ich die jeweilige Anwendung dann jeweils wählen. Oder den Pi halt doch wieder zum Zocken mit Retropie benutzen.

Das hört sich nach einer Menge an, das ausprobiert werden will. Was wiederum zeigt, wie vielfältig einsetzbar doch so ein Display ist.

Aber eins nach dem anderen. Fangen wir erstmal einmal mit dem (vermeintlich) einfachsten an, der Konsolen-Anwendung.

Den Touchscreen unter Raspberry Pi OS Lite (ohne Desktop) installieren

Zur Softwareinstallation schreibt Berrybase auf Ihrer Seite (Stand 24.04.2023):
Die Installation der Treiber unter Raspbian sind identisch mit denen bei Displays des Herstellers Waveshare. Daher kann folgende Anleitung genutzt werden: https://www.waveshare.com/wiki/3.5inch_RPi_LCD_(A)
Der Anleitung bin ich gefolgt und habe folgendes getan für die Einrichtung, denn aufgesteckt auf einen Raspberry Pi 3B mit frisch installierte Raspberry Pi OS Lite (Version Bullseye, ohne Desktop) bleibt der Touchscreen einfach nur bildschirmfüllend weiß.

Dazu habe ich die erweiterten Einstellung des Raspberry Pi Imager benutzt und habe mit der Installation gleich WLAN und SSH eingerichtet, so dass ich mich nach einer Weile, nachdem sich das System mit Nachinstallieren und Rebooten beruhigt hatte, über SSH einloggen konnte.

Dazu habe ich mir die IP-Adresse aus meinem Router rausgekramt, dankenswerterweise meldet sich der Pi außer mit der MAC auch mit raspberrypi, so dass der 3B+ schnell identifiziert war.

Für die SSH-Verbindung habe ich wie immer PuTTY benutzt. Das ist klein, schnell und tut seinen Dienst seit Jahrzehnten klaglos.

Nachdem ich mich mit den den erweiterten Einstellungen der Imagers gemachten Einstellungen eingeloggt habe, muss ich als erstes einmal GIT installieren:
sudo apt update sudo apt install git
Erst dann kann ich mittels Kommandozeile auf GitHub zugreifen und mir eine Kopie des LCD-Show-Projektes lokal installieren:
git clone https://github.com/waveshare/LCD-show.git
Wechseln wir mit
cd LCD-show/
in das neue Verzeichnis und schauen einmal hinein:
pi@raspberrypi:~/LCD-show $ ls boot LCD32-show LCD4-show waveshare28-v2.dtbo cmdline.txt LCD35B-show LCD5-show waveshare32b-overlay.dtb cmdline.txt-noobs LCD35B-show-V2 LCD7-1024x600-show waveshare32c-overlay.dtb dtc.sh LCD35C-show LCD7-800x480-show waveshare35a-overlay.dtb etc LCD35-HDMI-480x320-show LCD-hdmi waveshare35b-overlay.dtb inittab LCD35-HDMI-800x480-show mk_arcade_joystick_rpi-master waveshare35b-v2-overlay.dtb LCD101-1024x600-show LCD35-show nes waveshare35c-overlay.dtb LCD154-show LCD43-show README.md waveshare4c-overlay.dtb LCD28-show LCD43-show-V2 rpi-fbcp xinput-calibrator_0.7.5-1_armhf.deb LCD28-show-V2 LCD4-800x480-show st7789_module LCD32C-show LCD4C-show usr
Für unser LCD ist LCD35-show relevant. Denn wir scheinen die älteste Version des Displays zu haben.

Also führen wir dieses Installationsscript für die Touchscreen-Treiber aus, nachdem wir die Datei ausführbar gemacht haben:
chmod +x LCD35-show ./LCD35-show lite
Das installiert eine Menge Libraries. Danach starte der Pi von alleine neu und nach einer kurzen Wartephase zeigt das LCD einen schwarzen Bildschirm mit dem Prompt an, allerdings auf dem Kopf, wenn man das Stromkabel hinten heraus hat und man das als Rückseite ansieht.

Also Putty neu starten und verbinden und dann
cd LCD-show/ ./LCD35-show lite 180
eingeben. Das hätte man auch gleich bei der ersten Installation machen können, aber so erklärt sich das besser, dass LCD35 auch als Konfigurationstool herhält. Man kann übrigens 0, 90, 180 und 270 als Parameter mitgeben, je nachdem wie man den Bildschirm gedreht haben möchte.


Danach führen wir mit "sudo reboot" einen Neustart aus. Ab jetzt wird die Konsole direkt auf dem Touch-Screen angezeigt und mit einer kleinen Wireless Tastatur kann man dann direkt tippen und Befehle über die Kommandozeile absetzen.

Man kommt natürlich immer noch über Putty rein, was zu Hause natürlich auch viel bequemer ist. Aber unterwegs hat man mit Touchscreen und Mini-Tastatur eine Notfalllösung zum mitnehmen.

Oder man lässt auf der Touchscreen-Session zum Beispiel htop laufen, während man den Raspi über SSH bedient und hat so immer nebenbei eine Übersicht über Auslastung und laufende Programme.

Aber das ist ja nicht nur ein normaler Bildschirm, nein, das ist ein Touchscreen. Zwar nicht kapazitiv, sondern resistiv, was heißt, dass er auf punktuellen Druck reagiert. Darum auch der kleine Plastik-Griffel dabei. So leichtgängig wischen wie auf dem Smartphone geht damit nicht.

Die Mausemulation über den Touchscreen hilft uns in der Konsole wenig. Diese wird erst mit dem Desktop so richtig sinnvoll.

Für meinen Serial Monitor muss ich mir noch etwas einfallen lassen, denn der breite und lange Header des LCD ist zwar schön als Stützkonstruktion, genehmigt sich aber fette 26 Pins als Auflagefläche, von denen er die wenigstens auch benutzt. Was für eine Verschwendung. Das kastriert den Pi GPIO-Pin-mässig förmlich.

Und wie das Pinout des Raspberry Pi zeigt, sind damit die für das Serial Monitor wichtigen Serial Pins UART TX (8) und UART RX (19) verdeckt. Da muss ich mir noch etwas einfallen lassen.

Doch zur Verwendung des Touchscreens unter dem Desktop, oder sollte ich besser sage: Dem Versuch der Verwendung...?

Den Touchscreen unter Raspberry Pi OS (mit Desktop) installieren

Das Prozedere ist genau das gleiche wie oben, nur das wir im Raspberry Pi Imager die Vollversion mit Desktop auswählen. WLAN und SSH konfigurieren wir genauso.

Also wieder den Imager seine Arbeit machen lassen, SD Karte in Raspi einstecken, Raspi einschalten und warten. Der Touchscreen ist komplett weiß, das ist wieder ganz normal so.

Wieder im WLAN-Router die den Raspi zugewiesene Adresse herausfinden und mit Putty mit dem raspi verbinden. Wieder Git installieren und wieder LCD-Show von GitHub clonen.

Bisher same same... Nun aber
cd LCD-show/ chmod +x LCD35-show ./LCD35-show 180
eingeben, ohne das "lite". Das installiert dann auch die für den Desktop nötigen Treiber.


Danach starte der Pi von alleine neu und nach einer kurzen Wartephase zeigt das LCD richtig herum (so man denn die Seite mit dem Stromkabel als hinten ansieht) den Desktop an.

Aber: der Touchscreen als Mouse-Ersatz weiß scheinbar noch nicht, wo oben und unten ist und deshalb positioniert er die Maus komplett falsch, wenn man darauf toucht.

Laut der Anleitung von Waveshare soll man jetzt ... und ich sagen "soll man", weil das Ganze bei mir nicht funktioniert hat ... die Touchscreen-Kalibrierungssoftsoftware installieren mit
sudo apt-get install xinput-calibrator
Nun am besten eine Maus anschließen oder eben spiegelverkehrt touchen, wobei die Spiegellinie die Diagonale von unten links nach oben recht ist (viel Spaß! Nein im Ernst, schließt eine Maus an!).

Auf die Himbeere klicken, Preferences / Calibrate Touchscreen auswählen.



Die nach der Kalibrierung angezeigten Werte notieren und dann über die SSH-Konsole eingeben:
sudo nano /etc/X11/xorg.conf.d/99-calibration.conf
und dort im Nano-Editor eingeben
Section "InputClass" Identifier "calibration" MatchProduct "ADS7846 Touchscreen" Option "Calibration" "2695 2695 2091 2982" Option "SwapAxes" "0" EndSection
Bzw. die Werte, die dort bei euch stehen. Mit Strg+o speichern und mit Strg+x den Nano Editor wieder verlassen.

Nach einem Neustart (sudo reboot) soll dann der Touchscreen als Mausersatz auf dem Desktop funktioniert. "Soll", denn das tut er nicht.


Was mich ein wenig stutzig macht ist, dass in der 99-calibration.conf MatchProduct "ADS7846 Touchscreen" steht, auf dem LCD aber "XPT2046". Das ist doch ein anderes Modell. Vielleicht sind aber auch beide kompatibel? In Sachen Anzeige wohl schon, denn die passt ja, aber in Sachen Touch habe ich arge Zweifel.

Ich habe alles Mögliche versucht mit den Parametern, bin bisher aber auf keinen grünen Zweig gekommen, immer ist der Mauszeiger in der linken oberen oder unteren Ecke festgetackert.

Was ich sonst noch so probiert habe: Zum Schluss habe ich dann den Support von Waveshare angeschrieben. Die wollten erst mal ein Foto von der Rückseite der Platine, bevor sie weiterhelfen. Kann ich ja schon verstehen - ich würde auch nur ungern Zeit und Geld investieren, um vielleicht nachgemachte Platinen, die nicht von mir sind, zu supporten.

Und wenn man sich den Satz von Berrybase genau durchliest, dann steht da nur, dass die Installation identisch ist (Anm. d. Red.: und leider nicht durchgehend klappt), nicht dass Waveshare der Hersteller dieses Boards ist. Das habe ich da nur beim schnellen Lesen hinein interpretiert.

Das Original Waveshare XPT2046 3.5 Zoll Display sieht übrigens von vorne sehr sehr ähnlich zu meinem gekauften aus, aber wenn man sich die Bilder bei amazon durchschaut, dann hat das Original ein Waveshare-Logo hinten drauf und andere Chips.

Vielleicht habe ich ja doch kein LCD von Wareshare, sondern von irgendeinem Drittanbieter und da passen die Touch-Treiber halt nicht? Langsam wird mir klar, warum mein Schnäppchen so günstig war. Aber hey, als normaler TFT Screen taugt das Ding Bombe und ist auch dafür noch recht günstig.

Ich werde die Sache weiter verfolgen und euch an dieser Stelle berichten, wenn sich Neues ergeben hat und ich vielleicht eine Lösung für das Touch-Problem gefunden habe.

Video

In folgendem Video demonstriere ich die unterschiedlichen Images und was ich sonst noch am Display und am Gehäuse modifiziert / verbessert habe:

Weitere Aussichten

Am wichtigsten ist für mich erst einmal das Teilprojekt Serial Monitor. Da muss ich einmal recherchieren, ob statt der Hardware RX / TX auf den verdeckten Pins 10 und 8 nicht auch andere Pins, etwa 38 und 40 (BCM 20 und BCM 21) per Software gehen. Sonst muss ich mir was einfallen lassen und evtl. Flatterkabel anlöten oder ich benutzen einen Pi Zero mit Zwischenplatine.

Das wird sich je nach Möglichkeiten zeigen, was die beste Lösungsoption ist.

Wenn ich näheres herausgefunden habe, werdet ihr hier den Link zum Folgeartikel finden. Schaut also hin und wieder mal rein.

Das Problem mit dem festgetackerten Mauszeiger habe ich inzwischen gelöst. Mehr in meinem Artikel Den 3.5 Zoll RPi Display TFT Touchscreen funktionierend auf Raspbian Desktop einrichten.