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:
- 320x480 Auflösung
- Resistiver Touchscreen
- Display mit LED Backlight
- Direkt aufsteckbar auf alle Raspberry Pi Modelle
- Bild, Touchscreen und Stromversorgung über GPIO
- Unterstützte Betriebssysteme: Raspbian, Ubuntu, etc.
- Display hat die gleiche Größe wie der Raspberry Pi
- LCD Interface: SPI
- Touch Screen Typ: Resistiv
- Touch Screen Controller: XPT2046
- Hintergrundbeleuchtung: LED
Und auch eine Pinbelegung wird aufgeführt:
Pin | Funktion | Beschreibung |
---|---|---|
1, 17 | 3.3V | Power positive (3.3V power input) |
2, 4 | 5V | Power positive (5V power input) |
3, 5, 7, 8, 10, 12, 13, 15, 16 | NC | NC |
6, 9, 14, 20, 25 | GND | Ground |
11 | TP_IRQ | Touch Panel interrupt, low level while the Touch Panel detects touching |
18 | LCD_RS | Instruction/Data Register selection |
19 | LCD_SI / TP_SI | SPI data input of LCD/Touch Panel |
21 | TP_SO | SPI data output of Touch Panel |
22 | RST | Reset |
23 | LCD_SCK / TP_SCK | SPI clock of LCD/Touch Panel |
24 | LCD_CS | LCD chip selection, low active |
26 | TP_CS | Touch 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
git clone https://github.com/waveshare/LCD-show.git
cd LCD-show/
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
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
Also Putty neu starten und verbinden und dann
cd LCD-show/
./LCD35-show lite 180
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
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
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
Section "InputClass"
Identifier "calibration"
MatchProduct "ADS7846 Touchscreen"
Option "Calibration" "2695 2695 2091 2982"
Option "SwapAxes" "0"
EndSection
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:
- die Werte bei Calibration testweise verzehntfacht oder nur ein Zehntel genommen, tat sich aber nichts
- den Treiber von https://github.com/CytronTechnologies/xpt2046-LCD-Driver-for-Raspberry-Pi versucht
- die anderen LCD-Show-Scripts versucht mit dem Ergebnis
- LCD35B-show = alles invers (und auf dem Kopf)
- LCD35B-show-V2 = Farben wieder falsch (und auf dem Kopf)
- LCD35C-show = nur ein weißer Screen, geht gar nix
- LCD35-show (ohne 180) = Farben richtig, Bild auf dem Kopf, Touchscreen funktioniert auch nicht richtig
- den Treiber git clone https://github.com/goodtft/LCD-show.git versucht, aber da findet er nichts
- mit "TransformationMatrix" "1 0 0 0 -1 1 0 0 1" herumgespielt, auch kein Glück
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.