Forum: Mikrocontroller und Digitale Elektronik Feine Analog-Tastatur


von Georg B. (diereinegier)


Lesenswert?

Ich habe mir eine feine 4x4 Tastatur gekauft, die nur einen Eingangspin 
benötigt:

http://www.wvshare.com/product/A_D-Keypad.htm

Solange keine Taste gedrückt ist liegt der Pin auf 5V (bzw. VCC). Bei 
einer gedrückten Taste liegt die Spannung unter 4.8 V. Das kann man 
schön pollen und zuverlässig umwandeln.

Wenn ich den Pin A0 benutze und einen Pin Change Interrupt bekomme ich 
nur die obere Tastaturhälfte, bei der die Spannung unter 2,5 V fällt - 
"natürlich!" werdet Ihr sagen. Ich war zugegebenermaßen überrascht.

Nun also die Preisfrage: wie läßt sich (vielleicht mit geschicktem 
Umschalten zwischen ADComparator und ADConverter) etwas bauen, das bei 
unter 4.8 V triggert aber dann trotzdem die Analog-Digital-Wandlung 
nicht stört?

Ist ein Spannungsteiler, der die Spannung aus der Tastatur halbiert, die 
einzige einfache Möglichkeit?

Müßte dann so 1,6 MOhm sein...

: Verschoben durch User
von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Wie wäre es, wenn du gar nicht auf einen Interrupt setzt, sondern 
einfach die Spannung am Pin per ADC zyklisch abfrägst? Dann ist es 
einfach, zu erkennen, ob eine Taste gedrückt ist...

von RomanK (Gast)


Lesenswert?

Hallo Georg,

warum studiert Du nicht das Beispiel auf der von Dir verlinkten 
Webseite.
Dort steht alles, aber auch alles, was Du wissen musst. Es gibt sogar 
ein gutes Beipiel, wenn auch für den anspruchsvollen ST32F..., das Dir 
die notwendigen Schritte vorgibt.

Gruß

Roman

von Peter D. (peda)


Lesenswert?


von Georg B. (diereinegier)


Lesenswert?

Hallo Roman,

die Web-Seite habe ich gelesen und natürlich habe ich das auch schon 
längst ausprobiert: Pollen geht. Das wollte ich auch mit dem ersten 
Absatz meines Postings gesagt haben.

Ich möchte die Tastatur aber in meinem Projekt "Taschenrechner", naja, 
eher "Tischrechner", einsetzen. Und der Rechner soll zwischen den 
Tastendrücken schlafen, wenn er nicht gerade rechnet.

Deshalb möchte ich auch mit der Analogtastatur einen Interrupt auslösen, 
der den Rechner weckt.

Vielleicht durch Vergleichen der Eingangsspannung mit 4.8V? Leider kann 
man auf dem ATmega328 nur entweder den Vergleicher oder den AD-Wandler 
benutzen. Ich habe versucht, in der Interrupt-Routine umzuschalten, aber 
wahrscheinlich habe ich das falsch gemacht oder nicht lange genug 
gewartet - wie auch immer: ich lese nur Müll mit analogRead(), aber 
vielleicht darf ich diese Routine im Interrupt gar nicht benutzen?

Statt blödsinnig alles Mögliche(TM) auszuprobieren, frage ich lieber mal 
die Gemeinde.

Gruß
Georg

von (prx) A. K. (prx)


Lesenswert?

Georg Bisseling schrieb:
> Deshalb möchte ich auch mit der Analogtastatur einen Interrupt auslösen,
> der den Rechner weckt.

Wär natürlich nützlich, die Schaltung der Tastatur zu kennen. Aber wenn 
ich mal annehme, dass jede Tastatur einen Widerstand gegen GND schaltet 
und für alle zusammen ein Pullup gegen VCC existiert, dann geht das 
schon - wenn andersrum, dann bitte im Geiste wenden.

"VCC" Anschluss über Widerstand an VCC. So dimensioniert, dass die Taste 
mit der höchsten Spannung maximal 40% von VCC liefert. Ohne Taste gibts 
100% von VCC, mit einer Taste maximal 40%. Die Spannungswerte der Tasten 
sind dann nicht mehr linear, aber das sollte nicht stören.

Wenn es doch stört: "VCC" Anschluss zusätzlich an einen 2. I/O-Pin 
hängen. Im Ruhezustand ist der offen/Eingang. Gibt prima Interrupt. Für 
Identifikation der Taste diesen Pin als Ausgang "high" schalten. Gibt 
dann normale Spannungswerte.

: Bearbeitet durch User
von Peter D. (peda)


Lesenswert?

