PC PS/2 klávesnice a Arduino
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.
Obsah článku:
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 } }
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.
- Sledovač slunce s Arduinem - 23.3.2022
- Programovatelný kytarový pedál s Arduinem - 26.2.2020
- Arduino infračervený teploměr vytištěný na 3D tiskárně - 11.2.2020
2 Comments on “PC PS/2 klávesnice a Arduino”
Napsat komentář
Pro přidávání komentářů se musíte nejdříve přihlásit.
xmarek
20.11.2018 at 9:46Moc 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:02Zdraví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í.