mikrocontroller.net

Forum: Projekte & Code Einfache Sensortaste


Autor: Peter Dannegger (peda)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
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 (peda)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
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:

Bewertung
0 lesenswert
nicht lesenswert
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 (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@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:

Bewertung
0 lesenswert
nicht lesenswert
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:

Bewertung
0 lesenswert
nicht lesenswert
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:

Bewertung
0 lesenswert
nicht lesenswert
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 (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@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:

Bewertung
0 lesenswert
nicht lesenswert
Ich hab das schon richtig verstanden. Einfach den Pin PB0 berühren.
Sonst keinerlei Beschaltung?

Autor: Danilo Reinhardt (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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:

Bewertung
0 lesenswert
nicht lesenswert
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:

Bewertung
0 lesenswert
nicht lesenswert
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:

Bewertung
0 lesenswert
nicht lesenswert
@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:

Bewertung
0 lesenswert
nicht lesenswert
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:

Bewertung
0 lesenswert
nicht lesenswert
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:

Bewertung
0 lesenswert
nicht lesenswert
@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:

Bewertung
0 lesenswert
nicht lesenswert
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:

Bewertung
0 lesenswert
nicht lesenswert
@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:

Bewertung
0 lesenswert
nicht lesenswert
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:

Bewertung
0 lesenswert
nicht lesenswert
achja und wie groß sollte die kläche max. sein?

Autor: Bernhard Reitinger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke für die schnellen Antworten...

Werde das mal austesten..

Benrnhard

Autor: Bartholomäus Steinmayr (sam_vdp)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@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:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Peter! Ziehmlich interessantes Prinzip. Ist denn das ganze auch
mit einem 8051 zu realisieren? (LPC900 genaugenommen)

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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:

Bewertung
0 lesenswert
nicht lesenswert
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:

Bewertung
0 lesenswert
nicht lesenswert
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:

Bewertung
0 lesenswert
nicht lesenswert
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:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Eugen,

da bin ich sehr gespannt darauf.

Gruß
Gerd

Autor: Hagen Re (hagen)
Datum:
Angehängte Dateien:

Bewertung
1 lesenswert
nicht lesenswert
"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:

Bewertung
0 lesenswert
nicht lesenswert
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:

Bewertung
0 lesenswert
nicht lesenswert
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:
      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;

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:
        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;
        }




Gruß Hagen

Autor: Eugen Dischke (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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:

Bewertung
0 lesenswert
nicht lesenswert
"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:

Bewertung
0 lesenswert
nicht lesenswert
Ü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:

Bewertung
0 lesenswert
nicht lesenswert
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:

Bewertung
0 lesenswert
nicht lesenswert
"(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:

Bewertung
0 lesenswert
nicht lesenswert
Hagen, Eugen, macht Euch doch einfach Euren eigenen Thread auf, statt 
Peters hier zu kapern!

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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:

Bewertung
0 lesenswert
nicht lesenswert
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:

Bewertung
0 lesenswert
nicht lesenswert
Ü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:

Bewertung
0 lesenswert
nicht lesenswert
"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:

Bewertung
0 lesenswert
nicht lesenswert
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:

Bewertung
0 lesenswert
nicht lesenswert
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:

Bewertung
0 lesenswert
nicht lesenswert
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:

Bewertung
0 lesenswert
nicht lesenswert
@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:

Bewertung
0 lesenswert
nicht lesenswert
@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:

Bewertung
0 lesenswert
nicht lesenswert
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:

Bewertung
0 lesenswert
nicht lesenswert
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:

Bewertung
0 lesenswert
nicht lesenswert
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:

Bewertung
0 lesenswert
nicht lesenswert
Niemand da, der sich mit C auskennt und die Abhänigkeit dieses einen 
Wertes deuten kann?

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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

Autor: Marco (Gast)
Datum:

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

Kondensatoren sind da überall wo es geht und nötig ist. Das ganze wird 
auch über viel Strom geschaltet. Sprich eine geringe induzierte Leistung 
reicht nicht um den Transistor auf der "Empfängerseite" durchzuschalten.
Nützt aber auch nichts.

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

Ok, ich werde mal suchen. Aber was spricht gegen deine "Erfindung"? So 
müssten die Störungen über 10 Bits in der halbwegs richtigen Zeit und 
Reihenfolge erzeugen um eine Fehlauslösung zu bewirken. Das ist ja schon 
wie Lotto spielen.
Mein Problem ist ja nur die fehlende C-Kentniss. Es stellt sich nur die 
Frage, wofür die eine Programmzeile ist:
>uputs("Test Sensor Key:\n\r");
Ob man die ersatzlos entfernen kann und wie ich das ganze auf 8MHz 
anpasse.

Trotzdem Danke für die Antwort.

Autor: Andreas (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@ Eugen
was ist denn aus Deiner Ankündigung der GPL-Veröffentlichung geworden.

--
ich habe mir das alles jetzt bestimmt 4x durchgelesen und parallel 
fleissig Skizzen gemacht, wie's denn aussehen könnte. Ich muss nur eine 
einzelne Taste realisieren, also ohne Mux - trotzdem bin ich mir nicht 
sicher, ob ich's geschnallt habe.
Könnte nicht mal jemand eine Skizze zu dem, doch offensichtlich 
favorisierten- Qprox-Verfahren einhängen; dann versteht sich's soch 
gleich viel besser ;)

Gruß, Andreas


---

Autor: Stefan (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo...

ich hab' mal versucht, den Ansatz von Hagen umzusetzen, aber der 
gelesene ADC-Wert ändert sich nicht. Einen Mux gibt es in diese Fall 
nicht, da ich erst mal die Grundlagen umsetzten wollte. Nun ist 
Assembler eher meine Sache, so dass ich diesen "simplen" Codeabschnitt 
als willkommene erste Schritte auffasse. Ich poste daher lieber mal den 
Code - nicht dass ich mir da was ganz Dummes eingebaut habe. ;)
int main (void) {
 
   uint8_t d1 = DDRF & ~(1 << PF0);
   uint8_t d2 = d1 | (1 << PF0);
   uint8_t p1 = PORTF & ~(1 << PF0);
   uint8_t p2 = p1 | (1 << PF0);
   uint8_t burst;
   uint16_t  cap;   
   ADMUX  = (1 << REFS1) | (1 << REFS0) | 0x09;
   ADCSRA = (1 << ADEN) | (1 << ADSC) | (1 << ADPS2) | (1 << ADPS1);
   while ( ADCSRA & (1<<ADSC) ); // initiate ADC

   while (1) {
        
       DDRF = d2;  // discharge Cs
       _delay_ms(50);
       DDRF = d1;

       burst = 127;
       while (burst) {
         DDRE  &= ~(1 << PE0);
         PORTF  = p2;
         DDRF   = d2;
         DDRF   = d1;
         PORTF  = p1;
         DDRE  |=  (1 << PE0);
         burst--;
       }
       ADCSRA |= (1 << ADSC); // start conversion
       while ( ADCSRA & (1<<ADSC) );
       cap = ADC; // !! Breakpoint here !!
   }
   return 0;
}
Das läuft momentan auf dem STK501 mit Mega128. Der AREF Jumper ist 
gezogen; gemessen habe ich am STK500 PORTE/AUX-Header-REF 2.73 VDC - 
dieser ist direkt mit 501/PF1 verbunden und über einen 10nF an Masse. 
Der zweite 10nF liegt zwischen 501/PE0 und 501/PF0 - an dem auch die 
Elektrode liegt.

Auf cap = ADC liegt ein Breakpoint, zu dem ich mit F5 in eins 
durchlaufen lasse. Der gemessene ADC-Wert ändert sich jedoch bei 
Annäherung / Berührung nicht und steht ~konstant auf 0x0200 :(


Vielen Dank im Voraus und in der Hoffnung auf konstruktive Hilfe,

Stefan

.

Autor: Stefan (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ich denke, ein Fehler liegt darin, dass ich den ADC nach der ersten 
Initialisierung nicht wieder ausschalte (\ADEN) und daher die 
Portfunktionen zum Umladen nicht greifen. Ich habe jetzt mal
   while ( ADCSRA & (1<<ADSC) ); // initiate ADC

dahingehend -jedoch ohne Erfolg- geändert:
   while ( ADCSRA & (1<<ADSC) ); // initiate ADC
   ADCSRA &= ~(1 << ADEN);

Autor: Linker (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert

Autor: Bernhard (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi,

hat hier jemand das Programm von Peter Dannegger auf einen 8051er 
umgeschrieben und könnte den Programmteil vielleicht zur Verfügung 
stellen?

Ich hab mir bereits selbst etwas überlegt,aber das ist ziemlich unschön 
- und  ich glaub auch kaum das es funktionieren wird.

Bernhard

Autor: Bernhard (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi,

hab mir jetzt das Programm selbst geschrieben - funktioniert ganz gut.
Ein Problem hab ich aber:

Ich hab den 1nF Kondensator auf dem Pin P0.7 des AT89C51 angeschlossen.
Wenn ich jetzt nun auf dem Pin P0.x etwas anderes anschließe(z.B eine 
LED über Vorwiderstand),dann funktioniert es nicht mehr.
Wenn ich die LED aber auf nen anderen Pin (z.B P3.x) anschließe,dann 
funktioniert das Programm wieder.

Was könnte das sein?

Bernhard

Autor: Hauke Radtki (lafkaschar) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ohne Programm wird dir niemand was sagen können ...
Meine Idee: Irgend ein Port Register überschrieben?

Autor: Bernhard (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hier mein C - Programm.


Bernhard

Autor: Bernhard (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Keiner eine Idee?

Bernhard

Autor: Bernhard (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi,

ich sollte mich echt mal anmelden,damit ich die Beiträge editieren kann.
Ich entschuldige mich schon mal im Vorraus für den Triple-Post.

Ich hab jetzt nämlich einen verdammt komischen Effekt entdeckt - also 
noch viel,viel komischer als der oben beschriebene....

Ich hab hier auf der µC Testschaltung eine Buchsenleiste angelötet.
Neben den verschiedenen Port-Pins hab ich auch noch die Möglichkeit +5V 
und Masse abzugreifen.

Wenn an dieser Buchsenleiste nichts außer dem Sensor angeschlossen 
ist,dann bekomme ich im Terminal ununterbrochen die Messwerte serviert.

Schließe ich aber an irgendeinen anderen Port(egal ob +5V,Masse oder ein 
Port-Pin) etwas an,dann bekomme ich nicht mehr andauernd und 
ununterbrochen einen Messwert sondern es fängt zum "Hackeln" an. Sprich 
es kommt 5s lang ununterbrochen ein Messwert und dann 2s lang wieder 
überhaupt nichts.

Wenn hier jemand eine Idee hat was an dem Programm falsch läuft,dann 
bitte ich mir Hilfe zu leisten.
Ansonsten bleibt mir wohl nur die Möglichkeit übrig eine andere Methode 
des kap. Sensors zu suchen.

Bernhard

Autor: Hauke Radtki (lafkaschar) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Klingt irgendwie nicht nach Programm sondern eher nach Hardware ... 
wackelkontakt? Wenn du die Messmethode so implementiert hast wie ich, 
dann wartet der controller solange ein High signal am Port liegt, wenn 
also aus irgend einem grund VCC auf dem eingang liegt, hängt das 
Programm.

Autor: Bernhard (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi,

ich möchte einen Hardwarefehler nicht ausschließen,jedoch muss ich auch 
sagen,dass mir bisher mit dem aufgebauten Testboard noch keine Probleme 
untergekommen sind.
Hast du vielleicht einen Sourcecode von deiner Implentierung bei der 
Hand,oder ist der auch AVR - bezogen?

Bernhard

Autor: Hauke Radtki (lafkaschar) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Meiner ist leider auch für nen AVR (Tiny13) und dazu noch in Assembler 
(bei dem kleinen auch kein Wunder ;) )

Ich muss mich noch korregieren: Der Controller hängt solange ein LOW 
Signal anliegt.

Aber das Prinzip ist ja einfach: Entlade einen Kondensator und miss dann 
die Zeit bis er sich wieder über einen WIderstand aufgeladen hat.

Hast du vielleicht auf den Pins irgendwelche Interrupts oder sonstiges 
die deinen Controller aus dem Tritt bringen?

Autor: Bernhard (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Also ich hab die Hardware so aufgebaut:

Port Pin P0.7 --> 1nF Kondensator --> 1 Drahtstückchen(das dient als 
Sensor,das geht doch - oder?)

Das ist alles was an Ports belegt ist. In dieser Konfiguration sehe ich 
schön,dass wenn ich auf das Drahtende mit dem Finger greife die 
Aufladezeit größer wird.

Wenn ich aber nun ein Stückchen Draht nehme und das eine Drahtende in 
die Buchsenleiste stecke,die mit Masse verbunden ist,und das andere 
Drahtende frei in der Luft hängen lasse dann bekomme ich den oben 
beschriebenen Effekt das ich öfters zwischendurch keinen Messwert 
bekomme.
Entferne ich das Stückchen Draht wieder,dann funktioniert es wieder.

Wenn ich mich bei dem Setzen der verschiedenen Flags nicht vertan 
habe,dann hab ich im Prinzip nur zwei Interrupts. Einmal den für den 
UART und dann den für den Timer0(für die Messung der Aufladezeit).



Bernhard

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Bernhard wrote:
> Also ich hab die Hardware so aufgebaut:
>
> Port Pin P0.7 --> 1nF Kondensator --> 1 Drahtstückchen(das dient als
> Sensor,das geht doch - oder?)
>
> Das ist alles was an Ports belegt ist.

Dann ist die Sache ja klar, der 8051 hat keine zuschaltbaren Pullups.
Da muß also noch ein Widerstand gegen VVC ran (z.B. 1M).


Und dann muß der Kondensater richtig entladen werden, d.h. eine 
bestimmte Zeit lang, z.B. 100µs).
Wie das Programm jetzt ist, lädst Du nur zwischen den Triggerschwellen 
(hat der 8051 überhaupt ne Hysterese?) um, was nur schwer verwertbare 
kurze Zeiten ergibt.
Für die Zeitmessung brauchst Du auch keinen Timerinterrupt, der 
Zählumfang des Timers reicht dicke aus.

Du hast bisher wohl nur auf das 50Hz Netzbrummen reagiert, daher die 
große Abhängigkeit von anderen angeschlossenen Sachen.


Und was soll der leere UART-Interrupt?
Wenn Du pollst, ist ein Interrupt Blödsinn.


Peter

Autor: Bernhard (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hi,

die Hardware sieht nun so aus:

5V --> 100kOhm Widerstand --> P0.7 --> 1nF Kondensator --> 1 
Drahtstückchen

Ich habe versucht möglichst alle Änderungen von Dir zu übernehmen.

Im Anhang hab ich das überarbeitete Programm.

Jetzt ist es so,dass ich bei jedem Reset einen Messwert ins Terminal 
gesendet bekomme.

Ich bekomme den Messwert 4 - 6 wenn das Drahtstück frei in der Luft 
hängt.
Wenn ich das Drähtchen fest berühre,dann bekomme ich 8 - 10(Manchmal 
sogar Werte die über 100 springen).

Aber irgendwie kommt mir das noch immer komisch vor,was meint ihr?

Bernhard

Autor: Hauke Radtki (lafkaschar) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Eigentlich baut man garkeinen Kondensator extra ein, du selbst bist der 
Kondensator wenn du das ding anpackst, so kann man höhere auflösungen 
erzielen.

Autor: Bernhard (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ohne Kondensator bekomme ich noch ausgefallenere und vor allem 
zufälligere Werte. Das Programm scheint immer noch nicht so recht zu 
funktionieren...

Bernhard

Autor: Bernhard (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi,

ich will ja nicht nerven,aber dieses Problem beschäftigt mich schon 
sehr,da ich schon sehr viel Zeit in dieses Programm gesteckt habe(für 
viele Leute wahrscheinlich ein Kinderspiel - aber ich bin noch 
Anfänger).
Das Problem ist ich weiß momentan nicht wirklich ob ich eher den Fehler 
im Programm suchen soll,oder ob doch der Hund in der Schaltung begraben 
ist...
Derzeit bekomme ich total unterschiedliche Messwerte,die zwischen 50 und 
220 liegen(wenn ich das Drahtende nicht berühre).

Bernhard

Autor: Peter Dannegger (peda)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Bernhard wrote:
> 5V --> 100kOhm Widerstand --> P0.7 --> 1nF Kondensator --> 1
> Drahtstückchen

100k könnte etwas klein sein, die 8051 haben ja TTL-Pegel und nicht 
VCC/2 wie die AVRs.
Ich hab mal 1M und 220pF genommen, da komme ich auf folgende Zeiten bei 
11MHz:

Time: 14
Time: 14
Time: 14
Time: 14
Time: 50 ---- berührt
Time: 52
Time: 56
Time: 54
Time: 56
Time: 62
Time: 14 ---- losgelassen
Time: 14
Time: 14
Time: 14

Funktioniert also astrein.

Anbei das Testprogramm (auf nem T89C51RD2 getestet).
Die LEDs gehen bei 25 an.


Peter

Autor: Andreas W. (theslow)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Ich habe dieses Projekt grade mit dem Layout für das Touchwheel von 
Quantum (http://www.qprox.com/) verbunden.

Damit ich trotz drei Sensorflächen die Messung nicht Pollen muss hab ich 
die Input Capture Unit mit dem Analogkomparator verbunden. Dessen 
positiver Eingang wurde mit der internen Bandgap-Referenz verschaltet, 
der negative mit dem Multiplexer des AD-Wandlers. So ist es möglich bis 
zu 8 Kanäle mit dem mega8 Auszuwerten.

Die Sensorflächen wurden jeweils mit 1nF entkoppelt, und mit einem 
22MOhm Widerstand aufgeladen.

Die Messung geschieht zyklisch im Timer1 CompareA-Interrupt. Das 
Compareregister ist mit 8192 vorgeladen. Bei 4MHz Taktfequenz resultiert 
eine Abtastrate von rund 488Hz. Es werden 8 mal die je drei Werte 
gelesen und dann einmal gemittelt. So entsteht eine effektive Abtastrate 
von etwa 20Hz.

Die gemittelten Werte werden mit 19200 BAUD über die Serielle 
Schnittstelle gesendet.

Autor: Andreas W. (theslow)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hier mal die Aufzeichnung einer Testmessung, bei der ich den Daumen ala 
IPOD über das Rad gedreht habe.

Autor: Andreas W. (theslow)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Und zu guter letzt das AVR-Studio Projekt.

Autor: No Name (nohelp)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Mal 'ne Frage zur Dimensionierung von Widerstand und Kondensator. Ich 
plane diese Sensortasten in einer 3 Volt Umgebung (Batterie) mit einem 
AVR zu betreiben. So ganz werde ich aus den Beiträgen noch nicht schlau. 
Ist ein größerer Wert für C und R nun besser oder eher schlechter? Sind 
330K und 330pF passable Werte?

Autor: Hauke Radtki (lafkaschar) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Je größer R*C, desto hochauflösender kannst du messen (weil sich die 
Zeit verlängert, die der Kondensator braucht um sich über die 
High-Schwelle des AVR-Eingangs aufzuladen, größer wird).

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Der Kondensator ist unkritisch, er soll nur 50Hz abblocken, 330p .. 1nF.
Der Widerstand bestimmt die Auflösung, 330k ist o.k..


Peter

Autor: Condor (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Leute

ich habe das mit der Sensortate jetzt auch versucht.

+5V ------- 1M ------- PB0 -------- Gehäuse

ich lade den Pin mit GND und zähle so lange bis der Pin 1 wird.
erster Aufbau und mit schaltwert 30 ( 4MHz ) sofort funktioniert.

nur wen ich das ganze in mit einem SNT oder Batterie betreibe geht es 
nicht mehr.
wen ich GND an PE lege geht wider alles wie gewohnt.

ich habe auch schon mit den werten gespielt aber der Unterschied berührt 
und nicht Berührt ist 0....

hat mir jemand einen Tip was ich da falsch mache ?

Autor: was-willst-du (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Was heißt das ?

>ich lade den Pin mit GND

Autor: Condor (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das heißt ich schalte PB0 als Ausgang und schreibe eine 0 an PB0.
danach wieder als Eingang und warten bis PB0 logisch 1 wird.

Autor: was-willst-du (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke!

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Condor wrote:
> nur wen ich das ganze in mit einem SNT oder Batterie betreibe geht es
> nicht mehr.

Wie groß ist denn die Sensorfläche und wie groß ist die mit GND 
verbundene Fläche?

Beide müssen einen Kondensator bilden, dessen Kapazität sich durch 
Annähern an die Sensorfläche ändert.


Peter

Autor: Condor (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Die Sensorfläche ist das ganze Gehäuse. ( aufgefaltet ca.15X15 cm Blech 
)
GND ist das was auf der Platine GND ist.
Du meinst das meine GND Fläche zu klein ist ?

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Condor wrote:
> Die Sensorfläche ist das ganze Gehäuse. ( aufgefaltet ca.15X15 cm Blech
> )

Sowas nennt sich ein Faradayscher Käfig.
Wie soll sich denn im Innern die Kapazität ändern ???


> GND ist das was auf der Platine GND ist.
> Du meinst das meine GND Fläche zu klein ist ?

Solange sie nicht außerhalb des Faradayschen Käfig ist, ist die Größe 
egal, es kann nicht funktionieren.


Peter

Autor: Condor (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Also bleibt mir nur der Trick mit der Erdung an GND damit ich genügend 
masse habe oder ?

außerdem ist das Gehäuse nicht wirklich Faradayscher Käfig.
es ist eigentlich nur ein U die offene Seite unten ist mit PVC zu und 
links und rechts mit Holz.

Autor: Markus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@theslow,

könntest du mal genauer erklären wie du die Sache mit der internen 
Verschaltung mit dem Komparator usw gemacht hast, ist das eine 
"Softwaresache"? Ein kleiner Plan wäre nicht schlecht damit man sich das 
vorstellen kann.
Sorry bin noch anfänger... :(

Autor: Thomas B. (yahp) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Markus wrote:
> @theslow,
>
> könntest du mal genauer erklären wie du die Sache mit der internen
> Verschaltung mit dem Komparator usw gemacht hast, ist das eine
> "Softwaresache"? Ein kleiner Plan wäre nicht schlecht damit man sich das
> vorstellen kann.
> Sorry bin noch anfänger... :(

Das wird tatsächlich alles in Software gemacht. Ich fand es auch 
faszinierend, als ich das mal im Datenblatt so nachvollzogen habe. 
Ziemlich praktisch der Einfall :)

Autor: Toni B. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Guten Abend zusammen,

sry dass ich diesen alten Thread nochmal auskrabe.
Ich versuche die ursprüngliche Idee von Peter hier auf einem PIC32 zum 
laufen zu bewegen. Zuerst mal die Frage hab ich das so richtig 
verstanden und aufgebaut: 
http://toflo.homeunix.org/~toni.burger/temp/kap_taste.png
PC7 wird vom Timer abwechselnd auf high und low gesetzt. PC1 ist auf 
Eingang geschaltet (hier eigentlich den internen Pullup aktivieren oder 
nicht? denke mal nicht oder?) ... sobald der Timer nun den PIN auf high 
gesetzt hat läuft eine Schleife solange durch bis an PC1 ein high 
erkannt wird, und zählt dabei eine variable hoch. Als Ladewiderstand 
habe ich schon einges zwischen 200kOhm und 3MOhm ausprobiert.
Soweit scheint das auch zu funktionieren ... stecke ich einen richtigen 
kondensator anstatt der sensorfläche an, geht die Zählervariable bis 
8000 oder so. Nur mit der Sensorfläche gehts knapp bis 17. Das 
wesentlcihe Problem sit dass die Änderung minimal ist wenn man den 
sensor berührt. so 2-3 Schleifendurchläufe mehr. (aber auch nicht 
immer). Zumal der PIC32 mit knapp 74Mhz läuft hätte ich schon etwas mehr 
erwartet wenn hier mit 8Mhz schon größere Änderungen erzielt werden.
Hab ich bei der Beschaltung doch was falsch verstanden? Muss ich 
irgendwas besonderes beim INPUT pin beachten? Im Datenblatt steht dass 
der entweder nen schmitt-trigger vorgeschaltet hat oder nen TTL-Buffer. 
(Bisher hab ich noch nicht rausgefunden wie man was aktiviert ;-) viell. 
weiß es hier jemand ;-) ).

Schönen Abend noch.

Toni

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Toni B. wrote:

> http://toflo.homeunix.org/~toni.burger/temp/kap_taste.png
> PC7 wird vom Timer abwechselnd auf high und low gesetzt.

Nein, es darf nur ein Pin verwendet werden.
Erstmal wird dieser eine konstante Zeit auf Ausgang low gesetzt, um die 
Sensorkapazität sicher zu entladen.
Dann wird er Eingang, entweder mit internem Pullup oder externem 
(empfindlicher) und die Zeit bis high gemessen.


Peter

Autor: Toni B. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Peter,

vielen Dank für deine schnelle Antwort. Nur damit ich das jetzt richtig 
verstanden habe G 
http://toflo.homeunix.org/~toni.burger/temp/kap_taste_2.png << simmts so 
nun? interner Pullup ist aus.

Im Timerinterrupt entlade / lade ich den Pin. Da spätere mehrere Tasten 
verwendet werden sollen würd ich das gerne mit der Polling Methode 
machen. Jetzt ist mir nur etwas unklar ... wenn ich den Pin auf Ausgang 
+ High setzte damit der kodensator geladen wird, kann ich doch nicht 
gleichzeitig davon lesen um zu schauen ob er schon high ist? Oder doch? 
Welches Register liest man dafür beim AVR? ... dann finde ich viell. 
etwas ähnliches beim PIC.

Der grobe Programmablauf also:

Pin auf Ausgang Low setzten, um den Kondensator entladen zu lassen
Einige Zeit warten, da er ja auch über denn "Pullup" entladen wird.
Dann den Pin auf HIGH setzten
Jetzt eine Schleife laufen lassen die solange eine Variable hochzählt 
bis ein High erkannt wird (Hier ist mir noch unklar wie ich das abfrage)

Toni

Autor: Toni B. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ehm ok :) viel mit pullup hat das oben nicht zu tun G

http://toflo.homeunix.org/~toni.burger/temp/kap_taste_3.png so besser? 
:)

Toni

Autor: Hauke Radtki (lafkaschar) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Du musst den Pin nicht auf high setzten, sondern auf "hochohmigen 
Eingang" sonst ist die Mühe mit dem Pullup ganz umsonst ;)

Autor: gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
wie zuverlässig klappt das bei euch ? und wie schnell ca?
ich nutze einen normalen portpin und  leider keinen INT.

ablauf:
im timerinterupt wird der PIN erst als ausgang und auf LOW geschalten
dann auf eingang im TRIstate

extern ist ein 100Kohm zu VCC
kondensatorplatten 2stk je 1 x 2cm

es wird nun der PIN abgefragt
wird der PIN gesetzt,  wird der timerwert in eine variable geschrieben

das ganze wird auch erkannt .. schwankt aber recht stark
natürlich ist die methode ohne INT pin nicht ideal
sollte aber jedoch gehen


ich wollte vlt mit dieser methode ein "rad" bauen
also als eine art finger-encoder

Autor: Hauke Radtki (lafkaschar) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hmm ich mach das komplett in Software, indem ich die Schleifendurchläufe 
zähle. Also ganz ohne Timer. Ist aber auch auf nem Tiny, der nix anderes 
zu tun hat als eben die Taste abzufragen und n paar LEDs zu blinken ;)

Ich würde einfach mal mehr als die 100kOhm nehmen, das sollte schon was 
bringen um die Auflösung zu erhöhen.

Autor: Toni B. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Vielen Dank für euere Hilfe :). Mittlerweile funktioniert es. Als Pullup 
habe ich jetzt 1Mohm verwendet, damit lässt sich eine Sensorberührung 
durch die Platine + 2x 2mm dicke Glasplatten sicher erkennen. Bei 3 
Glasplatten wirds dann langsam ungenau.
Viell. hab ich auch mal noch die Möglichkeit die zweite hier diskutierte 
Methode auszuprobieren :). Hört sich auch ganz interessant an.

Toni

Autor: gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hi

ich habe grade gefunden das atmel selbst eine appnote dazu hat inkl 
einer lib
da sind die ganzen sachen von den quantum teilen drin
also Qtouch / qmatrix Qwheel usw

#ansonst hab ich es auch so halb zum laufen bekommen

Autor: gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert

Autor: TOO0M (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ich habe den beitrag über die sensortaste mit interresse verfolgt.
die frage die sich mir stellt, ob es möglich ist eine sensortaste
in einem attiny85 zu realisieren der im stromsparmodus arbeitet.
das heisst wenn keine taste betätigt wird schaltet der attiny85 in den 
power_down modus. wird die taste betätigt muss der attiny85 über einen
externen interrupt aufwachen und z.b. eine led für 1 minute einschalten.
danach wird die led wieder ausgeschaltet, oder wenn zwischenzeitlich
nochmal die taste getrückt wird soll die einschaltzeit der led 
verlängert
werden (so eine art Treppenhauslicht).
bis jetzt läuft die schaltung mit einem mechanischen taster.
besteht die aussicht so etwas mit einer sensortaste zu realisieren.

mfg. too0m

Autor: Bernhard (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo!

Habe eine Leiterplatte mit mehreren Sensortasten mit inspiration von 
Peters Vorschlag nachgebaut (an der Stelle vielen Dank!):

Am PB0 hängt ein 1M an +5V und nach einem 1n Kondensator gehts auf die 
Sensortaste.
Die Auswertung mache ich wie folgt:

setbit(DDRB, PB0);   // set to output
clrbit(PORTB, PB0);  // discharge
asm("nop");
asm("nop");
asm("nop");
asm("nop");
cli();
  clrbit(DDRB, PB0);   // set to input
  temp1 = TCNT1;
  while (bitclr(PINB, PB0));
  count = TCNT1 - temp1;    // get charging time
sei();

Bei der Auswertung stoße ich nur auf kleine Probleme und hoffe das ich 
von Euch ein paar Tipps bekomme wie man das eventuell besser machen 
kann.

Derzeit wird das Ergebnis über ein paar Messungen gemittelt und mit 
einem festen Schwellenwert verglichen. Leider ist durch Umwelteinflüsse 
oder Wahl des Materials vor der Sensortaste der Schwellenwert 
unterschiedlich sodaß die Tasten teils von selbst ausgwlöst werden.

Um das Problem zu lösen dachte ich den Ruhezustand der Taste über einen 
längeren Zeitraum zu ermitteln und den dann mit dem über kurzen Zeitraum 
ermittelten Wert zu vergleichen. Ist das Delta über einem bestimmten 
Schwellenwert ist die Taste gedrückt. Dieser letzte Schwellenwert 
bestimmt dann die Empfindlichkeit der Taste und ist quasi fest.

Würdet ihr das auch so machen oder gibt es eventuell eine bessere 
Möglichkeit n selbstkalibrierende Sensortasten zu "programmieren" ?

Am besten wäre natürlich wenn man damit auch ermitteln kann wie lange 
die Taste gedrückt wurde.

Grüße an Alle!

Bernhard

Autor: Bernhard (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Update:

Mittlerweile hat sich meine Testsoftware etwas gewandelt. Die 
Messwerterfassung ist gleich geblieben, jedoch bilde ich zuerst einen 
gleitenden Mittelwert mit einer Gewichtung von 20% für den neuen 
Messwert.
Das Ergebnis gebe ich dann in je einen Ganzzahl FIR-Filter mit einem 
Schleppspeicher von 10 Messwerten.
Die Gewichtung der Messwerte ist jedoch je Filter unterschiedlich. Aus 
der Differenz der beiden Ergebnisse kann ich den Zustand der Taste 
ermitteln.

Ich frage mich aber nach wie vor ob ich damit auf dem richtigen Weg bin 
oder ob ich zu kompliziert denke und es eine einfachere Möglichkeit gibt 
die Tasten auszuwerten.

Vor ein Problem stellt mich derzeit noch die Frage ob es damit möglich 
ist festzustellen ob eine Taste lang oder kurz gedrückt wurde..

Beste Grüße,

Bernhard

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Eine automatische Kalibration halte ich für sinnvoll.

Das war ja nur eine Testsoftware, die ich wegen grottenschlechter 
Ergonomie nicht weiter verfolgt habe.
Sensortasten sollte man wirklich nur dann nehmen, wenn es wirklich 
absolut garnicht anders geht.


Ich habe mir z.B. nen LG W2600 gekauft, der hat leider auch 
Sensortasten.
Man hat überhaupt kein Feedback und vertippt sich daher ständig.
Fazit, die sind unbedienbar.
Ich stelle ihn daher nur über das Desktoptool (LG forteManager) ein, das 
ist benutzbar. Aber unter Linux hätte ich warscheinlich schlechte 
Karten.


Peter

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ein Bastler denkt, eine Taste, die erstmal nicht als solche erkennbar 
ist, ist schick.

Aber ein Benutzer findet eine Taste, die sofort als Taste erkennbar ist, 
und auch ordentlich Hub hat und ordentlich klickt, tausendmal schicker.


Peter

Autor: Hauke Radtki (lafkaschar) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich würde die selbstkalibrierung über einen Tiefpass in software machen, 
also einfach über eine sehr lang Zeit Mitteln, also über stunden.

Evtl mit schnellerer Autokalibrierung beim ersten einschalten, damit es 
nicht ettliche stunden dauert bis sich der richtige Mittelwert 
eingestellt hat

Autor: Bernhard (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke für Eure Antworten!

@Peter:

Die Rückmeldung habe ich durch LED's in der Mitte der Taste realisiert 
die bei Aktivierung der Sensortaste angehen. Somit kann ich auch 
feststellen ob meine Auswertung einigermaßen funktioniert.
Induktionsherde von Siemens haben z.B. auch solch ähnliche Sensortasten 
die aber m.E. auf Infrarotbasis funktionieren.

Über Ergonomie lässt sich streiten :) Ein paar Freude fanden die 
Sensortasten jedenfalls sehr angenehm und "stylisch", v.a. wenn man sich 
vorstellt diese hinter einer dünnen Rauchglasscheibe zu platzieren. Die 
Empfindlichkeit ist übrigens in der Tat sehr gut, hätte ich nicht 
gedacht das man so geringe Kapazitätsunterschiede mit dem AVR ordentlich 
messen kann.
Wenn es trotzdem nicht reichen sollte, muss ich die Tasten mehr 
Oberfläche spendieren.


@Hauke:

Ich verwende hier einen Mega48 der nur 1K Speicher hat.
Daher ist im FIR-Filter kein so großer Schleppspeicher möglich.

Hier ist mal meine Auswerteroutine die für jede Taste (index) aufgerufen 
wird und per "value" den Messwert übergeben bekommt.
Vielleicht kann man das ja noch optimieren :)
// globale buffer
volatile uint16_t  values[9];
volatile uint16_t  buffer1[9][10];
volatile uint8_t   bptr1[9];
volatile uint16_t  buffer2[9][10];
volatile uint8_t   bptr2[9];

uint16_t updateavg(uint8_t index, uint16_t value)
{
  const uint8_t fir_emphasis_a[10] = {1, 2, 4, 2, 1, 1, 1, 1};
  const uint8_t fir_emphasis_b[10] = {1, 1, 1, 2, 2, 2, 2, 2};

  uint32_t temp1, temp2;
  uint8_t counter;

  // mittelwertbildung, gewichtung neue werte -> 20%
  values[index] = (80 * values[index] + 20 * value) / 100;
  value = values[index];


  // FIR filter
  buffer1[index][bptr1[index]++] = value;
  buffer2[index][bptr2[index]++] = value;

  if (bptr1[index] == 10)
    bptr1[index] = bptr2[index] = 0;

  temp1 = temp2 = 0;

  for (counter = 0; counter < 10; counter++)
  {
    temp1 += buffer1[index][counter] * fir_emphasis_a[counter];
    temp2 += buffer2[index][counter] * fir_emphasis_b[counter];
  }

  return temp1 - temp2;
}



Was ich auch schon geprüft hatte war die Mittelwertbildung zwei Mal zu 
machen, einmal mit einer kleinen Gewichtung für den Langzeitwert und 
einmal mit höherer Gewichtung für den Kurzzeitwert.

Es scheint jedoch nur so zu sein das es ab und zu schon gewaltige 
Ausreißer in den Messwerten gibt die dann eine unbeabsichtige Auslösung 
der Taste verursachen. Leider hatte ich bei dem Board keine Möglichkeit 
den UART rauszuführen um das mal genauer "anschauen" zu können.
Ich muss mich wohl durch geschichte Optimierung der Auswertung 
herantasten.

Grüße,

Bernhard

Autor: Hauke Radtki (lafkaschar) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Naja FIR Filter ist glaub ich hier etwas mit Kanonen auf Spatzen.

Als Vergleichswert würde ich einfach einen Mittelwert nehmen der über 
längere Zeit läuft z.b. über ne halbe Stunde. Dafür braucht man auch 
nicht viel Speicher man kann z.b. den Mittelwert über 16 Werte nehmen, 
aber niemand hat gesagt, dass man jeden Wert den man ausliest auch 
gleich übernehmen muss. Man könnte z.b. eine art Supersampling anwenden, 
oder einen Schnellen Mittelwert und den ausgang davon für den Langsamen 
heranziehen, so spaart man speicher (benötigt z.b. 2 buffer a 16 Byte) 
hat aber das gleiche ergebnis wie ein 256byte langer schneller 
mittelwertspeicher.

Autor: Marc (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi Leute!

Auch ich wollte mal Peters Variante probieren! Läuft auf nem ATmega32-16 
auch soweit. Nur bekomme ich erst Werteänderungen wenn ich den Pin 
direkt berühre. Benötigt wird aber eine berührungslose Funktion.

Wie sollte denn eine gute Sensoranordnung aussehen?


PS: Wers genau wissen will: ich möchte bei der Modellbahn die Achsen 
zählen. D.h. ich kann keine großen Platten oder so verwenden.



MfG Marc  :-)

Autor: Gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Berührungslose Variante? Dann guck mal hier:
http://www.microchip.com/stellent/idcplg?IdcServic...
Das kann man auch auf den Atmel übertragen.

Autor: Christian Busch (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich muss mal wieder auskramen, da ich schon beim Compilieren/Linken des 
Codes in Post 1 Probleme habe. Ich compiliere mit WinAVR. Die 
Headerdateienpfade hab ich schon angepasst, die makefile selber 
geschrieben.

Kann jemand die Makefile für das Projekt uploaden? Wäre sehr nett.

Autor: PORT-CS (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert

Autor: Lutz Koppe (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi Peter,


habt ihr davon auch eine aktuellen Schaltplan? Ich bin im allgemeinem 
sehr neu auf diesem Gebiet (AVR usw)
Falls es schon fertige Codes und Pläne gibt freue ich mich wenn du mir 
sie zu senden könntest.

Danke


LG Lutz

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das hier ist besser:

Beitrag "Re: qtouch - sekt oder selters"


Peter

Autor: Sebi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hallo allerseits, ich würde gerne ein touch wheel vervirklichen und 
wollte mal fragen ob irgendjemand ein layout zur verfügung stellen 
könnte...
habe hier nur eine datei gefunden wo schon die fertigen gerberdaten 
vorhanden waren.... wäre echt super
schönen gruß sebi

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.