Viele Buttons an einem analogen Pin
« | 12 May 2019 | »Nachdem die ATmega328 MCUs 13 digitale Pins zur Verfügung stellen, könnte man 13 Tasten damit auslesen. Natürlich sind dann eben alle 13 digitalen Pins belegt.
Beim ATtiny25/45/85, der in Summe nur 5 Pins für Anwendungen bietet (3 digitale und 2 analoge) wäre das natürlich ein großes Problem, denn wenn 2 Tasten 2 Pins belegen, kann man den restlichen 3 Pins nur mehr wenig anfangen … und jede weitere Taste verschlimmert die Angelegenheit.
Die Lösung sind analoge Buttons.
Vor Jahren erzählte mir ein etwas älterer Herr vom “Zeitalter der Analog-Computer”, die Rechenaufgaben durch elektrische bzw. physikalische Eigenschaften lösen konnten. So richtig verstanden hatte ich das Konzept eigentlich nicht. Doch es erschien mir logisch, dass sich Spannungen und Stromstärken durch bestimmte Verschaltungen addieren oder aufteilen lassen.
Erst in den letzten Monaten, wo ich das Pin-Mangel-Problem vorfand, führte mich eine Suche zu “analogen Button-Controllern” und den alt bekannt Rechenregeln, wonach bei in Serie geschalteten Verbrauchern (Widerständen) die Spannung proportional abfällt.
Analoge Widerstand-Messung
Während digitale Pins nur 2 Zustände unterscheiden, können analoge Pins
als Analog/Digital Wandler genutzt werden und die am Pin anliegende
Spannung messen. Gemessen wird immer gegen die Referenzspannung, die
man auf manchen Controllern auf einen eigenen Pin legen kann (AREF
),
in der Regel aber mit der Betriebsspannung gleichgesetzt ist.
ATmega/ATtiny MCUs nutzen 10 Bits für die Messung und können so Spannungen von 0 Volt bis Betriebsspannung (bzw. AREF) auf die Werte 0 bis 1023 abbilden.
Und dann gibt es ja die bekannte Spannungsteiler-Schaltung, wo der Strom durch 2 Widerstände fließt und zwischen dem ersten und zweiten die Spannung entsprechend abgefallen (geteilt) ist.
Legen wir also eine Leitung zu einem Widerstand und von dort eine zurück zum analogen Pin, während wir parallel einen Weg zu einem zweiten Widerstand und dann zum Ground verlegen:
+5V
→ R1
→ R2
→ Ground
+5V
→ R1
→ A-Pin
Der analoge Pin (A-Pin) liefert dann den Wert
1024 - (R1 / (R1 + R2)) * 1024
oder (R2 / (R1 + R2)) * 1024
.
Bei zwei 10 Kilo-Ohm Widerständen, wäre das 512, wenn man leichte Schwankungen berücksichtigt oder leichte Ungleichheiten bei den Widerständen, kann es zu Schwankungen zwischen 509 und 515 kommen.
Nehmen wir für den zweiten Widerstand einen fixen Wert, sagen wir 100 KOhm, dann können wir mehrere unterschiedliche Widerstände mit Tastern parallel zum analogen Pin schalten. Wird ein Taster gedrückt, so misst der Pin eine Spannung die für den entsprechenden Widerstand typisch ist.
Ich hatte einige Widerstände in der Schublade liegen, die ich für einen Test so verbauen konnte:
- Pulldown: 174 KOhm
- Button 1: 1.5 KOhm (Messung: 1015)
- Button 2: 3.9 KOhm (Messung: 1001)
- Button 3: 7.5 KOhm (Messung: 982)
- Button 4: 15 KOhm (Messung: 943)
Und schon kann man ein Fadenkreuz (Hinauf, Hinunter, Links, Rechts) mit nur einem einzigen analogen Pin bauen.
Natürlich kann man das so fortsetzen und noch viele weitere Buttons so verbauen, doch eine vollständige Tastatur wird das nicht werden, denn:
Nachteil: Man darf immer nur einen Taster drücken.
Wenn man mehrere Tasten drückt, werden die Widerstände parallel
geschaltet und ergeben einen geringeren Wert nach der Formel:
1/R = 1/R1 + 1/R2 + 1/R3 + ...
.
Bei zwei Tasten ergibt das verkürzt: R = (R1 * R2) / (R1 + R2)
.
Da müsste man also für jede Konstellation eigene Soll-Messwerte erfassen und Kollisionen mit der Wahl von “passenden” Widerständen verhindern.
Fazit
Wie auch immer, für den kleinen ATtiny
ist diese Methode perfekt, und so
kann man z.B. einen ESP8266-01
der keine analogen Pins hat durch einen ATtiny ergänzen, der die Daten ließt
und per serieller Verbindung zum ESP schickt. … und fertig ist unsere
kleine WLAN-Fernbedienung (so zumindest die Theorie.)
Es gibt aber auch fertige Bauteile, die nach diesem Prinzip arbeiten.
Unter der Bezeichnung K845037
ist ein kleiner analoger Controller
zu finden, mit dem man eine einfache Joypad-Funktion erhalten kann.