3 Erweiterte I2C-Kopplung mit Touchscreen

Gespeichert von DL6GL am Mo., 09.03.2020 - 11:02

Update V2.00, 03/2020

Nun wollte ich es wissen: Mit der hier in Abschnitt 3 beschriebenen I2C-Kopplung, die auch eine Reaktion des Slaves zulässt, sollte es nun möglich sein, auch einen Touchscreen auszulesen. Ziel war also, ein Touch-Ereignis, etwa Button 2 auf dem Slave-Display wurde gedrückt, zurück an den Master zu geben, um dort eine entsprechende Reaktion des Steuerprogramms auszulösen.

Abb. 3.1: Touch Panel des Slave-Displays.

Im Slave werten die AVR-ADC Touch-Ereignisse aus. Dazu werden jeweils zwei gegenüber liegende Elektroden einer Kontaktfläche (Layer) des Touch Panel an +Vcc bzw. GND gelegt und der durch den Fingerdruck erzeugte Spannungsabfall des Widerstandsnetzwerkes am anderen Layer (Abb. 3.2) gemessen.

Abb. 3.2: Resistives Touch Panel schematisch (Quelle Wikipedia).

Da die gemessenen ADC-Werte infolge kapazitiver Kopplung auf das Panel auch ohne Berührung recht stark schwanken, wird zunächst festgestellt, ob ein bestimmter Schwellenwert durch einen Fingerdruck überschritten wurde. Erst dann erfolgt die ADC-Messung an beiden Layern, um festzustellen, wo die Betätigung erfolgt war.

Die so ermittelten X/Y-Koordinaten sind zunächst ADC-Werte von 0 bis 1023. Eine Umrechnung in die Displaykoordinaten X/Y = 240/320 oder umgekehrt je nach Orientierung ermöglicht eine Kalibrierung. Hierzu wurde die Routine von HKipnik unverändert übernommen. Sie arbeitet im Portrait Mode (aufrecht). Die Umrechnung in andere Orientierungen erfolgt automatisch, zumindest wie erprobt im anschließenden Landscape Mode (quer).

Die Kalibrierungsdaten werden im EEPROM des Slave gespeichert. Das Fuse Bit EESAVE ist dazu zu setzen. Wenn mit dem erstmaligen Betrieb ein unbeschriebenes EEPROM vorgefunden wird, startet die Kalibrierungsroutine im Slave-Testprogramm. Drei mit einem Fadenkreuz gekennzeichnete Punkte sind nacheinander mit einem Stift möglichst genau anzutippen. Eigentlich selbsterklärend.

Zu den vier Anschlüssen des (resistiven) Touch Panels ist noch anzumerken:

  1. Die Anschlüsse X+, X-, Y+, Y- oder auch XP, XM, YP, YM sind mit anderen TFT-Anschlüssen doppelt belegt. Sie sind also nur alternativ zu benutzen, entweder Touch oder TFT. Beides, Touch-Auswertung und TFT-Anzeige, quasi gleichzeitig zu betreiben ließe sich über Zeitscheiben oder Interrupts lösen.
  2. Es ist offenbar so, dass diese Doppelbelegungen je nach Hersteller verschieden sind. Im Zweifelsfall hilft hier nur Ausmessen (welcher Anschluss am Flexboard des Touch Panels geht an welchen beschrifteten Pin des Display-Boards?).
  3. Chinesische Händler liefern zumeist keinerlei Dokumentation, nicht mal Links darauf.

Am oben beschriebenen TFT wurden folgende Pin-Zuordnungen gefunden und in ILI9341-Slave_200.bas programmiert:

Touch TFT-Pin Arduino UNO
X- LCD_RS A2 (PC.2/ADC2)
X+ LCD_D6 PD.6
Y- LCD_D7 PD.7
Y+ LCD_WR A1 (PC.1/ADC1)

Fallweise müssen die Alias-Zuweisungen im Erklärungsteil von ILI9341-Slave_200.bas umdefiniert werden.

Die Include-Dateien "ILI9341_functions8_DL6GL.inc" zu V1.00 und V2.00 sind nicht zueinander kompatibel. Es sind die Versionen aus den jeweiligen .zip-Files zu verwenden.
In V2.00 ist die "ILI9341_Colordefinitions.inc" hinzugekommen.

Das in Abschnitt 2 vorgestellte Testprogramm wurde neben der neuen I2C/TWI-Software um den in Abb. 3.1 gezeigten Touchscreen erweitert. Mit Fingerdruck auf "Touch1" bis "Touch3" wird der entsprechende Button an den Master zurückgegeben. Nach Betätigen von "End" spult sich die schon vorher vorhandene Demo ab.

Die Synchronisation über die in Abb. 1.2 gezeigte Steuerleitung ist verblieben. Sie ist einfacher und vor allem schneller als eine nunmehr denkbare Rückmeldung vom Slave an den Master via I2C.