Viele Tasten benutzen (Tastatur)

Hallo zusammen,

ich möchte an einem Arduino (welcher ist mir erst einmal egal) eine Tastatur anschließen.
Jetzt könnte ich einfach eine ps2-Tastatur anschließen und glücklich sein. Nein, eigentlich nicht, dann die Kombination aus Tastatur, Arduino und Display (20x4 oder OLED) wird schon ziemlich unhandlich. Also hatte ich die Idee, einen Uraltcomputer (Epson HX20) seines Innenlebens zu berauben und nur die Tastatur und das Gehäuse zu verwenden.

Nur, wie bekomme ich die Tastenmatrix der 68 Tasten an einen Arduino?
Meine erste Idee war, die Elektronik aus der ps2-Tastatur auszubauen und die Tasten an diese anzuschließen. Das funktioniert aber nicht, weil natürlich die Tasten anders verteilt sind.

Hat da Jemand irgendeine Idee zu?

p.s.
Ich könnte nun einen Arduino Mega verwenden und die Matrix selbst auslesen, aber dann müsste ich die Tasten auch noch entprellen und mich um alles selbst kümmern, daher hoffe ich auf eine fertige Lösung, welche sozusagen out of the box funktioniert und die ich nur noch nicht gefunden habe.

Bevor du den HX20 unwiderruflich zerstörst - guck mal auf Ebay für was die Dinger gehandelt werden.

Was spricht gegen eine kleine PS2 Tastatur und diese direkt mit dem Arduino auszulesen?
An welche Abmessungen für deine Tastatur hast du gedacht? Maximum Angaben oder Minimum Angaben.

Und wenn du ein eigenes "Layout" haben willst, dann brauchst die Tasten ja nur so arangieren wie du willst und auf die Elektronik der Tastastur gehen.

Oder was von :
Adafruit

You can of course arrange them as a matrix of buttons for a total of 80 switches.

JA! Nicht den HX20 zerstören! Da bin ich vollständig bei @noiasca!

Wenn Du Spass am basteln und probieren hast, denke mal darüber nach, eine kleine Bluetooth-Tastatur abgesetzt zu betreiben.
Die gibt es auch in ganz klein...

Eben halt nur ne Idee...

Der ist leider schon zerstört. Als ich den von XX+ Jahren bekommen habe, hatte ein Wasserschaden die Hauptplatine bereits unbrauchbar gemacht und das übrig gebliebene Gehäuse (mit der Tastatur) ist in den Fundus gewandert.
Auch der Drucker und das Display fehlen bereits.

Da aber die Tastatur noch gut aussieht und das Gehäuse einen Ausschnitt für ein Display hat, dachte ich, daß das ganz gut zusammen passt.

Gegen eine ps2-tastatur spricht nur, daß ich dann für Display, Akku und Arduino ein eigenes Gehäuse drucken muss und ich dann zwei Geräte habe.
die Maße sind mir nicht soo wichtig, aber eine Vollformattastatur ist mir dann doch etwas zu sperrig.
Das Layout hätte ich schon gerne so, wie eine "echte" Tastatur es hat, damit ich mich nicht umgewöhnen muss. Da würde auch die das HX-20 gut passen.

Das Ganze soll ein portables Terminal für RS232, RS485, TTY usw. werden, mit dem ich diverse Geräte konfigurieren kann.
Daher wäre es schön, alles in einem Gehäuse zu haben.

Weist Du denn, wie die Tastatur verdrahtet ist, - d.h. hast Du einen Schaltplan dazu?

Wenn Du viele Tasten auswerten willst, und dich nicht selbst um das Entprellen und Auswerten kümmern willst, wäre gegebenfalls die MotoButtons-Klasse meiner MobaTools was für dich. Die kann in einer Instanz bis zu 32 Tasten auswerten. Und da das Einlesen der Tastenzustände über eine Call-Back Funktion möglich ist, können die auch beliebig verschaltet sein. Wenn Du nicht die ganze Lib installieren willst, reicht auch die MotButtons.h rauszukopieren , in dein Sketchverzeichnis zu kopieren und von dort einzubinden.
Mit so vielen Tasten habe ich es zwar noch nicht probiert, sollte aber mit mehreren Instanzen möglich sein.

Einen Mega brauchst Du dafür nicht. Das geht mit IO-Expandern auch auf einem Nano. Das ist wesentlich platzsparender. Und so kompliziert ist das Auswerten ja auch nicht, wenn es nur darum geht das Drücken und evtl. Loslassen zu erkennen.

