mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Interpolation Touchscreen


Autor: Markus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

Ich versuche momentan einen kapazitiven Touchscreen mit einem ATMega32 
auszuwerten. Dabei benutze ich die QTouch Lib von Atmel um die Signale 
der Sensoren auf einer Folie zu erfassen. Der nächste Schritt ist die so 
gewonnene Matrix zu interpolieren um die Auflösung der Folie zu erhöhen.
Momentan interpoliere ich linear auf das 10-Fache.
Danach stecke ich aber fest. Ich habe keine Idee wie ich nun die x/y 
Koordinate in der interpolierten Matrix finde (wird zb zwischen 2 oder 4 
tasten gedrückt ist kein Maximalwert vorhanden bzw der maximalwert in 
der Matrix entspricht nicht der Fingerposition) bzw ob ich überhaupt die 
ganze Matrix interpolieren muss?
Und bei dem Wetter ist es auch schwer einen kühlen Kopf zu bewahren um 
klar zu denken ;-)

Vielleicht hat hier jemand eine Idee oder kann mich wenigstens in die 
richtige Richtung schubsen?

Gruß Markus

Autor: Markus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Mal ein Beispiel mit einer 3x3 Matrix:
_____________
|    |    |    |
|    |    |    |
----------------
|    |x   |    |       Hier drücke ich.
|    |    |    |
----------------
|    |    |    |
|    |    |    |
----------------

Das sind die Werte meiner Sensoren:

| 3  | 6  | 0  |
| 6  | 11 | 0  |
| 0  | 0  | 0  |

Das ist meine Interpolierte Matrix:

| 4  | 4  | 5  | 6  | 4  | 2  | 0  |
| 4  | 5  | 6  | 7  | 5  | 2  | 0  |
| 5  | 6  | 8  | 9  | 6  | 3  | 0  |
| 6  | 7  | 9  | 11 | 7  | 3  | 0  |
| 4  | 5  | 6  | 7  | 4  | 2  | 0  |
| 2  | 2  | 3  | 3  | 2  | 1  | 0  |
| 0  | 0  | 0  | 0  | 0  | 0  | 0  |

Das sieht alles Toll aus, die Werte stimmen so weit, die lineare 
Interpolation ist genau genug aber wie man sieht ist die 11 immer noch 
der höchste Wert. Der höchste Wert müsste aber unter dem Finger liegen, 
was der 8 entspricht.

Autor: Lehrmann Michael (ubimbo)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Dürften wir dich um den Quellcode bitten ?

Autor: Rolf Magnus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Markus schrieb:
> Das sieht alles Toll aus, die Werte stimmen so weit, die lineare
> Interpolation ist genau genug aber wie man sieht ist die 11 immer noch
> der höchste Wert. Der höchste Wert müsste aber unter dem Finger liegen,
> was der 8 entspricht.

Ich verstehe noch nicht so ganz, was du machst, aber wenn du in der 
Mitte eine 11 hast und links eine 6, wird eine lineare Interpolation 
dazwischen niemals einen Wert liefern, der größer als 11 ist.

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Markus schrieb:

> Das sieht alles Toll aus, die Werte stimmen so weit, die lineare
> Interpolation ist genau genug aber wie man sieht ist die 11 immer noch
> der höchste Wert. Der höchste Wert müsste aber unter dem Finger liegen,
> was der 8 entspricht.

Ich denke, da wirst du nicht viel dagegen machen können.
Du hast nun mal nur 3*3 Sensorwerte. Alles andere, was du dazwischen 
reinrechnest beruht nun mal auf der Annahme, dass bildlich gesprochen, 
eine Bergspitze nur in der Mitte eines der Sensorfelder sein kann.

Hast du mal ein paar 'Spielchen' probiert:

alle Werte rund um einen Wert addieren

| 4  | 4  | 5  | 6  | 4  | 2  | 0  |
| 4  | 5  | 6  | 7  | 5  | 2  | 0  |
| 5  | 6  | 8  | 9  | 6  | 3  | 0  |
| 6  | 7  | 9  | 11 | 7  | 3  | 0  |
| 4  | 5  | 6  | 7  | 4  | 2  | 0  |
| 2  | 2  | 3  | 3  | 2  | 1  | 0  |
| 0  | 0  | 0  | 0  | 0  | 0  | 0  |


