www.mikrocontroller.net

Forum: Codesammlung Einfache Sensortaste

Autor: peter dannegger (Gast)
Datum: 12.09.2004 20:14
Dateianhang: sensor.zip (1,5 KB, 1445 Downloads)

Im Forum wurde schonmal heiß über Sensortasten diskutiert, teilweise mit
erheblichem Hardwareaufwand (555 + noch nen Haufen Zeugs).

Anbei mal eine einfache Softwarelösung.

Die Sensorfläche wird einfach über einen 1nF Kondensator direkt an den
Capture-Pin (PB0) gelegt und fertig.
Der Kondensator soll nur 50Hz Netzbrummen fernhalten.

Das Beispiel läuft mit einem ATMega8 bei 11MHz auf dem STK500.
Über die UART (1200 Baud) wird immer der Meßwert ausgegeben.
Bei mir ergab sich 20 (offen) und 35 (berührt), bei 25 geht die LED
an.
Bei anderen Quarzen muß man das entsprechend anpassen


Das Prinzip ist ganz einfach.
Der Timer T1 läuft durch, läßt sich also nebenbei für andere Sachen
benutzen.
Im Überlaufinterrupt wird der Pin abwechselnd entladen und beim
nächsten mal über den internen Pullup aufgeladen.
Durch die zusätzliche Körperkapazität ergibt sich bei Berührung eine
höhere Aufladezeit.
Im Cature-Register steht dann die Aufladezeit.
Damit auch noch andere Interrupts möglich sind, wird die Startzeit der
Aufladung gemerkt und vom Ergebnis abgezogen.

Will man eine größere Auflöung haben, schaltet man einfach statt des
internen Pullups einen größeren Widerstand gegen VCC (z.B. 220kOhm).
Die Zeile zum Einschalten des Pullups muß dann natürlich raus.


Peter
Autor: peter dannegger (Gast)
Datum: 12.09.2004 21:27
Dateianhang: SENSORP.ZIP (1,4 KB, 726 Downloads)

Wenn man den Capture bereits anderweitig benutzt, geht das ganze
natürlich auch im Polling. Dabei ist dann die Auflösung geringer.

Für den professionellen Einsatz sollte man besser einen externen
Widerstand nehmen, da ja der interne Pullup sehr große Toleranzen hat.

Oder man nimmt eine variable Schwelle oder detektiert, ob sich der Wert
schnell nach oben (=gedrückt) oder nach unten (=losgelassen) ändert.


Peter
Autor: Michael (Gast)
Datum: 13.09.2004 09:28

Hallo Peter,
meinst du, daß man dem Capture-Pin auch ein HC4051 vorschalten kann, um
die Taster-Anzahl zu vergrößern?. Ich meine reineweg von der Hardware.
Weiterhin, hast du überhaupt keine Schutzmaßnahmen gegen Überspannung
getroffen?.
Michael
Autor: Peter Dannegger (Gast)
Datum: 13.09.2004 10:51

@Michael,

für mehrere Tasten würde ich die Polling Methode nehmen.


Als Schutz könnte man noch einen 100 Ohm in Reihe legen und vom Sensor
je eine 1N4148 gegen VCC und GND legen.

Supressordioden sind nicht geeignet, da die eine sehr hohe Kapazität
haben.


Peter
Autor: churchi (Gast)
Datum: 19.05.2005 16:01

Hi

sry das ich den Thread nochmal rauskram, aber ich hab mir den Code ein
wenig auf meine Bedürfnisse adaptiert und er funktioniert super!
Nun hab ich da eine Frage: Ist die Strippe vom Pin zur Sensorfläche
nicht eine schöne sendende Antenne?
Ich hab mir nämlich gedacht das als Lichtschalter zu nehmen und
natürlich möchte ich die Schaltung nicht mehrmals aufbaun sondern
längere Kabeln zu den Schaltern nehmen --> EMV?, irgendwelche
Strahlungen?
Wie siehts da so aus?
Autor: Hauke Radtki (Gast)
Datum: 19.05.2005 21:18

na dann nimm doch einfach nen geschirmtes kabel!
aber wie oft wird denn der pin umgeschaltet? ich glaub nicht, dass das
sooo oft passiert, dass sich daraus große störungen ergeben! das
einzige problem bei langen leitungen wäre höchstens, dass deine werte
verfälscht werden!
Autor: Danilo Reinhardt (Gast)
Datum: 25.09.2005 17:46

Hmm, das ganze kling sehr interessant. Ich habe es mal mit nem mega32
probiert und hab ein etwas komisches Verhalten.

Wenn ich den im code genutzen "Capture-Pin" PB0 berühre, passiert
garnix. Wenn ich dagegen PD6 berühre funktioniert es. Dieser ist der
"Input Capture von T1" beim Mega32.

Ich schätze jetzt mal das ist nur ein Seiten Effekt. Hat jemand eine
Idee woran es liegen könnte? (und sagt mir das :) )
Autor: peter dannegger (Gast)
Datum: 25.09.2005 18:57

@Danilo

"Ich schätze jetzt mal das ist nur ein Seiten Effekt."


Ne, das scheint AVR-typisch zu sein.

Warscheinlich muß sich jeder Entwickler irgendwie verewigen und die
Pins und IO-Register durcheinanderbringen. Ein System ist bisher nicht
erkennbar.

Und so mußt Du eben jeden Code anpassen, wenn Du einen anderes
AVR-Derivat benutzen willst.

Wenn also bei Deinem AVR der Caputere PD6 ist, dann mußt Du eben den
nehmen.


Ich ärgere mich auch ständig darüber.
Am schlimmsten ist der Übergang vom ATMega8 auf den ATMega168, da ist
fast nichts mehr da, wo es hingehört.


Peter
Autor: Danilo Reinhardt (Gast)
Datum: 25.09.2005 19:00

Ich hab das schon richtig verstanden. Einfach den Pin PB0 berühren.
Sonst keinerlei Beschaltung?
Autor: Danilo Reinhardt (Gast)
Datum: 25.09.2005 20:30

OK. Problem gelöst. Asche auf mein Haupt... da hätte ich selbst drauf
kommen müssen. Hab wohl das Prinzip verpeilt :)
Autor: Bartholomäus Steinmayr (sam_vdp)
Datum: 10.10.2005 17:58

Tut mir leid, dass ich den Thread nochmal rauskrame, aber ich finde die
Idee von Peter genial, aber bekomme sie nicht zum laufen.
Ich habe die zweite Variante nachgebaut (auf einem ATMega8 mit 8 Mhz)
und sie funktioniert soweit auch, allerdings wird die Änderung nur
erkannt, wenn ich direkt das Metall berühre. Kann ich die Schaltung
irgendwie empfindlicher machen ohne auf die erste Variante
zurückzugreifen? Und gibt es etwas, worauf man beim Aufbau speziell
achten muss (Form der Kapazität z.B.)?

Vielen Dank und beste Grüße,
Bartl
Autor: dirk (Gast)
Datum: 08.11.2005 09:11

Gibt es eine Möglichkeit, mit dem Verfahren eine Tastertur aufzubauen?
Hat es einer geschafft und wie sind die ergebnisse?
Autor: Peter Dannegger (Gast)
Datum: 08.11.2005 15:25

@Dirk,

kann man machen, pro Taste je einen Portpin.


Allerdings ist die Haptik beschissen. Man hat keinerlei Druckpunkt und
muß den Finger immer wieder abheben. Die Auslösung erfolgt ja nicht
durch Kraft, sondern durch Abstand.

Ich würde es als Zumutung ansehen, damit Texte schreiben zu müssen. Da
sollte es doch schon was wesentlich ergomonischeres sein.

Touchscreens werden ja auch nur zur Auswahl in Menüs verwendet
(Fahrkartenautomat).


Peter
Autor: dirk (Gast)
Datum: 08.11.2005 16:09

Klaro, soll etwar dafür sein nur für Paar tasten und Display.

Wie machen die es eigentlich bei einen Touchpanel?
Autor: hans dieter (Gast)
Datum: 08.11.2005 16:13

