An resistiven Touchpanel (4-Wire) Position ermitteln

    This site uses cookies. By continuing to browse this site, you are agreeing to our Cookie Policy.

    • An resistiven Touchpanel (4-Wire) Position ermitteln

      Hallo mal ne Frage

      Ich hab hier an meinem Display 320x480 (ILI9486) ein resistives Touch-Panel mit dran. So ist das ja an vielen TFT-Displays dran.
      Das Funktionsprinzip ist hier erklärt: Wikipedia Siehe auch Abbildung.


      Um beispielsweise X auszulesen muss ich am Unteren Panel eine Spannung anlegen.
      Angenommen links 0V und rechts 5V.
      Wenn ich dann das Panel drücke verbindet sich elektrisch die untere Ebene mit der oberen.
      Wenn hier die Elektroden (oben und unten) per ADC eingelesen werden, erhalte ich die Spannung vom Spannungsteiler der unteren Ebene.

      Jetzt meine Frage:
      Wie erkenne ich aber zuverlässig, wenn das Touchpanel nicht bedient wird, es also frei schwebt wie ein offener Pin?
    • six1 wrote:

      Oft ist an dem Touch-Widerstandsnetzwerk ein Touchcontroller dran
      In meinem Fall nicht. Die Anschlüsse des Touch gehen direkt an die Controller-Pins.

      Michael wrote:

      Dann misst du den gleichen Pegel an beiden Pins der jeweiligen Ebene.
      Das klappt leider nicht.

      Denn von jeder Ebene geht nur je ein Pin an den ADC.
      Und der ist dann gleichzeitig noch ein Pin zum Spannung anlegen je Ebene.

      Also untere Ebene hat Anschlüsse X- (an PortC.2 = ADC2) und X+ (PortD.6).
      Obere Ebene mit Anschlüsse Y- (PortD.7) und Y+ (PortC.1 = ADC1).

      Wenn ich also z.B. zum X einlesen an X+ 5V und an X- GND anlege, kann ich nicht am ADC2 einlesen, denn das ist ja dann GND (X-).
      Ich kann also nur den freien ADC1 von der anderen Ebene in dem Fall einlesen.

      So wird's vielleicht deutlicher:

      BASCOM Source Code

      1. PIN_TOUCH_XP Alias PortD.6 ' X-Plus
      2. PIN_TOUCH_YM Alias PortD.7 ' Y-Minus
      3. PIN_TOUCH_XM Alias PortC.2 ' X-Minus (ADC2)
      4. PIN_TOUCH_YP Alias PortC.1 ' Y-Plus (ADC1)

      The post was edited 1 time, last by Mitch64 ().

    • Hallo Mitch64,

      es war mir schon klar, dass die gnerelle Wirkungsweise bekannt war; ich hatte angenommen, dass di auch an einer Verschaltung solcher 4-Draht Dinger gelegen war; ich vermute du hast auch weiter nach unten gescrollt; da gab es Schaltbilder zur Verdrahtung solcher Objekte.

      Weitere Infos mit Schaltbeispielen sind in den verschiedenen Touch-Controller Datenblättern zu finden.

      The post was edited 1 time, last by Ulrich ().

    • Riedleweg wrote:

      Ich hatte da vor Jahren mal was probiert
      Ich hab mir eben den Code mal durchgesehen.
      Im Prinzip machst du es wie ich.
      Am X-Plain 5V und 0V per Pin anlegen und dann den ADC von anderen Plain lesen.
      Du holst halt mehrere Werte und bildest den Mittelwert.

      Bei der Auswertung teilst du den Messbereich in gleiche Teile ein und weist so die Spalte/Zeile zu.
      Passt ein Wert nicht ist es Spalte0 / Zeile 0.

      Mein Problem ist, dass dass ich Werte vom ADC bekomme die im Wertebereich liegen, obwohl ich das Touch nicht anfasse.
      Würde ich den Wert so auswerten wie du, würde ich eine Spalte/Zeile im mittleren Bereich erhalten.

      Vielleicht ist mein Touch aber auch defekt. Gemessen habe ich auf dem einen Plain (XP nach XM und YP nach YM) einmal um die 580 Ohm und das andere Plain 230 Ohm.
      Also nix hochohmig wie bei dir.


      Ulrich wrote:

      da gab es Schaltbilder zur Verdrahtung solcher Objekte.
      Ja, hab auch weiter unten geschaut (gescrollt). Meine Anschluss-Beschaltung entspricht aber dem aus Post #7.
      Daher habe ich keinen Touch-Controller und es ist auch nicht vorgesehen, Gesten zu erkennen. Nur Buttons (Cklick) oder vielleicht noch "Wischen".

      Das Display ist fix verdrahtet, ohne Touch-Controller. Pins liegen direkt am Controller. Beschaltung wie in Post #7 bzw. Post #5.
    • @Riedleweg
      Ich habe bei mir an den ADC-Eingang auch mal ein 470kOhm gegen Masse gehängt, so wie in deiner Schaltung, aber ohne Kondensator.
      Jetzt sind die ADC-Werte nahe bei 0, wenn ich das Touch nicht bediene.
      Fast voller Wertebereich
      • X-Bereich von ca. 15 bis 817 (Ruhewert 15)
      • Y-Bereich von ca. 125 bis 820 (Ruhewert 0)
      Touch ist in Ordnung, mit anderen Display kommen gleiche Werte.

      Ich glaube damit wäre mein Problem gelöst.
      Am Y-Wert=0 (oder <50) lässt sich erkennen, ob das Touch bedient wird oder nicht.

      Mich Wundert, dass da kein Widerstand auf dem Shield ist. Ich bekomme da immer Ruhewerte für X und Y um die 500. Das geht ja gar nicht.
      Ich habs's auch mal mit den internen PullUp's versucht, Dann war der Pegel nahe des oberen Bereichs. Beim Bedienen konnte der Wert jedoch höher werden. Das ging also so auch nicht.

      Aber ich bitte @Michael doch noch, seine Lösung aufzuzeigen.
      Vielleicht hat die Variante Vorteile.

      An der Stelle möchte ich mal mein funktionierendes Code-Schnipsel zeigen.

      BASCOM Source Code: Touch.inc

      1. ' Modul: Touch.inc
      2. ' Autor: Mitch64 © 2020
      3. ' erstellt: 18.08.2020
      4. ' Version: Test
      5. ' Anschlüsse lt. Testprogramm MCUFriend am Arduino-Uno Board
      6. ' X (Minus) = A2
      7. ' X (Plus) = D6
      8. ' Y (Plus) = A1
      9. ' Y (Minus) = D7
      10. ' An den ADC-Eingängen A1 und A2 wird je ein PullDown mit je 470kOhm geschaltet.
      11. PIN_TOUCH_XP Alias PortD.6 ' X-Plus
      12. PIN_TOUCH_YM Alias PortD.7 ' Y-Minus
      13. PIN_TOUCH_XM Alias PortC.2 ' X-Minus (ADC2)
      14. PIN_TOUCH_YP Alias PortC.1 ' Y-Plus (ADC1)
      15. Const ADC_TOUCH_X = 2 ' ADC2 (X-Minus)
      16. Const ADC_TOUCH_Y = 1 ' ADC1 (Y-Plus)
      17. Config ADC = Single , Prescaler = Auto , Reference = AVCC
      18. Dim _Touch_X as Word
      19. Dim _Touch_Y as Word
      20. ' ============================================================================
      21. Goto Modul_Touch_Exit
      22. ' ============================================================================
      23. ' ------------------------------------
      24. ' Liest X-Wert in Variable _Touch_X
      25. ' ------------------------------------
      26. Sub Touch_Read_X()
      27. Config PIN_TOUCH_XP = Input : Reset PIN_TOUCH_XP ' Tristate
      28. Config PIN_TOUCH_XM = Input : Reset PIN_TOUCH_XM ' Tristate
      29. Config PIN_TOUCH_YP = Output : Set PIN_TOUCH_YP
      30. Config PIN_TOUCH_YM = Output : Reset PIN_TOUCH_YM
      31. Waitms 50
      32. _Touch_X = GetADC(ADC_TOUCH_X)
      33. End Sub
      34. ' ------------------------------------
      35. ' Liest Y-Wert in Variable _Touch_X
      36. ' ------------------------------------
      37. Sub Touch_Read_Y()
      38. Config PIN_TOUCH_XP = Output : Set PIN_TOUCH_XP
      39. Config PIN_TOUCH_XM = Output : Reset PIN_TOUCH_XM
      40. Config PIN_TOUCH_YP = Input : Reset PIN_TOUCH_YP ' Tristate
      41. Config PIN_TOUCH_YM = Input : Reset PIN_TOUCH_YM ' Tristate
      42. Waitms 50
      43. _Touch_Y = GetADC(ADC_TOUCH_Y)
      44. End Sub
      45. ' ============================================================================
      46. Modul_Touch_Exit:
      47. ' ============================================================================
      Display All
      Eine Auswertung ist da jetzt noch nicht dabei. Es ging ja erst mal ums Auslesen und Erkennung, wenn Touch nicht bedient wird.
      Vielleicht hilft das schon dem Einen oder Anderen.

      The post was edited 1 time, last by Mitch64 ().

    • Mitch64 wrote:

      Da werden 4 Digital-Pins verwendet, wobei 2 davon auch Analogpins sind.
      Wenn ich meinen Code so nachträglich anschaue, reichen da auch 2 analoge ;)

      Es ist ein Arduino Mega2560 Board (deswegen ADC 8-11)

      BASCOM Source Code: Touch Beispiel

      1. $regfile = "m2560def.dat"
      2. $crystal = 16000000
      3. $hwstack = 128
      4. $swstack = 128
      5. $framesize = 128
      6. Dim Adx As Word
      7. Dim Ady As Word
      8. Dim Ada As Word
      9. Dim Adb As Word
      10. Dim Y_wert As Word
      11. Dim X_wert As Word
      12. Do
      13. Gosub Ad_lesen
      14. Loop
      15. Ad_lesen:
      16. Ddrk.0 = 0 'ADC 8
      17. Ddrk.1 = 1 'ADC 9
      18. Ddrk.2 = 0 'ADC 10
      19. Ddrk.3 = 1 'ADC 11
      20. Portk.3 = 1
      21. Adx = Getadc(32) 'ADC 8
      22. Ady = Getadc(33) 'ADC 9
      23. Ada = Getadc(34) 'ADC 10
      24. Adb = Getadc(35) 'ADC 11
      25. Y_wert = Adx + Ada
      26. Portk = Portk And &HF0
      27. Ddrk.0 = 1
      28. Ddrk.1 = 0
      29. Ddrk.2 = 1
      30. Ddrk.3 = 0
      31. Portk.0 = 1
      32. Adx = Getadc(32)
      33. Ady = Getadc(33)
      34. Ada = Getadc(34)
      35. Adb = Getadc(35)
      36. X_wert = Ady + Adb
      37. Return
      Display All


      Mitch64 wrote:

      Was war das für ein Projekt, wenn ich fragen darf?
      Eine von 3 Servos bewegte Platte, auf der eine Kugel rollt bzw. balanciert.
      Die Kugelposition wird vom Touchscreen erfasst.
    • bei dem Display habe ich das so gelöst:

      BASCOM Source Code

      1. Xplus Alias Portc.2 'ADC2
      2. Xminus Alias Portd.6
      3. Yplus Alias Portc.1 'ADC1
      4. Yminus Alias Portd.7
      5. Sub Read_touch_raw()
      6. Cs_disp = 1
      7. Config Yplus = Input
      8. Config Xminus = Input
      9. Config Xplus = Output
      10. Config Yminus = Output
      11. Reset Xplus
      12. Set Yminus
      13. Waitms 1
      14. Touch_level = Getadc(2)
      15. ' Print "level: " ; Touch_level
      16. If Touch_level > 10 Then
      17. 'Read x
      18. Config Yplus = Input
      19. Config Yminus = Input
      20. Config Xplus = Output
      21. Config Xminus = Output
      22. Set Xminus
      23. Reset Xplus
      24. Waitms 1
      25. For Thelp = 1 To 2
      26. Adc_read(thelp) = Getadc(1)
      27. Next
      28. Tx = Adc_read(1) + Adc_read(2)
      29. Shift Tx , Right , 1
      30. Tx = 1024 - Tx
      31. ' Print "X-Wert: " ; Tx
      32. 'Read Y
      33. Config Xplus = Input
      34. Config Xminus = Input
      35. Config Yplus = Output
      36. Config Yminus = Output
      37. Reset Yplus
      38. Set Yminus
      39. Waitms 1
      40. For Thelp = 1 To 2
      41. Adc_read(thelp) = Getadc(2)
      42. Next
      43. Ty = Adc_read(1) + Adc_read(2)
      44. Shift Ty , Right , 1
      45. Ty = 1024 - Ty
      46. ' Print "Y-Wert: " ; Ty
      47. Touch_flag = 1
      48. Else
      49. Touch_flag = 0
      50. End If
      51. 'Display mode
      52. Config Yplus = Output
      53. Config Yminus = Output
      54. Config Xplus = Output
      55. Config Xminus = Output
      56. Cs_disp = 0
      57. End Sub
      Display All