Als zb für den 8-er links von der 11: 5 + 6 + 7 + 9 + 11 + 9 + 7 + 6

Mit ein wenig Glück kriegst du so eine Verschiebung des Maximums in 
Richtung linke obere Ecke hin.

Aber grundsätzlich: Information die in den Ausgangsdaten nicht vorhanden 
ist, ist weg. Und wenn du dich Kopf stellst, sie ist trotzdem weg.
Deine Ausgangsdaten sind nun mal 9 Sensorwerte und nicht mehr. Aus 
deinen Seonsorwerten kann man noch ablesen, dass der Druckpunkt nicht 
zentral in der Mitte war, sondern eher links von der Mitte und oberhalb 
der Mitte. Aber zu recht viel mehr wirds nicht reichen.

Autor: Markus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Genau!
Das ist mein Problem :-)
Ich hab nur keine Ahnung wie ich das so Interpoliere das zwischen der 6 
und der 11 ein Anstieg ist, und drumherum ein Abstieg.

Autor: hm (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wie sieht die 3x3 Matrix denn aus, wenn du im selben Feld woanders 
drückst?

Autor: Markus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
| 0  | 6  | 11 |
| 0  | 3  | 6  |
| 0  | 0  | 0  |

Autor: Markus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Huch, ich hab mich verlesen...

| 0  | 0  | 0  |
| 2  | 15 | 2  |
| 1  | 9  | 1  |

Was dann dort wäre:
______________
|    |    |    |
|    |    |    |
----------------
|    |    |    |
|    | x  |    |
----------------
|    |    |    |
|    |    |    |
----------------

Autor: hm (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
also im mittleren Feld drücken, kann eine den höchsten Wert in einem 
anderen erzeugen?
Schade ich hätte sonst ausgehend vom maximalen Wert, also Feld gedrückt 
geschaut in welche Richtung die Differenzen geringer sind, um die 
Tendenz in dem Feld festzustellen.

Autor: hm (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Würd doch dann gehen?

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Im Folgenden nur weiterlesen, wenn du dich mit Geometrie und Mathe nicht 
auf Kriegsfuss befindest.

Man könnte versuchen einen Bi-quadratischen Patch in die Daten 
hineinzurechnen und dessen Maximum zu bestimmen.

Hintergrund:
Wenn man 3 Punkte kennt, kann man eine Gleichung 2ten Grades in diese 
Punkte hineinrechnen, so dass alle 3 Punkte auf dieser Gleichung liegen.

Dasselbe kann man auch mit 9 Punkten und einer Fläche machen, die in 2 
Achsrichtungen jeweils aus einer Gleichung 2ten Grades besteht.

Das müsste ungefähr so aussehen
 f( x, y ) = z = a*x^2 + b*x + d*y^2 + e*y + f*x^2y^2 + g*x^2y + h*xy^2 + i*xy + j

du hast 9 bekannte Punkte, damit lassen sich 9 Gleichungen dieser Form 
aufstellen und die Koeffizienten a bis j berechnen.

Aus der dann bekannten Formel, kann man wiederum mittels Differentiation 
die Position des Maximums (von z) berechnen.

Autor: hm (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Vorrausgesetzt der kapazitive Einfluß des Fingers genügt auch einer 
quadratischen Funktion, das wüsst ich jetzt physikalisch nicht.
Dann wärs schon beliebig präzise.

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hm schrieb:
> Vorrausgesetzt der kapazitive Einfluß des Fingers genügt auch einer
> quadratischen Funktion, das wüsst ich jetzt physikalisch nicht.

Ich auch nicht.
Im Zweifelsfall würd ich aber sagen: eher nicht

Aber das ist so ziemlich das einzige was mir einfällt um aus einem Satz 
unvollständiger Daten Kaffeesatzleserei zu betreiben.

Im Grunde gehts darum, von einem Messpunkt auch noch ein wenig seiner 
Umgebung zu berücksichtigen.
Anschaulich gesagt ist klar, dass bei

| 3  | 6  | 0  |
| 6  | 11 | 0  |
| 0  | 0  | 0  |

*) der Druckpunkt nicht in der Mitte war
*) sondern etwas weiter links
*) und etwas oberhalb der Mitte
*) aber auch nicht soweit links/oberhalb, dass man schon am Rand wäre
*) sondern eher näher der Mitte als näher am Rand