könnte man da nicht einen analog multiplexer nehmen und daran einen
operations-verstärker anschließen?
Über den verstärkungs-faktor könnte man dann auch eine art druckpunkt
einstellen.
Wenn man einen Rail-To Rail nimmt oder einen Komparator nachschaltet,
dann hat man auch feine Logik-Pegel.
Autor: Peter Dannegger (Gast)
Datum: 08.11.2005 17:37

@Hans,

das Erkennungsprinzip ist hier die Kapazitätsmessung über die
Aufladezeit.


Ein Multiplexer würde durch seine zusätzliche Kapazität nur die
Empfindlichkeit senken.

Und ein Opamp hat hier nichts verloren.


Peter
Autor: Florian Bantner (scheintod)
Datum: 21.01.2006 04:59

Muss den Thread jetzt auch noch einmal raukramen... Bin neulich drüber
gestolpert und das Verfahren schien mir die Lösung auf eine Frage die
mich schon lange beschäftigt: Wie baue ich mir einfachst einen
Touchscreen.

Meine Anforderungen sind dann auch relativ bescheiden. Mir genügt es,
wenn ich eine 19x19 Matix sicher erfassen kann.

Erste Versuche mit can128 (war grade zur Hand bzw. im stk) brachten
Ergebnismäßig aber rein garnix. (Das Polling lief gerade mal bis zum
ersten Wert.) Fast schon frustriert wieder aufgegeben, dann aber noch
versuchsweise mit 2 Pins und einem 1M Widerstand probiert. Das Ergebnis
ist gigantisch. Die 2cm abstand sind kein Gerücht.

Ab ca. 2cm Abstand fangen die Werte bei mir an zu "zittern". Ich
weiss noch nicht genau, ob genügend für eine programmatische
Detektierung reicht, aber bei Gelegenheit werde ich es mal probieren.

Das Faszinierende an dem Verfahren ist auch, dass sich die Genauigkeit
nahezu beliebig steigern lässt. Je größser der Widerstand gewählt wird,
desto länger dauert das Aufladen des "Kondensators" und (mit dem
entsprechenden Zeitaufwand natürlich) desto genauer lassen sich
Annäherungen detektieren.

Schoene Gruesse,

Scheintod
Autor: peter dannegger (Gast)
Datum: 21.01.2006 16:42

@Florian,

ich schrieb ja oben schon:

"Will man eine größere Auflöung haben, schaltet man einfach statt des
internen Pullups einen größeren Widerstand gegen VCC (z.B. 220kOhm)."

"Für den professionellen Einsatz sollte man besser einen externen
Widerstand nehmen, da ja der interne Pullup sehr große Toleranzen
hat."


Es kann durchaus sein, daß bei manchen Typen der interne Pullup so
klein ist, daß kaum ne Änderung erfolgt. Ist eben wirklich nur ne
Edelbastlerlösung für den absoluten Minimalisten.


Peter
Autor: Ludwig Wagner (lordludwig)
Datum: 21.01.2006 21:24

nur zur vertändniss: hier wird ein kondensator zuerst entladen und dann
über einen großen widerstand aufgeladen. Dann wird der pin z.b. jeden
Takt gelesen und sobald er auf 1 ist wird die zeitmessung gestoppt.

Richtig so??? Will das ganze in asm schreiben. wieso der capture pin???
kann es nicht irgendein pin sein???

Ich muss nix anderes währed der erkennung tun also werde ich alle pins
nacheinander aufladen und vergleichen falls das so passt

Will 10 Pads für einen Jingleplayer abfragen. Das ding tut schon gut
aber solche Berührungssensoren währen echt der Hammer!!!
Autor: Ludwig Wagner (lordludwig)
Datum: 21.01.2006 21:44

achja und wie groß sollte die kläche max. sein?
Autor: Bernhard Reitinger (Gast)
Datum: 09.03.2006 10:33

Danke für die schnellen Antworten...

Werde das mal austesten..

Benrnhard
Autor: Bartholomäus Steinmayr (sam_vdp)
Datum: 09.03.2006 15:01

@Florian:
Klingt sehr interessant. Wie hast du das vom Aufbau her gelöst?
Erkennen die "Tasten" noch etwas, wenn sie hinter einem Display sind?
Autor: Mathias (Gast)
Datum: 09.08.2006 14:01

Hallo Peter! Ziehmlich interessantes Prinzip. Ist denn das ganze auch
mit einem 8051 zu realisieren? (LPC900 genaugenommen)
Autor: Peter Dannegger (peda)
Datum: 09.08.2006 20:26

Mit nem 8051 gehts natürlich auch, aber nur bei den Portpins, die keinen
strong Pullup beim 0->1 Wechsel haben (z.B. P0).

Bei den LPC9xx kann man das wohl für jeden Pin auswählen.


Peter
Autor: Eugen Dischke (Gast)
Datum: 16.08.2006 21:09

Es geht auch wunderbar mit der Methode von qprox
( sorry  werbung ) aber es ist die einzige Implementation dieser Art
die ich gesehen habe.
im Grunde genommen bedient man sich der SC- (Switched Capacitor)
technik in dem man erst eine Fläche aufläd und die Ladung dann auf
einen Kondensator leitet in dem man ihn geerdet an die Fläche
anschließt.
wiederholt man diesen Vorgang verhält sich die Kapazität  der Fläche
wie ein Wiederstand (SC) der den Speicherkondensator langsam aufläd.
Nach einer festen Anzahl von durchläufen misst man nur noch die
Spannung am  Kondensator und bekommt einen Wert der proportional zur
Kapazität der Fläche steht.
der Vorteil der Methode ist dass man durch Variation der Anzahl der
Durchläufe die gemessene Spannung Modulieren kann und  mit hilfe der
spreitzspektrummethode  lassen sich Rauschen und Störspannungen
unterdrücken (MLS Methode).
Hat man 2 solcher Ladungspumpen kann man sie an die Enden einer langen
resistiven Fläche legen. damit kann man die Position eines Fingers auf
der Fläche rausfinden. weil dadurch die beiden Kondensatoren sich
verschieden stark aufladen und die Differenzspannung dann etwa der
Position des Fingers entspricht

die Modulation mit der MSL und die resistive Fläche habe ich noch nicht
ausprobiert aber eine Sensortaste hab ich damit schon realisiert  . der
Code ist zwar noch nicht bereit präsentiert zu werden kommt aber noch
Autor: Gerd L. (gerd)
Datum: 26.10.2006 15:06

Hallo Eugen,

ich interessiere mich für die qprox-Methode. Bist Du mit Deinen
Experimenten schon weiter gekommen?

Gruß
Gerd
Autor: Eugen Dischke (Gast)
Datum: 08.11.2006 09:36

ja ich habe schon ein prototyp-slider getestet,
allerdings konnte ich die fertigstellung nicht abwarten und habe ein
"schmutziges layout" gemacht. das problem war dann dass ich ein sehr
verrauschtes positionssignal hatte und min 64 mal mitteln musste um ein
halbwegs stabiles signal zu haben. ich denke in etwa einem monat werd
ich hier mein (bisdahin hoffentlich sauberen ) C-code und die eaglefiles
Posten
MfG
Eugen
Autor: Gerd L. (gerd)
Datum: 08.11.2006 10:03

Hallo Eugen,

da bin ich sehr gespannt darauf.

Gruß
Gerd
Autor: Hagen Re (hagen)
Datum: 08.11.2006 13:10
Dateianhang: sensor.jpg (344,3 KB, 1652 Downloads)
preview image for sensor.jpg

"Es geht auch wunderbar mit der Methode von qprox
( sorry  werbung ) aber es ist die einzige Implementation dieser Art
die ich gesehen habe.
"

Habe ich auch schon aufgebaut mit 5 kapazitiven Sensoren. Die Schaltung
ist sehr einfach:

an einem 74HC4051 = 8'fach analog MUX sind bis zu 8 Sensorflächen, jede
ca. 20*30 mm groß angeschlossen. Am Z Ausgang des MUX liegt ein DG419DY
= analog Switch. An den beiden Ausgängen dieses Switches liegen einmal
VCC und der ADC des AVRs und gegen Masse ein ca. 22nF bis 470nF
Kondensator.

