2021/04/17

Teclado Hexadecimal USB: Versión 1 funcionando

Venís de la intro y un mini POC.

 

Tras mirar bastante el código  de PS2Keyboard, que es la clase que lee el teclado PS2 y observar el comportamiento de Keyboard, que es la clase que se hace pasar por un teclado USB, he logrado comprender bastantes cosas, empezando por las limitaciones.

                           [PS2Keyboard]
                               /   \
  PC <-- USB -->[Keyboard] Teensy   <-- ps2 --> Teclado
                               \   /
                               [ps2]


Usando PS2Keyboard y Keyboard, ya tengo un segundo prototipo, que funciona con lo básico, pero no puedo hacer que me funcionen las demás teclas como las flechas ni el NumLock.
 

PS2Keyboard

PS2Keyboard es de más alto nivel, toma las secuencias de código que provienen del teclado y las convierte en caracteres de 8 bits. Mapea las teclas especiales como "print screen" y "capslock" a un código arbitrario.

Se usa asi:

 if (keyboard.available()) {
    // read the next key
    char c = keyboard.read();

Si oprimis la tecla "4", recibís un "4" (ascii 52 o 0x34).

Tocando el código de la librería:

[$ARDUINO_FOLDER/hardware/teensy/avr/libraries/PS2Keyboard/PS2Keyboard.cpp]

 

     while (1) {
           s = get_scan_code();
           if (!s) return 0;
           if (s == 0xF0) {
                   state |= BREAK;
                   Serial.println("BREAK");
           } else if (s == 0xE0) {
                   state |= MODIFIER;
                   Serial.println("MODIFIER");

 

Si oprimís "4", en el serial emitís un BREAK, si oprimís flecha arriba, MODIFIER, MODIFIER, BREAK, pero para consumir unos caracteres inútiles por ahora.

 

Toqué un poco en el .h:

[$ARDUINO_FOLDER/hardware/teensy/avr/libraries/PS2Keyboard/PS2Keyboard.h]

// Every call to read() returns a single byte for
// each keystroke.  These configure what byte will
// be returned for each "special" key.  To ignore
// a key, use zero.
#define PS2_TAB                      9
#define PS2_ENTER                   13
#define PS2_BACKSPACE                7
#define PS2_ESC                     27
#define PS2_INSERT                  65     // 0
#define PS2_DELETE                  68     // 127
#define PS2_HOME                    66     // 0
#define PS2_END                     69     // 0
#define PS2_PAGEUP                  67     // 25
#define PS2_PAGEDOWN                70     // 26
#define PS2_UPARROW                 11
#define PS2_LEFTARROW                8
#define PS2_DOWNARROW               10
#define PS2_RIGHTARROW              21
 

 

 Y con eso tengo las letras A-F en donde quería.

 

 La versión actual queda:


include <PS2Keyboard.h>

const int DataPin = 5;
const int IRQpin =  3;

PS2Keyboard keyboard;

void setup() {
  keyboard.begin(DataPin, IRQpin);
  delay(1000);
}

void loop() {
 if (keyboard.available()) {
    char c = keyboard.read();
    Keyboard.print(c);
  }
}

 

El resto

ps2

ps2 es de bajo nivel, recibe sin interpretar cada código desde el teclado:

  for (;;) { /* ever */ 
    code = kbd.read();
    Serial.println(code, HEX);

Si oprimís la tecla "4", recibís:

6B
F0
6B

Aparentemente 6B es 4-keypress y F06B es 4-keyrelease

Si oprimís flecha arriba:

E0
75
E0
F0
75

Afirmaría que E075 es upArrow-keypress y E0F075 upArrow-keyrelease.

A ver, qué pasa si hago:

  • oprimir 4  
  • oprimir flecha
  • soltar flecha
  • soltar 4

6B -> 4 keypress
E0
75 -> flecha keypress
E0
F0
75 -> flecha keyrelease
F0
6B -> 4 keyrelease

Bien, si ahora oprimo el 4 y espero, aparece el 6B, si no me apuro en soltar, se llena de 6B. Ya está bien clarito, llegó el momento de mapear todo...

 


key presskey release
printscreenE012E07C



E0F07CE0F012
scroll lock7E






F07E



pauseE11477E1F014F077





backspace66






F066



num lock77






F077



insertE070





E0F070


homeE06C





E0F06C


page upE07D





E0F07D


deleteE071





E0F071


endE069





E0F069


page downE07A





E0F07A


up arrowE075





E0F075


left arrowE06B





E0F06B


down arrowE072





E0F072


right arrowE074





E0F074


esc76






F076



/E04A





E0F04A


*7C






F07C



-7B






F07B



76C






F06C



875






F075



97D






F07D



+79






F079



46B






F06B



573






F073



674






F074



169






F069



272






F072



37A






F07A



enterE05A





E0F05A


070






F070



.71






F071



Intuyo que si pudiera activar el NumLock, las teclas marcadas en verde enviarían otros códigos.


El código referenciado está en

$ARDUINO_FOLDER/libraries/ps2/ps2.h

$ARDUINO_FOLDER/libraries/ps2/ps2.cpp

 

Próximos pasos

Tengo que examinar Keyboard para ver si puedo enviar esos códigos directamente o tengo que hacer alguna conversión y quizás prender y apagar el LED. En otras palabras, que el teclado funcione de modo transparente salvo los reemplazos de teclas objetivo del ejercicio.


No hay comentarios:

Publicar un comentario