PI-Touch

Einleitung

Dieser Text ist ein "Abfallprodukt" aus einem meiner aktuellen Projekte, bei dem ein Raspberry PI mit einem Touchscreen zum Einsatz kommt. Dieser Text wäre wahrscheinlich nie entstanden, wenn ich nicht auf Grund eines Problems mit dem Epiphany-Browser unter Jessie auf einem Raspberryp PI 3b ein "sudo apt-get dist-upgrade" durchgeführt hätte.

Ich hatte zunächst die Original-Treiber installiert und nach dem Upgrade funktionierte mein Touchscreen nicht mehr. (weil das Touchfeld nach dem Upgrade verdreht war). Durch viel googeln, näherte ich mich der Lösung langsam an und fand so einiges an Informationen, die ich in diesem Text verarbeitete, der ursprünglich nur zur internen Verwendung bestimmt war.

Treiber-Installation

Unter Linux sollte man auf die Kalibrierungs-Tools oder Treiber der Touchscreen-Hersteller möglichst verzichten und auf Bordmittel zurück greifen. In Debian Jessie werden übrigens für Touchscreens mit der Kennung XPT2046 oder ADS7846 keine zusätzlichen Treiber der Hersteller benötigt.

Installieren Sie also für den XPT2046 oder ADS7846  unter Jessie und Stretch keine Treiber von Waveshare oder andere als kompatibel angegebene Treiber. Dadurch könnte die Debian-Installation unbrauchbar werden, weil z.B. der neueste Waveshare-Treiber das WIFI-Modul deaktiviert wird.

Die Installation der Benötigten Pakete:

  sudo apt-get update
  sudo apt-get install libts-bin evtest xinput python-dev python-pip
  sudo pip install evdev
  sudo apt-get install xinput-calibrator


1. Einrichtung des Treibers:

Es gibt zwei Möglichkeiten einen Monitor an einen Raspberry PI anzuschließen. HDMI und SPI. Wenn man einen SPI-Monitor besitzt, der direkt auf den Raspberry PI aufgesteckt wird, dann muss man in der Datei /boot/config.txt zusätzlich die SPI-Schnittstelle aktivieren. Bei HDMI-Monitoren ist das nicht notwendig.

Statt dessen müsste man bei einem HDMI-Monitor in der /boot/config.txt ggf. die HDMI-Schnittstelle vorkonfigurieren. Das folgende Beispiel bezieht sich also auf einen SPI-Monitor.

  sudo nano /boot/config.txt

und fühgen der Datei folgendes hinzu:

  dtparam=i2c_arm=on
  dtparam=spi=on
  dtoverlay=ads7846,penirq=25,speed=10000,penirq_pull=2,xohms=150

(Die 3. Zeile beschreibt lediglich die Konfiguration des Touchfeldes)


2. Erzeugen Sie (wenn nicht vorhande) das Verzeichnis /etc/X11/xorg.conf.d

Erstellen Sie (wenn nicht vorhanden) die Datei file 99-calibration.conf in diesem Verzeichnis

Fügen Sie folgendes in die Datei ein. Die Werte von "Calibration" sind unter anderem abhängig von der Auflösung des Touchscreens (dazu später mehr). Das folgende Beispiel ist für einen 3.5" Touchscreen von KUMAN

  Section "InputClass"
     Identifier "calibration"
     MatchProduct "ADS7846 Touchscreen"
     Option "Calibration" "3853 170 288 3796"
     Option "SwapAxes" "1"
  EndSection


3. Damit die Einstellungen übernommen werden, muss der Raspberry PI neu gebootet werden.

Das wars vom Prinzip und wenn der Touchscreen wie gewünscht funktioniert, dann gibt es nichts mehr zu tun.

Touchscreen Konfigurieren

Sollte der Touchscreen nicht richtig funkionieren, so kann die Ursache eine fehlerhaft Kalibrierung oder verdrehung des Touchfeldes sein

Um den Touchscreen zu Kalibrieren, sucht man im Menü von Debian unter Einstellungen nach der Option "Touchscreen Kalibrieren"

Das Programm ist selbsterklärend und erzeugt evenutell einen Code-Schnippsel der wie folgt aussieht:

Section "InputClass"
    Identifier    "calibration"
    MatchProduct    "ADS7846 Touchscreen"
    Option    "MinX"    "22152"
    Option    "MaxX"    "21879"
    Option    "MinY"    "48486"
    Option    "MaxY"    "49714"
    Option    "SwapXY"    "1" # unless it was already set to 1
    Option    "InvertX"    "0"  # unless it was already set
    Option    "InvertY"    "0"  # unless it was already set
EndSection

Das obrigen  Code-Schnipsel kann man dann in die weiter oben beschriebene Datei "/etc/X11/xorg.conf.d/99-calibration.conf" einfügen. (In einigen Distributionen befindet sich die Datei im Ordner "/usr/share/X11/xorg.conf.d/")

Wer so wie ich gerne mit der GUI arbeitet und die Vorzüge eines kompfortablen Editors schätzt, der sollte sich xrdp und geany installieren.

Dann kann man sich über RDP mit dem Raspberry verbinden und mit Alt+F2 und folgendem Befehl die Datei benutzerfreundlich editieren.

gksu geany /etc/X11/xorg.conf.d/99-calibration.conf

Im Original sieht die Datei eventuell auch wie folgt aus:

   Section "InputClass"
        Identifier      "calibration"
        MatchProduct    "ADS7846 Touchscreen"
        Option  "Calibration"   "3936 227 268 3880"
        Option  "SwapAxes"      "1"
   EndSection

Touchfeld drehen

In Linux kann der Touchscreen unabhängig vom angezeigten Screen verdeht werden oder sein. Der Touchscreen funktioniert dann nicht wie gewünscht und man hat (wie schon weiter oben beschrieben) den Eindruck, der Touchscreen wäre defekt.

Um zu verstehen wie man das Touchfeld richtig einstellt, muss man wissen, dass die Zahlen die Start und Endpunkte der jeweiligen Achsen angeben.

Es bringt also nichts, wenn man einen Wert aus dem ersten Zahlen-Paar mit einem Wert aus dem zweiten Zahlenpaar vertauscht.

Die Rotation erfolgt jeweils um 90 weitere Grad. Damit man nicht mit den Zahlen durcheinander, kommt wurden in dem folgenden Schema die Zahlen durch alphanumerische Kennungen ersetzt

+  0° Drehung:
     Option  "Calibration"   "MinX MaxX MinY MaxY"
     Option  "SwapAxes"      "1"

+ 90° Drehung:
     Option  "Calibration"   "MinX MaxX MaxY MinY"
     Option  "SwapAxes"      "0"

+180° Drehung:
     Option  "Calibration"   "MaxX MinX MaxY MinY"
     Option  "SwapAxes"      "1"

+270° Drehung
     Option  "Calibration"   "MaxX MinX MinY MaxY"
     Option  "SwapAxes"      "0"

Um den Touchscreen in die richtige Richtung drehen zu können, muss man zunächst die aktuelle Ausrichtung bestimmen.

Dazu bewegt man den Stift horizontal und vertikal über das Touchtpad, wenn die Bewegungen des Mauszeigers dabei in entgegengesetzter Richtung zum Stift verlaufen, dann ist der Touchscreen z.B. um 180° verdreht.

Sollte die Bewegung des Mauszeigers keinen Sinn ergeben, weil z.B. nur ein Vektor in die falsche Richtung läuft, dann sollte man zunächst nur Wert des Parameters SwapAxes von 0 auf 1, oder 1 auf 0 ändern und den Raspberry rebooten.

Nach dem man die aktuelle Verdrehung bestimmt hat, kann man anhand der obrigen Tabelle das Touchfeld in die richtige Richtung drehen. 

Dazu empfehle ich ein Blatt Papier zu nehmen, auf dem man seine Zahlen der aktuellen XY-Kombination. zuordnet, denn wenn man weiß wo man ist und wo man hin will, fällt es einem leicht seine Zahlen in die richtige Reihenfolge zu bringen.

Kalibrierungsresistenter Touchscreen

Mit unter kann es vorkommen, das sich ein Touchscreen mit Händen und Füßen gegen jedwede Kalibrierung wehrt. Da können Sie in die Datei 99-calibration.conf eintragen was Sie wollen - es wird vom X-Server ignoriert.