Georg Bisseling schrieb:
> Und der Rechner soll zwischen den
> Tastendrücken schlafen, wenn er nicht gerade rechnet.

Wie tief und warum?
Bei einem Tischrechner mit Netzteil ist es egal, ob man 5mW einspart.

von RomanK (Gast)


Lesenswert?

Hallo Georg,

nun haben wir ja ein paar Informationen zur CPU usw.. Du könntest einen 
analogen Komparator vorschalten der einen Interrupt auslöst sobald die 
Spannung unter 5Volt fällt.  Ist aber nur der Schönheit wegen, siehe 
PeDa's Ausführungen zum Leistungsbedarf.

Gruß

Roman

von Georg B. (diereinegier)


Lesenswert?

A. K. schrieb:
> "VCC" Anschluss über Widerstand an VCC. So dimensioniert, dass die Taste
> mit der höchsten Spannung maximal 40% von VCC liefert. Ohne Taste gibts
> 100% von VCC, mit einer Taste maximal 40%. Die Spannungswerte der Tasten
> sind dann nicht mehr linear, aber das sollte nicht stören.

Ja, das meinte ich mit dem Stichwort Spannungsteiler. Das werde ich mal 
probieren.

von Georg B. (diereinegier)


Lesenswert?

RomanK schrieb:
> Hallo Georg,
>
> nun haben wir ja ein paar Informationen zur CPU usw.. Du könntest einen
> analogen Komparator vorschalten der einen Interrupt auslöst sobald die
> Spannung unter 5Volt fällt.  Ist aber nur der Schönheit wegen, siehe
> PeDa's Ausführungen zum Leistungsbedarf.
>
> Gruß
>
> Roman

Nach einem kurzen Blick auf die Komparatoren im DIP-Gehäuse, die 
Reichelt so anbietet, denke ich, daß die viel zu viel Leistung 
verbraten. Da werde ich wohl die Spannungsteileridee verfolgen.

Aber ausprobieren kann man das für die paar Cent ja trotzdem mal...

von Peter D. (peda)


Lesenswert?

Georg Bisseling schrieb:
> Aber ausprobieren kann man das für die paar Cent ja trotzdem mal...

Dann aber bitte auch nachmessen, wie winzig die Stromersparnis ist 
gegenüber Power-Down und Polling im Watchdoginterrupt (16ms).
Falls der Unterschied überhaupt meßbar ist.

von Georg B. (diereinegier)


Lesenswert?

Peter Dannegger schrieb:
> Dann aber bitte auch nachmessen, wie winzig die Stromersparnis ist
> gegenüber Power-Down und Polling im Watchdoginterrupt (16ms).
> Falls der Unterschied überhaupt meßbar ist.

Peda,

Du meinst all diese Hin und Her zu den verschiedenen Schlafmodi der 
Atmel-Prozessoren ist verlorene Liebesmüh'? Auch bei Batteriebetrieb? 
Schade, aber eleganter wäre es trotzdem...

von Georg B. (diereinegier)


Lesenswert?

Liebe Leute,

ich bin ja ganz neu hier in diesem Forum, habe aber schon ein paar 
Threads gelesen. Und sowohl dort als auch hier in diesem Thread meine 
ich ein Muster zu erkennen:

Jemand fragt, wie etwas geht, und ihm wird geantwortet, daß er etwas 
anderes machen soll. Wenn jemand tatsächlich auf dem Holzweg ist, dann 
ist sicher hilfreich auch andere Lösungswege anzudeuten, aber man sollte 
doch schon erstmal die Frage genau lesen. Bitte schaut doch mal, ob Euch 
das auch auffällt.

Ich halte mich selbst für einen alten, grantigen Besserwisser. Insofern 
sollte ich mich hier pudelwohl fühlen. ;-)

von Ulrich P. (uprinz)


Lesenswert?

Also mit Besserwisserei hat es nichts zu tun, wenn einige Leute hier 
(manchmal etwas trocken) sagen, dass eine Idee nichts bringt.

Leider wird hier auch gerne mal herum getrollt... Es gilt für sich 
selbst zu entscheiden, welchen und wessen Rat man annimmt.

Trotzdem kann man einen eingeschlagenen Weg auch gegen den Rat der 
erfahrenen User hier weiter verfolgen, weil es einem um eine andere 
Sache geht. Aus Energieersparnis Gründen macht der Ansatz AVR + externe 
OP-Schaltung keinen Sinn, weil der OP mehr Geld kostet, als man an der 
Stromrechnung in vertretbarem Zeitraum je sparen könnte. Selbst, wenn 
wenn man die Versandkosten nicht beachtet:

2kWh sind ca 60ct entspricht 1 OPA
bei 5mW Ersparnis sind das 400.000h Betrieb also 16.000 Tage oder 45 
Jahre.

Aber vielleicht will der TS einfach was zu OP Schaltungen lernen und 
dann macht das durchaus Sinn.

Wenn es um den Tischrechner als solches geht und die Hauptaufgabe der 
Rechner und sein Energieverbrauch ist, dann würde ich dem TS raten auf 
einen STM32L152 zu wechseln dessen konfigurierbare OPs können frei mit 
ADC und Comparator verschaltet werden. Zudem benötigt er weniger Energie 
als ein AVR und kann sehr viel feiner in seiner Taktung und damit seinem 
Stromverbrauch angepasst werden.
Sollte die Anzeige bereits extern gelöst sein, kann man auch einen 
STM32L151 nehmen oder die Stromaufnahme noch einmal halbieren und auf 
einen STM32L0 gehen, der hat IMHO keine ADCs, aber durch die freie 
Konfigurierbarkeit von PLLs, Clocks und ADC sollte sich einiges machen 
lassen, was dazu führt, dass er einen AVR sehr weit unterbietet.

Gruß
Ulrich

von Roman (Gast)


Lesenswert?

Hallo zusammen,

wenn es in dem Falle wirklich um die Stromersparnis und Kosten geht,
empfehle ich den guten alten Ausschalter. Kostet zwar mehr als ein paar 
Batterien im Jahr, aber ist effizient.

Gruß

Roman

P.S.: Wer kommt in der heutigen Zeit noch auf die Idee eine Tischrechner 
bauen zu wollen. Hier wird das Prinzip alles mit einem MC machen zu 
wollen zu Tode geritten. Dafür gibt es heutzutage doch hochintegrierte 
IS's.

von Peter D. (peda)


Lesenswert?

Georg Bisseling schrieb:
> Auch bei Batteriebetrieb?

Hat niemand behauptet.
Aber eh man an der HW rumpfriemelt, sollte man erstmal die SW 
Möglichkeiten probieren.
Z.B. Power-Down mit Watchdoginterrupt zum Aufwachen.
Man kann auch den CPU-Teiler einschalten, wenn nix zu tun ist.
Usw.

: Bearbeitet durch User
von c-hater (Gast)


Lesenswert?

Georg Bisseling schrieb:

> Ist ein Spannungsteiler, der die Spannung aus der Tastatur halbiert, die
> einzige einfache Möglichkeit?

Nein. Die andere einfache Möglichkeit ist die "Umkehrung" dieses 
Ansatzes.


Also so:

Vcc
o-----
      |
      -
     | | Rv
     | |
      -
      |
      *---------------IOx
      | Vcc -----
       ----| key |
           | pad |----ADCx
       ----|     |
      | Gnd -----
      |
     ---

Dat Dingens wird auf zwei Arten betrieben.

Im normalen Modus (also bei wachem AVR) ist IOx auf Ausgang konfiguriert 
und gibt High aus. Das Keypad hat dann (fast) die volle 
Betriebsspannung. Die Pegel der Tasten werden nur geringfügig nach unten 
verschoben sein. Genau das ist der Hauptvorteil dieser "umgekehrten" 
Variante, der Störabstand der Tastatur im Normalbetrieb wird nur wenig 
verringert.

Zum Einschlafen macht man nun folgendes: IOx auf Eingang umkonfigurieren 
(nicht vergessen neben DDRx auch PORTx zurückzusetzen!), dann mindestens 
einen Takt warten, Pegel an PINx checken. Wenn low, nicht einschlafen, 
dann ist noch irgendeine Taste gedrückt, ansonsten zuständigen PCINT 
aktivieren und einschlafen.

Nun muß bloß noch Rv passend dimensioniert sein, so daß bei Druck auf 
die Taste, die normalerweise am ADC-Pin 4,8V erscheinen läßt, der Pegel 
an PINx sicher als Low gelesen wird. Dann wird bei dieser und jeder 
anderen Taste der Interrupt ausgelöst. In der ISR schaltet man dann den 
PCINT wieder ab, konfiguriert IOx wieder als H-Ausgang und alles ist 
wieder gut.

Nunja, der Nachteil der Konstruktion ist natürlich, daß man einen 
zusätzlichen Pin benötigt. Aber dagegen steht neben o.g. Hauptvorteil 
als weiterer Vorteil, daß das auch mit ältlichen AVRs funktioniert, die 
kein PCINT für jeden Pin haben. Da kann man dann nämlich einen der 
INTx-Pins zum Aufwecken verwenden, die typischerweise sowieso niemals 
mit einem ADC-Pin zusammenfallen.

