Tastiera A,B,C,D per Computer

Salve ragazzi, in questi giorni mi sto esercitando ad un concorso con un Software di quiz. Il software mi fa leggere la domanda e mi fa dare la risposta tra le 4 elencate con la pressione dei tasti A,B,C,D della tastiera e una volta selezionata devo premere Invio.

Ora per comodità volevo qualcosa di più veloce e automatizzato.

Pensavo di creare una tastiera HID composta solo da 4 Pulsanti collegati ad Arduino e mappare per ogni pulsante la lettera o A, o B, o C o D e per ogni lettera dopo inserire l'Invio così alla pressione di uno dei tasti, avrò immediatamente selezionato e accettato la risposta del quiz che ritengo corretta. Ovviamente questa tastiera funzionerà solo tramite cavo USB che collega Arduino al Computer.

In passato ho avuto esperienza nell'utilizzare Arduino come Joystick per PC e farlo rilevare come periferica di gioco a tutti gli effetti con UnoJoy (mettendolo prima in DFU Mode, e flasharlo). Non so se questo servirà nuovamente per poter fare ciò che serve a me però lascio a voi dirmi se serve oppure no.

Esiste già qualche guida per fare ciò che serve a me? E' una cosa fattibile? Mi richiede secondo voi tanto tempo per sviluppare un progetto del genere? (Nel caso vado dal cinese, mi compro una di quelle tastiere di gomma che si arrotolano e collego dei pulsanti esterni solo alle lettere che servono a me... purtroppo è un po' losca come cosa però se è complicato dovrò accontentarmi)

Con un Arduino Leonardo ci vogliono più o meno 5 minuti, ma dipende da quali sono le tue conoscenze.

Arduino Leonardo? Mmmmmh... mi fa un po' paura... diciamo che sono parecchio limitato all'uso di Arduino UNO, non perchè non ho il Leonardo, ma principalmente perchè non mi sono mai messo alla prova utilizzando altri tipi di Arduino.

Per quanto riguarda le mie conoscenze, mi permetto di darle direttamemte del tu, se intendi a livello di programmazione come sto messo, diciamo che le basi solide le ho ma non sono tanto avanzate... direi che a fischi e pernacchie me la cavo. Al computer mi ritengo capace di fare qualsiasi cosa... ma non tanto con l'arduino, non so se mi spiego, però con chi mi aiuta dandomi degli input, riesco pian piano a inviare output senza problemi.

E allora seleziona la Leonardo nell'IDE, carica l'esempio Keyboard e fatti passare la paura!

wow, davvero tutto così semplice? scusami ma ho visto la scheda arduino leonardo e correggimi se sbaglio, alla fine è come la uno... con gli stessi pin analogici e digitali o mi sbaglio?

E come fa la scheda leonardo a sapere cosa deve fare se non gli scrivo niente? Cioè io ora ho aperto l'arduino IDE e dentro non ho trovato alcun esempio, ma solo una libreria... credo che fosse questa a cui facevi riferimento. Se è così una volta caricata la libreria non va scritto qualcosa che richiami le funzioni presenti in quest'ultima?

La scheda è fisicamente simile, ma il microcontrollore è diverso. Nella fattispecie, quello della Leonardo gestisce direttamente l'USB e quindi può apparire al dispositivo connesso come un mouse, una tastiera, un joystick, ecc...

Se non hai trovato esempi, hai guardato male. Vedi qua:

ok, errore mio... chiedo scusa. Ho trovato gli esempi e guardandomeli un po' mi sono reso conto di uno di loro che l'ho già utilizzato 2 settimane fa circa per un altro progetto a cui sto lavorando e che ora o temporaneamente sospeso. (KeyboardMessage)

Comunque vorrei utilizzare la UNO perchè è la scheda che ho tra le mani, e componentistica varia già pronta per questo progetto.

Se mi sai aiutare utilizzando la UNO, è meglio sennò mi sa che sono costretto a dover aspettare l'aiuto di altri

mh, ho visto il link che mi ha mandato e ho provato a selezionare solo la parte che interessa a me, e quindi ecco il codice:

#include "Keyboard.h"

// set pin numbers for the five buttons:
const int upButton = 2;
const int downButton = 3;
const int leftButton = 4;
const int rightButton = 5;
const int mouseButton = 6;

void setup() { // initialize the buttons' inputs:
  pinMode(upButton, INPUT);
  pinMode(downButton, INPUT);
  pinMode(leftButton, INPUT);
  pinMode(rightButton, INPUT);
  pinMode(mouseButton, INPUT);

  Serial.begin(9600);
  Keyboard.begin();
}

void loop() {

  // use the pushbuttons to control the keyboard:
  if (digitalRead(upButton) == HIGH) {
    Keyboard.write('u');
  }
  if (digitalRead(downButton) == HIGH) {
    Keyboard.write('d');
  }
  if (digitalRead(leftButton) == HIGH) {
    Keyboard.write('l');
  }
  if (digitalRead(rightButton) == HIGH) {
    Keyboard.write('r');
  }
  if (digitalRead(mouseButton) == HIGH) {
    Keyboard.write('m');
  }

}

