From 762eaecefdcd739f7265b2e7a41236aa15451d0c Mon Sep 17 00:00:00 2001 From: Dejvino Date: Wed, 24 Feb 2021 23:08:10 +0100 Subject: [PATCH] First commit --- README.md | 8 +++ XtKeyboard.ino | 173 +++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 181 insertions(+) create mode 100644 README.md create mode 100644 XtKeyboard.ino diff --git a/README.md b/README.md new file mode 100644 index 0000000..c75dc1c --- /dev/null +++ b/README.md @@ -0,0 +1,8 @@ +# XT Keyboard Adapter + +Arduino Leonardo (Atmel MEGA32U4) code for adapting an old XT keyboard into a USB keyboard. + +The code contains a mapping table so this makes the keyboard "programmable"! + +For added effect, there is a beeping sound generated based the events being received from the keyboard. + diff --git a/XtKeyboard.ino b/XtKeyboard.ino new file mode 100644 index 0000000..51f1680 --- /dev/null +++ b/XtKeyboard.ino @@ -0,0 +1,173 @@ +// XtKeyboard source: https://forum.arduino.cc/index.php?topic=18396.0 +// XT protocol: https://www.win.tue.nl/~aeb/linux/kbd/scancodes-1.html + +#include + +int clockPin = 2; +int dataPin = 3; +byte data = B0; +int test = 0; +int counter = 0; +int numbits = 10; +int speakerPin = 5; +int keyReleaseBit = 0x80; + +char m[255]; + +void setupKeyMapping() { + m[1]=KEY_ESC; + m[2]='1'; + m[3]='2'; + m[4]='3'; + m[5]='4'; + m[6]='5'; + m[7]='6'; + m[8]='7'; + m[9]='8'; + m[10]='9'; + m[11]='0'; + m[12]='-'; + m[13]='='; + m[14]=KEY_BACKSPACE; + m[15]=KEY_TAB; + m[16]='q'; + m[17]='w'; + m[18]='e'; + m[19]='r'; + m[20]='t'; + m[21]='y'; + m[22]='u'; + m[23]='i'; + m[24]='o'; + m[25]='p'; + m[26]='['; + m[27]=']'; + m[28]=KEY_RETURN; + m[29]=KEY_LEFT_CTRL; + m[30]='a'; + m[31]='s'; + m[32]='d'; + m[33]='f'; + m[34]='g'; + m[35]='h'; + m[36]='j'; + m[37]='k'; + m[38]='l'; + m[39]=';'; + m[40]='\''; + m[41]='`'; + m[42]=KEY_LEFT_SHIFT; + m[43]='\\'; + m[44]='z'; + m[45]='x'; + m[46]='c'; + m[47]='v'; + m[48]='b'; + m[49]='n'; + m[50]='m'; + m[51]=','; + m[52]='.'; + m[53]='/'; + m[54]=KEY_RIGHT_SHIFT; + m[55]='\335'; // num-* + m[56]=KEY_LEFT_ALT; + m[57]=' '; + m[58]=KEY_CAPS_LOCK; // EVIL + m[59]=KEY_F1; + m[60]=KEY_F2; + m[61]=KEY_F3; + m[62]=KEY_F4; + m[63]=KEY_F5; + m[64]=KEY_F6; + m[65]=KEY_F7; + m[66]=KEY_F8; + m[67]=KEY_F9; + m[68]=KEY_F10; + // https://forum.arduino.cc/index.php?topic=266688.msg1880644#msg1880644 + const byte KEY_NUM_LOCK = 219; + m[69]=KEY_NUM_LOCK; + const byte KEY_SCROLL_LOCK = 207; + m[70]=KEY_SCROLL_LOCK; + m[71]='\347'; // num-7 + m[72]='\350'; // num-8 + m[73]='\351'; // num-9 + m[74]='\336'; // num-- + m[75]='\344'; // num-4 + m[76]='\345'; // num-5 + m[77]='\346'; // num-6 + m[78]='\337'; // num-+ + m[79]='\341'; // num-1 + m[80]='\342'; // num-2 + m[81]='\343'; // num-3 + m[82]='\352'; // num-0 + m[83]='\353'; // num-. + //... + m[101]=KEY_F11; + m[102]=KEY_F12; + m[107]=KEY_INSERT; + m[108]=KEY_DELETE; + m[109]=KEY_UP_ARROW; + m[110]=KEY_DOWN_ARROW; + m[111]=KEY_LEFT_ARROW; + m[112]=KEY_RIGHT_ARROW; +//m[]=KEY_; +} + +char translateKeyToChar(int key) { + if (sizeof(m) <= key) { + return 0; + } + return m[key]; +} + +void printChar(char keyChar) { + Serial.print("'"); Serial.print(keyChar); Serial.print("' ("); Serial.print(int(keyChar)); Serial.println(")"); +} + +void processKbdByte(byte data) { + bool isRelease = data & keyReleaseBit; + int key = data - (isRelease ? keyReleaseBit : 0); + Serial.print("Scancode: <"); Serial.print(int(data)); Serial.print("> "); + Serial.print("Key: <"); Serial.print(int(key)); Serial.print("> "); + char keyChar = translateKeyToChar(key); + + if (isRelease) { + Keyboard.release(keyChar); + Serial.print("Release: "); + printChar(keyChar); + } else { + Keyboard.press(keyChar); + Serial.print("Press: "); + printChar(keyChar); + } +} + +void setup() { + setupKeyMapping(); + + pinMode(dataPin, INPUT); + pinMode(clockPin, INPUT); + Serial.begin(9600); + Keyboard.begin(); +} + +void loop() { + if(digitalRead(clockPin) == LOW && test == 0 && counter < numbits) { + test = 1; + data = data >> 1; + if(digitalRead(dataPin) == HIGH) { + bitSet(data, 7); + } + counter++; + } + if(digitalRead(clockPin) == HIGH && test == 1) { + test = 0; + } + if(counter >= numbits) { + //Serial.println(int(data)); + processKbdByte(data); + tone(speakerPin, 60 + int(data), 25); + data = B0; + counter = 0; + } +}