Das wird wahrscheinlich schwierig bis unmöglich. Dazu ist deine HW zu speziell. Ein bisschen wirst Du dich da schon selbst 'reinhängen' müssen.

Die genaue Verschaltung habe ich noch nicht, aber ich vermute, sie sind in einer Matrix verschaltet. Die genaue Anordnung muss ich noch rauspiepsen, aber das sollte eher kein größeres Problem darstellen.
Insgesamt sind es 68 Tasten, allerdings werde ich wohl die Modifiertasten (shift, shiftlock, crtl, graph) und Enter direkt einlesen müssen.

Der mega hat für mich den Vorteil, daß er mehr Speicher hat. Da kann ich die zusätzlichen Eingänge auch gleich mit nutzen. Schön wäre es natürlich, wenn es auch mit einem Uno oder nano klappt. Das werde ich erst mal ausprobieren, da ich noch einige Nanos hier herumliegen habe. Wenn das mit den Expandern klappt, kann ich später auch auf einen ESP oder einen RP2040 umsteigen.
Platzprobleme habe ich in dem Gehäuse tatsächlich keine. Da passt dann auch ein relativ großer Akku samt Ladeelektronik rein.

Daß es nur mit Anschließen und glücklich sein nicht funktioniert, ist mir bewusst. Aber bei einer fertigen Lösung (als Lib oder Hardware) kann ich es mir eben einigs an Arbeit sparen.

Ich werde mal die MotButtons ausprobieren und dann entscheiden, wie ich weiter vorgehen werde.

Wobei die Tasten 61-68 oben links offensichtlich aus der Matrix rausfallen, wenn man die Unterseite


mit der Oberseite

übereinander legt. Die scheinen direkt ans LCD-Board angepinnt zu sein. (Connector auf der Unterseite)

Bleiben 60 Tasten, die an den 2x20pol Anschlüsen hängen, von denen auch noch einige fürs Display hinhalten müssen.

Da bleibt nicht mehr viel übrig; somit eine machbare Aufgabe auch wenn man nur die Leiteseite zur Verfügung hat.

Kennst Du diesen Link auf das HX20 technische Manual in archive.org? Da steht auch viel zur Tastatur drin.

Ich habe das Ding auch mal programmieren dürfen ( bzw. müssen ... :roll_eyes:). Ist aber schon einige Jahrzehnte her :innocent:.

Ej, Du warst schneller.... :wink:

Die Connectorenbelegung:

CN4 Connector
Pin No. Signal Direction Meaning of Signal
1 KSC 0 OUT Keyboard column 0 scan
2 KSC 1 OUT 1
3 KSC 2 OUT 2
4 KSC 3 OUT 3
5 KSC 4 OUT 4
6 KSC 5 OUT 5
7 KSC 6 OUT 6
8 KSC 7 OUT 7
9 KPTN 9 IN Keyboard return 9
10 KPTN 8 IN 8
11 KPTN 7 IN 7
12 KPTN 6 IN 6
13 KPTN 5 IN 5
14 KPTN 4 IN 4
15 KPTN 3 IN 3
16 KPTN 2 IN 2
17 KPTN 1 IN 1
18 KPTN 0 IN 0
19 PW sw IN Power switch
20 BUSY (SO) IN LCD busy/serial data output
CN5 Connector
Pin No. Signal Direction Meaning of Signal
1 VCL IN LCD voltage (generated from VLD via angle control circuit)
2
3 R OUT Reset
4 C/D OUT SI input mode designation command/data; SO/busy designation in read mode
5 CLK OUT Control timing (ENABLE signal)
6 SD OUT Display serial data/command
7 SCK OUT Serial register shift clock to input or output in units of 8 bits
8 CS5 OUT Chip select 5 (Chip No. 5)
9 CS4 OUT Chip select 4 (Chip No. 4)
10 CS3 OUT Chip select 3 (Chip No. 3)
11 CS2 OUT Chip select 2 (Chip No. 2)
12 CS1 OUT Chip select 1 (Chip No. 1)
13 CSO OUT Chip select 0 (Chip No. 0)
14 GND - Signal ground
15
16
17 VLD OUT LCD voltage
18 PWSW IN Power switch
19 SP OUT Speaker signal
20 SPG :_ Speaker ground

aufgearbeitete Quelle: Full text of "Epson HX 20 Tech Manual OCR"