Nur: Wie giesst man das in Formeln?

Autor: hm (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Andere Idee wäre zu gucken, wenn vielleicht schon die Tools da sind, ob 
man einem mehrschichtiges Perzeptron beibringen kann, von der 3x3 auf 
eine höhere Auflösung zu abstrahieren. GANZ ähnliches Problem habe ich 
so mal gelöst.
Falls eine Funktion über die Fläche gelegt werden kann, könnte man die 
auch lernen und spart sich das Lösen. Verbraucht sicher nciht 
unwesentlich Rechenzeit. Zweiten Grades bräuchte auch nciht so viele 
Neuronen.

Autor: Sebastian ... (zahlenfreak)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Sollte das nicht einfach über eine Schwerpunktsberechnung gehen? Die wär 
jedenfalls recht einfach zu machen und irgendwie klingts für mich 
logisch ^^

Sebastian

Autor: Markus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ja... eben da bin ich auch mit meinem Latein, was auch noch nicht allzu 
groß ist, am Ende...  Vielleicht hilft es das ich das Maximum das ein 
Feld erreichen kann kenne und weiß wie groß der Radius einer Berührung 
ca. ist? Könnte man da nicht was mit einer Gausschen Glocke basteln? Das 
Problem ist nur das ich den Mittelpunkt nicht kenne, den die Formel aber 
verlangt.

Autor: Markus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@zahlenfreak
Das heisst Schwerpunktberechnung. Du sagst ja auch nicht Bratswurst oder 
Schamslippen ;-)

Autor: Markus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Und ja, du hast Recht. mit der Schwerpunktberechnung bekomme ich 
ziemlich gute Ergebnisse!

Autor: Sebastian ... (zahlenfreak)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Mit der Schwerpunktberechnung solltest du dir sogar die Interpolation 
sparen können. Dann dürfte auch die Genauigkeit steigen, weil du auf dem 
Weg weniger Rundungsfehler hast. Der Rechenzeit tuts sowieso gut.

Autor: hm (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Schwerpunkt ist wahrscheinlich wegen der Linearitär bischen ungenauer 
als der quadratische Ansatz, aber ja auch unschlagbar einfach.
Würd ich definitiv als Gewinner ansehen, wenn reicht.

Autor: Unterlehrer (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Markus schrieb:
> Das heisst Schwerpunktberechnung. Du sagst ja auch nicht Bratswurst

... oder Weihnachtszeit, Rotationsmatrix, Spannungsspitze, Essensreste, 
Heizungsinstallateur, Geschäftsmann, Tageszeitung, ...

Autor: Markus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Dann will ich mich mal bei allen bedanken!
Allein die Schwerpunktsberechnung ;-) reicht nicht, wenn ich vorher 
interpoliere bekomme ich aber recht genaue Ergebnisse.

Autor: Arne Helms (piowux)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Markus schrieb:
> Dann will ich mich mal bei allen bedanken!
> Allein die Schwerpunktsberechnung ;-) reicht nicht, wenn ich vorher
> interpoliere bekomme ich aber recht genaue Ergebnisse.

Wie genau denn? Würde mich mal interessieren. Wie groß ist denn dein 
Touchpad und wie groß die Elektroden? Welchen Abstand hat dein Finger zu 
den Elektroden?

Viele Grüße,

Arne

Autor: u-jean (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi Leute, ich bin gerade auch dabei einen ATmega32 für ein touch pad zu 
programmieren. Ich bin recht unerfahren was die Programmierung in C 
angeht. Wie ich die Interpolation und Schwerpunktberechnung auf dem 
Papier mache ist mir klar, nur krieg ich das nicht in Code gegossen :\

@ Markus (Gast): Es wäre mir eine große Hilfe, wenn du vielleicht ein 
kleines Codebeispiel o.Ä. hättest.

Gruß

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.