Hallo zusammen, ich habe mir einen Taster mit der QTouch Library von Atmel aufgebaut. Das funktioniert erst einmal auch soweit. Ich habe jetzt nur ein Phänomen bemerkt, welches ich mir nicht erklären kann. Die Sensorfläche/der Schalter funktioniert erst einmal einwandfrei. Wenn ich nun für einige Sekunden in schneller Abfolge auf die Sensorfläche tippe, wird das System immer sensitiver, d.h. nach einiger Zeit (einige Sekunden) pausenlosen, schnellen Tippens auf die Sensorfläche, reicht es dann schon aus, wenn man den Finger über die Sensorfläche bringt, damit der Sensor eine Betätigung erkennt. Wenn man dann mit dem Tippen aufhört, ein paar Sekunden wartet und ein, zwei mal auf die Sensorfläche tippt, "normalisiert" sich die Sensitivität wieder und es wird ein Fingerdruck wie gewünscht erkannt. Hat jemand Erfahrungen mit der Library und hat eventuell eine Idee, warum das System sensitiver wird, wenn man eine Zeit lang schnell auf die Sensorfläche tippt? Freue mich über Anregungen. Grüße
Du mußt die Drift compensation etwas verlängern. Ist sie zu kurz eingestellt, dann geht das Referenzsignal Richtung der "neuen" Kapazität. Das ist dafür gut wenn sich z.b. im Laufe der Zeit die Sensorfläche verdreckt (Kapazität ändert sich) und wenn der Drift compensation z.b. auf 10Sekunden eingestellt ist, dann wird jede 10Sekunden geprüft wie das neue Signal aussieht und dann geht die Referenz immer in 1Count Schritten entweder mit hoch oder runter. Hast Du die Drift compensation auf viel kürzeren Abstand eingestellt, z.b. jede Sekunde, dann ist "im Schnitt" der Pegel viel höher und die Referenz geht dann solange du permanent drauf klopfst mit. Wenn Du dann loslässt, geht ja das Signal runter und das Referenzsignal folgt dem neuen Signal und dann ist wieder alles gut.
Hallo, vielen Dank für die schnelle Antwort! Wenn ich das richtig verstanden habe, wäre das der Wert "neg_drift_rate" und "pos_drift_rate"!? Ich werde dann mal ein wenig damit rumspielen. Das würde doch aber heißen, wenn ich den Wert z.B. auf 10s einstelle und dann 20s oder so schnell tippe, würde ich dann auch wieder das entsprechende Phänomen erhalten? Sollte man diesen Wert dann also möglichst hoch einstellen!? Vielen Dank! Grüße
ja so kann mans betrachten, je schneller gedriftet werden soll desto öfter passt sich der Algorithmus an die Umgebung an. Du wirst ein wenig ausprobieren müssen welche Einstellungen für die Applikation Sinn machen GGf. kannst Du auch versuchen die Abtastrate zu ändern, z.b. alle 250ms sampeln damit kriegt der Algorithmus nicht so häufig die Änderungen mit, das geht aber zu Lasten der Response Zeit. Alternativ kannst Du auch den Parameter Detect Integration erhöhen, dann wird x-mal gesampelt und erst wenn alle Samples über dem Detect Threshold liegen, dann wird der Wert als Touch reported. Mußt mal ein wenig ausprobieren, Touch ist Rocket Science :) Am besten wenn Du das QDebug Interface nutzt und mit Hilfe von Atmel Studio / QTouch Analyser kannst Du Dir dann anschauen wie sich der Verlauf des Signals und des REferenzsignals ändert. Dann siehst Du genau wie das Verhalten ist. Du kannst Dir ggf. auch ein günstiges SAMD20 Xplain Pro kit zum Experimentieren nehmen dort ist der EDBG Chip verbaut der auch als Gateway zum QTouch Analyser dient. Um das Prinzip zu verstehen und mal alle Parameter zu testen hilft das auch schon weil Du dann direkt im Analyser siehst was vor sich geht.
Hallo, vielen Dank! Ich werde mal ein wenig mit den Werten rumexperimentieren und mal schauen, was sich für Änderungen ergeben. Das mit dem QDebug Interface und dem Analyser werde ich mir einmal anschauen. Wenn ich etwas weiter gekommen bin, werde ich hier nochmal berichten. Hilft dann vielleicht auch anderen weiter. Besten Dank!! Grüße
Frank schrieb: > Das würde doch aber heißen, wenn ich den Wert z.B. auf 10s einstelle und > dann 20s oder so schnell tippe, würde ich dann auch wieder das > entsprechende Phänomen erhalten? Stell den Wert einfach so ein, dass der Schwellwert nicht nennenswert wegdriftet, bevor dein Finger lahm ist ;-)
Hat eigentlich schonmal jemand probiert, die Touch-Fläche eines "self-capacitance Buttons" möglichst groß zu machen? Funktioniert das Prinzip dann auch noch oder ist es gar nicht mehr zu gebrauchen wegen zu schlechter Sensitivität bzw. wo in etwa liegt die Grenze?
@Kurt klar geht das, je größer desto mehr Sensitivität = Proximity. Mit ca. 5x5cm Fläche hatte ich ungefähr 10cm Proximity Wenn man einfach nur einen großen Button haben will und keine Proximity, muß dann der Detect Threshold einfach groß genug gewählt werden so dass man immer noch die Elektrode berühren muß bevor ein Touch entsteht. Man muß sich das so vorstellen. Man hat einen Sampling Kondensator im nF Bereich, die Elektrode ist beinahe egal wie groß man sie macht im pF Bereich. Beim Charge Transfer wird ja nun die Ladung von der Elektrode in den Cs transferiert und gezählt bis Cs ansetzt. Vergrößerst Du die Elektrode dann werden halt weniger Ladungen fällig. Ob so eine Fläche auch riesig werden kann hab ich auch nicht probiert
Für nur einen simplen Touchbutton brauchts keine library, da reichen 10 Zeilen code:
1 | uint8_t touch_measure_CC() { |
2 | uint8_t count_iterations = 0; |
3 | |
4 | // discharge everything before we begin
|
5 | SET_LOW(TOUCH); |
6 | SET_LOW(SAMPL); |
7 | SET_AS_OUTPUT(TOUCH); |
8 | SET_AS_OUTPUT(SAMPL); |
9 | |
10 | // Now run our charge pump until C_Sample
|
11 | // is charged high enough so its voltage is
|
12 | // read as logical 1 on the port pin.
|
13 | do { |
14 | // Disconnect negative side of C_Sample
|
15 | SET_AS_INPUT(SAMPL); |
16 | |
17 | // Load touch electrode by connecting to Vcc.
|
18 | // It is important to set the PORT bit first
|
19 | // so it will not pull the pin low for one clock
|
20 | // cycle because that would provoke a negative spike
|
21 | // on the negative side of C_Sample and immediately
|
22 | // discharge C_Sample again via the body diode.
|
23 | SET_HIGH(TOUCH); |
24 | SET_AS_OUTPUT(TOUCH); |
25 | |
26 | // Disconnect touch electrode from Vcc
|
27 | SET_AS_INPUT(TOUCH); |
28 | SET_LOW(TOUCH); |
29 | |
30 | // Transfer charge from touch electrode to C_Sample by
|
31 | // connecting negative side of C_Sample to ground.
|
32 | SET_AS_OUTPUT(SAMPL); |
33 | |
34 | // allow one clock cycle before we read the TOUCH pin,
|
35 | // so this is the best place to put the counter increment.
|
36 | ++count_iterations; |
37 | |
38 | // if charge in C_Sample is enough we will read 1.
|
39 | } while (!IS_HIGH(TOUCH)); |
40 | |
41 | return count_iterations; |
42 | }
|
Schaltung (TOUCH und SAMPL sind normale port pins):
1 | _____
|
2 | |
|
3 | |___________.______________O Cx (Touch electrode) |
4 | |TOUCH | |
5 | | | |
6 | | ===== Cs (2n...10n) |
7 | AVR | | |
8 | |___________| |
9 | |SAMPL |
10 | |
|
11 | |
|
12 | |
|
13 | _____| |
:
Bearbeitet durch User
@Bernd: Ist die Variante besser als die ADC-Variante? Wie siehts bei der aus mit 2-3mm Kunststoff dazwischen?
Hallo, also mit dem selben Algorithmus wie bei Bernd hab ich Tasten in einen Bilderrahmen eingebaut. 3mm Pressspan + 2mm Glas, als Elektrode eine 2032, sind kein Problem. Noch 2mm PVC drauf geht immer noch. Sascha
Mathias O. schrieb: > @Bernd: Ist die Variante besser als die ADC-Variante? Wie siehts bei der > aus mit 2-3mm Kunststoff dazwischen? Die ADC-Variante hab ich noch nicht ausprobiert aber ich denke mal die dürften beide ähnlich empfindlich sein. ADC verwendet ebenfalls Ladungstransfer, aber nur einen einzugen Zyklus und verwendet den internen Sample-Kondensator des ADC (der zum Glück in der selben Größenordnung liegt wie ein Finger auf dem Touch-Pad). Nur ein einziger Pumpvorgang und anschließende genaue Spannungsmessung geht dann natürlich schneller als Pumpen bis zum Triggerpunkt, sollte aber grundsätzlich in etwa die selben Eigenschaften haben. * Übrigens: eine hab ich noch: Die verwendet nur einen einzigen Port-Pin (keinen ADC!) und mißt die Kapazität direkt indem sie ein RC-Glied bildet und die Ladezeit misst wobei R der interne Pullup ist und Cx die Kapazität gegen Masse, allerdings ist die nicht so empfindlich und im Gegensatz zu den anderen Varianten mit Ladungstransfer ist sie wahrscheinlich auch störanfälliger, also wenn möglich würd ich lieber die Ladungspumpe nehmen anstatt die Ladezeit von Cx direkt zu messen:
1 | uint8_t touch_measure_RC() { |
2 | uint8_t cnt = 0; |
3 | |
4 | // discharge the electrode
|
5 | SET_LOW(TOUCH); |
6 | SET_AS_OUTPUT(TOUCH); |
7 | SET_AS_INPUT(TOUCH); |
8 | |
9 | // now we apply short pulses of current via
|
10 | // the internal pull-up until the electrode is
|
11 | // charged enough and the port pin reads high.
|
12 | // For best results the µC should run at the
|
13 | // highest possible clock frequency to make
|
14 | // the pulses as short as possible so we
|
15 | // need more pulses and increase resolution
|
16 | // and sensitivity.
|
17 | while (!IS_HIGH(TOUCH)) { |
18 | SET_HIGH(TOUCH); // pulse as short as possible |
19 | SET_LOW(TOUCH); |
20 | ++cnt; |
21 | }
|
22 | return cnt; |
23 | }
|
Schaltung (TOUCH ist ein normaler Portpin):
1 | _______
|
2 | |
|
3 | |
|
4 | |______________________O Cx (Touch electrode) |
5 | |TOUCH |
6 | |
|
7 | AVR | |
8 | _______| |
:
Bearbeitet durch User
Hallo, ich bins nochmal. Ich habe jetzt mal ein wenig mit der neg_drift_rate rumgespielt. Ich habe den Wert mal auf Maximum eingestellt. Es ist schon merklich besser geworden. Die Sensitivität steigt noch an, aber wesentlich langsamer habe ich das Gefühl. Ich werde jetzt noch ein wenig mit dem Parameter und dem Parameter Detect Integration herumspielen. Da werde ich noch ein wenig was zu tun haben. :-) Ich habe dann aber noch eine Frage zu einer weiteren Überlegung. Ich würde den Taster später gerne in ein Metallgehäuse integrieren. Der Taster soll draußen zum Einsatz kommen. Ich dachte mir, ich nehme ein kleines Rohr, verschließe dieses an dem einen Ende mit einer Kunststoffscheibe, lege darunter die Sensorfläche und bringe darunter die restliche Schaltung unter und verschließe das andere Ende mit Kleber oder so und lasse nur die Kabel rausschauen. In einem Luftversuch funktioniert das schon mit dem Sensor unter der Plastikscheibe. Ich habe aber Bedenken bei dem gedachten Metallgehäuse. Das dürfte doch die ganze Kapazität durcheinander bringen? Grüße
Im Atmel Touch Sensor Design Guide steht etwas drüber (suche nach floating conductive items). wenn ich das richtig deute sollte das Gehäuse somit geerdet werden. Ich glaub das ist schon machbar, immerhin funktioniert das in Systemen wie settop boxen, Waschmaschienen ja auch...
Hallo, alles klar, vielen Dank. Ich habe den Abschnitt schon gefunden. Ich werde es mal testen, wenn ich mal probeweise was verbauen kann! Vielen Dank! Grüße
Frank schrieb: > Ich habe > aber Bedenken bei dem gedachten Metallgehäuse. Das dürfte doch die ganze > Kapazität durcheinander bringen? Stichworte zum Googlen: "driven shielding", "driven guarding", "aktive Schirmung". Du brauchst nen OP dazu. So ungefähr:
1 | _______________ |
2 | | | |
3 | | |\ | |
4 | |____| \ | |
5 | |- \ | |
6 | | \______| |
7 | | / | |
8 | ____|+ / | |
9 | | | / | |
10 | | |/ |shield |
11 | | ____|___________________ |
12 | _______|_______________________________________O touch |
Aber probiers erst mal ohne wenns so auch geht, in dem Falle legst Du das Gehäuse einfach auf Ground (jedoch nicht floaten lassen!). Erst wenn Du mehrere Meter bis zur touch-Fläche mit Koax-Kabel überbrücken musst wird ein getriebener Schirm wirklich notwendig werden.
:
Bearbeitet durch User
Hallo zusammen, ich bin ein wenig weiter gekommen. Mein Taster läuft jetz soweit recht gut. Ich habe nun mal erste Versuche gemacht, das Ding in ein Gehäuse einzubauen, ein Metallgehäuse. Wie zu erwarten, gibt es da neue Probleme. Wenn ich wieder schalte, bis mir der Finger bald abfällt, wird der Schalter wieder sensitiver, was jetzt nicht mehr so das Problem ist, aber ab einem gewissen Zeitpunkt, bleibt er immer geschaltet, egal ob ich den Finger weg nehme oder auf die Sensorfläche taste. Er bleibt also im getouchten Zustand hängen. Ich gehe mal davon aus, dass mir das Gehäuse da ein wenig ins Handwerk pfuscht!? Dann habe ich nochmal eine Frage zur Drift Kompensation. Wenn ich das richtig verstanden habe, führt diese Funktion den Referenzlevel nach? Ich habe mal eine Zeichnung aus der AppNote "QTouch und QMatrix Sensitivity Tuning" eingefügt. D.h. das Delta zwichen Referenz und Level zum Detektieren wird immer kleiner!? Hab ich das so richtig verstanden? Grüße
nein das soll eben nicht kleiner werden. Das Ziel von der Drift Compensation ist dass das Delta immer gleich bleibt sonst passiert es ja genau so wie du beschreibst dass der Delta Bereich immer kleiner wird (ohne Compensation) und irgendwann reicht der Delta Wert nicht mehr aus um Touch/No Touch zu erkennen. Hast Du denn auch den Drift Hold time gesetzt?
@Bernd: Kann ich eigentlich einen gemeinsamen SAMPL nehmen für 6 Tasten oder braucht jeder einen eigenen. Den Abfrageablauf mach ich auch immer nur bei einem. Erst wenn der zu Ende ist, kommt die nächste Taste ran (for-Schleife).
Mathias O. schrieb: > @Bernd: Kann ich eigentlich einen gemeinsamen SAMPL nehmen für 6 Tasten > oder braucht jeder einen eigenen. Das ist leider nicht so einfach. Würdest Du die Sample-Kondensatoren einfach alle an einem Ende zusammenschalten dann wären alle Touch-Elektroden kapazitiv miteinander verbunden (es reagiert nämlich auch wenn Du den Finger auf SAMPL legst, dann wird Cs geladen wenn der TOUCH-Pin auf high geht). Du müsstest einem Weg finden mit zusätzlicher externer Beschaltung die unbenutzten Elektroden komplett wegzuschalten. Zum Beispiel mit Analogschaltern oder Analogmultiplexern wie dem hier: http://www.nxp.com/documents/data_sheet/74HC_HCT4051.pdf dann bräuchtest Du nur einen einzigen Samplekondensator und würdest einfach die Touchflächen umschalten.
Ich hab nochmal geschaut, es sind 7 Tasten. 6 gleich große und eine die so groß ist wie alle 6 kleine hintereinander. Sollte man dann einen anderen Samplekondensator für die große nehmen oder muss man das nicht der Größe der Touchfläche angleichen?
@Peter Hallo, ok, das Delta soll gleich bleiben, wenn sich also der Signal-Level nach und nach ändert, wird die Referenz nachgeführt, damit das Delta etwa gleich bleibt, damit noch zwischen getoucht und nicht getoucht unterschieden werden kann, da sonst das Delta zu klein würde und nicht mehr zwischen betätigt und nicht betätigt unterschieden werden könnte. !? Irgendwie fällt der Groschen nur langsam ;-) Die Drift Hold time habe ich gesetzt. Die steht auf 10, also 2 Sekunden. Grüße
Mathias O. schrieb: > Sollte man dann einen > anderen Samplekondensator für die große nehmen oder muss man das nicht > der Größe der Touchfläche angleichen? Nimm einen mit dem auch die kleinste Taste noch funktioniert und ausreichend Auflösung und Empfindlichkeit bringt, dann kalibrier alle Tasten softwaremäßig individuell. Zum Beispiel beim Einschalten machst Du 64 Messungen mit jeder Taste (unter der Annahme daß die nicht gedrückt sind) und dann hat jede Taste ihren eigenen Nullwert (und vielleicht musst Du auch andere Schaltschwellen für die grosse Taste empirisch ermitteln). Der Wert wird ja kleiner beim Annähern des Fingers, im obigen Beispiel hab ich einen uint8_t genommen, also sollte Cs so bemessen sein daß der Wert bei nicht gedrücktem Taster irgendwo bei 200 zu liegen kommt, so hast Du einigermaßen gute Auflösung und Empfindlichkeit. Natürlich kannst Du auch einen uint16_t nehmen und einen viel größeren Cs, dann kannst Du die Empfindlichkeit noch stark in die Höhe treiben aber dann dauert die Messung entsprechend (viel) länger. Noch ein Tip: Nimm keinen billigen Keramikkondensator für Cs (die Temperaturdrift ist extrem, damit kannst Du ein Thermometer bauen), nimm einen der explizit als NP0 (oder C0G) spezifiziert ist (oder notfalls einen Folienkondensator aus der Bastelkiste, die sind zumindest nicht ganz so temperaturanfällig). Das Problem des ursprünglichen Fragestellers im Thread mit der anscheinend fehlerhaften/halbherzig implementiuerten QTouch library (deshalb riet ich ja bereits zu Beginn die einzig benötigten 10 Zeilen Code lieber selbst hinzuschreiben und die 990 Fehlerhaften die sonst noch da drin stecken und nur der Featuritis geschuldet sind ganz wegzulassen), dass beim automatischen langsamen Nachkalibrieren der Wert wegläuft (noch dazu in die falsche Richtung) vermeidest Du indem Du: * den Nullwert für jede Taste nur extrem langsam nachführst (wenn überhaupt!) wenn er kleiner wird * den Nullwert schnell nachführst wenn er größer wird (weniger Finger auf der Taste als null Finger geht nicht, die Taste muss im Einschaltmoment bereits gedrückt gewesen sein und jetzt wurde sie losgelassen) * den Wert nur nachführst wenn die Taste nicht als gedrückt erkannt worden ist * einen NP0 Kondensator für Cs verwendest
:
Bearbeitet durch User
Danke für die Tipps. Bei meinem Testkupferplättchen hab ich um die 106 und gedrückt 90-100. Nur was meinst du genau mit nachführen. Wie muss das aussehen? Die Schaltschwelle nachführen oder was?
@Bernd: Deine Lösung in aller Ehren und für private Zwecke vielleicht ok aber ich würde von der Verwendung dieser Algorithmen in kommerziellen Projekten abraten ohne sich mit Hilfe eines Patentanwalts abzusichern. Nur meine Meinung dazu. Du kannst gerne einen eigenen Thread aufmachen wenn Du Deine Lösung vorstellen willst dann stört es nicht den Lesefluss Frank, 2Sekunden können zu wenig sein, erhöhe das mal. Zur Not kannst Du auch mal Atmels hotline befragen, die haben mir sogar beim PCB Review geholfen.
Peter schrieb: > ohne sich mit Hilfe eines Patentanwalts abzusichern. Welches Patent?
:
Bearbeitet durch User
Dazu fällt mir nur das ein: "GIF-Grafiken verwenden zur Kompression den patentierten Lempel-Ziv-Welch Algorithmus (LZW), um die Datenmengen zu verkleinern. Das letzte nationale LZW-Patent des Unternehmens Unisys ist am 7. Juli 2004 in Kanada ausgelaufen, jedoch hielt auch IBM bis zum 11. August 2006 ein Patent für die gleiche Technologie." Quelle: Wikipedia.org Also einfach abwarten bis es ausläuft ;)
Peter schrieb: > 2Sekunden können zu wenig sein, erhöhe das mal. Ich habe das jetzt mal auf 4Sekunden erhöt, das brachte leider bisher noch keine Besserung. Ich werde da mal noch ein wenig mit rumspielen oder schaue wirklich mal, dass ich mich mal mit dem Support von ATMEL in Verbindung setze. Grüße
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.