Habe mir mal das Manual herunter geladen. Ich denke, das hilft mir auf jeden Fall.
Danke dafür schon mal.

Ich habe einfach mal ein wenig herumgespielt und einen kleinen Adapter gelötet.
Herausgekommen ist ein kleiner Drahtverhau

Sieht ziemlich wild aus, macht aber, was es soll.
Die IOs des Nano reichen gerade mal so aus, um die 18 Leitungen der Matrix anzuschließen, da gibt es also noch Verbesserungsbedarf.
Ich werde mir mal eine Hand voll I²C-Portexpander bestellen und weiter basteln.
Dabei werden zwar einige tasten herausfallen, was mir in der gegebenen Anwendung aber nicht viel ausmacht.

Einige der Tasten funktionieren nicht ganz richtig und prellen schlimmer, als die Lib es unterdrücken kann, aber auch das sollte sich noch beheben lassen.

Hier noch der Code, den ich zum Testen verwendet habe.

#include <Keypad.h>
const byte ROWS = 10; //four rows
const byte COLS = 8; //four columns
//define the cymbols on the buttons of the keypads
char hexaKeys[ROWS][COLS] = 
{
  {'0','8','ü','h','p','x','R','C'},
  {'1','9','a','i','q','z',' ','P'},
  {'2','ä','b','j','r','y','T','B'},
  {'3','ö','c','k','s','+','*','P'},
  {'4',',','d','l','t','#','*','D'},
  
  {'5','ß','e','m','u','^','<','M'},
  {'6','.','f','n','v','L','G','*'},
  {'7','-','g','o','w','R','C','*'},
  {'P','P','P','P','P','F','*','*'},
  {'S','S','S','S','*','^','C','D'},
};
byte rowPins[ROWS] = {11,10,9,8,7,6,5,4,3,2}; //connect to the row pinouts of the keypad
byte colPins[COLS] = {12,13,14,15,16,17,18,19}; //connect to the column pinouts of the keypad
//initialize an instance of class NewKeypad
Keypad customKeypad = Keypad( makeKeymap(hexaKeys), rowPins, colPins, ROWS, COLS); 
void setup()
{
  Serial.begin(9600);
}
void loop()
{
  char customKey = customKeypad.getKey();
  if (customKey)
  {
    Serial.println(customKey);
  }
}

Du könntest die MCP23S17 in Erwägung ziehen, die werden per SPI angesteuert und haben aber zusätzlich noch Adressen (diese Pins werden bei MCP23017 für die I²C-Adresse verwendet). Also ein CS-Pin für acht ICs, auch wenn Dir zwei genügen.

Praktisch bei MCP23S17 und MCP23017 ist die Interrupt-Leitung, damit Du keinen Tastendruck verpaßt.

Bei einer alten Tastatur könnte Kontaktspray helfen.

Ich habe mich für den PCF8575 entschieden, weil der 16 I/Os hat und ich so nur einen für die Tastatur benötige.
Auch der hat einen Interruptausgang, den ich aber nicht benutzen werde. Generell denke ich, daß ein Interrupt bei Matrixansteuerung nicht benötigt wird, da die Matrix sowieso zyklisch ausgelesen wird.
Für mich hat I²C noch den Vorteil, daß ich weniger Pins benötige, da ich das Display und den Drucker, den ich noch in meinem Fundus gefunden habe, auch noch irgendwie anschließen muss.

Kontaktspray ist keine all zu gute Idee, da es Rückstände hinterlässt, welche die Kontakte noch schlechter machten. Besser ist es da, die Kontakte (nur die betroffenen) mit WD40 auszuspülen und nachher mit Isopropanol zu reinigen. Anschließend kann man noch eine hauchdünne Schicht Vaseline drüber sprühen, um die Kontakte vor erneuter Korrosion zu schützen, wobei das aber bei mechanisch nur schwach belasteten Kontakten auch kontraproduktiv sein kann.
Das Reinigen ist bei dieser Tastatur allerdings eher eine Fleißarbeit mit Wattestäbchen und isopropanol. :wink:

Das gilt auch für MCP23S17 und MCP23017.

Generell stimme ich Dir zu, aber im Thema Fragen zu Port Expander habe ich ihn doch verwendet. Auswertung der Eingänge nur bei Interrupt geht schneller.

Ich möchte Dir nur Anregungen geben und Alternativen aufzeigen :slightly_smiling_face:

Diese Variante kannte ich noch nicht, werde ich mal probieren, wenn es wieder soweit ist.

