Problema con tastiera PS2 e Arduino Uno

Sto cercando di fare una cosa che dovrebbe essere relativamente semplice eppure non ci riesco: devo collegare una tastiera PS2 al mio Arduino Uno ed essere in grado di rilevare la pressione dei tasti.
Dato che non avevo un connettore femmina PS2 da utilizare ho semplicemente tagliato il cavo della tastiera e ho collegato i cavetti all’Arduino seguendo questo schema:
**EDIT:**Se state leggendo questo post per carpire informazioni tenete a mente che questo codice colori non è corretto, quello giusto lo trovate alla pagina successiva

Ho collegato il cavo dati al pin digitale 4 e il clock al 3.
Poi ho provato ad avviare una cosa semplice semplice:

#include <PS2Keyboard.h>

const int DataPin = 4;
const int IRQpin =  3;

PS2Keyboard keyboard;

void setup() {
  delay(1000);
  keyboard.begin(DataPin, IRQpin);
  Serial.begin(9600);
  if (keyboard.available()) {
    Serial.println("Ok");
  }else{
    Serial.println("Errore");
  }
}

void loop() {
  
}

ma mi scrive Errore, la tastiera funziona, infatti i led si accendono appena carico il programma sull’arduino e si rispengono mezzo secondo dopo, cosa può essere?

Sarà il caso che ti [u]stud[/u]i bene come funziona la libreria e guardi [u]bene[/u] l'esempio ... :smiling_imp:

... stai mettendo nel setup() cose che devi mettere nel loop() ... cerca di capire da solo perché !

Guglielmo

http://arduino.cc/en/Reference/Setup http://arduino.cc/en/Reference/Loop

gpb01:
Sarà il caso che ti **stud**i bene come funziona la libreria e guardi bene l’esempio … :smiling_imp:

… stai mettendo nel setup() cose che devi mettere nel loop() … cerca di capire da solo perché !

Guglielmo

Se lo mettessi nel loop non farebbe altro che stampare “Errore” all’infinito, non vedo perché dovrei mettercelo, non sto facendo nessuna lettura dalla tastiera, sto solamente controllando se è collegata
**EDIT:**Ho scritto cose sbagliate, se leggete il thread per carpire informazioni leggete quello che dice gpb01

... la tua risposta dimostra che NON hai studiato la libreria e cosa fanno i vari metodi ...

Guglielmo

gpb01: ... la tua risposta dimostra che NON hai studiato la libreria e cosa fanno i vari metodi ...

Guglielmo

Il metodo available restituisce un boolean, true se la tastiera è stata inizializzata correttamente, false se non è stata inizializzata correttamente, per il mio codice non penso serva studiare altro, non sto ancora pensando alla lettura di caratteri, per ora mi basta che restituisca true.

Davvero ? ? ? :smiling_imp: :smiling_imp: :smiling_imp:

Strano eh ... perché la descrizione dice :

keyboard.available() Check if a keystroke has been received. Returns true if at least one keystroke.

Guglielmo

Ok, mi hai decisamente beccato :sweat_smile: , mi scuso per non aver cercato abbastanza, ora che so cosa fa riprovo con una cosa del genere:

const int DataPin = 4;
const int IRQpin =  3;
PS2Keyboard keyboard;

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

void loop() {
  if (keyboard.available()) {
    Serial.println("Hai premuto un tasto");
  }
}

E poi scrivo com'è andata, ma non penso andrà bene dato che avevo già provato con l'esempio semplice incluso nella versione 2.3 con supporto a CTRL+Enter e non aveva funzionato

Quella libreria è stata più volte usata e se ne è parlato anche su questo forum ... basta fare una ricerca per trovare alcune discussioni ...

Comunque funziona bene, quindi ... occhio hai collegamenti.

Guglielmo

Niente, non funziona, inoltre ho riprovato anche con l'esempio incluso nel download della libreria, e non funziona, sicuramente c'è qualcosa che non va nei collegamenti, ma non capisco cosa, allego un paio di foto di tutto: L'alimentazione è collegata di sicuro perché i LED della tastiera si accendono, il problema può essere solo sugli altri due cavetti, ma ho controllato con il multimetro che ci sia connessione tra i cavi che escono dalla tastiera e quelli che arrivano all'arduino, e sono connessi, qualche idea di cosa posso aver sbagliato?

Ho notato una cosa, con il multimetro messo come Ohmmetro sembrerebbe che il cavo dei dati sia collegato al cavo del clock, ma la lancetta si alza di meno di quanto si alza normalmente quando lo attacco a due punti di un cavo collegati EDIT questa cosa è all'interno della tastiera, ho scollegato la tastiera dal resto e ho rifatto il test, stesso risultato. Ora la mia domanda è: è normale che sia così o è possibile che la tastiera sia rotta?

Mmm ... non hai un'altra tastiera con cui provare ?

Hai provato anche l'esempio che è QUI cambiando ovviamente i pin ? ... esempio di cui mi fido di più di quello del PlayGround ... :roll_eyes:

Guglielmo

Non mi tornano le connessioni dell'immagine che hai postato in cima al thread con quelle che ci sono qui: http://www.pjrc.com/teensy/td_libs_PS2Keyboard.html

Io ho usato queste, alcuni anni fa, ed ho fatto lavorare una vecchia tastiera PS/2 con la libreria che trovi a quel link.

gpb01:
Hai provato anche l’esempio che è QUI cambiando ovviamente i pin ?

Quell’esempio è identico a quello contenuto nello zip della versione 2.3 con supporto a CTRL+ENTER, non cambia un singolo carattere, quindi si, l’ho provato.

gpb01:
Mmm … non hai un’altra tastiera con cui provare ?

Probabilmente la ho, domattina controllo e se la ho la cambio.

leo72:
Non mi tornano le connessioni dell’immagine che hai postato in cima al thread con quelle che ci sono qui:
http://www.pjrc.com/teensy/td_libs_PS2Keyboard.html

Io ho usato queste, alcuni anni fa, ed ho fatto lavorare una vecchia tastiera PS/2 con la libreria che trovi a quel link.

Non avevo un connettore PS2 femmina, quindi sono andato a vedere i fili all’interno del cavo grosso (scusate il linguaggio scadente, sono un programmatore, e fino a due giorni fa non avevo mai toccato il saldatore), e sono abbastanza sicuro che i colori siano giusti, almeno il bianco e il rosso lo sono di sicuro perché la tastiera si accende, in che senso non ti tornano?

Confronta lo schema della presa che hai messo nel primo post con lo schema che c'è al link che ti ho dato, vedi che non sono uguali? EDIT: argh.. le prese sono con 2 inquadrature diverse.... una è ruotata di 180° dell'altra... quindi tornano.. Io ho usato quelli del link, e mi ha funzionato

… non è che hai invertito i fili di Clock e Data ? Magari i colori sono diversi … dovresti verificare sulla presa PS2 … :roll_eyes:

Guglielmo

gpb01: Mmm ... non hai un'altra tastiera con cui provare ?

Ho rimediato la tastiera, la sto saldando adesso, e una cosa che ho notato subito è che il problema che rilevavo sull'altra con l'Ohmmetro qui non c'è, probabilmente era davvero rotta l'altra tastiera, appena faccio i test vi aggiorno

gpb01: ... non è che hai invertito i fili di Clock e Data ? Magari i colori sono diversi ... dovresti verificare sulla presa PS2 ... :roll_eyes:

La presa... (l'ho buttata :fearful: ) comunque quando faccio il test se non riesce provo a invertirli e rifarlo

Niente, usando questo

#include <PS2Keyboard.h>

const int DataPin = 4;
const int IRQpin =  3;
PS2Keyboard keyboard;

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

void loop() {
  if (keyboard.available()) {
    Serial.println("Hai premuto un tasto");
  }
}

Non mi funziona, ho provato anche a invertire il cavo dei dati con quello del clock, e questa tastiera l’ho provata su un PC prima di tagliare il cavo, quindi funziona, non so più cosa pensare :slightly_frowning_face:

Ummm ... rimetti una bella foto chiara di tutte le connessioni che le ricontrolliamo assieme ... :roll_eyes:

Guglielmo

gpb01: Ummm ... rimetti una bella foto chiara di tutte le connessioni che le ricontrolliamo assieme ... :roll_eyes:

Guglielmo

Appena trovo il cellulare la rifaccio, intanto ho notato una cosa strana: secondo questo documento (e ne ho trovato anche un'altro simile) l'interruzione di pressione del tasto inizia quando il clock è LOW e il data anche, quindi ho provato una cosa semplice semplice: se tutti e due sono LOW stampo un messaggio

int clock = 3;
int data = 4;
void setup() {                
  pinMode(clock, INPUT); 
  pinMode(data, INPUT); 
  Serial.begin(9600);
}

void loop() {
  if(digitalRead(clock)==LOW && digitalRead(data)==LOW){
     Serial.println("INT");
  }else{
  }
}

Eppure quando lo eseguo scrive INT a raffica mentre io non premo niente :astonished: Ah, altra cosa, in teoria il clock è sempre HIGH, finché non viene premuto un tasto, in quel momento inizia a scandire il tempo di invio dei bit, però stampando il valore letto dal clock ogni 100ms il risultato è che avvolte è HIGH, avvolte LOW, in pratica scandisce il tempo costantemente... o il documento è sbagliato, oppure la tastiera è fasulla, però la tastiera funziona se collegata al PC :cold_sweat: AGGIUNTA: Se il documento è giusto allora probabilmente la libreria si basa sullo stesso protocollo per la comunicazione con la tastiera, quindi il fatto che gli input che la mia tastiera fornisce all'arduino non rispettino il protocollo spiega perché la libreria non mi funziona. A questo punto il problema può essere solo due cose: o la tastiera è rotta (e quindi ho due tastiere rotte) oppure ho sbagliato i collegamenti(mooooolto più probabile :sweat_smile: )