Der AVR schaltet nun reihum den MUX an die 8 Sensorflächen. Pro
Meßzyklus und Sensorfläche entlädt der AVR erstmal den Kondensator über
den ADC Pin als Ausgang auf Masse. Dann schaltet der AVR den DG419DY mit
zb. 500KHz eine bestimmte Anzahl an Takten. Der DG419 legt also
abwechselnd VCC an den MUX und somit an die selektierte Sensorfläche an.
Damit lädt er diese Fläche auf. Danach legt er die Sensorfläche auf den
Kondensator der am ADC liegt und entlädt die Sensorfläche additiv in den
größeren Kondensator. Je nach Kapazität dieses Kondensators müssen mehr
oder weniger Umschaltzyklen des DG419 durchgeführt werden. Damit lässt
sich die Empfindlichkeit der Sensoren einstellen, und natürlich muß das
einmal kalibriert werden. Der Kondensator arbeitet quasi als switched
Capacitator Integrator. Naja und am Ende misst man über den ADC die
Spannung am Kondensator.

Die Empfindlichkeit ist sehr hoch und kann dynamisch über die Anzahl an
Umladezyklen eingestellt werden. In meinem Falle arbeitet das System mit
einer 3 mm starken Glasscheibe die von Hinten mit einer
"Heckscheibenfolie" für Autos beklebt ist und auf die dann die
Sensortasten aus 20x30mm großen selbstklebenden Kupferfolien geklebt
wurden. Abstand der Sensorflächen zueinander sind 5 mm. Die
Sensorflächen besitzen keinen Gegenpol zur Masse.

Vorteil der ganze Sache ist die Störunterdrückung, weil wir ja mit einer
Taktfrequenz von 500Khz die Sensoren abtasten. Desweiteren ist auf Grund
der einstellbaren Anzahl an Umladevorgängen die Empfindlichkeit
anpassbar. Bei meinen Tests reichte das von 2mm Abstand des Fingers zur
Glasfläche bis hin zu 50mm Abstand. Stellt man eine mit Wasser gefüllte
Cola Flasche auf die Glasplatte (über die Sensoren) so konnte ich die
Annährungen der Handfläche an die Cloa Flasche aus einer Distanz von 20
cm messen. In einem weiteren Aufbau benutzte ich 2 Sensorflächen die als
spitzwinklige Dreicke antiparallel aus Kopferfolie aufgebaut waren.
Quasi ein 80*30 mm großes Quadrat das in der Diagonale halbiert wurde.
Das habe ich auf eine Glasplatte geklebt und bildete die 2
Sensorflächen. Mit dem Finger konnte man drüberrutschen und hatte somit
einen Schieberegler. Auch das hat mit Hilfe eines FIR Filters in
Software dann wunderbar funktioniert. Einzigstes Problem waren die
"Schalterstellungen" nahe 0 und 100 %.

Die Sensorflächen habe ich aus selbstklebendem Kupferband und
selbstklebener Druckfolie im Schichtverfahren hergestellt. Das
Kupferband gibts als Rollen bei eBay als "Schnecken-abwehr". Die
bedruckbare Folie im Supermarkt. Zu erst klebt man einen Streifen der
Kupferfolie auf die Druckfolie. Danach schneidet man mit einem Skalpell
die Sensortasten aus der Kupferfolie. Dann lötet man die Kabel dran und
zum Abschluß klebt man als Isolation noch eine Lage Druckfolie drüber.
Die Druckfolie ist für Laserdrucker, durchsichtig und sehr stabil gegen
versehentliches Druchschneiden mit dem Skalpell. Man hat nun eine
selbstklebende und teilweise druchlässige Anordnung von Sensortasten die
man zb. eben von hinten auf eine Glasplatte kleben kann. Durchscheinend
benötigte ich sie weil ich von Hinten mit RGB LEDs die Tasten je nach
Zustand beleuchten wollte.

Gruß Hagen
Autor: Eugen Dischke (Gast)
Datum: 08.11.2006 18:35

genau das mach ich in etwa ja auch mit dem avr,
nur das ich im prinzip 2 tasten habe die ich mit einem breitflächigem
großen wiederstand verbinde und diese resistive fläche stellt dann den
schieberegler dar
gruß eugen
Autor: Hagen Re (hagen)
Datum: 08.11.2006 20:39

ich habe auch noch eine andere Hardware getestet:

Der Charge-Kondensator Cs wird an die Pins ADC0 und PE0 angeschlossen.
PE0 stellt eine "virtuelles" GND dar. Der Z Ausgang vom MUX geht auch an
den ADC0 Eingang. Von AREF nach GND ein 10nF Kondensator. Der muß in
meinem Testaufbau so klein sein da ich per Software intern die Referenz
hin und herschalte. Vom AREF Pin noch eine Verbidnung zum ADC1 Eingang.
Ziel ist es den Cs per dirrentiellem ADC mit einem Gain von 20x zu
messen und das relativ zur internen Referenzspannung von 2.56V (ach
vergessen ich habe das auf einem ATMega128 Board aufgebaut).

Die Sensortatsten werden nun nach folgendem Schema gemessen:

1.) Cs entladen

PF0 = ADC0 auf Ausgang mit L-Pegel
PE0 auf Ausgang mit L-Pegel

Cs wird nun entladen um neue Messung vorzubereiten

2.) Messen der Sensortasten, umladen nach Cs, dabei wird in einer
Schleife ein Burst von Umladezyklen erzeugt.

PE0 = Cs- auf Input
PF0 = Cs+ ist auf Eingang, Pullup aktivieren
PF0 = auf Ausgang umschalten
PF0 = wieder auf Eingang mit Pullup
PF0 = wieder auf Eingang ohne Pullup
PE0 = Cs- nun auf Ausgang ohne Pullup um Cs- wieder nach GND zu schalten
einen Counter "Burst" dekrementieren

Mit obiger Burst-Sequenz nimmt man Cs aus dem Kreislauf, setzt
kurzzeitig die Sensottatste auf VCC um sie aufzuladen, setzt sie dann
wieder ADC0 hochohmig als Eingang und Cs- nach GND um die Ladung in Cs
zu transferieren.

Mit 16Mhz Takt benötigt man so pro Transferzyklus exakt 8 Taktzyklen und
man transferiert im gesammten Burst mit 2Mhz die Ladung von der
Sensortaste in Cs.

Hier der Codeausschnitt:

[code]
      uint8_t d1 = DDRF & ~(1 << PF0);
      uint8_t d2 = d1 | (1 << PF0);

      DDRF = d2;  // discharge Cs
      _delay_loop_1(11);
      DDRF = d1;

      i &= 0x07;
      uint8_t burst = SensorBurst[i];
      uint8_t p1 = PORTF & ~(1 << PF0);
      uint8_t p2 = p1 | (1 << PF0);

      while (1) {
        DDRE  &= ~(1 << PE0);
        PORTF  = p2;
        DDRF   = d2;
        DDRF   = d1;
        PORTF  = p1;
        DDRE  |=  (1 << PE0);
        if (!(--burst)) break;
      }
      ADMUX  = (1 << REFS1) | (1 << REFS0) | 0x09;
[/code]

Danach startet man nun den ADC mit Gain 20x und VRef von 2.56 Volt.
In meiner Software arbeite ich mit maximal 256 Takten im Burst,
durchschnittlich gesehen kalibriere ich aber auf ca. 64 bis 128 Bursts.
Das mache ich um die einzelnen Sensortasten aneinander anzugleichen. Bei
64 Zyklen im Burst a 2 Mhz brauchen wir pro Taste also nur 32µs zur
Abfrage.

Die Kalibrierung und das Ermitteln des Sensortastenstatus so aus:
[code]
        v  = ADC;
        i &= 0x07; // Index der Sensortaste
        if (v >= 0x200) v |= 0xFC00; // 10 Bit signed in 16 bit signed
        v  = 512 -v;
        v /= 2;
        uint8_t calibrate = SensorCalibrate; // Statusflag ob noch