In diesen Fälen liegt es aller Wahrscheinlichkeit nach an einer unvollständigen Einrichtung des Paketes evdev.

Führen Sie folgendes aus, damit evdev für den X-Server verwendet werden kann:

   sudo apt-get install xserver-xorg-input-evdev

   sudo cp -rf /usr/share/X11/xorg.conf.d/10-evdev.conf /usr/share/X11/xorg.conf.d/45-evdev.conf

 

Troubleshooting für RB-LCD-5 von Joy-IT

Der 5"-TouchScreen von Joy-IT benötigt in der /boot/config.txt eine spezielle HDMI-Konfiguration, und kommt ebenfalls ohne die Treiber des Herstellers aus. Bevor wir jedoch den Touchscreen einrichten können, müssen wir wie schon oben beschrieben einige Pakete installieren.

   sudo apt-get update

   sudo apt-get install libts-bin evtest xinput python-dev python-pip

   sudo pip install evdev

   sudo apt-get install xserver-xorg-input-evdev

   sudo apt-get install xinput-calibrator

   sudo cp -rf /usr/share/X11/xorg.conf.d/10-evdev.conf /usr/share/X11/xorg.conf.d/45-evdev.conf

Nach dem wir die benötigten Pakete installiert haben, können wir den Touchscreen über die Datei /boot/config.txt einrichten.

Hinweis: Die folgenden Parameter und Werte sind für den 5" HDMI-Monitor andere Größen und Auflösungen bedingen z.T. andere Werte, die man aber größten Teils den Anleitungen des Herstellers entnehmen kann.

   sudo nano /boot/config.txt

   max_usb_current=1

   hdmi_drive=1 # HDMI ohne Sound / 2 = HDMI mit Sound verursacht u.U. einen lilanen Streifen am linken Rand

   hdmi_group=2

   hdmi_mode=1

  hdmi_mode=87

   hdmi_cvt=800 480 60 6 0 0 0

   dtoverlay=ads7846,penirq=25,speed=10000,penirq_pull=2,xohms=150

Wie weiter oben in der Anleitung für den SPI-Monitor, enthält die letzte Zeile lediglich eine Grundkonfiguration für das Touchfeld des Monitors ohne Angabe einer Kalibrierung

Jetzt müssen wir die Datei noch speichern und widmen uns der eigentlichen Kalibrierung des Touchscreens

   cd /etc/X11

   sudo mkdir xorg.conf.d

   sudo nano 99-calibration.conf

Folgende Werte sollten eigentlich für den 5"-Touchscreen passen, fügen Sie den gesamten Block in die Datei : 99-calibration.conf ein:

  Section "InputClass"
      Identifier    "calibration"
      MatchProduct    "ADS7846 Touchscreen"
      Option    "Calibration"    "172 3960 184 4063"
      Option    "SwapAxes"    "0"
  EndSection

Jetzt müssen wir den Raspberry PI noch mal neu starten:

   sudo reboot

Sollte der Touchscreen nach dem booten nicht korrekt kalibriert sein, dann kann man ihn lokal über "Einstellungen > Touchscreen Kalibrieren" noch einmal nachjustieren.

Hier findet man interessante Infos zur Helligkeitssteuerung:

https://maker-tutorials.com/raspberry-pi-touchscreen-installieren-und-anschliessen-tipps-tricks/

Allerdings bezieht sich die Anleitung speziell auf den 7" Toucher von Raspberry. Mit anderen Monitoren wird sie nicht funktionieren.

Noch ein Wort zu Multitouch: Wer jetzt nicht weiß was das ist sollte Tante Google fragen - jedenfalls ist die Frage ob man es unter Linux zum Laufen bekommt, von zwei Faktoren abhängig.

Ist die Hardware (der Touchscreen) Multitouch-fähig?

Gibt es Treiber für Linux?

Wenn nur eine der beiden Fragen mit nein zu beantworten ist, dann muss man auf Multitouch verzichten. 

Weitere Quellen:

https://www.raspberrypi.org/forums/viewtopic.php?t=143581

https://www.raspberrypi.org/forums/viewtopic.php?f=44&t=173993

http://www.spotpear.com/learn/EN/raspberry-pi/Raspberry-Pi-LCD/Raspberry-Pi-_Rotate-the-screen-display.html