von Georg B. (diereinegier)


Lesenswert?

c-hater schrieb:
> Vcc
> o-----
>       |
>       -
>      | | Rv
>      | |
>       -
>       |
>       *---------------IOx
>       | Vcc -----
>        ----| key |
>            | pad |----ADCx
>        ----|     |
>       | Gnd -----
>       |
>      ---

Das ist ja doppelt schön,
also erstmal die Schaltungsidee
als auch die Darstellung als ASCII-Art.
Danke für die Mühe!

Georg

von Georg B. (diereinegier)


Lesenswert?

Neu Teile sind eingetroffen, und ich hatte Zeit etwas zu spielen:

Der einfache Spannungsteiler, also einfach ein zusätzlicher 
Vorwiderstand vor den internen 9,8 kOhm Pullupwiderstand, funktioniert 
leider nicht. Ist der Widerstand sehr groß, dann fallen einige Tasten 
(bei 10bit AD-Wandlerauflösung) zusammen. Ist der Widerstand zu klein 
dann fällt die Eingangsspannung nicht unter die hier schon einmal 
genannten 40% VCC. Bei einem Widerstand von 220kOhm hat man sogar beide 
Effekte: Key0 und Key1 sind nicht sicher zu unterscheiden und der 
digitale Wert für die Spannung bei Key15 liegt bei 412 (von 1023).

Als nächstes werde ich die Idee mit dem Komparator probieren...Mist 
gerade sehe ich, daß Reichelt einen Transistor statt des Komparators 
eingetütet hat. Dann also die Idee mit dem zusätzlichen Ausgang...

: Bearbeitet durch User
von MWS (Gast)


Lesenswert?

Was ist denn eigentlich an dem Knacktaster-Ding als "fein" zu 
bezeichnen?

Und wie sähe es aus, wenn man den GND Fusspunkt dieses Dings offen 
lässt? Ist dann am Ausgang eine Spannung gen VCC zu messen, sobald ein 
beliebiger Taster gedrückt wird, bzw. 0V ohne Druck?

Dann lässt sich darüber ein Pinchange auslösen, GND kann über einen 
Portpin bereit gestellt werden, sobald der uC aufgewacht ist.

von Oldie (Gast)


Lesenswert?

> Das ist ja doppelt schön,
schreiben - und dann nicht richtig auswerten...

Ich finde, dass der Beitrag von c-hater recht überzeugend
aussieht.
- Aber, wenn man die Tasten-Auswertung macht, ohne dass IOx
das AD-keypad mit (fast)Vcc versorgt, kommt natürlich der von
dir beschriebene Mist raus!

Die Verschiebung der Potentiale (bei IOx = High und Ix < 0,5 mA)
sollte wirklich minimal sein und mit einer minimal angepassten
Vergleichstabelle selbst bei 8 Bit AD locker zu beherrschen sein.

- Aber IOx muss vor der AD-Wandlung High-Potential liefern!

Die Taste 15 des keypads (mit 4,7107 V @ 5 V) bringt einen
Widerstand von 163 kOhm in Reihe mit 10 kOhm zur Wirkung.
Macht 173 kOhm.
Bei Rv >= 820 kOhm erreicht man auch mit dieser Taste einen
satten Low-Pegel von <= 20 % von Vcc (< 1 V @ 5V).

Ich würde aber noch zu etwas Entstörung Rf / Cf raten:
Die Tastatur ist mit offenen Tasten ein guter Empfänger
für jede ungewünschte Störeinstrahlung!

> Vcc
> o-----
>       |
>       -
>      | | Rv = 820 k
>      | |
>       -
>       |     Rf = 1 k
>       *------===---------------*----IOx
>       |                        |
>       | Vcc -----              |
>        ----| key |            === Cf = 1 n
>            | pad |----ADCx     |
>        ----|     |            ---
>       | Gnd -----
>       |
>      ---

Rf ist hier hauptsächlich zum Schutz von Taste 0 gedacht.
Auch 1 nF, geladen mit 5 V, liefert ohne Vorwiderstand
kurzzeitig einen "ungesunden" Strom für die Taste.

Ein Cf dürfte auch in der Leitung zu ADCx nicht schaden.

von Georg B. (diereinegier)


Lesenswert?

Oldie schrieb:
> Ich finde, dass der Beitrag von c-hater recht überzeugend
> aussieht.

Das finde ich auch und werde das auch so ausprobieren.

> - Aber, wenn man die Tasten-Auswertung macht, ohne dass IOx
> das AD-keypad mit (fast)Vcc versorgt, kommt natürlich der von
> dir beschriebene Mist raus!