kalibriert wird
        if (calibrate != 0xFF) {
          uint8_t burst = SensorBurst[i];
          if (v < 64) {
            burst++;
            calibrate = 0;
          } else if (v > 128) {
            burst--;
            calibrate = 0;
          } else {
            v += SensorOffset[i];
            v /= 2;
            SensorOffset[i] = v;
            calibrate++;
          }
          SensorBurst[i] = burst;
          SensorCalibrate = calibrate;
        } else {
// reale Sensorauswertung und Umwandlung in Tastenstatus
          v -= SensorOffset[i];
          v += SensorSample[i]; // Mitteln mit letztem Wert
          v /= 2;

          static uint8_t SensorRecalibrate;
          uint8_t recalibrate = SensorRecalibrate;
          if ((v < 0) | (v > 255)) { // check limits
            if (v < 0) v = 0;
              else v = 255;
            if (recalibrate >= 252) { // must be recalibrated ?
              recalibrate = 0;
              SensorCalibrate = 0;
            } else {
              recalibrate += 4;
            }
          } else if (recalibrate) {
            recalibrate--;
          }
          SensorRecalibrate = recalibrate;

// sensor status errechnen, mit Thresholds etc.pp in FSM
          uint8_t sample = v;
          uint8_t state = SensorState[i];
          uint8_t count = SensorCount[i];

          if (state == 0) { // wait for key press
            if (sample > SENSOR_THRESHOLD_LOW) {
              state = 1;
              count = 0;
            }
          } else if (state == 1) { // counting up key press, measure
speed of keypress
            if (sample > SensorSample[i]) {
              if (++count >= 4) {
                if (sample > SENSOR_THRESHOLD_HIGH) state = 2;
                  else state = 4;
                count = 0;
              }
            } else {
              state = 4;
              count = 0;
            }
          } else if (state == 2) { // wait delay for key press, debounce
            if (sample > SENSOR_THRESHOLD_HIGH) {
              if (++count >= SENSOR_THRESHOLD_ON) {
                state = 3;
                count = 0;
              }
            } else {
              state = 4;
              count = 0;
            }
          } else if (state == 3) { // key on
            if (sample < SENSOR_THRESHOLD_HIGH) {
              if (++count >= 4) {
                state = 4;
                count = 0;
              }
            } else {
              count = 0;
            }
          } else if (state == 4) { // wait for stable key off
            if (sample < SENSOR_THRESHOLD_LOW) {
              if (++count >= 4) {
                state = 0;
                count = 0;
              }
            } else {
              count = 0;
            }
          }
          SensorState[i] = state;
          SensorCount[i] = count;
          SensorSample[i] = sample;
        }
[/code]




Gruß Hagen
Autor: Eugen Dischke (Gast)
Datum: 09.11.2006 09:34

hehe loool
das ist so ziemlich ganz exakt das was ich auf dem tiny26 mache.
Das einzige Problem was sich in Sachen Präzision herausgestellt hat ist
die Kapazität jedes Pins(an der Sensorfläche). Bei jedem lade und
entlade Vorgang von den Sensorflächen mit dem AVR, wird eine nicht
unerhebliche konstante Ladung von den Pinkapazitäten mitgenommen.Als
Resultat ändert sich beim anfassen der Sensorfläche die spannung am Cs
kondensator weniger stark.
eine Möglichkeit das zu kompensieren ist in dem man einen weiteren Cs
Kondensator zur hand nimmt der ohne Sensorfläche daherkommt  und bei der
differntzspannung Messung den konstanten Teil der Spannung am
"richtigen" Cs  subtrahiert.
Grüße Eugen
Autor: Hagen Re (hagen)
Datum: 09.11.2006 10:24

"eine Möglichkeit das zu kompensieren ist in dem man einen weiteren Cs
Kondensator zur hand nimmt der ohne Sensorfläche daherkommt  und bei der
differntzspannung Messung den konstanten Teil der Spannung am
"richtigen" Cs  subtrahiert."


:) Die gleiche Erfahrung habe ich auch gemacht !
Meine Lösung ist ganz einfach. Ich nutze ja nur 5 der 8 Eingänge des
MUX. Am zb. 6. Eingang ist also keine Sensortaste und denoch wird dieser
so gesampelt als wäre eine dran. Er kann als Referenzquelle der
Kapazitäten des MUX,Boards und AVRs benutzt werden. Denn diese Teile
stellen diese "Grundkapazität" dar.

Allerdings ist dies im Grunde garnicht mehr nötig. Mit der Methode in
meinem letzten Posting erledigt sich das fast von selbst. Ich nutze ja
die interne VRef von 2.56 Volt und den ADC im differienziellen Modus mit
Gain 20x. Ein Pin des ADC liegt dabei an AREF an. D.h. der Kondensator
Cs muß erstmal von 0 Volt auf ca. 2.56 Volt aufgeladen werden und der
gemessene Spannungbereich beträgt dann 2.56Volt +- 512 * 250µV. Damit
erledigt sich auch das Problem das man Cs ja nicht unbedingt vollständig
entladen kann und muß, es also immer eine Restspannung in Cs geben wird.

Dh. die Grundkapazität aller Komponenten inklusive der Sensortaste
schlägt sich darin nieder das mit einer einmal kalibrierten Anzahl an
Zyklen in unserem Burst der Cs auf rund 2.56 Volt aufgeladen wird. Da
die Kalibrierung ohne Annäherung der Hand gemacht wurde stellt dieser
Wert also die Grundkapazität dar. Bei Annäherung der Hand/Finger etc.
verändert sich diese Spannung dann im Bereich von -128mV bis +128mV in
1024 Schritten=0.25mV. Deshalb habe ich auch einen 1-22nF als Cs
benutzen können und die Abfragedauer im Burst auf 32µS und 2MHz. Die
Empfindlichkeit wird dann eingestellt über die Kapazität von Cs und die
Anzahl der Zyklen im Burst.

Allerdings ist die effektive Empfindlichkeit bei der letzten Methode im
Vergleich zur Methode mit dem analog Switch DG419 nicht mehr ganz so
empfindlich. Stört aber nicht da ich ja nicht schon aus 5 cm Entfernung
ein Ansprechen haben möchte. Das direkte Anfassen der Sensoren ist eh
nicht möglich da diese ja hinter einer 3 mm Glasplatte + x µm
Plastikfolie als Dielektrikum sitzen.
Die Reduzierung der Empfindlichkeit hat aber zur Folge das ich jetzt nun
den Abfrage-Burst viel schneller und hochfrequenter ausführen konnte. Im
Zusammenhang mit dem periodischen Erzeugen der Bursts werden viele
Störquellen wie die 50Hz, Einschaltspitzen im Stromnetz etc.pp. stark
reduziert und die Sensorfläche kann kleiner sein. Dh. die
Störanfälligkeit ist weitaus geringer und somit konnte ich auf einen
aufwendigen FIR Filter und Glättung in Software komplett verzichten.
Beim DG419 musste ich das noch machen.

Gruß Hagen
Autor: Hagen Re (hagen)
Datum: 09.11.2006 10:30

Übrigens machen die QProx Teile das nochmals anders. Sie laden einen
zweiten Csx negativ auf, als Referenzquelle, quasi Entladekapazität zum
Cs. Ihr Burstzyklus besteht dann aus dem zyklsichen Umladen
->Transfercharging und dazwichen ein zyklsiches Entladen der
Grundkapazität über Csx. Somit ist die Empfindlichkeit nochmals höher da
nun Cs nur die Differenzspannung der Sensortasten bei Annäherung der
Hand enthält, ohne deren Grundkapazität. Das nachzubauen schien mir aber
überflüssig da es ohne auch super funktioniert.
Denoch ist es eben so das diese Grundkapazitäten den Löwenanteil des
2.56V Spannungshubs ausmachen. Eben auch ein Grund warum die Auswertung
im ADC mit nur +-128mV arbeitet.

Gruß Hagen
Autor: Eugen Dischke (Gast)
Datum: 09.11.2006 12:08

