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
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
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
@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
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?
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!
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 :) )
@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
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
@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
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.
@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
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
@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
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!!!
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
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
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
"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
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
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:
1
uint8_t d1 = DDRF & ~(1 << PF0);
2
uint8_t d2 = d1 | (1 << PF0);
3
4
DDRF = d2; // discharge Cs
5
_delay_loop_1(11);
6
DDRF = d1;
7
8
i &= 0x07;
9
uint8_t burst = SensorBurst[i];
10
uint8_t p1 = PORTF & ~(1 << PF0);
11
uint8_t p2 = p1 | (1 << PF0);
12
13
while (1) {
14
DDRE &= ~(1 << PE0);
15
PORTF = p2;
16
DDRF = d2;
17
DDRF = d1;
18
PORTF = p1;
19
DDRE |= (1 << PE0);
20
if (!(--burst)) break;
21
}
22
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:
1
v = ADC;
2
i &= 0x07; // Index der Sensortaste
3
if (v >= 0x200) v |= 0xFC00; // 10 Bit signed in 16 bit signed
4
v = 512 -v;
5
v /= 2;
6
uint8_t calibrate = SensorCalibrate; // Statusflag ob noch kalibriert wird
7
if (calibrate != 0xFF) {
8
uint8_t burst = SensorBurst[i];
9
if (v < 64) {
10
burst++;
11
calibrate = 0;
12
} else if (v > 128) {
13
burst--;
14
calibrate = 0;
15
} else {
16
v += SensorOffset[i];
17
v /= 2;
18
SensorOffset[i] = v;
19
calibrate++;
20
}
21
SensorBurst[i] = burst;
22
SensorCalibrate = calibrate;
23
} else {
24
// reale Sensorauswertung und Umwandlung in Tastenstatus
25
v -= SensorOffset[i];
26
v += SensorSample[i]; // Mitteln mit letztem Wert
27
v /= 2;
28
29
static uint8_t SensorRecalibrate;
30
uint8_t recalibrate = SensorRecalibrate;
31
if ((v < 0) | (v > 255)) { // check limits
32
if (v < 0) v = 0;
33
else v = 255;
34
if (recalibrate >= 252) { // must be recalibrated ?
35
recalibrate = 0;
36
SensorCalibrate = 0;
37
} else {
38
recalibrate += 4;
39
}
40
} else if (recalibrate) {
41
recalibrate--;
42
}
43
SensorRecalibrate = recalibrate;
44
45
// sensor status errechnen, mit Thresholds etc.pp in FSM
46
uint8_t sample = v;
47
uint8_t state = SensorState[i];
48
uint8_t count = SensorCount[i];
49
50
if (state == 0) { // wait for key press
51
if (sample > SENSOR_THRESHOLD_LOW) {
52
state = 1;
53
count = 0;
54
}
55
} else if (state == 1) { // counting up key press, measure speed of keypress
56
if (sample > SensorSample[i]) {
57
if (++count >= 4) {
58
if (sample > SENSOR_THRESHOLD_HIGH) state = 2;
59
else state = 4;
60
count = 0;
61
}
62
} else {
63
state = 4;
64
count = 0;
65
}
66
} else if (state == 2) { // wait delay for key press, debounce
67
if (sample > SENSOR_THRESHOLD_HIGH) {
68
if (++count >= SENSOR_THRESHOLD_ON) {
69
state = 3;
70
count = 0;
71
}
72
} else {
73
state = 4;
74
count = 0;
75
}
76
} else if (state == 3) { // key on
77
if (sample < SENSOR_THRESHOLD_HIGH) {
78
if (++count >= 4) {
79
state = 4;
80
count = 0;
81
}
82
} else {
83
count = 0;
84
}
85
} else if (state == 4) { // wait for stable key off
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
"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
Ü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
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.
"(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
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
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
Ü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
"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
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
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
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-Kochfeld_mit_Touchsensor-Tasten
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 :)
@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
@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
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
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!
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
>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.
@ 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
---
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. ;)
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
.
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
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
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
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
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.
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
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?
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
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
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
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.
Ohne Kondensator bekomme ich noch ausgefallenere und vor allem
zufälligere Werte. Das Programm scheint immer noch nicht so recht zu
funktionieren...
Bernhard
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
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:
1
Time: 14
2
Time: 14
3
Time: 14
4
Time: 14
5
Time: 50 ---- berührt
6
Time: 52
7
Time: 56
8
Time: 54
9
Time: 56
10
Time: 62
11
Time: 14 ---- losgelassen
12
Time: 14
13
Time: 14
14
Time: 14
Funktioniert also astrein.
Anbei das Testprogramm (auf nem T89C51RD2 getestet).
Die LEDs gehen bei 25 an.
Peter
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.
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?
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).
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 ?
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
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 ?
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
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.
@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... :(
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 :)
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
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
Hallo Peter,
vielen Dank für deine schnelle Antwort. Nur damit ich das jetzt richtig
verstanden habe Ghttp://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
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
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.
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
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
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
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:
1
setbit(DDRB,PB0);// set to output
2
clrbit(PORTB,PB0);// discharge
3
asm("nop");
4
asm("nop");
5
asm("nop");
6
asm("nop");
7
cli();
8
clrbit(DDRB,PB0);// set to input
9
temp1=TCNT1;
10
while(bitclr(PINB,PB0));
11
count=TCNT1-temp1;// get charging time
12
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
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
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
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
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
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 :)
1
// globale buffer
2
volatileuint16_tvalues[9];
3
volatileuint16_tbuffer1[9][10];
4
volatileuint8_tbptr1[9];
5
volatileuint16_tbuffer2[9][10];
6
volatileuint8_tbptr2[9];
7
8
uint16_tupdateavg(uint8_tindex,uint16_tvalue)
9
{
10
constuint8_tfir_emphasis_a[10]={1,2,4,2,1,1,1,1};
11
constuint8_tfir_emphasis_b[10]={1,1,1,2,2,2,2,2};
12
13
uint32_ttemp1,temp2;
14
uint8_tcounter;
15
16
// mittelwertbildung, gewichtung neue werte -> 20%
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
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.
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 :-)
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.
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
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