Graphit-Tasten-Pad
Hard · 1h · Günstig
Ziel & Lerninhalt
Male mehrere Bleistift-Tasten auf Papier und erkenne mit nur einem Analogeingang über eine Widerstandsleiter eindeutig, welche Taste gedrückt wurde.
- Widerstandsleiter ('Voltage-Ladder Keypad') verstehen.
- Mehrere Tasten an einem einzigen ADC-Pin auswerten.
- Robuste Tasten-Erkennung mit Toleranzbändern programmieren.
Erklärung & Wissen
Basic
Stell dir vor, du malst mit einem 2B-Bleistift mehrere kleine Tasten auf ein Blatt Papier. Jede Taste hat ihren eigenen Festwiderstand, in Reihe zu einer gemeinsamen Leitung. Drückst du eine Taste mit dem Finger, schließt du sie mit GND kurz – und damit ändert sich der Widerstand am Mainboard. Weil jede Taste einen anderen Widerstand kurzschließt, kommt am Analogeingang ein eindeutiger Spannungswert raus. So bekommst du z.B. fünf Tasten an EINEM Pin.
Medium
Das Prinzip heißt 'Voltage-Ladder-Keypad'. Mehrere Widerstände sind in Reihe geschaltet, jede Taste verbindet einen anderen Knoten der Leiter mit GND. Am Spannungsteiler-Mittelabgriff liegt dann pro Taste eine andere Spannung an. Im Code liest du den ADC-Wert, vergleichst ihn gegen ein Toleranzband (z.B. ±30 ADC-Punkte) und ordnest ihn der passenden Taste zu. Wichtig: Die Toleranzbänder dürfen sich nicht überlappen, deshalb wählt man die Widerstandswerte z.B. so, dass die Tasten ADC-Werte 100/300/500/700/900 produzieren – weit auseinander, robust gegen Rauschen.
Expert
In einer echten Matrix-Multitouch-Variante würdest du Zeilen und Spalten getrennt scannen und über das Schwerpunkt-Verfahren $x_c = \sum R_i x_i / \sum R_i$ eine sub-pixel-Position berechnen – kommerziell zum Beispiel in Wacom-Tablets. Für das Bleistift-Pad reicht die einfachere Variante: Eine Widerstandsleiter mit z.B. 1k/2k/4k/8k/16k erlaubt 5 eindeutige Tasten, und mit etwas Glück sogar das Erkennen von Doppeldrücken (Summenwiderstand = Wert beider Tasten parallel). Ghosting tritt erst auf, wenn mehr als zwei Tasten gleichzeitig kommen – mit zwei Tasten ist die Mehrdeutigkeit meist auflösbar.
Fun Fact
Genau dieses Prinzip steckt im klassischen 16x2-LCD-Shield mit Tasten: Up/Down/Left/Right/Select hängen über eine Widerstandsleiter an einem einzigen Analogeingang.
- Widerstandsleiter
- Reihe von Widerständen mit Abgriffen, die pro Knoten eine andere Spannung liefern. Jede Taste schließt einen Punkt der Leiter mit GND kurz und ergibt damit einen anderen Spannungsteiler. Sauber dimensioniert liegen die ADC-Werte weit voneinander entfernt und sind eindeutig unterscheidbar.
- Toleranzband
- Fenster im ADC-Wert, das einer Taste zugeordnet wird. Statt exakter Werte vergleicht der Code 'liegt ADC zwischen 80 und 130 → Taste 1'. Das deckt das Rauschen ab. Die Bänder dürfen sich nicht überschneiden.
- Ghost-Druck
- Falsch erkannte Taste, wenn mehrere gleichzeitig gedrückt werden. Bei einer Widerstandsleiter ergibt jedes Tastenpaar einen Summenwert, der oft mit einer einzelnen anderen Taste verwechselbar ist. Dioden in jeder Tastenleitung verhindern dieses Ghosting, sind aber für ein DIY-Bleistift-Pad meist unpraktisch.
- Spannungsteiler-Keypad
- Prinzip: Mehrere Tasten an einem einzigen Analogpin durch geschickte Widerstandswahl. Ohne dieses Prinzip bräuchtest du einen Digital-Pin pro Taste. Mit einem Widerstandsteiler reicht ein ADC für alle: Jede Taste verbindet einen anderen Punkt der Widerstandskette mit GND → anderer Spannungswert am ADC. Das klassische Arduino LCD-Keypad-Shield funktioniert genauso: 5 Tasten an A0 mit Widerstandswerten so gewählt, dass ADC-Werte 0, 144, 329, 504, 741 entstehen — sauber 150+ Punkte auseinander, robust gegen Rauschen.
Praktischer Versuch: Bleistift-Tastenfeld
5 Graphit-Tasten als 'Kurzschluss-Pads', eine Widerstandsleiter, EIN Analogpin.
- Festes Papier (DIN A6)
- Bleistift 2B oder weicher
- 5 Widerstände: 1 kΩ, 2,2 kΩ, 4,7 kΩ, 10 kΩ, 22 kΩ
- 1 Widerstand 10 kΩ als Pull-Up
- Krokoklemmen oder kleine Stecker
Tasten aufmalen
Zeichne fünf quadratische Tasten nebeneinander auf das Papier. Jede Taste hat eine eigene 'Zuleitung' zum Rand, ebenfalls aus Graphit.
Check: Fünf 1×1 cm-Felder, dick und gleichmäßig schraffiert.
Tipp: Lieber dreimal überzeichnen als einmal kratzen – geschlossene Schicht.
Gemeinsame GND-Bahn malen
Male eine zweite breite Graphit-Bahn unten qür über das Papier, parallel zu den Tasten. Sie ist deine Massebahn.
Check: Eine dicke Linie verbindet alle Tasten zu einer gemeinsamen Bahn am unteren Rand.
Tipp: Diese Bahn ist später ein einziger Punkt im Schaltkreis: GND.
Widerstandsleiter aufbauen
Schließe die fünf Widerstände so in Reihe, dass jede Taste an einem anderen Punkt der Leiter hängt. Beachte die Skizze in wiringInfo.
Check: Auf dem Steckbrett sitzt 5V → 10 kΩ → Knoten 1 → ... → 22 kΩ → A0 → 10 kΩ Pull-Up gegen 5V.
Tipp: Reihenfolge der Widerstände bestimmt die ADC-Werte der Tasten – siehe Code-Kommentar.
Mechanik manuell prüfen
Vorher prüfen: Multimeter im Durchgang zwischen jeder Tasten-Bahn und der GND-Bahn, mit Finger drauf. So weißt du, ob die Graphitschicht stabil ist.
Check: Beim Druck auf eine Taste piept das Multimeter, beim Loslassen nicht.
Tipp: Der Finger schließt die Tasten-Bahn mit der GND-Bahn – dafür musst du beide gleichzeitig berühren.
ADC auswerten
Code hochladen, Tasten der Reihe nach drücken und ADC-Werte vergleichen. Bei Bedarf Toleranzbänder im Code anpassen.
Check: Im Monitor erscheint klar 'Taste 1/2/3/4/5', je nachdem, welche du drückst.
Tipp: Wenn zwei Tasten denselben ADC-Bereich liefern, müssen die Widerstandswerte weiter auseinander – z.B. exponentiell statt linear gestaffelt.
5V → 10 kΩ (Pull-Up) → A0; an A0 hängt die Reihenkette: Taste1—1k—Taste2—2k2—Taste3—4k7—Taste4—10k—Taste5—22k—GND. Jede Tasten-Bahn schließt zwischen Knoten und GND-Bahn.
// ProtoPeaks - Bleistift-Tastenfeld
const int sensorPin = A0;
struct Key { int low, high; const char* name; };
Key keys[] = {
{970, 1023, "keine"},
{800, 900, "Taste 1"},
{600, 750, "Taste 2"},
{400, 550, "Taste 3"},
{200, 350, "Taste 4"},
{0, 150, "Taste 5"}
};
void setup() { Serial.begin(9600); }
void loop() {
long sum = 0;
for (int i = 0; i < 8; i++) sum += analogRead(sensorPin);
int adc = sum / 8;
for (auto &k : keys) {
if (adc >= k.low && adc <= k.high) {
Serial.print(adc); Serial.print(" -> "); Serial.println(k.name);
break;
}
}
delay(80);
}- Mehrere Tasten liefern dieselben ADC-Werte. — Widerstandswerte zu nah beieinander. Größeren Spreizfaktor wählen (z.B. 1k/3k/10k/30k/100k).
- Tasten reagieren erst nach mehrfachem Drücken. — Graphitschicht hat schlechten Kontakt. Tasten nochmal überzeichnen, dicker schraffieren.
- ADC-Werte schwanken stark. — Mittelung erhöhen (16–32 Werte) und Toleranzbänder breiter setzen.
Kurzzusammenfassung
Über eine clevere Widerstandsleiter wird aus EINEM Analogpin ein fünfstufiges Tastenfeld. Jede Bleistift-Taste schließt einen anderen Punkt der Leiter mit GND, der ADC-Wert ist eindeutig pro Taste – ideal für minimalistische Eingabegeräte.