Benutzer-Werkzeuge

Webseiten-Werkzeuge


softwareanleitungen:cda19t

Touchpanels CDA19T

Vor einiger Zeit haben wir Touchpanels des Typs CDA19T gespendet bekommen. Es ist bis jetzt noch nicht gelungen, im Internet eine vollständige Dokumentation dafür aufzutreiben. Die Geräte können an den VGA- oder DVI-Port der Grafikkarte angeschlossen werden. Per RS232 (DSUB-9) können die Positionsdaten des Touchpanels gelesen werden. Das Touchpanel ist ein resistives und daher etwas schwergängiger als kapazitive Touchoberflächen, wie man sie von modernen Smartphones gewohnt ist.

Protokoll

Das serielle Protokoll konnte mit wenig Aufwand rekonstruiert werden. Dem Protokoll auf Byte-Ebene liegt eine Baudrate von 9600 ohne Start-/Stoppbits oder Paritätsbits zugrunde. Es gibt drei verschiedene Ereignisse, die per RS232 behandelt werden:

  • Drücken der Oberfläche (press)
  • Halten des Fingers auf einer Position (hold)
  • Loslassen der Oberfläche (release)

Wird die Oberfläche gedrückt, wird ein press-Ereignis gesendet. Danach werden so lange hold-Ereignisse gesendet, bis der Touchscreen losgelassen wird.

Jedes Ereignis wird in Form eines 10 Byte großen Päckchens per RS232 an den PC weitergegeben. Ein Päckchen zeigt folgenden Aufbau:

Byte-Index Bedeutung
0 U (ASCII), magic byte
1 T (ASCII), magic byte
2 Ereignistyp
3 x-Position low byte
4 x-Position high byte
5 y-Position low byte
6 y-Position high byte
7 Druck low byte
8 Druck high byte
9 unbekannt

Byte 2 kann die Werte 0x81 (press), 0x82 (hold) oder 0x84 (release) annehmen.

Mit folgendem Python-Code lassen sich x- und y-Koordinaten ausgeben:

#!/usr/bin/env python3
import serial

baud = 9600
with serial.Serial('/dev/ttyUSB0', baud, timeout=1) as ser:
    while True:
        ser.flushInput() # je nach Anwendung
        b = ser.read(10)
        if not b:
            continue
        if b[0] != 0x55 or b[1] != 0x54:
            continue
        evtype = b[2]
        evname = 'unknown'
        if evtype == 0x81:
            evname = 'press'
        elif evtype == 0x82:
            evname = 'hold'
        elif evtype == 0x84:
            evname = 'release'
        x_lo = b[3]
        x_hi = b[4]
        x = (x_hi << 8) + x_lo
        y_lo = b[5]
        y_hi = b[6]
        y = (y_hi << 8) + y_lo
        print(evname, x, y)

Linux-Treiber

Es gibt im Archwiki eine Anleitung (https://wiki.archlinux.org/index.php/serial_input_device_to_kernel_input), die die Nutzung von RS232-Geräten zur Eingabe unter Linux erklärt. Mittels des inputattach-Treibers kann bei Auswahl des „elotouch“-Betriebsmodus das Display als Eingabegerät genutzt werden. Allerdings bewegt sich der Mauszeiger in y-Richtung verkehrtherum, was man aber bestimmt in der Xorg-Konfiguration beheben kann (noch nicht getestet). Vielleicht lässt sich das auch in inputattach einstellen. Außerdem reagiert der Mauszeiger recht langsam auf die Touch-Eingaben, was jedoch der Geschwindigkeit der seriellen Schnittstelle geschuldet sein kann.

Man findet im Netz bruchstückhafte Informationen zum Elotouch-Protokoll, die die obige Dokumentation teilweise obsolet machen.

Für den RasPI gibt es hier etwas Code: https://github.com/Ysurac/raspberry_kernel_mptcp/blob/master/drivers/input/touchscreen/elo.c

Ideen

  • Infoscreen mit Kalender, Raumbelegungsplan,… für die Werkstatt
  • Gerät für virtuelle Präsenz
  • Gewinnspiel für den THinG, C3 und andere Messen
  • pixelflut-Client: Fingerfarbensimulator mit Memefunktion
softwareanleitungen/cda19t.txt · Zuletzt geändert: 2021/01/25 20:14 von 127.0.0.1