naja also ich werde in den nächsten tagen wirklich mal ein neues
überarbeitetes, korrektes layout vom "schieberegler " ätzen und
ausprobieren (dass dann vieleicht bei 20 facher verstärkung nicht so
viel brummen einfängt).
denn die sensortasten haben ja hervorragend funktioniert (eben  nach der
hier diskutierten methode ).
das spannende ist dass man einen schieberegler eventuell auch nur mit
einem kondensator realisieren könnte in dem man ihn sozusagen "von
beiden seiten" läd und dann die spannung an ihm misst.
also auf gut deutsch an beiden polen des kondensators 2 sensorflächen
hat die so kammähnlich in einander verzahnt sind.
wenn diese methode gut funktioniert dann lassen sich auch trackpoints
(der mausersatz bei manchen laptops) damit machen.
ich finde das ganze thema hier sowieso so furchbar brisannt-spannend
wenn man bedenkt dass man nahezu ohne extern-analoge elemente auskommt
obwohl es um kapazitäten geht die kaum noch messbar sind.
vieleicht währe es sogar möglich ein theremin auf der basis der sensor
taste zu bauen in dem man die auflösung des ADC über oversampling noch
weiter erhöt.
Autor: Hagen Re (hagen)
Datum: 09.11.2006 12:55

"(dass dann vieleicht bei 20 facher verstärkung nicht so
viel brummen einfängt)"

Damit hatte ich eben keine Probleme mehr. Du musst halt nur die Abfrage
der Sensortasten als Burst möglich schnell manchen (oben die 2Mhz) dann
möglichst kurz (oben nur ein 1-22 nF Kondesnator und somit nur 32µs
lang) und das Ganze dann in einem periodischen Zeitintervall (oben ADC
mit 15KSpS und somit alle ca. 2Khz eine Burstabfrage pro Sensor). Das
Ganze wirkt dann wie ein mehrstufiges Filter das einerseits lowfrequente
und highfrequente Störungen unterdrückt.

Klar, wenn ich mich mit der rechten Hand dem Sensor annährere macht es
schon ein Unterschied ob ich in der Linken Hand ein Stromführendes Kabel
umfasse (isoliert natürlich ;) oder nicht. Aber solch starke Störungen
lassen sich selbst mit den QProx Teilen nicht unterdrücken. Wichtig ist
dann nur das die Auswertung in der Software dann nicht falsche Werte
liefert. Im obigen 2. Source sieht man meine Lösung für dieses Problem.
Ich werte nicht einfach die Spannung an Cs als Schaltersignal aus,
sondern in einer FSM werte ich die Anstiegszeit der Spannung aus. Dh.
nur wenn die Spannung an Cs innerhalb einer Zeitspanne einen gewissen
zeitlichen Anstieg ausmacht und der dann innerhalb bestimmter
Thresholds=Schwellen liegt wird das als Schaltersignal interpretiert.
Desweiteren wird nicht nur das Anklicken des Sensors in der FSM
berücksichtig sondern auch das "Loslassen" und die Zeitspanne des
"Losgelassen seins" als Debouncing wird berücksichtigt. Deutlich wird
das wenn man statt dem Finger zb. eine Pinzette aus Metall in der Hand
an den Sensor annähert (auf den Sensor fallen lässt). Durch die FSM
reagiert die Software eben nicht mehr auf solche Fehlbedienungen. Oder
man nähert sich mit dem Finger nur ganz langsam dem Sensor. Auch da
verhindert die FSM das das als Schaltsignal interpretiert wird.

Insgesamt hat man also per Sofwtare quasi 4 Filter die alle
unterschiedlich wirken und unterscheidliche Störungen ausfiltern.

"also auf gut deutsch an beiden polen des kondensators 2 sensorflächen
hat die so kammähnlich in einander verzahnt sind."

Damit hatte ich auch schon experimentiert. Leider ist das mit der
Kupferfolie nicht so leicht per Skalpell zuzuschneiden gewesen. Ätzen
ist da wohl weitaus sauberer und feiner.

Allerdings ändert das rein garnichts zum einfachen Schieberegler. Dieser
ist ja schon "ein Kondensator" der an beiden Seiten seine Pole hat.
Ändern tut sich nur die Unempfindlichkeit wenn man mit dem Finger nicht
exakt zentiert über dem Schieberegler positioniert. D.h. die Genauigkeit
wird durch einen kammartigen Sensor nicht in der horizontalen Achse
erhöht sondern in der vertikalen Achse. Damit wird der Sensor nur
unemfindlicher bei versetzter Positionierung des Fingers auf den Sensor.

Eine andere Idee ist es den Slider aus vielen Einzelsensoren, die quasi
sowas wie einen Graycode erzeugen, zu konstruieren. Das Design wird aber
immer weiter kompliziert.

Für meinen Geschmack waren meine Slider einfach zu ungenau und in der
Habtik unpraktisch. Man musste immer mit dem Finger über die Glasplatte
rutschen und wenn man keine Schweißfinger hat ist das schon sehr
gewöhnungsbedürftig. Oder aber man musste den Finger leicht über dem
Sensor schweben lassen und das ist ab einem gewissen Alter mit zittrigen
Händen garnicht so einfach.
Ein normaler Sensortaster ist in der Habtik schon sehr
gewöhnungsbedürftig. Ein Doppelklick funktioniert exakt negiert zu einem
normalem Taster. Man muß halt nicht den Finger "durchdrücken" sondern
eben "abheben" für einen Doppelklick.

Man muß aloso solche Sensoren sehr relativiert betrachten und nur für
wenige Anwendungszwecke sind sie wirklich sinnnvoll. Zb. eben
- Bedienung durch Scheiben hindruch
- Wasserdichte Schalter
- oder wie bei mir einfach wegen des Effektes mit der getönten
Glasscheibe die von hinten farblich beleuchtet wurde. Sprich LED Matrix
Anzeige und RGB LEDs hinter den Sensortasten. Sieht dann bischen so aus
wie auf der Enterprise ;)

Ansonsten würde ich solche Sensoren niemals benutzen wollen.

Gruß Hagen
Autor: Dennis (Gast)
Datum: 10.11.2006 12:54

Hagen, Eugen, macht Euch doch einfach Euren eigenen Thread auf, statt
Peters hier zu kapern!
Autor: Peter Dannegger (peda)
Datum: 10.11.2006 15:41

Es ist schon eindrucksvoll, wie umständlich man die Kapazitätsmessung
machen kann.

Letztendlich ändert das aber nichts am Prinzip.

Ganz im Gegenteil, die von mir vorgeschlagene Lösung ist total
unempfindlich gegen Netzbrummen und daher besser. Es wird ja nur für
wenige µs gemessen und dabei ist 50Hz quasi Gleichstrom.


Ich denke mal, die Touchpads machen es genau so.
Bloß sind dann schmale Streifen in 2 um 90° versetzten Lagen angeordnet,
so das die Fingerkapazität noch bis auf die untere Lage durchscheint.

Dann braucht man nur noch die Reihe und Spalte mit der höchsten
Kapazität ausmessen und schon hat man die Fingerposition.


Peter
Autor: Hagen Re (hagen)
Datum: 10.11.2006 20:56

Ich sehe das nicht als umständlich an. Denn "deine" Methode hatte ich
schon vor einiger Zeit ausgetestet (auf Grund eines Beitrages bei
avrfreaks, und hier im Forum findet man auch noch einen Thread dazu).
Und nun kann ich 4 verschiedene Methoden miteinander vergleichen, mit
praktischen Resultaten. Mein Fazit: die QProxs Methode ist am
empfindlichsten und störunanfälligsten. Die Empfindlichkeit muß auch auf
Grund des Verfahrens weitaus höher sein. Denn bei "deiner" Methode wird
ja die Kapazität nur einmal ausgemessen. Bei der QProx Methode benutzt
man einen Charge Integrator und somit quasi eine digitale Verstärkung.

Schaut man sich die letzten Beiträge an so wird man auch feststellen das
der Bauteileaufwand nicht höher als bei deiner Methode ist. Die
nachgeschaltete Filterung in der Software muß man bei allen Lösungen in
irgend einer Form implementieren.

Interessanter finde ich es da schon das die Fähigkeit der Menschen
konstruktiv zu diskutieren immer mehr nachlässt und nur die eigenen
Erfolge die besten sein sollen. Das führt dann dazu das man sich eher
lustig macht über die Erfahrungen der Anderen statt einfach mal was
daraus an Wissen für sich mitzunehmen.

