Viele Buttons an einem analogen Pin

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:

+5VR1R2Ground
+5VR1A-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.

K845037