Der Interrupt (von den Eingängen) kommt, solange eine Taste gedrückt ist, jedes mal, wenn die entsprechende Spalte der Matrix vom Arduino angesteuert wird, aber dann wird der Eingang sowieso abgefragt.
Anders herum kommt der Interrupt nicht, wenn die Spalte gerade nicht angesteuert wird.
Daher halt ich es für mich nicht für notwendig, einen Interrupt zu benutzen.

Bei dem Drucker wird das wohl anders, da der alle 0,5 Millisekunden ein Taktsignal für das nächste Pixel ausgibt.
Vielleicht werde ich dem einen eigenen Arduino als Controller spendieren und den per I²C ansteuern. Aber das ist erst mal eine andere Baustelle.

Das macht aber mMn nur Sinn, wenn die Eingänge direkt mit Schaltern/Sensoren verbunden sind, und dann ein Interrupt ausgelöst wird, wenn einer aktiv wird.
Bei einer Matrix ist das sinnlos. Die muss sowieso aktiv angesteuert werden um alle Spalten anzusteuern, sonst erkennt man ja nicht wenn eine Taste grdrückt wird ( oder zumindest nur die in der gerade aktiv angesteuerten Spalte ). D.h. eine Matrix MUSS gepollt werden, und da macht ein Interrupt dann keinen Sinn.

Besorg Dir Bremsenreiniger in der Spraydose und viel Isopropanol - gibt es als Litercontainerflasche.
WD40 hinterlässt manchmal unschöne Rückstände. Frag mal Schlüsseldienste. Die werden Dir schnell erläutern, das WD40 in Sicherheitsschlössern dünne mechanische Teile wie Federn an- und später auffrisst.... :wink:

Genau.
Deshalb auch mein Vorschlag das gleich mit einem geeigneten IC zu machen statt die Zeit mit Portexpander multiplexen zu verbrauchen.

Sorry, den Link in #2 hatte ich bisher übersehen. Das Teil ist eigentlich ideal für meine Tastatur. Habe mir gleich mal einen bestellt. Mal sehen, was schneller ankommt. :wink:

Mir hat mal jemand das ABUS Pflegespray geschenkt, hoffentlich ist das besser.

Ja. Die Ausgänge werden nacheinander von hochohmig auf HIGH oder LOW geschaltet, dann wieder auf hochohmig.

Doch, kann er machen.

Es geht ja um die Abfrage der Eingänge. Bei einem UNO, Nano oder ProMini wird man die Eingänge vermutlich einzeln in einer Schleife abfragen. Bei einem Mega2560 kann man die Eingänge auf einem Port sammeln und den ganzen Port abfragen. Ist der Port ungleich 0x00 oder 0xFF, so wertet man das Bit aus. Das Lesen des Ports geht auch beim MCP23x17, allerdings ist die Kommunikation über I²C- oder SPI-Bus aufwändiger als eine Portabfrage vom µC. Da könnte ein kurzer Impuls wie beim Darttreffer schon mal durchrutschen.

Nutzt man aber den Interrupt des MCP23x17, so merkt sich dieser die Quelle des Interrupts (INTCAP) bis zum willentlichen Löschen durch Lesen, siehe "1.7.4 INTERRUPT OPERATION" im Datenblatt. Dieses Merken bis zum Lesen kann den Unterschied machen, ob ein kurzer Impuls erkannt wird oder nicht.

@nano555e: Wenn mir Schwergewichte des Forums wie @MicroBahner und @noiasca widersprechen, dann muß ich mir schon gut überlegen, ob ich meinen Standpunkt beibehalte und wie ich ihn verteidige. Ich hoffe, dies ist mir einigermaßen gelungen und es nützt auch Dir.

Für Dein Thema hätte ich Dir vor ein paar Jahren den Mega2560 Pro Mini empfohlen, den es im fernen Osten unter 10 € gab. Inzwischen ist die Situation komplizierter und die europäischen Preise lassen einen als Bastler grübeln. Da nimmt man lieber einen Nano aus der Bastelkiste und schließt ein zusätzliches IC an. Ein spezielles IC wie TCA8418 ist vermutlich unschlagbar.

Solltest Du aber doch mal beim MCP23x17 landen, bist Du eingeladen, meine Lösung mit Polling und Interrupt auszuprobieren, um Dir selbst eine Meinung über Sinn oder Unsinn zu bilden :slightly_smiling_face: