In Zeiten von USB und Bluetooth sind alte PS/2-Tastaturen längst aus unserem Alltag verschwunden, doch mit ein wenig Technik-Know-how kannst du sie für spannende Projekte wiederbeleben. In diesem Beitrag zeige ich dir, wie du eine PS/2-Tastatur an deinen Arduino anschließt und die Signale ganz einfach auslesen kannst. Wir starten damit, den Aufbau des PS/2-Steckers und der Buchse zu verstehen – das ist der erste Schritt, um die Verbindung richtig herzustellen.
Mit der Arduino IDE wird das Auslesen der Tastaturdaten kinderleicht. Später gehen wir noch einen Schritt weiter und nutzen die Tastatur, um automatische Aktionen auszulösen – perfekt für Makros oder Steuerungsaufgaben. Lass uns loslegen und deine Retro-Hardware wieder zum Leben erwecken!
Die Idee zu diesem Beitrag habe ich einem meiner Follower zu verdanken, der meinen bereits veröffentlichten Beitrag zum MacroPad gesehen und die spannende Frage gestellt hat, ob man ein solches Projekt nicht um eine PS/2-Tastatur erweitern könnte. Vielen Dank für die tolle Anregung! Eure Fragen und Ideen inspirieren mich immer wieder zu neuen Projekten und zeigen, wie vielfältig und kreativ die Maker-Community ist.
Inhaltsverzeichnis
- Aufbau einer PS/2 Buchse
- Bezug einer PS/2 Buchse
- Schaltung am Arduino UNO R3
- Auslesen einer PS/2 Tastatur am Arduino mit der Arduino IDE
- Steuern eines Servomotors via PS/2 Tastatur
Aufbau einer PS/2 Buchse
Damit deine PS/2-Tastatur mit dem Arduino spricht, musst du wissen, wie die Pins der PS/2-Buchse belegt sind. Auf dem Bild siehst du das Pinout, und es wird direkt klar: Du brauchst nur vier Pins! Zwei davon sind für die Stromversorgung (VCC und GND) zuständig, die anderen beiden für die Kommunikation (Clock und Data).
Ein kleiner, aber wichtiger Hinweis: Wenn du direkt die Pins vom Stecker abgreifen willst, ist das Pinout spiegelverkehrt! Also achte gut darauf, dass alles richtig verbunden ist. Sobald das passt, bist du nur noch ein paar Schritte davon entfernt, Daten mit deinem Arduino auszulesen. So einfach kann’s gehen!
Bezug einer PS/2 Buchse
Du bekommst PS/2 Buchsen & Stecker immer noch zu kaufen, auch wenn diese bereits seit mehreren Jahren durch den USB-Standard abgelöst wurden. Nachfolgend gebe ich dir ein paar Links zu dem hier verwendeten Modul.
Hinweis von mir: Die mit einem Sternchen (*) markierten Links sind Affiliate-Links. Wenn du über diese Links einkaufst, erhalte ich eine kleine Provision, die dazu beiträgt, diesen Blog zu unterstützen. Der Preis für dich bleibt dabei unverändert. Vielen Dank für deine Unterstützung!
Schaltung am Arduino UNO R3
Es gibt die PS/2 Buchsen einzeln als Baustein für den Aufbau auf einer Lochrasterplatine und auch als Modul fertig auf einer Platine, ich habe mich für die letztere Version entschlossen, da dieses für den Beitrag erstmal völlig ausreicht und keinen nennenswerten Vorteil / Nachteil gibt.
Auslesen einer PS/2 Tastatur am Arduino mit der Arduino IDE
Nachdem das kleine Modul angeschlossen und mit der Tastatur verbunden ist, können wir mit der Programmierung starten.
Wir können uns hier wie üblich mit einer passenden Bibliothek die Arbeit sehr einfach machen. Ich verwende die Bibliothek PS2Keyboard von Christian Weichel, welche du ganz bequem über den Bibliotheksverwalter der Arduino IDE installieren kannst.
Nachfolgend ein kleines Beispiel, welches auf der seriellen Schnittstelle die gedrückte Taste ausgibt. Dieses funktioniert für die Tasten 0-9 und a-z sehr zuverlässig. Möchtest du die Sonderzeichen und Großbuchstaben behandeln, so muss auch die Aktion an der Shift-Taste behandelt werden.
//Bibliothek zum auslesen der KeyCodes einer PS/2 Tastatur #include <PS2Keyboard.h> //Pins #define dataPin 4 #define clkPin 3 //Initialisieren des Objektes PS2Keyboard keyboard; void setup() { //beginn der seriellen Kommunikation mit 115200 baud Serial.begin(115200); //beginn der Kommunikation mit der PS/2 Tastatur keyboard.begin(dataPin, clkPin); } void loop() { //Wenn Daten empfangen werden können, dann... if (keyboard.available()) { //auslesen des KeyCodes uint16_t c = keyboard.read(); //Wenn der Code größer 0 ist, dann... if (c > 0) { //umwandeln des Wertes in einen Charakter //damit wird die gedrückte Taste ausgegeben Serial.print(char(c)); //Dieses Funktioniert für die Taster 0-9 und a-z zuverlässig. //Möchtest du die Sonderzeichen und Großbuchstaben behandeln //so muss zuvor auf die Shift-Taste reagiert werden. } } }
Steuern eines Servomotors via PS/2 Tastatur
Wir können mit der Tastatur nun recht einfach einen Servomotor steuern, dazu verwende ich die beiden Pfeiltasten rechts & links.
Die kleine Schaltung erweitern wir hierzu um den Servomotor, welcher an einen digitalen PWM Pin angeschlossen wird. Einen solchen PWM Pin erkennen wir an der Tilde ~ an der Pinbeschriftung.
Bauteil | Arduino UNO R3 |
---|---|
PS/2 Modul | |
CLK (grün) | D4 |
DATA (gelb) | D3 |
VCC (rot) | 5 V |
GND (schwarz) | GND |
Servomotor | |
VCC (rot) | 5 V |
GND (braun) | GND |
DATA (orange) | D9 |
//Bibliothek zum ansteuern eines Servomotors am Arduino #include <Servo.h> //Bibliothek zum auslesen der KeyCodes einer PS/2 Tastatur #include <PS2Keyboard.h> //Pins #define dataPin 4 #define clkPin 3 //Initialisieren des Objektes PS2Keyboard keyboard; //Servomotor am digitalen Pin D9 angeschlossen #define servoPin 9 //initialisieren des Servo-Objektes Servo servo; //Schritte für den Servomotor const int SERVO_STEPS = 10; //maximale & minimale Position des Servos const int MAX_SERVO_POSITION = 180; const int MIN_SERVO_POSITION = 0; //Feld zum speichern der aktuellen Servoposition unsigned int servoPosition = 0; void setup() { //beginn der seriellen Kommunikation mit 115200 baud Serial.begin(115200); //beginn der Kommunikation mit der PS/2 Tastatur keyboard.begin(dataPin, clkPin); //verbinden des Servo-Objektes mit dem Pin servo.attach(servoPin); //beim starten des Mikrocontrollers soll die NULL-Position angefahren werden servo.write(servoPosition); } void loop() { //Wenn Daten empfangen werden können, dann... if (keyboard.available()) { uint16_t c = keyboard.read(); //Wenn die Pfeiltaste Links & die aktuelle Servoposition kleiner als die maximale ist, dann... if (c == PS2_LEFTARROW && servoPosition < MAX_SERVO_POSITION) { //erhöhen der Servoposition um X Schritte servoPosition += SERVO_STEPS; //schreiben der aktuellen Position servo.write(servoPosition); } else if (c == PS2_RIGHTARROW && servoPosition > MIN_SERVO_POSITION) { servoPosition -= SERVO_STEPS; servo.write(servoPosition); } } }