Close

PC PS/2 klávesnice a Arduino

Arduino a PS/2 klávesnice

Náš čtenář, pan Miroslav Tesař, kterého možná znáte jako autora robotického sudoku, nám poslal další zajímavý projekt. V tomto projektu ukazuje, jak lze použít starou PS/2 klávesnici pro ovládání Arduina.


Nevyhazujte starou klávesnici s výstupem na PS/2, ale využijete ji ve vašich aplikacích s Arduinem.

Klávesnice s výstupem na konektor PS/2 jsou v dnešní době pro PC nepoužitelné. Nahradily je klávesnice s výstupem na USB konektor. Takže klávesnice končí v tom horším případě v kontejneru, v lepším případě jako separovaný elektronický odpad. A to je škoda ….

Bastlíři ví, jaký problém je s tlačítky – musí pro ně najít místo, musí ošetřit přechodové jevy a navíc každé softwarové ošetření zakmitávání kontaktů sebou nese ztrátu strojového času. Nabízí se tedy otázka, proč nevyužít starou, nepotřebnou profesionální klávesnici s výstupem na PS/2? Získáte tím externí klávesnici se značným počtem použitelných kláves a přitom se nemusíte „babrat“ se všemi problémy s tlačítky.

Jak se dá klávesnice připojit?

Takže pojďme na to a zahrňme starou klávesnici mezi periferní jednotky k Arduinu. Co k tomu potřebujeme? Jedno Arduino NANO, stačí s mikročipem ATmega168 a pokud potřebujeme dálkovou správu vašeho hlavního Arduina (do 1200 metrů), můžeme doplnit obvod o budič SN75176 a vytvořit na místo klasického přenosu kódu pomocí protokolu RS232 obvod pracující na protokolu RS485.

Samozřejmě je možná varianta, aby se přímo použil protokol PS/2 ve vašem hlavním Arduinu. To všechno je možné, stačí si jen vybrat pro vás to nejvhodnější řešení.

My se podíváme na řešení s pomocným Arduinem NANO 168/328P s dálkovým přenosem pomocí protokolu RS485.

Ke klávesnici si vytvoříme modul převodníku PS/2 -> RS232 -> RS485. Programové řešení je uvedeno níže.

Program pro obsluhu klávesnice

/*******************************************************
 * PREVODNIK PS2 KLAVESNICE NA RS485 (anebo RS232)
 * -----------------------------------------------------
 * odeslani stlacene klavesy do RS485 (RS232)
 * *****************************************************/
 
/*******************************************************
 * KNIHOVNY
 *******************************************************/
 #include <PS2Keyboard.h>
 #include <SoftwareSerial.h>

/*******************************************************
 * KONSTANTY PRE PS/2
 *******************************************************/
 #define DATA_PIN  4   // Data
 #define IRQ_PIN   3   // Clock

/*******************************************************
 * KONSTANTY PRE USART
 *******************************************************/
 #define TX      19  
 #define RX      14
 #define Speed 4800

/*******************************************************
 * INSTANCE
 *******************************************************/
 PS2Keyboard    kbd;
 SoftwareSerial mySerial(RX, TX);

/*******************************************************
 * PROMENNE
 *******************************************************/
 byte Klav;

/*******************************************************
 * SETUP
 *******************************************************/
 void setup() {
   Serial.begin(9600);  // Inicializace pro kontrolu kodu
   while (!Serial) { }; // Pockej na pripojeni klavesnice
   kbd.begin(DATA_PIN,IRQ_PIN);
   mySerial.begin(Speed);
   pinMode(RX,INPUT);
   pinMode(TX,OUTPUT);
   digitalWrite(TX,HIGH);
 }

/*******************************************************
 * HLAVNI PROGRAM
 *******************************************************/
 void loop() {
   if(kbd.available()) {
     Klav = toupper(kbd.read());  // Konvertuj na velke pismena 
     mySerial.write(Klav);        // Posli na RS232    
     // Serial.println(Klav);     // Pro kontrolu kodu
   } 
 }
Arduino a PS/2 klávesnice - PCB

Nahoře: Převodník z PS/2 na RS485, Dole: převodník RSR85 na RS232

Arduino a PS/2 klávesnice - PCB

Program pro hlavní Arduino

Program ve vašem hlavním Arduinem je popsaný níže:

/*******************************************************
 * PRIJEM STLACENE KLAVESY Z PREVODNIKU PS2 KLAVESNICE
 * -----------------------------------------------------
 * prijem stlacene klavesy do RS485 (RS232)
* *****************************************************/

/*******************************************************
 * KNIHOVNY
 *******************************************************/
 #include <Wire.h>
 #include <SoftwareSerial.h>

/*******************************************************
 * PIN - KONSTANTY PRE USART
 *******************************************************/
 #define TX            11
 #define RX             2

/*******************************************************
 * INSTANCE
 *******************************************************/
 SoftwareSerial mySerial(RX,TX); // USART 

/*******************************************************
 * PROMENNE
 *******************************************************/
 byte Klav;

/*******************************************************
 * DEKODUJ KLAVESU 001 - 032
 * -----------------------------------------------------
 * reakce na stlacenou klavesu
 *******************************************************/
 void DekodujKlavesu001_032() {
   switch (Klav) {
     // do case si doplnite procedury reagujici na klavesu
     case   8:   ; break;  // Sipka Vlavo
     case  10:   ; break;  // Sipka Dole    
     case  11:   ; break;  // Sipka Hore
     case  13:   ; break;  // Enter
     case  21:   ; break;  // Sipka Vpravo
     case  25:   ; break;  // 9
     case  26:   ; break;  // 6
     case  27:   ; break;  // ESC
     case  32:   ; break;  // SPACE
   }   
 }

/*******************************************************
 * DEKODUJ KLAVESU 033 - 064
 * -----------------------------------------------------
 * reakce na stlacenou klavesu
 *******************************************************/

 void DekodujKlavesu033_064() {
   switch (Klav) {
     // do case si doplnite procedury reagujici na klavesu
     case  45:   ; break;  // %
     case  46:   ; break;  // :
     case  47:   ; break;  // -
     case  48:   ; break;  // 0
     case  49:   ; break;  // 1
     case  50:   ; break;  // 2
     case  51:   ; break;  // 3
     case  53:   ; break;  // 5
     case  54:   ; break;  // 6
     case  55:   ; break;  // 7
     case  56:   ; break;  // 8
     case  57:   ; break;  // 9
     case  61:   ; break;  // =
   }   
 }

/*******************************************************
 * DEKODUJ KLAVESU 065 - 096
 * -----------------------------------------------------
 * reakce na stlacenou klavesu
 *******************************************************/
 void DekodujKlavesu065_096() {
   switch (Klav) {
     // do case si doplnite procedury reagujici na klavesu
     case  65:   ; break;  // A
     case  66:   ; break;  // B
     case  67:   ; break;  // C
     case  68:   ; break;  // D
     case  69:   ; break;  // E
     case  70:   ; break;  // F
     case  71:   ; break;  // G
     case  72:   ; break;  // H
     case  73:   ; break;  // I
     case  74:   ; break;  // J
     case  75:   ; break;  // K
     case  76:   ; break;  // L
     case  77:   ; break;  // M
     case  78:   ; break;  // N
     case  79:   ; break;  // O
     case  80:   ; break;  // P
     case  81:   ; break;  // Q
     case  82:   ; break;  // R
     case  83:   ; break;  // S
     case  84:   ; break;  // T
     case  85:   ; break;  // U
     case  86:   ; break;  // V
     case  87:   ; break;  // W
     case  88:   ; break;  // Y
     case  89:   ; break;  // 
     case  90:   ; break;  // Z     
   }   
 }

/*******************************************************
 * DEKODUJ KLAVESU 096 - 128
 * -----------------------------------------------------
 * reakce na stlacenou klavesu
 *******************************************************/
 void DekodujKlavesu096_128() {
   switch (Klav) {
     // do case si doplnite procedury reagujici na klavesu
     case 128:   ; break;  // 4
   }   
 }

/*******************************************************
 * DEKODUJ KLAVESU 129 - 160
 * -----------------------------------------------------
 * reakce na stlacenou klavesu
 *******************************************************/
 void DekodujKlavesu129_160() {
   switch (Klav) {
     // do case si doplnite procedury reagujici na klavesu
     case 129:   ; break;  // 7
     case 130:   ; break;  // HOME
     case 131:   ; break;  // END
     case 132:   ; break;  // F1
     case 133:   ; break;  // F2
     case 134:   ; break;  // F3
     case 135:   ; break;  // F4
     case 136:   ; break;  // F5
     case 137:   ; break;  // F6
     case 138:   ; break;  // F7
     case 139:   ; break;  // F8   
     case 140:   ; break;  // F9
     case 141:   ; break;  // F10
     case 142:   ; break;  // F11
     case 143:   ; break;  // F12
   }   
 }

/*******************************************************
 * SETUP
 *******************************************************/
 void setup() {
   Wire.begin();
   Serial.begin(9600);
   mySerial.begin(4800);
}

/*******************************************************
 * HLAVNI PROGRAM
 *******************************************************/
 void loop() {
   if (mySerial.available()) {
     Klav = mySerial.read();
 //  Serial.println(Klav);     // Pro kontrolu kodu
     DekodujKlavesu001_032();
     DekodujKlavesu033_064();
     DekodujKlavesu065_096();
     DekodujKlavesu096_128();
     DekodujKlavesu129_160(); 
   }
}

A to je vše. Pro přenos signálu použijte konektory RJ45 a UTP kabel.


Děkujeme za článek. Máte i vy projekt, se kterým se chcete pochlubit? Podívejte se, jak na to.

Zbyšek Voda

2 Comments on “PC PS/2 klávesnice a Arduino

xmarek
20.11.2018 at 9:46

Moc pěkné. Podobným způsobem jsem zužitkovával dálkové ovládače. Ty jsem si např. skrze STM32Fxx a USB „propojil“ s PC a skrze HID spouštěl hudbu, ovládal hlasitost atd. Dnes jsem sám překvapen co všechno lidé vyhodí a jak se to dá zužitkovat na projektech. 🙂

Oldřich Horáček
20.11.2018 at 10:02

Zdravím vás. Ano ten trend pořizování nových věcí a často nesmyslného zbavování se starých, ale stále opravitelných nebo funkčních věcí, je bohužel obrázek dnešní doby. Právě proto jsou příklady jako náš článek nebo váš komentář hodně důležité, protože ukazují lidem nové možnosti použití.

Napsat komentář