quindi una volta effettuati i collegamenti e caricato questo sketch, alla pressione dei pulsanti dovrebbe funzionare giusto? E come faccio invece ad inserire il pulsante "Invio"?

Ok, ci sono riuscito e funziona benissimo, lascio il mio sketch nel caso a qualcuno potrebbe servire e svilupparlo in maniera differente.

Si collega l'Arduino UNO al computer e si carica questo sketch (fatto interamente da me):

Titolo: ABCDButton
Autore: Cosiwell
Data : 24/05/2018 01:00 

uint8_t buf[8] = { 0 }; 
 // Dichiarazioni costanti su pin definiti
     const int A = A0;
 const int B = A1;
 const int C = A2;
 const int D = A3;
 // Verifica lo stato dei Pulsanti dichiarati
     int previousAState = 0;
 int previousBState = 0;
 int previousCState = 0;
 int previousDState = 0;
 
void setup() {
    Serial.begin(9600);
    // Impostazione dei Pulsanti per funzionare con resistenze interne dell'Arduino
 pinMode(A, INPUT_PULLUP);
 pinMode(B, INPUT_PULLUP);
 pinMode(C, INPUT_PULLUP);
 pinMode(D, INPUT_PULLUP);
    delay(200);
}
 
void loop() {
 
 // Leggi Pulsanti premuti
 int AState = digitalRead(A);
 int BState = digitalRead(B);
 int CState = digitalRead(C);
 int DState = digitalRead(D);
 
 if ((AState != previousAState) && (AState == HIGH)) {
  
  buf[2] = 0x04;   // Lettera A
  Serial.write(buf, 8); // Invia lettera premuta
          releaseKey(); // Rilascia Pulsante
  buf[2] = 0x28;   // Lettera Invio
  Serial.write(buf, 8); // Invia lettera premuta
          releaseKey(); // Rilascia Pulsante
  
  }
  previousAState = AState;
  
 if ((BState != previousBState) && (BState == HIGH)) {
  
  buf[2] = 0x05;   // Lettera B
  Serial.write(buf, 8); // Invia lettera premuta
          releaseKey(); // Rilascia Pulsante
  buf[2] = 0x28;   // Lettera Invio
  Serial.write(buf, 8); // Invia lettera premuta
          releaseKey(); // Rilascia Pulsante
  
  }
  previousBState = BState;
  
 if ((CState != previousCState) && (CState == HIGH)) {
  
  buf[2] = 0x06;   // Lettera C
  Serial.write(buf, 8); // Invia lettera premuta
          releaseKey(); // Rilascia Pulsante
  buf[2] = 0x28;   // Lettera Invio
  Serial.write(buf, 8); // Invia lettera premuta
          releaseKey(); // Rilascia Pulsante
  
  }
  previousCState = CState;
  
 if ((DState != previousDState) && (DState == HIGH)) {
  
  buf[2] = 0x07;   // Lettera D
  Serial.write(buf, 8); // Invia lettera premuta
          releaseKey(); // Rilascia Pulsante
  buf[2] = 0x28;   // Lettera Invio
  Serial.write(buf, 8); // Invia lettera premuta
          releaseKey(); // Rilascia Pulsante
  
  }
  previousDState = DState;
}

void releaseKey() {
      buf[0] = 0;
      buf[2] = 0;
      Serial.write(buf, 8); // Rilascia Pulsante  
     }

Caricato il codice, si passa alla fase che permetterà la conversione della scheda Arduino da usbserial a keyboard. Per fare ciò bisogna utilizzare il Software Flip.

Da Qui ci scarichiamo la cartella contenente i vari firmwares.

Dopodiché bisogna mettere Arduino in DFU Mode (cortocircuitando 2 pin Maschio allineati in un gruppo da 6 in corrispondenza del pin 13 - cercare su google immagini DFU Mode Arduino Uno)

Una volta messa la scheda in DFU, si dovrà passare ad Aggiornare i Driver di una periferica sconosciuta a windows manualmente e indirizzarla a: "C:\Program Files (x86)\Atmel\Flip 3.4.7\usb" se non avete cambiato destinazione d'installazione di Flip.

Installati i nuovi driver aprire Flip, cliccare sull'icona del processore e scegliere la propria scheda (nel mio caso ATmega16U2), subito a fianco cliccare sull'icona della USB e aprire il collegamento.

Infine premere CTRL+L e scegliere "Arduino-keyboard-0.3.hex" che si trova nella cartella firmware scaricata in precedenza da github. Cliccare su Run in basso a sinistra a attendere che finisca, dopo scollegare e ricollegare arduino al computer e attendere installazione di driver automatici per "keyboard".

Il collegamento che va fatto, o almeno per questo sketch è:
A0 > Pulsante A > GND
A1 > Pulsante B > GND
A2 > Pulsante C > GND
A3 > Pulsante D > GND

Per cambiare lettere e sapere il codice dei pulsanti presenti sulla tastiera, Qui c'è la lista che mi è servita per sviluppare il mio codice.

Per qualsiasi info commentate :wink: