Datum: 12.09.2004 20:14
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
Datum: 12.09.2004 21:27
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
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
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
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?
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!
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 :) )
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
Datum: 25.09.2005 19:00
Ich hab das schon richtig verstanden. Einfach den Pin PB0 berühren. Sonst keinerlei Beschaltung?
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 :)
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
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?
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
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?
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.
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
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
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
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!!!
Datum: 21.01.2006 21:44
achja und wie groß sollte die kläche max. sein?
Datum: 09.03.2006 10:33
Danke für die schnellen Antworten... Werde das mal austesten.. Benrnhard
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?
Datum: 09.08.2006 14:01
Hallo Peter! Ziehmlich interessantes Prinzip. Ist denn das ganze auch mit einem 8051 zu realisieren? (LPC900 genaugenommen)
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
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
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
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
Datum: 08.11.2006 10:03
Hallo Eugen, da bin ich sehr gespannt darauf. Gruß Gerd
Datum: 08.11.2006 13:10
"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
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
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
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
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
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
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.
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
Datum: 10.11.2006 12:54
Hagen, Eugen, macht Euch doch einfach Euren eigenen Thread auf, statt Peters hier zu kapern!
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
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
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
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
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
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
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 :)
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
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
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
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
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!
Datum: 24.11.2006 21:35
Niemand da, der sich mit C auskennt und die Abhänigkeit dieses einen Wertes deuten kann?
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



