Wie können 16 Tasten mit nur 8 Drähten verbunden werden?

9

Hier ist das Produkt. Ich verstehe die Idee: Diese 16 Tasten verwenden eine 4x4-Matrix. 4 Zeilen für Zeilen, 4 Zeilen für Spalten, und wir haben 8 Kabel.

Geben Sie hier die Bildbeschreibung ein

Aber:

  1. Wie kann das ohne Multiplexer funktionieren?

  2. Kann dies das Drücken mehrerer Tasten genau erkennen? Auch wenn Schaltflächen dieselbe Zeile oder Spalte verwenden? Beispiel: Tasten an Position (2,2) (2,3), (3,2) und (3,3) gleichzeitig gedrückt.

  3. Wie funktioniert es?

Basj
quelle
7
Dies ist allgemein bekannt, wie Sie bei einer Google-Suche nach "Tastatur-Multiplexing" oder ähnlichem feststellen werden. Haben Sie das nicht zuerst versucht, bevor Sie dies gepostet haben?
TonyM
3
@ TonyM Natürlich habe ich viele Suchanfragen durchgeführt und sogar ein paar Multiplexer-Chips 74HC164 bestellt, die vor ein paar Tagen zu Hause angekommen sind. Ich wollte gerade alles mit diesem Multiplexer-Chip verkabeln, als ich das fand. Dann habe ich mich gefragt, "wie kann das ohne Multiplexer funktionieren"?
Basj
1
Das Gerät auf der linken Seite muss einen Multiplex-Code enthalten
Marcelo Espinoza Vargas
3
@ TonyM Danke, dass du mir das gezeigt hast. Kannst du das PDF verlinken, anstatt ein Rätsel zu machen;)? Vielleicht habe ich mit anderen Schlüsselwörtern als Tastatur usw. gesucht und wahrscheinlich nicht das gleiche gefunden.
Basj
1
@Basj: Mehrfachpressen sind kein Problem. Sie scannen alle vier Zeilen nacheinander. Wenn in Zeile 1 eine Taste gefunden wird, notieren Sie diese. Wenn es um Zeile 3 geht, finden Sie dort eine andere Taste, die Sie ebenfalls notieren. Am Ende erhalten Sie beide Schaltflächen. Solange Sie deutlich schneller scannen können, als Benutzer Tasten drücken können, werden Sie es nicht verpassen.
Gábor

Antworten:

24
Wie kann das ohne Multiplexer funktionieren?

Das tut es nicht. Die Tastaturplatine scheint nur Schalter zu haben, vielleicht mit einigen Dioden, die wir nicht sehen können. Auf der linken Platine befindet sich jedoch ein Prozessor. Mit ziemlicher Sicherheit wird Multiplexing in Firmware durchgeführt.

Der Multiplexing-Algorithmus funktioniert ungefähr so:

  1. Fahren Sie eine Reihe hoch, die anderen niedrig.

  2. Aktivieren Sie passive Pulldowns in den Spaltenzeilen.

  3. Sehen Sie, welche Spaltenzeilen hoch sind. Die Schaltflächen an den Schnittpunkten dieser Spaltenzeilen mit der einen bestätigten Zeilenzeile werden gedrückt. Die anderen Schaltflächen in dieser Zeile werden freigegeben.

  4. Wiederholen Sie den Vorgang mit Schritt 1 und bestätigen Sie die nächste Zeile nacheinander.

Der obige Vorgang wird schnell genug wiederholt, so dass alle Tasten innerhalb einer Zeit überprüft werden, die sich für einen menschlichen Beobachter immer noch augenblicklich anfühlt. Die menschliche Grenze von "augenblicklich" liegt in diesem Zusammenhang bei etwa 50 ms. Selbst ein Low-End-Mikrocontroller kann eine 4x4-Tastatur in viel kürzerer Zeit scannen.

Kann dies das Drücken mehrerer Tasten genau erkennen?

Wahrscheinlich ja. Eine Möglichkeit besteht darin, mit jeder Taste eine Diode in Reihe zu schalten. Diese könnten sich auf der Unterseite der Tafel befinden, die Sie anzeigen. Bei den Dioden funktioniert der oben beschriebene Algorithmus einfach.

Eine andere Möglichkeit besteht darin, Widerstände mit Leitungen in Reihe zu schalten und ihre analoge Spannung zu messen. Selbst wenn mehrere Schaltflächen mehrere Zeilen- / Spaltenzeilen kurzschließen, können Sie eventuell herausfinden, welche Schaltflächen gedrückt werden. Dies erfordert A / D-Eingänge im Mikro, nicht nur digitale Eingänge wie bei Verwendung von Dioden.

Olin Lathrop
quelle
1
Vielen Dank. Was ist dann mit mehreren Pressen gleichzeitig? Hinweis: Das linke Board ist ein RaspberryPi.
Basj
1
@ Hayman warum ist es so? Kannst du ein Beispiel geben? Warum ist (1,2), (2,2) und (3,3) gleichzeitig ein Problem, wenn keine Diode vorhanden ist? Vielleicht hätten Sie ein kleines Schema? Da dieser Punkt wirklich entscheidend ist, lohnt es sich vielleicht für eine engagierte Antwort @Hayman?
Basj
8
+1 für "Die linke Karte sieht aus, als hätte sie einen Prozessor". Liebte das.
Enric Blanco
3
@Basj es ist offensichtlich, wenn Sie damit spielen. Immer wenn Sie eine Taste drücken, verbinden Sie eine Zeile mit einer Spalte. Immer wenn eine Zeile und eine Spalte verbunden sind, wird die Taste an der Kreuzung als gedrückt registriert. Wenn jedoch mindestens 3 Tasten gedrückt werden, können eine Zeile und eine Spalte indirekt verbunden werden .
Hobbs
2
@Basj Schauen Sie sich dieses Bild an . Die roten Linien zeigen einen logisch hohen Pegel an. Wenn Sie die 3 mit einem 'x' gekennzeichneten Tasten gedrückt halten, können Sie sie verfolgen und den Pfad sehen, in dem das Signal fließen wird. Zuerst wird Zeile 1 ausgewählt und hoch gesetzt. Durch Drücken der Taste 1,1 wird die erste Spalte hoch. Durch Drücken der Taste 1,2 haben wir nun Zeile 2 hoch gemacht. Wenn wir nun eine andere Taste in Zeile 2 drücken, wird eine weitere Spalte hoch gesetzt. Das Problem dabei ist, dass das μC dumm ist, es weiß, dass es Zeile 1 hoch gesetzt hat und es ein Hoch in Spalte 3 sieht, daher denkt es, dass Knopf 1,3 hoch ist
Doodle
9

Ohne Dioden ... erhalten Sie Phantomrechtecke.

Zum Beispiel in Ihrem Beispiel (2,2) (2,3), (3,2) und (3,3); Sie haben ein ironisches Beispiel gewählt, indem Sie ein Rechteck gewählt haben. Wenn Sie tatsächlich alle vier drücken, funktioniert es. Aber wenn Sie die drei Ecken des Rechtecks drücken, wird die vierte Ecke auch erscheinen wird gedrückt, auch wenn es nicht ist .

Diese Tastatur ist eindeutig für die Eingabe von Tastaturdaten gedacht, bei denen die Benutzerkonvention jeweils ein Tastendruck ist. Sie bemerken beispielsweise, dass auf einer Tastatur zur Eingabe einer Tankstellen-Kreditkarte keine Umschalttasten vorhanden sind.

Wenn Sie jedoch S1 zu einer Umschalttaste und S3 zu einer Alt-Umschalttaste gemacht haben, sodass Benutzer beide vernünftigerweise gedrückt halten können, während sie gleichzeitig S13 drücken, scheint S15 ebenfalls gedrückt zu sein.

Harper - Monica wieder einsetzen
quelle
1
In der Tat ist bei den meisten Dateneingabetastaturen nicht vorgesehen, dass mehr als zwei Tasten gleichzeitig gedrückt werden, sodass kein Problem besteht. Musikalische Keyboards sind eine andere Geschichte, da viele Tasten gleichzeitig gedrückt werden können. Die meisten von ihnen haben Dioden oder unabhängige Verkabelung zu jedem Schlüssel. Aber ich habe eine Musiktastatur in einem Second-Hand-Laden gefunden (Preis 9 Euro), die keine angemessene Anpassung für mehrere gleichzeitig gedrückte Tasten hatte, mit unvorhersehbaren und nervigen Ergebnissen!
Level River St
Die Schlüsselschalter könnten von einem Typ sein, der eine eingebaute Diode hat, oder es könnten Dioden darunter versteckt sein.
Rackandboneman
1

So geht's ohne kontinuierlichen Scan:

  • Stellen Sie alle Treiber auf hoch
  • Aktivieren Sie passive Pulldowns auf Empfangsleitungen
  • Stellen Sie den Pin-Wechsel-Interrupt ein, um zu erkennen, dass eine der Leitungen hoch geht (oder sich der Pegel ändert).
  • Aktivieren Sie in diesem Fall die Tastatursuche, z. B. alle 10 ms
  • Normal scannen und Tastendrücke verarbeiten
  • Beenden Sie nach einer Zeitüberschreitung ohne Ereignisse den Scanvorgang und starten Sie ihn am ersten Aufzählungspunkt neu
peufeu
quelle
0

Ich habe dies mit Assembler auf nackten Atmel AVR-Mikrocontrollern gemacht.
Der Einfachheit halber: Tastaturzeilen: Verwenden Sie die Arduino-Pins 4,5,6 und 7 (AVR-Pins PD4, PD5, PD6 und PD7). Tastatursäulen: Verwenden Sie die Arduino-Pins 8, 9, 10 und 11 (AVR-Pins PB0, PB1, PB2 und PB3 ) Machen Sie Row-Pins-Eingänge mit aktivierten Klimmzügen. Spaltenstifte ausgeben Ausgabe und Ausgabe von Nullen an diese. Aktivieren Sie Pin Change Interrupts für alle Zeilen- und Spalten-Pins. http://playground.arduino.cc/Main/PinChangeInterrupt Durch Drücken einer Taste auf der Tastatur wird ein Row-Pin nach unten gezogen. Die Interrupt-Routine muss die Zeilenstifte lesen und herausfinden, welcher Stift niedrig ist. Die oberen 4 Bits sollten drei Einsen und eine Null sein. Wenn Sie eine 8-Bit-Variable uint8_t verwenden, können Sie sie durch 16 oder (var >> 4) teilen, um die 4 Bits in die unteren Bits der Zahl zu setzen. Sie können ein bitweises ODER | verwenden Operation mit 240, um die oberen 4 Bits auf 1s zu setzen, und eine bitweise NOT ~ -Operation, um alle Bits zu invertieren, sodass nur ein Bit gesetzt ist, das die Zeile darstellt, in der sich der Tastendruck befand. Speichern Sie diese Nummer als 0, 1, 2 oder 3.
Wechseln Sie die Pin-Konfiguration:
Machen Sie Spaltenstifteingaben mit aktivierten Klimmzügen. Zeilenpins ausgeben Ausgabe und Ausgabe von Nullen an sie. Lesen Sie die Säulenstifte und finden Sie heraus, welcher Stift niedrig ist. Führen Sie eine ähnliche Manipulation mit diesem Wert durch, außer dass Sie die Zahl nicht nach rechts verschieben müssen. Nach var ^ 240 und ^ var haben Sie ein einzelnes Bit, um die Spalte darzustellen, in der sich der Tastendruck befand. Denken Sie daran, Interrupts zu deaktivieren, bevor Sie die Ports neu konfigurieren, da dies wahrscheinlich unerwünschte Interrupts auslösen wird. Möglicherweise müssen Sie Interrupt-Flags löschen, wenn Sie die Interrupt-Routine verlassen, um eine doppelte Interrupt-Behandlung zu verhindern.

Darrell Harriman
quelle