Mir persönlich geht es aber darum das hier der ideale Ort wäre an dem
man eben diese Problemstellung von allen Seiten betrachten könnte. Also
nicht nur einseitig sondern umfassend die verschiendenen Erfahrungen
verschiedener Leute auszutauschen.

Allerdings sind wir im Umgang untereinander schon so weit gekommen das
man die eigenen Differenzen nicht unterdrückt und konstruktiv Meinungen
austauscht. Mir scheint es dann schon so das es wichtiger ist sich als
Schiedsrichter aufzuspielen (Dennis) ohne irgendwas zum eigentlichen
Thema beitragen zu können. Und ja, dein Thread wurde in spezieller weise
von mir gekapert, allerdings dachte ich das dieses Thema ansich
interessant ist und  gerade praktische Erfahrungen (und nicht wie oft
reine Theorie) von allgemeinem Interesse sein könnte. Da die
Suchfunktion im Forum nicht die allerbeste ist dachte ich mir das es
hier am besten reinpasst und das andere das auch finden können.  Sorry,
ich entschuldige mich hiermit das ich mein Wissen teilen wollte, kommt
nicht wieder vor.

Gruß Hagen
Autor: Hagen Re (hagen)
Datum: 10.11.2006 21:00

Übrigens: bmöchte man bei "deiner" Methode die Empfindlichkeit erhöhen
so geht dies nur mithilfe eines immer größeren Vorwiderstandes. Das
führt dazu das

1.) die Meßzeit sich immer weiter verlängert
2.) die Störanfälligkeit sich immer weiter erhöht

Bei der QProx Methode ist die Meßzeit unabhängig von der gerünschten
Empfindlichkeit machbar. Man kann also wie oben beschrieben die Anzahl
an Zyklen im Burst und deren Frequenz im Grunde konstant halten.

Ich bin also nicht unbedingt deiner Meinung, ist das schlimm jetzt ?

Gruß Hagen
Autor: Hagen Re (hagen)
Datum: 10.11.2006 21:15

"Ganz im Gegenteil, die von mir vorgeschlagene Lösung ist total
unempfindlich gegen Netzbrummen und daher besser. Es wird ja nur für
wenige µs gemessen und dabei ist 50Hz quasi Gleichstrom."

Ja da hast du Recht. Allerdings ist das eben auch ein Problem. Denn in
allen 4 Methoden die ich getestet habe ist das eine gewaltige Störgröße.
Denn wir messen ja kleinste Kapazitätsunterschiede und ein über den
Körper eingespeistes Netzbrummen verändert die gemessenen Werte enorm in
ihrer Amplitude. Das läst sich meiner Meinung nach nicht so ohne
weiteres bei keinem der Verfahren umgehen, immerhin messe wir im pico
Farad Bereich. Die einzigste Lösung ist die "Filterung" per FSM in
Software die die Anstiegszeiten der Signale ausmisst und nur reagiert
bei bestimmten Schwellen. Das muß man in jedem Falle machen, und, machen
auch die QProx Teile.

Also auch bei "deiner" Methode bekam ich absolut undefinierbare
Schaltersignale wenn die Sofwtare ohne diese FSM arbeitet und starke
50Hz Störungen mit gemessen wurden. Defakto könnte ich in meiner PC
Auswerte Software direkt das 50Hz Brummen beim Anfassen eines Kabels
mitverfolgen. Und das war bei jeder der Methoden der Fall. Ich finde das
irgendwie auch logisch. Denn das Meßinterval mit dem die Sensoren
ausgewertet werden ist immer weitaus höher als 50Hz. Man wird, ob man
will oder nicht, also immer solche Interferenzstörungen mit einfangen.

Der garvierendste Unterschied ist aber ein ganz andere. Baue ich nämlich
die Sensoren hinter eine Glasscheibe so habe ich festgestellt das die
EMpfindlichkeit der verschiednenen Verfahren enorm unterschiedlich sind.
Die QProx Methode hat dabei nach meinem Gefühl weitaus besser reagiert.

Gruß Hagen
Autor: Peter Dannegger (peda)
Datum: 10.11.2006 23:37

Immer gleich die beleidigte Leberwurst. Man traut sich ja kaum noch was
zu sagen.

Ich hab halt nur das mit dem Netzbrummen gelesen und damit hatte ich bei
mir keinerlei Probleme.


Ich hab das auch nicht weiter verfolgt, da ich Sensortasten doch sehr
unergonomisch fand.
Man muß die Finger immer physisch abheben ohne Federkraft die einem
hilft und mit wesentlich längerem Hub. Da schmerzten mir schnell die
Finger. Es ist garnicht so einfach, die Finger ruhig in der Luft zu
halten.

Bei meinem Notebook mußte ich auch zuerst die Tippen-Funktion
abschalten, damit ich es überhaupt bedienen konnte, ständig war alles
angeklickt.

Mit Handschuh funktioniert das Touchpad überhaupt nicht.

Und auch nicht, wenn man beim Hochfahren schon den Finger drauf hat, da
erfolgt wohl beim Einschalten erstmal ne Kalibration auf die
Schaltungskapazität.


Mach doch mal nen Schaltplan und ein funktionierendes Codebeispiel,
damit man Deine Versuche auch mal nachvollziehen kann.


Peter
Autor: Gerd L. (gerd)
Datum: 11.11.2006 10:37

Hallo Peter, Eugen und Hagen,

ich finde die hier stattfindende Diskussion sehr interessant, deshalb
meine Nachfrage an Eugen (s.o.). Ich habe mich bisher nur theoretisch
mit den verschiedenen Messmethoden beschäftigt, und fand die
qprox-Methode als die ausgefeilteste.
Als mögliches Problem bei meinen zukünftigen Experimenten mit einem
Mikrocontroller (AVR) sehe die Kapazität der Ports des MC, was ich auch
so aus der Diskussion heraus gelesen habe.

@Hagen: Du schreibst, dass Du vier Methoden miteinander verglichen hast.
Ich lese aus der Diskussion nur drei. Welche Methode hast Du noch
getestet? (Ich hoffe, dass Du Dein Wissen teilen magst).

Gruß,
Gerd
Autor: emil (Gast)
Datum: 11.11.2006 12:31

Hi all:

zuerst einmal möchte ich den Konflikt Hagen/Peter irgendwie ein wenig
schlichten.

Bitte, Ihr seid doch beide definitiv einige der wichtigsten
Forumsträger!

Hagen, Deine GLCD-Lib für Nokia ist schon ein Programmier-Klassiker für
alle hier!

Peter, Deinen RC5-IR Code baue ich in nahezu jeder Applikation und er
funktioniert immer auf Anhieb!

Ausgerechnet Euch beide will ich nicht streiten sehen!

Und endlich auf den Punkt gebracht: ich habe den Sensor-Code von Peter
ein wenig modifiziert und bei einem Ceran-Feld für meine Frau verwendet:

http://emil.ilianaweb.net/?Elektronik:Ceran-Kochfe...

Meine Erfahrungen-es ist beeindruckend, was man damit schon anstellen
kann. Und ohne den Beitrag von Peter hätte ich es definitiv nicht
geschafft.

Habe aber leider einige Probleme, wenn's in der Nahe eine
Leuchtstofflampe ist, daher interessiere ich mich sehr stark auch für
andere Methoden, also eben QProx und bin sehr sehr dankbar, dass Hagen
und Eugen Ihr Wissen auch offenlegen, was heutzutage nicht unbedingt
selbstverständlich ist.

Daher nochmals meine Bitte an Hagen und Peter-lässt es gut sein, es ist
doch allgemein schwierig in Internet-Foren, jeweils richtig auf
versteckte Gefühle in Foren-Postings zu reagieren, dies braucht Ihr hier
auch garnicht, niemand zweifelt doch an Eurer Professionalität !

Hagen, Eugen: leider keine Zeit, um Eure Ansätze zu testen, mache ich
aber unbedingt, denn meine Frau braucht dringend schicki-micki
Sensor-Ceran-Feld für die Küche :)))
Und vielen vielen Dank für Eure "Qprox"-Beiträge!

