ARDUINO LEONARDO COME KEYBOARD

Buongiono,

premetto che sono nuovo da queste parti e quindi mi scuso anticipatamente se scriverò qualche belinata come dicono a Genova.
Ho un Arduino Leonardo dove fino ad oggi e' stato usato come emulatore di tastiera semplice ,mi spego meglio,ai suoi ingressi digitali ho dei pulsanti n/a che quando vengono premuti l'Arduino genera delle lettere e dei numeri come se fosse una tastiera di un pc.
Lo skech che uso è' il seguente:

#include <Keyboard.h>

void setup() { 
pinMode(0, INPUT_PULLUP); 
pinMode(1, INPUT_PULLUP);
pinMode(2, INPUT_PULLUP); 


Keyboard.begin(); 
} 
void loop() { 
int statoPulsante0 = digitalRead(0); 
int statoPulsante1 = digitalRead(1); 
int statoPulsante2 = digitalRead(2); 


if (statoPulsante0 == LOW) {Keyboard.press(97);} 
else {Keyboard.release(97);} 
if (statoPulsante1 == LOW) {Keyboard.press(98);} 
else {Keyboard.release(98);} 
if (statoPulsante2 == LOW) {Keyboard.press(99);} 
else {Keyboard.release(99);} 


}

Fino a qui tutto ok ,poi mi servivano funzioni generate dall'Arduino piu' complicate tipo (shift+a,ctrl+e ecc.) e ho trovato sul sito di Arduino il seguente sketch:

#include <Keyboard.h>

char ctrlKey = KEY_LEFT_CTRL;

void setup() { 
pinMode(0, INPUT_PULLUP); 


Keyboard.begin(); 
} 
void loop() { 
int statoPulsante0 = digitalRead(0); 

while (digitalRead(0) == HIGH) {
  delay(50); }
  delay(10);
Keyboard.press(ctrlKey);
Keyboard.press('m');
delay(20);
Keyboard.release('m');
Keyboard.release(ctrlKey);
delay(20);
delay(10);
}

Lo sketch funziona ma solo con il pulsante 0 se sullo sketch volessi inserire tutti gli ingressi come faccio?
Io ho provato in tutti i modi per esempio come segue ma non mi funziona correttamente per far scrivere l'Arduino devo in seguenza pigiare prima il pulsante 0 poi 1 poi 2 poi 0 ,1 ,2 e così via,
cioe' se io volessi pigiare per prima il pulsante 2 devo iniziare dal 1 cmq.
Lo skech che ho provato e' il seguente :

lo skech dovrebbe generare sul puls N° 0 ctrl+m sul pulsante N° 1 ctrl+n e sul pulsante N° 2 ctrl +o.

Potete cortesemente darmi una soluzione

CIAO E GRZ IN ANTICIPO

#include <Keyboard.h>

char ctrlKey = KEY_LEFT_CTRL;

void setup() { 
pinMode(0, INPUT_PULLUP); 
pinMode(1, INPUT_PULLUP);
pinMode(2, INPUT_PULLUP); 


Keyboard.begin(); 
} 
void loop() { 
int statoPulsante0 = digitalRead(0); 
int statoPulsante1 = digitalRead(1); 
int statoPulsante2 = digitalRead(2);  

while (digitalRead(0) == HIGH) {
 
   delay(50); }
   delay(10);
 
 Keyboard.press(ctrlKey);
 Keyboard.press('m');
 delay(20);
 Keyboard.release('m');
 Keyboard.release(ctrlKey);
 delay(20);

 delay(10);
  
while (digitalRead(1) == HIGH) {
 
   delay(50); }
   delay(10);

 Keyboard.press(ctrlKey);
 Keyboard.press('n');
 delay(20);
 Keyboard.release('n');
 Keyboard.release(ctrlKey);
 delay(20);

 delay(10);

while (digitalRead(2) == HIGH) {

   delay(50); }
   delay(10);

 Keyboard.press(ctrlKey);
 Keyboard.press('o');
 delay(20);
 Keyboard.release('o');
 Keyboard.release(ctrlKey);
 delay(20);

 delay(10);

}

Ti invitiamo a presentarti (dicci quali conoscenze hai di elettronica e di programmazione) qui: Presentazioni
e a leggere il regolamento se non lo hai già fatto: Regolamento
Qui una serie di link utili, non inerenti al tuo problema:

Il codice devi racchiuderlo nei tag code, vedi sezione 7 del regolamento, spiega bene come fare ( pulsante </> ).
Altrimenti parte del codice può essere visualizzata male o mancare perchè interpretato come attributo del testo stesso.

