Lettura dati tastiera PS/2

Ciao a tutti!
Sto cercando di creare un keylogger con arduino che legga i dati dalla tastiera e che senza alterare l'input vada al computer. Facendo dei test sono riuscito collegando la tastiera PS/2 solo sull'arduino e tramite il monitor seriale sono riuscito a visualizzare i caratteri digitati. Il problema arriva quando sdoppio il segnale dei cavi della tastiera per collegarli al PC. In pratica la tastiera funziona benissimo sul PC! Ma andando ad analizzare l'output dell'arduino sul monitor seriale sembra che i primi 4 - 5 caratteri che scrivo vengano fuori in modo corretto ma successivamente, arduino stampa caratteri a caso o a volte non stampa nulla.
Se riavvio la scheda ho la stessa analoga situazione: i primi caratteri giusti e i restanti "sballati".

Qualcuno potrebbe gentilmente aiutarmi?

Meglio se mostri lo sketch.

Ancora meglio:
Ti invitiamo a presentarti (dicci quali conoscenze hai di elettronica e di programmazione) qui: Presentazioni
e a leggere il regolamento: Regolamento

Ed inoltre il cross-posting è vietato.
http://forum.arduino.cc/index.php?topic=274384.msg1932762#msg1932762
O fai la domanda in italiano in sezione italia oppure in inglese in sezione internazionale

Si scusatemi tanto per il cross posting e per non essermi presentato, ma ora ho rimediato :wink:

Comunque lo sketch che è caricato attualmente sulla board è un esempio della libreria PS2Keyboard, e a quanto pare come riferitomi sull'altro post sembra essere un problema di sincronizzazione del clock.

/*  PS2Keyboard library example
  
  PS2Keyboard now requries both pins specified for begin()

  keyboard.begin(data_pin, irq_pin);
  
  Valid irq pins:
     Arduino Uno:  2, 3
     Arduino Due:  All pins, except 13 (LED)
     Arduino Mega: 2, 3, 18, 19, 20, 21
     Teensy 2.0:   All pins, except 13 (LED)
     Teensy 2.0:   5, 6, 7, 8
     Teensy 1.0:   0, 1, 2, 3, 4, 6, 7, 16
     Teensy++ 2.0: 0, 1, 2, 3, 18, 19, 36, 37
     Teensy++ 1.0: 0, 1, 2, 3, 18, 19, 36, 37
     Sanguino:     2, 10, 11
  
  for more information you can read the original wiki in arduino.cc
  at http://www.arduino.cc/playground/Main/PS2Keyboard
  or http://www.pjrc.com/teensy/td_libs_PS2Keyboard.html
  
  Like the Original library and example this is under LGPL license.
  
  Modified by Cuninganreset@gmail.com on 2010-03-22
  Modified by Paul Stoffregen <paul@pjrc.com> June 2010
*/
   
#include <PS2Keyboard.h>

const int DataPin = 8;
const int IRQpin =  5;

PS2Keyboard keyboard;

void setup() {
  delay(1000);
  keyboard.begin(DataPin, IRQpin);
  Serial.begin(9600);
  Serial.println("Keyboard Test:");
}

void loop() {
  if (keyboard.available()) {
    
    // read the next key
    char c = keyboard.read();
    
    // check for some of the special keys
    if (c == PS2_ENTER) {
      Serial.println();
    } else if (c == PS2_TAB) {
      Serial.print("[Tab]");
    } else if (c == PS2_ESC) {
      Serial.print("[ESC]");
    } else if (c == PS2_PAGEDOWN) {
      Serial.print("[PgDn]");
    } else if (c == PS2_PAGEUP) {
      Serial.print("[PgUp]");
    } else if (c == PS2_LEFTARROW) {
      Serial.print("[Left]");
    } else if (c == PS2_RIGHTARROW) {
      Serial.print("[Right]");
    } else if (c == PS2_UPARROW) {
      Serial.print("[Up]");
    } else if (c == PS2_DOWNARROW) {
      Serial.print("[Down]");
    } else if (c == PS2_DELETE) {
      Serial.print("[Del]");
    } else {
      
      // otherwise, just print all normal characters
      Serial.print(c);
    }
  }
}

Non credo che possa funzionare come dici di fare, ossia collegando l'uscita dello spinotto PS/2 della tastiera ad entrambe le cose (computer ed Arduino). I dati sulla PS/2 viaggiano con un clock, se il clock lo pilota il computer non puoi pilotarlo con l'Arduino. Credo che il problema sia questo.

Hai usato come IRQpin il 5: sei sicuro che sia adatto per il tuo modello di Arduino?

Se hai una UNO devi usare il pin 2 o 3.

Attualmente sto provando il tutto su un Arduino Nano V3 ed ho anche testato su diversi pin per l'IRQ. Ho anche testato con i pin consigliati dallo sketch su l'arduino Uno ma con gli stessi risultati.

Mi sembra che le ultime versioni della PS2keyboard non abbiano più il limite dei pin 2 e 3, si può usare qualunque pin.

Si può trovare un modo per risolvere il mio problema?

Io continuo a dire che il problema sta qui:

leo72:
Non credo che possa funzionare come dici di fare, ossia collegando l'uscita dello spinotto PS/2 della tastiera ad entrambe le cose (computer ed Arduino). I dati sulla PS/2 viaggiano con un clock, se il clock lo pilota il computer non puoi pilotarlo con l'Arduino. Credo che il problema sia questo.

Potresti risolvere con una Leonardo o una Micro, schede che usano il chip Atmega32U4 che integra l'USB e che può essere visto dal computer come una periferica HDI a tutti gli effetti. C'è la libreria Keyboard, con la quale puoi far "vedere" l'Arduino Leonardo o Micro come una tastiera: a quel punto, l'Arduino leggerebbe la tastiera PS/2, e poi con la Keyboard rispediresti il tasto al computer.

Scusami Leo, ma sia Data che Clock sono delle uscite da parte della tastiera che vengono ricevute dal PC o dal micro.

Quando si preme un tasto la tastiera emette una sequenza di Clock a 10-16.7 kHz ed una di Data: il Clock serve per la sincronizzazione dell'informazione sul Data.

Quindi è necessaria la "cattura" del clock attraverso un interrupt per leggere correttamente il Data.

I pin abilitati per l'interrupt sono il 2 od il 3 sia per la UNO che per la NANO, almeno per la versione 2.3 della libreria.

Le prime versioni di questa non adoperavano l'interrupt e quindi potevano perdere dei caratteri.

Sì, Cyberhs, hai ragione, il clock è generato dalla tastiera, non viceversa. Non ricordavo come funzionasse la linea PS/2.

Sulla questione dei pin e degli interrupt, c'è una versione modificata che può usare qualunque pin come ingresso del clock. C'è un link a metà pagina qui:
http://playground.arduino.cc/Main/PS2Keyboard
Però a me non riesce ad aprirlo.

Sono riuscito a scaricarla, ma sul sito dice

Make sure you connect the Clock PIN to the digital PIN 3 on the Arduino. Otherwise the interrupt, and therefore the whole library, won't work.

No, vabbè... stasera sono proprio rinc.....to.... Ho sbagliato link, la pagina rimanda alla libreria che hai scaricato tu. Comunque mi pareva di aver visto tempo fa una libreria PS2 modificata, mi pareva usasse i PCINT così che si potesse utilizzare con qualunque pin. Forse mi sbaglio o forse non c'è più.