Forum: Mikrocontroller und Digitale Elektronik Interpolation Touchscreen


von Markus (Gast)


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

von Markus (Gast)


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.

von Lehrmann M. (ubimbo)


Lesenswert?

Dürften wir dich um den Quellcode bitten ?

von Rolf Magnus (Gast)


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.

von Karl H. (kbuchegg)


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.

von Markus (Gast)


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.

von hm (Gast)


Lesenswert?

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

von Markus (Gast)


Lesenswert?

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

von Markus (Gast)


Lesenswert?

Huch, ich hab mich verlesen...

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

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

von hm (Gast)


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.

von hm (Gast)


Lesenswert?

Würd doch dann gehen?

von Karl H. (kbuchegg)


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
1
 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.

von hm (Gast)


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.

von Karl H. (kbuchegg)


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?

von hm (Gast)


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.

von Sebastian .. (zahlenfreak)


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

von Markus (Gast)


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.

von Markus (Gast)


Lesenswert?

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

von Markus (Gast)


Lesenswert?

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

von Sebastian .. (zahlenfreak)


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.

von hm (Gast)


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.

von Unterlehrer (Gast)


Lesenswert?

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

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

von Markus (Gast)


Lesenswert?

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

von Arne H. (piowux)


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

von u-jean (Gast)


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ß

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.