Perché hai abbandonato il primo sketch? Bastava cambiare i tasti premuti all'interno degli if! Prova a farlo!

Scusa hai ragione.

Grazie

Scusa SUKKOPERA ma i tasti che puoi cambiare sono quelli normali in ascii (97,98,99) io devo abbinarne 2 da pigiare insieme lo shift+97(a) come faccio?

Praticamente il mio Leonardo quando pigio il tasto sull'ingresso 0 mi deve scrivere in uscita SHIFT+(LETTERA) oppure CTRL+ (LETTERA).

Grazie cmq del tuo interessamento.

E che ci vuole?

if (statoPulsante0 == LOW) {
  Keyboard.press(KEY_LEFT_CTRL);
  Keyboard.press('m');
} else {
  Keyboard.releaseAll();
}

Grazie SUKKOPERA ci riprovo ,dato che questa soluzione l'avevo adottata riscontrando un problema che sul sw del GAME quando memorizzi per esempio CTRL+A sulla tastiera l'operazione meccanica che vai a digitare e' la seguente :

Vorrei fare ad Arduino questo e non riesco a capire come fare o meglio con un tasto ci sono riuscito (vedi il secondo skech) ma solo su un ingresso.

Grazie del tuo interessamento.

1) premi "ctrl" 
2) premi "a"
3) rilasci "a"
4) rilasci "ctrl"

>magicguru: ti ricordo che in conformità al regolamento, punto 7, devi editare il tuo post #1 (in basso a destra del post, bottone More -> Modify) e racchiudere il codice all'interno dei tag CODE (... sono quelli che in edit inserisce il bottone fatto così: </>, tutto a sinistra).

Guglielmo

E che ci vuole (2)?

if (statoPulsante0 == LOW) {
  Keyboard.press(KEY_LEFT_CTRL);
  Keyboard.press('m');
  delay(20);
  
  Keyboard.release('m');
  Keyboard.release(KEY_LEFT_CTRL);
  delay(20);
}

Eventualmente puoi introdurre anche un delay tra la pressione di CTRL e del tasto successivo, vedi tu se ti serve.

Ciao Sukkopera,ho provato sembra che funzioni a parte che dall' ingresso n° 2 per ottenere l'uscita corretta bisogna pigiare piu' volte il tasto nel mio caso come da skech dovrebbe generare una "o".

#include <Keyboard.h>

void setup() { 
pinMode(0, INPUT_PULLUP); 
pinMode(1, INPUT_PULLUP);
pinMode(2, INPUT_PULLUP); 


Keyboard.begin(); 
} 
void loop() { 
int statoPulsante0 = digitalRead(0); 
int statoPulsante1 = digitalRead(1); 
int statoPulsante2 = digitalRead(2); 

if (statoPulsante0 == LOW) {
  Keyboard.press(KEY_LEFT_CTRL);
  Keyboard.press('m');
  delay(20);
  
  Keyboard.release('m');
  Keyboard.release(KEY_LEFT_CTRL);
  delay(20);
}
  if (statoPulsante1 == LOW) {
  Keyboard.press(KEY_TAB);
  Keyboard.press('n');
  delay(20);
  
  Keyboard.release('n');
  Keyboard.release(KEY_TAB);
  delay(20);
}
   if (statoPulsante2 == LOW) {
  Keyboard.press(KEY_TAB);
  Keyboard.press('o');
  delay(20);
  
  Keyboard.release('o');
  Keyboard.release(KEY_TAB);
  delay(20);
  }


}

Io non sapevo che non ero obbligato ad inserire dopo un IF un ELSE.

Comunque grazie tante :slight_smile:

KEY_TAB + o? Tab non è un tasto modificatore, sicuro che sia il tasto giusto?

Ciao SUKKOPERA, si il tasto e' corretto e sugli altri 12 funziona perfettamente come da skech qui sotto:

#include <Keyboard.h>
void setup() { 
pinMode(0, INPUT_PULLUP); 
pinMode(1, INPUT_PULLUP);
pinMode(2, INPUT_PULLUP); 
pinMode(3, INPUT_PULLUP);
pinMode(4, INPUT_PULLUP); 
pinMode(5, INPUT_PULLUP);
pinMode(6, INPUT_PULLUP); 
pinMode(7, INPUT_PULLUP);
pinMode(8, INPUT_PULLUP); 
pinMode(9, INPUT_PULLUP);
pinMode(10, INPUT_PULLUP); 
pinMode(11, INPUT_PULLUP);
pinMode(12, INPUT_PULLUP); 
pinMode(13, INPUT_PULLUP);

Keyboard.begin(); 
} 
void loop() { 
int statoPulsante0 = digitalRead(0); 
int statoPulsante1 = digitalRead(1); 
int statoPulsante2 = digitalRead(2); 
int statoPulsante3 = digitalRead(3); 
int statoPulsante4 = digitalRead(4); 
int statoPulsante5 = digitalRead(5); 
int statoPulsante6 = digitalRead(6); 
int statoPulsante7 = digitalRead(7);
int statoPulsante8 = digitalRead(8); 
int statoPulsante9 = digitalRead(9); 
int statoPulsante10 = digitalRead(10); 
int statoPulsante11 = digitalRead(11); 
int statoPulsante12 = digitalRead(12); 
int statoPulsante13 = digitalRead(13); 

if (statoPulsante0 == LOW) {
  Keyboard.press(KEY_LEFT_CTRL);
  Keyboard.press('m');
  delay(10);
  
  Keyboard.release('m');
  Keyboard.release(KEY_LEFT_CTRL);
  delay(10);
}
  if (statoPulsante1 == LOW) {
  Keyboard.press(KEY_TAB);
  Keyboard.press('n');
  delay(10);
  
  Keyboard.release('n');
  Keyboard.release(KEY_TAB);
  delay(10);
}
   if (statoPulsante2 == LOW) {
  Keyboard.press(KEY_TAB);
  Keyboard.press('o');
  delay(10);
  
  Keyboard.release('o');
  Keyboard.release(KEY_TAB);
  delay(10);
  }
if (statoPulsante3 == LOW) {
  Keyboard.press(KEY_LEFT_CTRL);
  Keyboard.press('p');
  delay(10);
  
  Keyboard.release('p');
  Keyboard.release(KEY_LEFT_CTRL);
  delay(10);
}
  if (statoPulsante4 == LOW) {
  Keyboard.press(KEY_TAB);
  Keyboard.press('q');
  delay(10);
  
  Keyboard.release('q');
  Keyboard.release(KEY_TAB);
  delay(10);
}
   if (statoPulsante5 == LOW) {
  Keyboard.press(KEY_TAB);
  Keyboard.press('r');
  delay(10);
  
  Keyboard.release('r');
  Keyboard.release(KEY_TAB);
  delay(10);
  }
  if (statoPulsante6 == LOW) {
  Keyboard.press(KEY_LEFT_CTRL);
  Keyboard.press('s');
  delay(10);
  
  Keyboard.release('s');
  Keyboard.release(KEY_LEFT_CTRL);
  delay(10);
}
  if (statoPulsante7 == LOW) {
  Keyboard.press(KEY_TAB);
  Keyboard.press('t');
  delay(10);
  
  Keyboard.release('t');
  Keyboard.release(KEY_TAB);
  delay(10);
}
   if (statoPulsante8 == LOW) {
  Keyboard.press(KEY_TAB);
  Keyboard.press('u');
  delay(10);
  
  Keyboard.release('u');
  Keyboard.release(KEY_TAB);
  delay(10);
  }
if (statoPulsante9 == LOW) {
  Keyboard.press(KEY_LEFT_CTRL);
  Keyboard.press('v');
  delay(10);
  
  Keyboard.release('v');
  Keyboard.release(KEY_LEFT_CTRL);
  delay(10);
}
  if (statoPulsante10 == LOW) {
  Keyboard.press(KEY_TAB);
  Keyboard.press('z');
  delay(10);
  
  Keyboard.release('z');
  Keyboard.release(KEY_TAB);
  delay(10);
}
   if (statoPulsante11 == LOW) {
  Keyboard.press(KEY_TAB);
  Keyboard.press('x');
  delay(10);
  
  Keyboard.release('x');
  Keyboard.release(KEY_TAB);
  delay(10);
  }
  if (statoPulsante12 == LOW) {
  Keyboard.press(KEY_LEFT_CTRL);
  Keyboard.press('w');
  delay(10);
  
  Keyboard.release('w');
  Keyboard.release(KEY_LEFT_CTRL);
  delay(10);
}
  if (statoPulsante13 == LOW) {
  Keyboard.press(KEY_TAB);
  Keyboard.press('y');
  delay(10);
  
  Keyboard.release('y');
  Keyboard.release(KEY_TAB);
  delay(10);
}
   


}

Non riesco a capire come mai non funziona bene solo sull' input 2 >:(

Ciao e grazie