Datum:
Angehängte Dateien: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:
Angehängte Dateien: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:
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:
@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:
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:
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:
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:
@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:
Ich hab das schon richtig verstanden. Einfach den Pin PB0 berühren. Sonst keinerlei Beschaltung?
Datum:
OK. Problem gelöst. Asche auf mein Haupt... da hätte ich selbst drauf kommen müssen. Hab wohl das Prinzip verpeilt :)
Datum:
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:
Gibt es eine Möglichkeit, mit dem Verfahren eine Tastertur aufzubauen? Hat es einer geschafft und wie sind die ergebnisse?
Datum:
@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:
Klaro, soll etwar dafür sein nur für Paar tasten und Display. Wie machen die es eigentlich bei einen Touchpanel?
Datum:
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:
@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:
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:
@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:
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:
Danke für die schnellen Antworten... Werde das mal austesten.. Benrnhard
Datum:
@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:
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:
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:
Hallo Eugen, ich interessiere mich für die qprox-Methode. Bist Du mit Deinen Experimenten schon weiter gekommen? Gruß Gerd
Datum:
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:
Angehängte Dateien:"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:
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:
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
Datum:
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:
"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:
Ü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:
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:
"(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:
Hagen, Eugen, macht Euch doch einfach Euren eigenen Thread auf, statt Peters hier zu kapern!
Datum:
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:
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:
Ü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:
"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:
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:
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:
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:
@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:
@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:
Hallo Hagen, ich wäre an deinem angebotenen Source-Code interessiert: gerd.laschinski ät uni-duesseldorf.de Vielen Dank im voraus. Gruß Gerd
Datum:
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:
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:
Niemand da, der sich mit C auskennt und die Abhänigkeit dieses einen Wertes deuten kann?
Datum:
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
Datum:
>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.
Datum:
@ 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 ---
Datum:
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 .
Datum:
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); |
Datum:
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
Datum:
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
Datum:
Ohne Programm wird dir niemand was sagen können ... Meine Idee: Irgend ein Port Register überschrieben?
Datum:
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
Datum:
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.
Datum:
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
Datum:
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?
Datum:
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
Datum:
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
Datum:
Angehängte Dateien: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
Datum:
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.
Datum:
Ohne Kondensator bekomme ich noch ausgefallenere und vor allem zufälligere Werte. Das Programm scheint immer noch nicht so recht zu funktionieren... Bernhard
Datum:
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
Datum:
Angehängte Dateien: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
Datum:
Angehängte Dateien: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.
Datum:
Angehängte Dateien:Hier mal die Aufzeichnung einer Testmessung, bei der ich den Daumen ala IPOD über das Rad gedreht habe.
Datum:
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?
Datum:
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).
Datum:
Der Kondensator ist unkritisch, er soll nur 50Hz abblocken, 330p .. 1nF. Der Widerstand bestimmt die Auflösung, 330k ist o.k.. Peter
Datum:
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 ?
Datum:
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.
Datum:
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
Datum:
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 ?
Datum:
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
Datum:
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.
Datum:
@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... :(
Datum:
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 :)
Datum:
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
Datum:
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
Datum:
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
Datum:
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
Datum:
Du musst den Pin nicht auf high setzten, sondern auf "hochohmigen Eingang" sonst ist die Mühe mit dem Pullup ganz umsonst ;)
Datum:
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
Datum:
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.
Datum:
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
Datum:
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
Datum:
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
Datum:
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
Datum:
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
Datum:
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
Datum:
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
Datum:
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
Datum:
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
Datum:
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.
Datum:
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 :-)
Datum:
Berührungslose Variante? Dann guck mal hier: http://www.microchip.com/stellent/idcplg?IdcServic... Das kann man auch auf den Atmel übertragen.
Datum:
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.
Datum:
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
Datum:
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






