Arduino Leonardo->A500 Tastatur Problem. Wer kann helfen?

  • Arduino Leonardo->A500 Tastatur Problem. Wer kann helfen?

    Hallo
    Ich arbeite gerade an der kleinen Bastelei eine A500 Tastatur über einen Arduino als HID Keyboard zu benutzen.
    Leider habe ich ein kleines Problem.
    Ich finde einfach den Hex Code nicht für die rechte Windows Taste.
    Es geht eigentlich darum. Ich möchte gerne die Tastatur über den Arduino an einem Emulator laufen lassen.
    Wie ja vielen bekannt ist machen die Emulatoren wie Winuae oder UAE4Arm usw. einen Reset über
    Linke STRG, linke Windowstaste und rechte Windowstaste(Menü)
    Nun genau diese Menütaste geht nicht auf der Amiga Tastatur da mir der passende Hex Code zum ansprechen fehlt.
    Auf der Amiga Tastatur wäre es die rechte Amiga Taste.

    Hier habt ihr mal den Code für den Arduino:

    Quellcode

    1. #include <Keyboard.h>
    2. #define BITMASK_A500CLK 0b00010000 // IO 8
    3. #define BITMASK_A500SP 0b00100000 // IO 9
    4. #define BITMASK_A500RES 0b01000000 // IO 10
    5. #define SYNCH_HI 0
    6. #define SYNCH_LO 1
    7. #define HANDSHAKE 2
    8. #define READ 3
    9. #define WAIT_LO 4
    10. #define WAIT_RES 5
    11. #define HID_SendReport(id,data,len) HID().SendReport(id,data,len) // IDE 1.6.9
    12. KeyReport _keyReport;
    13. uint32_t counter = 0;
    14. uint8_t Joy, MemoJoy1, MemoJoy2, state, bitn, key, fn,keydown, ktab[0x68]={
    15. // Tilde, 1-9, 0, sz, Accent, backslash, Num 0 (00 - 0F)
    16. 0x35, 0x1E, 0x1F, 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x2D, 0x2E, 0x31, 0, 0x62,
    17. // Q bis +, -, Num 1, Num 2, Num3 (10 - 1F)
    18. 0x14, 0x1A, 0x08, 0x15, 0x17, 0x1C, 0x18, 0x0C, 0x12, 0x13, 0x2F, 0x30, 0 , 0x59, 0x5A, 0x5B,
    19. // A-#, -, Num 4, Num 5, Num 6 (20 - 2F)
    20. 0x04, 0x16, 0x07, 0x09, 0x0A, 0x0B, 0x0D, 0x0E, 0x0F, 0x33, 0x34, 0x32, 0, 0x5C, 0x5D, 0x5E,
    21. // <>,Y- -, -, Num . , Num 7, Num 8, Num 9 (30 - 3F)
    22. 0x64, 0x1D, 0x1B, 0x06, 0x19, 0x05, 0x11, 0x10, 0x36, 0x37, 0x38, 0, 0x63, 0x5F, 0x60, 0x61,
    23. // Space, BS, Tab, Enter, Return, ESC, Del, -, -, -, Num -, -, up, down, right, left (40 - 4F)
    24. 0x2C, 0x2A, 0x2B, 0x58, 0x28, 0x29, 0x4C, 0, 0, 0, 0x56, 0, 0x52, 0x51, 0x4F, 0x50,
    25. // F1-F10, -, -, Num /, Num *, Num +, - (50 - 5F)
    26. 0x3A, 0x3B, 0x3C, 0x3D, 0x3E, 0x3F, 0x40, 0x41, 0x42, 0x43, 0, 0, 0x54, 0x55, 0x57, 0,
    27. // modifiers: Shift left, Shift right, -, Win left, Ctrl left, Ctrl right, Alt left, Alt right
    28. 0x02, //SHIFT-LINKS
    29. 0x20, //SHIFT-RECHTS
    30. 0x00,
    31. 0x01, //LINKS-CTRL
    32. 0x04, //RECHTS-ALT
    33. 0x40, //LINKS-AMIGA
    34. 0x08, //LINKS-ALT
    35. 0x10, //Sollte die Menü Taste sein. Geht aber nicht
    36. };
    37. void setup() {
    38. // Keyboard (Port B)
    39. DDRD = ~(BITMASK_A500CLK | BITMASK_A500SP | BITMASK_A500RES); // direction INPUT
    40. }
    41. void loop() {
    42. // Keyboard
    43. if (((PINB & BITMASK_A500RES)==0) && state!=WAIT_RES) { // Reset
    44. interrupts();
    45. keystroke(0x4C,05); // CTRL+ALT+DEL
    46. fn=0;
    47. state=WAIT_RES;
    48. }
    49. else if (state==WAIT_RES) { // Waiting for reset end
    50. if ((PINB & BITMASK_A500RES)!=0) state=SYNCH_HI;
    51. }
    52. else if (state==SYNCH_HI) { // Sync-Pulse HI
    53. if ((PINB & BITMASK_A500CLK)==0) state=SYNCH_LO;
    54. }
    55. else if (state==SYNCH_LO) { // Sync-Pulse LOW
    56. if ((PINB & BITMASK_A500CLK)!=0) state=HANDSHAKE;
    57. }
    58. else if (state==HANDSHAKE) { // Handshake
    59. if (counter==0) {
    60. DDRB |= BITMASK_A500SP; // set IO direction to OUTPUT
    61. PORTB &= ~BITMASK_A500SP; // set OUTPUT to LOW
    62. counter=millis();
    63. }
    64. else if (millis()-counter>10) {
    65. counter=0;
    66. DDRB &= ~BITMASK_A500SP; // set IO direction to INPUT
    67. state=WAIT_LO;
    68. key=0;
    69. bitn=7;
    70. }
    71. }
    72. else if (state==READ) { // read key message (8 bits)
    73. if ((PINB & BITMASK_A500CLK)!=0) {
    74. if (bitn--){
    75. key+=((PINB & BITMASK_A500SP)==0)<<(bitn); // key code (add bits 0...6)
    76. state=WAIT_LO;
    77. }
    78. else { // read last bit (key down)
    79. keydown=((PINB & BITMASK_A500SP)!=0); // true if key down
    80. interrupts();
    81. state=HANDSHAKE;
    82. if (key==0x5F) fn=keydown; // "Help" key: special function on/off
    83. else if (key==0x62) keystroke(0x39,0x00); // CapsLock
    84. else {
    85. if (keydown){
    86. // keydown message received
    87. if (fn) {
    88. // special function with "Help" key
    89. if (key==0x50) keystroke(0x44,0); // F11
    90. else if (key==0x51) keystroke(0x45,0); // F12
    91. else if (key==0x5A) keystroke(0x53,0); // NumLock
    92. else if (key==0x5B) keystroke(0x47,0); // ScrollLock
    93. else if (key==0x02) keystroke(0x14,0x40); // @
    94. else if (key==0x04) keystroke(0x35,0x02); // °
    95. }
    96. else {
    97. if ((key==0x2B) && (_keyReport.modifiers & 0x22)) keystroke(0x35,0x00); // ^ (with shift)
    98. else if (key==0x00) if (_keyReport.modifiers & 0x22) keystroke(0x30,0x40); else keystroke(0x35,0x20); // ~,`
    99. else if (key==0x0D) if (_keyReport.modifiers & 0x22) keystroke(0x64,0x40); else keystroke(0x2D,0x40); // |,\
    100. else if (key==0x5A) if (_keyReport.modifiers & 0x22) keystroke(0x24,0x40); else keystroke(0x25,0x40); // {,[
    101. else if (key==0x5B) if (_keyReport.modifiers & 0x22) keystroke(0x27,0x40); else keystroke(0x26,0x40); // },]
    102. else if (key < 0x68) keypress(key); // Code table
    103. }
    104. }
    105. else {
    106. // keyrelease message received
    107. if (key < 0x68) keyrelease(key); // Code table
    108. }
    109. }
    110. }
    111. }
    112. }
    113. else if (state==WAIT_LO) { // waiting for the next bit
    114. if ((PINB & BITMASK_A500CLK)==0) {
    115. noInterrupts();
    116. state=READ;
    117. }
    118. }
    119. }
    120. void keypress(uint8_t k) {
    121. if (k > 0x5f) _keyReport.modifiers |= ktab[key]; // modifier
    122. else {
    123. for (uint8_t i=0; i<6; i++) {
    124. if (_keyReport.keys[i] == 0) {
    125. _keyReport.keys[i] = ktab[key];
    126. break;
    127. }
    128. }
    129. }
    130. HID_SendReport(2,&_keyReport,8);
    131. }
    132. void keyrelease(uint8_t k) {
    133. if (k > 0x5f) _keyReport.modifiers &= ~ktab[key]; // modifier
    134. else {
    135. for (uint8_t i=0; i<6; i++) {
    136. if (_keyReport.keys[i] == ktab[key]) _keyReport.keys[i] = 0;
    137. }
    138. }
    139. HID_SendReport(2,&_keyReport,8);
    140. }
    141. void keystroke(uint8_t k, uint8_t m) {
    142. unsigned short memomodifiers = _keyReport.modifiers; // save last modifier state
    143. for (uint8_t i=0; i<6; i++) {
    144. if (_keyReport.keys[i] == 0) {
    145. _keyReport.keys[i] = k;
    146. _keyReport.modifiers = m;
    147. HID_SendReport(2,&_keyReport,8);
    148. _keyReport.keys[i] = 0;
    149. _keyReport.modifiers = memomodifiers; // recover modifier state
    150. HID_SendReport(2,&_keyReport,8);
    151. break;
    152. }
    153. }
    154. }
    Alles anzeigen
    Ab Zeile 18 werden dann die einzelnen Tasten per Hexzahl der Amiga Tastatur zugewiesen.
    Ansonsten funktioniert alles halt soweit ganz ordentlich.
    Vieleicht kennt sich da jemand gut aus und kann mir helfen.

    Gruß Markus
    Chuck Norris brauch keine Datasette oder eine Floppy.
    Das Programm startet schon beim Einschalten den C=64

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von CypherXG ()

  • CypherXG schrieb:

    0x80 ist die rechte Windows Taste, aber nicht rmenu.
    Es bleibt mir wohl keine andere Wahl als alle Hex Nummern durchzumachen.
    schau vorher mal hier
    msdn.microsoft.com/pt-br/library/windows/desktop/dd375731

    Quellcode

    1. VK_MENU 0x12 ALT
    2. VK_LMENU 0xA4 Left MENU key
    3. VK_RMENU 0xA5 Right MENU key
    oder win.tue.nl/~aeb/linux/kbd/scancodes-1.html

    Quellcode

    1. These escaped scancodes occur only on 101+ key keyboards. The Microsoft keyboard adds
    2. e0 5b (LeftWindow)
    3. e0 5c (RightWindow)
    4. e0 5d (Menu)
  • Blöde Frage vielleicht:
    Gibt es irgendwo eine Anleitung, um den Umbau "Amiga 500 Tastatur als USB-Keyboard" nachzuvollziehen?

    Ich hatte bei meinem geplanten Umbau (Rasp mit Amibian in Amiga 500 Gehäuse) eigentlich mit dem Keyrah V2 die Tastatur vom A500 nutzen wollen.
    Allerdings besitzt Keyrah V2 nur Anschlüsse für eine A600 oder eine A1200 Tastatur.

    Ein Schaltschema oder - noch besser - ein paar Bilder zu dem Anschluss der A500 Tastatur an den Arduino wären super.
  • Neu

    Stuckalf schrieb:

    Blöde Frage vielleicht:
    Gibt es irgendwo eine Anleitung, um den Umbau "Amiga 500 Tastatur als USB-Keyboard" nachzuvollziehen?
    [...]
    Ich weiß, ich belebe hier vielleicht Zombies, aber: forum.arduino.cc/index.php?topic=139358.0



    Lieber Gruß

    René

    PS @CypherXG: Fühle mit Dir. Habe mich auch dumm und dämlich gesucht. Und es waren zwei kleine Ungenauigkeiten in Deinem ursprünglichen Code, siehe obiger Link.
  • Benutzer online 1

    1 Besucher