Naja, je nach Dimensionierung der in der Tastatur verwendeten 
Widerstände hätte es doch sein können, daß es einen "passenden" 
Vorwiderstand gibt.
Schließlich war ich auf diese Idee ja auch schon selbst gekommen und 
mußte mich davon überzeugen, daß sie nicht funktioniert bevor ich die 
bessere Lösung von c-hater ausprobiere.

Ich danke Dir für Deine Überlegungen zu Dimensionierung des 
Vorwiderstandes.

Du schlägst vor, IOx und ADCx mit einem Tiefpass zu schützen, das ist 
mir ein wenig zu viel Aufwand. Zumal ich die analoge Tastatur ja wegen 
des auf den ersten Blick geringeren Schaltungsaufwandes interessant 
fand, Zugegeben: der Aufwand entsteht ja dadurch, daß ich nicht pollen, 
sondern einen Interrupt auslösen möchte.

In der Zwischenzeit habe ich auch eine ganz normale Tastenmatrix in 
meinem Tascherechnermodell verwendet. Bisher habe ich da noch keine 
"spontanen" Tastendrücke durch Störeinstrahlung erlebt.

von Georg B. (diereinegier)


Lesenswert?

MWS schrieb:
> Was ist denn eigentlich an dem Knacktaster-Ding als "fein" zu
> bezeichnen?

"Fein" ist, daß man nur einen Pin am MUC benötigt, statt acht.
Aber das Tippgefühl ist und bleibt grauslig. Ich bin für 
Alternativvorschläge dankbar. Ein Nummernblock mit PS/2-Anschluß von 
Cherry für 40 € wäre aber irgendwie unsportlich...


>
> Und wie sähe es aus, wenn man den GND Fusspunkt dieses Dings offen
> lässt? Ist dann am Ausgang eine Spannung gen VCC zu messen, sobald ein
> beliebiger Taster gedrückt wird, bzw. 0V ohne Druck?

Die Taster schalten den Ausgang über einen Widerstand auf GND. Das kann 
also nicht funktionieren.

: Bearbeitet durch User
von Peter D. (peda)


Lesenswert?

Georg Bisseling schrieb:
> Aber das Tippgefühl ist und bleibt grauslig.

Das sind ja nur die nackten Stößel. Es fehlt noch die Frontplatte mit 
den Tastenkappen.

Nimm besser eine fertige 4*4 Matrix und papp die 7 Widerstände selber 
ran.

von MaWin (Gast)


Lesenswert?

Georg Bisseling schrieb:
> Der einfache Spannungsteiler, also einfach ein zusätzlicher
> Vorwiderstand vor den internen 9,8 kOhm Pullupwiderstand, funktioniert
> leider nicht.

Natürlich nicht, die 1/0 Schaltschwelle eines uC Digitaleingangs ist 
einfach zu ungenau.

Der Komoarator, bei vielen AVR eingebaut, braucht einen externen 
Spannungsteiler von ca. 49k/1k und der frisst zu viel Strom.

Lege Plus der Tastatur nicht an +5V sondern einen I/O Pin, den du in 
sleep auf Eingang mit internem pull up schaltest. Wird eine Taste 
gedrückt, weckt er per pin change den Prozessor auf. Dann schaltest du 
den pin auf Ausgang auf HI und der A/D Wandler bestimmt den Tastendruck.

Das kostet in sleep 0 Strom.

von MWS (Gast)


Lesenswert?

Georg Bisseling schrieb:
> Die Taster schalten den Ausgang über einen Widerstand auf GND. Das kann
> also nicht funktionieren.

Hab' erst jetzt den Schaltplan der Tastatur gesehen, der 
Gesamtwiderstand, betrachtet man VCC zu GND, beträgt 170k im größten 
Fall bei gedrücktem Key15.
Würde man GND der Tastatur an einen ext. Int-Pin mit Widerstand von 330k 
auf GND hängen, so löst jeder Tastendruck einen Interrupt aus, der den 
µC aufweckt. Im laufenden Betrieb wird dieser Pin auf Ausgang und Low 
gesetzt.
Hab' aber gesehen, dass es in dieser Art bereits vorgeschlagen wurde.

MaWin schrieb:
> Lege Plus der Tastatur nicht an +5V sondern einen I/O Pin, den du in
> sleep auf Eingang mit internem pull up schaltest.

Das haut nicht hin, nimm den internen Pullup mit 40k an, dann zieht die 
Tastatur im ungünstigsten Fall mit 170k gegen GND, was bei 5V VCC ein 
Spannung von ca. 4V am Int-Pin ergibt, da triggert noch gar nix.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.