Arduino Leonardo (Atmel Mega32U4) adapter for an XT keyboard to be used as a USB keyboard.
Não pode escolher mais do que 25 tópicos Os tópicos devem começar com uma letra ou um número, podem incluir traços ('-') e podem ter até 35 caracteres.

181 linhas
3.6 KiB

  1. // XtKeyboard source: https://forum.arduino.cc/index.php?topic=18396.0
  2. // XT protocol: https://www.win.tue.nl/~aeb/linux/kbd/scancodes-1.html
  3. #include <Keyboard.h>
  4. int clockPin = 2;
  5. int dataPin = 3;
  6. byte data = B0;
  7. int test = 0;
  8. int counter = 0;
  9. int numbits = 10;
  10. int speakerPin = 5;
  11. int keyReleaseBit = 0x80;
  12. char m[255];
  13. // MODS
  14. // play speaker sounds of keys
  15. const bool modKeySounds = true;
  16. // replace CapsLock with Super key (aka GUI or Windows key)
  17. const bool modSuperCapslock = true;
  18. void setupKeyMapping() {
  19. m[1]=KEY_ESC;
  20. m[2]='1';
  21. m[3]='2';
  22. m[4]='3';
  23. m[5]='4';
  24. m[6]='5';
  25. m[7]='6';
  26. m[8]='7';
  27. m[9]='8';
  28. m[10]='9';
  29. m[11]='0';
  30. m[12]='-';
  31. m[13]='=';
  32. m[14]=KEY_BACKSPACE;
  33. m[15]=KEY_TAB;
  34. m[16]='q';
  35. m[17]='w';
  36. m[18]='e';
  37. m[19]='r';
  38. m[20]='t';
  39. m[21]='y';
  40. m[22]='u';
  41. m[23]='i';
  42. m[24]='o';
  43. m[25]='p';
  44. m[26]='[';
  45. m[27]=']';
  46. m[28]=KEY_RETURN;
  47. m[29]=KEY_LEFT_CTRL;
  48. m[30]='a';
  49. m[31]='s';
  50. m[32]='d';
  51. m[33]='f';
  52. m[34]='g';
  53. m[35]='h';
  54. m[36]='j';
  55. m[37]='k';
  56. m[38]='l';
  57. m[39]=';';
  58. m[40]='\'';
  59. m[41]='`';
  60. m[42]=KEY_LEFT_SHIFT;
  61. m[43]='\\';
  62. m[44]='z';
  63. m[45]='x';
  64. m[46]='c';
  65. m[47]='v';
  66. m[48]='b';
  67. m[49]='n';
  68. m[50]='m';
  69. m[51]=',';
  70. m[52]='.';
  71. m[53]='/';
  72. m[54]=KEY_RIGHT_SHIFT;
  73. m[55]='\335'; // num-*
  74. m[56]=KEY_LEFT_ALT;
  75. m[57]=' ';
  76. m[58]=(modSuperCapslock ? KEY_LEFT_GUI : KEY_CAPS_LOCK); // EVIL
  77. m[59]=KEY_F1;
  78. m[60]=KEY_F2;
  79. m[61]=KEY_F3;
  80. m[62]=KEY_F4;
  81. m[63]=KEY_F5;
  82. m[64]=KEY_F6;
  83. m[65]=KEY_F7;
  84. m[66]=KEY_F8;
  85. m[67]=KEY_F9;
  86. m[68]=KEY_F10;
  87. // https://forum.arduino.cc/index.php?topic=266688.msg1880644#msg1880644
  88. // http://www.quadibloc.com/comp/scan.htm
  89. const byte KEY_NUM_LOCK = 219;
  90. m[69]=KEY_NUM_LOCK;
  91. const byte KEY_SCROLL_LOCK = 207;
  92. m[70]=KEY_SCROLL_LOCK;
  93. m[71]='\347'; // num-7
  94. m[72]='\350'; // num-8
  95. m[73]='\351'; // num-9
  96. m[74]='\336'; // num--
  97. m[75]='\344'; // num-4
  98. m[76]='\345'; // num-5
  99. m[77]='\346'; // num-6
  100. m[78]='\337'; // num-+
  101. m[79]='\341'; // num-1
  102. m[80]='\342'; // num-2
  103. m[81]='\343'; // num-3
  104. m[82]='\352'; // num-0
  105. m[83]='\353'; // num-.
  106. //...
  107. m[101]=KEY_F11;
  108. m[102]=KEY_F12;
  109. m[107]=KEY_INSERT;
  110. m[108]=KEY_DELETE;
  111. m[109]=KEY_UP_ARROW;
  112. m[110]=KEY_DOWN_ARROW;
  113. m[111]=KEY_LEFT_ARROW;
  114. m[112]=KEY_RIGHT_ARROW;
  115. //m[]=KEY_;
  116. }
  117. char translateKeyToChar(int key) {
  118. if (sizeof(m) <= key) {
  119. return 0;
  120. }
  121. return m[key];
  122. }
  123. void printChar(char keyChar) {
  124. Serial.print("'"); Serial.print(keyChar); Serial.print("' ("); Serial.print(int(keyChar)); Serial.println(")");
  125. }
  126. void processKbdByte(byte data) {
  127. bool isRelease = data & keyReleaseBit;
  128. int key = data - (isRelease ? keyReleaseBit : 0);
  129. Serial.print("Scancode: <"); Serial.print(int(data)); Serial.print("> ");
  130. Serial.print("Key: <"); Serial.print(int(key)); Serial.print("> ");
  131. char keyChar = translateKeyToChar(key);
  132. if (isRelease) {
  133. Keyboard.release(keyChar);
  134. Serial.print("Release: ");
  135. printChar(keyChar);
  136. } else {
  137. Keyboard.press(keyChar);
  138. Serial.print("Press: ");
  139. printChar(keyChar);
  140. }
  141. }
  142. void setup() {
  143. setupKeyMapping();
  144. pinMode(dataPin, INPUT);
  145. pinMode(clockPin, INPUT);
  146. Serial.begin(9600);
  147. Keyboard.begin();
  148. }
  149. void loop() {
  150. if(digitalRead(clockPin) == LOW && test == 0 && counter < numbits) {
  151. test = 1;
  152. data = data >> 1;
  153. if(digitalRead(dataPin) == HIGH) {
  154. bitSet(data, 7);
  155. }
  156. counter++;
  157. }
  158. if(digitalRead(clockPin) == HIGH && test == 1) {
  159. test = 0;
  160. }
  161. if(counter >= numbits) {
  162. //Serial.println(int(data));
  163. processKbdByte(data);
  164. if (modKeySounds) tone(speakerPin, 60 + int(data), 25);
  165. data = B0;
  166. counter = 0;
  167. }
  168. }