Sorry für die Fehler, Deutsch ist nicht meine Muttersprache :)
Autor: Hagen Re (hagen)
Datum: 11.11.2006 13:14

@Gerd:

"Du schreibst, dass Du vier Methoden miteinander verglichen hast.
Ich lese aus der Diskussion nur drei. Welche Methode hast Du noch
getestet?"

Die allererste Methode, die ich auch mal hier im Forum gepostet habe und
die zu Recht damals von Peter als uneffizient beurteilt wurde, hat mit
"Frequenzmessung" gearbeitet. Die Sensortaste wurde mit einer
Rechteckspannung mit ca. 100Khz angesteuert und wirkte über einen
Widerstand quasi als Tiefpassfilter. Per ADC wurde die resultierende
Spannung gemessen. Über den Dutycycle konnte man die Empfindlichkeit
einstellen. Bei AVRFreaks in der Codelib gibts dazu auch einen
Sensor-Lichtschalter an dessen Konzept ich mich dabei orientiert hatte.
Den Thread hier im Forum finde ich leider nicht mehr wieder.

Ich habe also getestet:

- Ansteuerung mit einer Rechteckfrequenz und Messung über einen
Tiefpassfilter

- Ansteuerung durch Entladen eines Kondensators über einen festen Strom
(Widerstand) per digitalem Input Capture und/oder Analog Comperator und
Input Capture. Das ist Peters Verfahren und bei Elm Chang findet man
auch ein Meßgerät für Kapazitäten mit gleicher Methode

- QProx Methode mit externem Analog Switch, Nachteile sind die begrenzte
Abtastfrequenz auf Grund des Analog Switches und teilweises Übersprechen
innerhalb des Switches. Vorteil war eine höhere Empfindlichkeit trotz
interner und zusätzlicher Kapazitäten der MOSFETs inerhalb des DG419.

- QProx Methode mit Cs Steuerung per virtuellem GND durch einen Pin des
AVRs. Vorteil: weitaus höhere Abfragezyklen "Burst", universeller da man
je nach interner Referenzspannnung und Aufbau des ADC, differientiell
misst und den vorhandenen Spannnungshub durch die Grundkapazitäten der
Schaltung relativiert indem man realtiv zu dieser AREF misst. Je nach
ADC+AREF kann man den Cs Kondesnator dann anpassen. Nachteil: durch die
kompliziertere Methode des Umschaltens der Ports im AVR von Input
hochohmig -> Input Pullup -> Output -> Input Pullup -> Input hochohmig
ist man erstens abhängig von der AVR Konstruktion selber und man hat ein
schlechteres Ladeverhalten der Sensoren.  Daraus, und aus den
Fehlerströmen der Inputschaltung im AVR resultiert eine geringere
Empfindlichkeit die aber immer noch vollkommend ausreichend ist.


@Peter:

"Immer gleich die beleidigte Leberwurst. Man traut sich ja kaum noch was
zu sagen."

Ja ich weis, habe da wohl überreagiert, entschuldige.

"Ich hab halt nur das mit dem Netzbrummen gelesen und damit hatte ich
bei
mir keinerlei Probleme."

Und ich habe eben grundsätzlich betrachtet damit eben auch keine
Probleme. Und denoch erhöht sich der gemessene Ausschlag -> die
Kapazität des Schalters enorm wenn man über den Körper ein 50Hz Brummen
einspeist. Eben wenn man mit der Linken Hand ein Kabel umfasst. Das
führt dann dazu das zb. bei deiner einfachen Auswertung mit festen
Schaltwerten der Schalter auslösst. Ich weis das dein Codebeispiel nur
das Grundsätzliche demonstrieren soll und das gerade du ein Entwickler
bist der sowas dann per zusätzlicher Softwarelogik, sprich FSM die die
Anstiegszeit auswertet, favorisiert.

"Und auch nicht, wenn man beim Hochfahren schon den Finger drauf hat, da
erfolgt wohl beim Einschalten erstmal ne Kalibration auf die
Schaltungskapazität"

Eben. Denn das ist auch ein Problem das alle Verfahren gemeinsam sein
muß. Auch bei meinen Tests war das ein generelles Problem. Lösen lässt
sich das auch nur wieder innerhalb der Software durch die FSM. Und im
obigen Source habe ich das auch angedeutet. Ich rekalibriere im
laufenden Betrieb neu wenn die gemessenen Werte sich aus den Schranken
heraus bewegen.
In deinem Codebeispiel machst du eine solche Kalibrierung überhaupt
nicht. Dh. die Sensorgröße wird quasi hardcoded und nur per Experiment
einmalig und fest eingestellt. Das kann sich aber zb. bei Gewitter sehr
negativ auswirken.

"Mach doch mal nen Schaltplan und ein funktionierendes Codebeispiel,
damit man Deine Versuche auch mal nachvollziehen kann."

Hm, vorerst mache ich das nicht. Oben habe ich schon den relevanten Code
gepostet und ich habe eigentlich keine Lust und Zeit meinen komplexen
Source auseinander zu klabüsern. Das soll jetzt kein Rückzieher sein,
ich weis aber das solche Sachen aus einem funktionierenden und komplexen
Source wieder rausextrahiert nicht auf Anhieb funktionieren können. Ergo
müsste ich alles nochmals austesten und das kostet meine wertvolle
Freizeit.
Wer Interesse hat dem gebe ich gerne den kompletten Source und der muß
sich das dann halt selber anpassen und alles unwichtige rausbauen.

Zur Schaltung nochmal zusamengefasst in Worten:

AVR->AREF Pin mit 10-100nF gegen Masse. Das ist sowieso eine
Standardbeschaltung wenn man den ADC benutzen möchte. Je öfter und
schneller man die REF Bits des ADCs umschaltet, sprich die Refernez des
ADC im laufenden Betrieb umschaltet, desto geringer sollte dieser Cap
ausgelegt werden.

AVR->AREF Pin an AVR->ADC1 Pin. Damit liegt die Spannung der internen
AREF von 2.56V also am positiven ADC Pin bei differentieller Messung.

AVR->ADC0 an MUX 74HC4051 Aus/Eingang Z.

Kondensator Cs an AVR->ADC0 und virtuelles GND vom Cs an AVR->PE0 zb.

Je nachdem ob PE0 nun ein Input oder Output->GND ist beeinflusst man ob
Cs im Stromkreislauf vorhanden ist. Man verhindert damit zb. das Cs sich
entlädt wenn man über den ADC0 Pin als Ausgang die Sensortasten auflädt.
Andererseits erreicht man das Cs die Kapazität der Sensortaste übernimmt
wenn ADC0 als Input und PE0 als Output->GND geschaltet wird.

Und finally an den 8 MUX Eingängen die Sensortasten. Die Leitungen zu
den Sensoren sind nicht geschirmt gegen Masse, das würde nur die
Empfindlichkeit reduzieren.

Cs ist 1-22nF groß.

ADC läuft mit ADMUX  = (1 << REFS1) | (1 << REFS0) | 0x09; also interne
2.56V und ADC0-1 differientiell und 10Bit Auflösung.

Gain ist 10x, sorry habe mich oben verrechnet da ich noch den ATTiny45
im Hinterkopf hatte. Bei Gain 200x war die Empfindlichkeit so groß das
man viel zu schnell ausserhalb der Messbereiche kam. Man konnte dann
schon das Zittern des Fingers der über den Sensoren schwebte messen (und
meine Finger zittern noch nicht so dolle ;)

"Mit Handschuh funktioniert das Touchpad überhaupt nicht.

Und auch nicht, wenn man beim Hochfahren schon den Finger drauf hat, da
erfolgt wohl beim Einschalten erstmal ne Kalibration auf die
Schaltungskapazität."

Hm das sieht mir mehr nach einem Resistiven Touchpad aus. Auf die
gleiche Weise arbeiten die Touchscreens zb. bei den Palm Handhelds.

Gruß Hagen
Autor: Hagen Re (hagen)
Datum: 11.11.2006 13:45

@Bernd:

"Als mögliches Problem bei meinen zukünftigen Experimenten mit einem
Mikrocontroller (AVR) sehe die Kapazität der Ports des MC, was ich auch
so aus der Diskussion heraus gelesen habe."

Das Problem hast du immer und zusätzlich noch wenn du externe Schalter
benutzt, sprich MUX 74HC4051 oder den DG419. Bei QProx (langsamm reicht
die Werbung für deren überteuerten Chips) gibts auch ein Datenblatt das
auf diese Probleme eingeht und in denen sie berichten das sie spezielle
integrierte MOSFET Schalter dafür "entwickelt" hätten.

Die anscheinend verbreiteste Lösung im Hobby Bereich ist es das zu
ignorieren und als festen Spannungshub der eben immer vorhanden zu seien
"scheint" zu bewerten. Ich zb. lade den Kondensator auf die besagten
2.56V auf und messe dann nur in einem Meßbereich von -128mV bis +128mV
relativ zu den 2.56V gesehen.

QProx wiederrum lädt einen 2. Kondensator auf einen fest kalibrierten
Wert negativ auf und entlädt dann damit den Cs. Das erfolgt pro
Meßperiode zyklisch und somit wird Cs immer wieder entladen und sollte
dann nur noch die Differenzspannung erzeugt durch den Finger enthalten.
Das Problem ist es ja das man eben nicht einfach Cs in der Kapazität
weiter erhöhen kann da dann ja das Verhältniss von Grundladung zu
Differenzladung des Fingers immer wieder nur proportional gleich bleibt.
Man hat also damit nur eine Verlängerung der Meßdauer erreicht aber real
keine Verstärkung des wichtigen Signales. Man wirkt damit also dem
Integrationsprozess entgegen.
QProx misst dann Cs aus per konstantstrom Entladung und digitalem Timer,
also im Grunde das gleiche wie bei Peters Methode. Erst neuere Chips
nutzen einen ADC.

Es gibt halt einen ganz wichtigen Vorteil bei der QProx Methode. Das
Ausmessen der Kapazität Cs erfolgt elektrisch getrennt vom Sensor. Das
war auch der Grund warum ich am Anfang mit dem DG419 Schalter
experimentiert hatte, denn auch dieser trennt Cs vom Sensor (legt diese
dann auf VCC), und Cs wird erst dann ausgemessen. So verhindert man das
Störungen zum Zeitpunkt des Ausmessens durch den Sensor eingespeist
werden. So zumindestens der Standpunkt bei QProx. Ich für meinen Teil
habe das so nicht meßtechnisch reproduzieren können und deshalb mit der
zweiten Methode weiter gemacht. Immerhin ist das Verhältnis der
Kapazitäten Sensortaste zu Cs in Größenanordnungen von 1 zu 10000.

Gruß Hagen
Autor: Gerd L. (gerd)
Datum: 13.11.2006 10:28

Hallo Hagen,

ich wäre an deinem angebotenen Source-Code interessiert:
gerd.laschinski ät uni-duesseldorf.de
Vielen Dank im voraus.

Gruß
Gerd
Autor: Eugen Dischke (Gast)
Datum: 14.11.2006 18:32

ich werde noch ein wenig brauchen um meine sourcecodes zu verbessern und
zu generalisieren, dann aber werde ich hier hoffentlich folgendes unter
der GPL anzubieten haben:

einfache Sensortaste (eventuell mit verbesserter Reichweite),

eindimensionale Touchpads

eventuell 2 diminsionale Touchpads (da lohnt ein blick auf die Synaptics
Touchpad Seite. Über die da illustrierten Bilder kann man sich an 5
Fingern abzählen wie man 2 eindimensionale Touchpads sinnvoll
kombiniert)

und ein Trackpoint (laptop-Mausersatz)

@ all die sich hier Streiten
die Störempfindlichkeit von der wir hier reden hat eigentlich fast keine
Wichtung, denn jeder testet seine eigene Schaltung unter anderen
Bedingungen und folglich kann  hier nicht wirklich ein Vergleich
stattfinden. erst wenn mehrere vollständige Variationen von Anderen
getestet werden können kann ein Vergleich stattfinden oder man
vergleicht die Schatungen unter genormten Bedingungen .

bisdahin viel Spass beim experimentieren
Grüße Eugen
Autor: Marco (Gast)
Datum: 17.11.2006 15:28

Als ich die ersten Beiträge gelesen habe habe ich mich über die Lösung
gefreut. Jetzt wo es noch so einige andere Varianten gibt und kleine
"Streiteren" dazu bin ich etwas verwirrt :(

Ich habe folgendes Problem.
Für mein Bruder habe ich eine Klingel gebaut. Im Flur ist ein
Lautsprecher, die Elektronik ist im Keller und der Taster ist eine
Metallplatte (10 X 10cm). Der Name ist ausgefräst und mit einer EL-Folie
beleuchtet.

Der Taster reagiert auch kapazitiv. Die Schaltung ist mit einem 4093
(Schmitt Trigger NAND) und 4013 (FF) und ein paar passiven Bauteilen
aufgebaut.

Berührt jemand den Taster, wird der Ausgang der Schaltung auf H gelegt
und im Keller ein kleines Soundmodul gestartet, dessen Sound verstärkt
wird und im Flur zu hören ist. (komplizierter geht es wohl nicht mehr ;)

Auf dem Schreibtisch klappt das ganze auch ganz gut. Aber in der Praxis
sieht es so aus, das die Klingelleitungen zum Teil parallel zu den
230V-Leitungen laufen und die ganze Leitungslänge gut als Antenne wirkt.
Somit klingelt es ab und zu mal, wenn z.B. im Keller eine
Leutschstofflampe eingeschaltet wird. Ich denke, das Problem ist
nachvollziehbar.

Aber zum eigentlichen Thema.
Ich denke, eine Schaltung die über UART eine Zahl des Zustands ausgibt
ist weniger störanfällig.
Ich würde jetzt einen M8 nehmen (Tiny26 geht ja nicht weil der kein
Hardware-UART und kein ICP hat) und das ganze am liebsten mit 8MHz
intern laufen lassen.
Erstes noch lösbares Problem ist die Baudrate. 1200 ist bei 8MHz nicht
möglich.
Da ich sonst mit Bascom programmiere ist das << von C für mich nur ein
viel kleiner als. Aber die Baudrate könnte ich wohl noch anpassen denke
ich.

Nur wie stellt man den internen Pullup aus damit man einen externen
verwenden kann?

Und was muss für die 8MHz im Programm geändert werden? Es ist ja für
11MHz ausgelegt.

uputs("Test Sensor Key:\n\r"); Was ist mit dieser Programmzeile? Wird
sie einmalig beim Start ausgegeben? Kann ich die einfach löschen?
Ich würde dann im Keller einfach den gesendetet Wert immer abfragen und
wenn ein getesteter und eingestellter Schwellwert erreicht wird das
Soundmodul einschalten.

Es würde mich freuen, wenn jemand bereit wäre, mir bei den kleinen
C-Problemen zu helfen oder evtl eine fertige .HEX hat.

Danke!
Autor: Marco (Gast)
Datum: 24.11.2006 21:35

Niemand da, der sich mit C auskennt und die Abhänigkeit dieses einen
Wertes deuten kann?
Autor: Peter Dannegger (peda)
Datum: 24.11.2006 22:30

Marco wrote:

> Auf dem Schreibtisch klappt das ganze auch ganz gut. Aber in der Praxis
> sieht es so aus, das die Klingelleitungen zum Teil parallel zu den
> 230V-Leitungen laufen und die ganze Leitungslänge gut als Antenne wirkt.
> Somit klingelt es ab und zu mal, wenn z.B. im Keller eine
> Leutschstofflampe eingeschaltet wird. Ich denke, das Problem ist
> nachvollziehbar.


Versuchs mal mit Entprellen, das hilft nicht nur gegen mechanisches
Prellen, sondern auch gegen andere kurzzeitige Störungen.


Ich glaub, in der Codesammlung mal ne Routine mit 4-fach Abtastung
gesehen zu haben, die soll wohl auch ganz gut sein (irgendwas mit
bulletproof).


Peter