Keyboard.h codici ascii non in linea con tabelle, problema con simboli

Ciao a tutti, innanzitutto sono nuovo, mi chiamo Danilo, ho un'esperienza davvero blanda, conosco le info di base, ma non sono elettrotecnico o comunque uno che opera con corrente elettrica e/o sistemi integrati, di lavoro faccio tutt'altro. Sono bravo a cercarmi le informazioni, e questo mi ha permesso quasi sempre di arraggiarmi, dove, come in questo caso, c'è un forte limite di competenze, o qualche tricks per esperti da sapere che richiederebbe probabilmente settimane di test, come tutti, utilizzo le community per capire se qualche anima buon mi possa aiutare, in attesa qual'ora riesca, a ricambiare il favore!

Ho un problema, sto realizzando un sistemino che mi permetta di sostituire i click da tastiera, con una superficie di controllo per comandare il mio simulatore di treni (TRAIN SIMULATOR 2019).

Non la faccio difficile, sto facendo una semplice superficie che al CLICK del tasto, simuli il click della tastiera, carico il software sulla scheda, e prima che inizi a girare vado su BLOCCO NOTE per vedere quali tasti mi preme.

Ho notato che la libreria non funziona con tutte le board, così ho preso una board compatibile:

Ho verificato prima di prenderla, la scheda dovrebbe essere compatibile per usare la libreria perché usa ATMega 32U4.

Prima di venire qui a disturbare ho fatto vari tentativi, ho usato la libreria Keyboard, facendo test con write, usando sia il font, che il codice ascii. E finché si trattava di caratteri normali nessun problema. Quando è stata ora dei simboli [] (parentesi quadre, solo per fare un esempio), sono iniziati i problemi.

D'apprima, inserendo le semplici parentesi tra apici:

Keyboard.write('[');

Mi venivano restituiti dei caratteri diversi, se non erro la è+ (che sono i tasti privi dell'ALT GR).
Così ho cercato una tabella ascii e ho inserito il codice ascii

Keyboard.write(93);

93 e 91 sono se non erro i due codici per i due simboli. Ma niente, ho provato con l'hex...
poi ho anche provato a cercare tra i forum, e qualcuno usava questo sistema, ma non sapevo come trovare l'ALTGR

Keyboard.press(ctrlKey);
  Keyboard.press('n');
  delay(100);
  Keyboard.releaseAll();

Ovviamente avevo settato la variabile char provando a sostituirla con il tasto

Siccome ho una tastiera con layout inglese (anche se il layout su windows è settato su italiano) ho anche provato ad inserire tutti i codici asci, uno per uno, da 1 a 255 per vedere cosa mi restituivano, ma niente parentesi quadra...

Ho cambiato tastiera, mettendo una logitech scrausa con layout italiano, ma ancora niente... non so piu davvero che altro provare...

Io non riesco a capire quale tabella devo seguire per fargli digitare la parentesi quadra, e già che ci sono, vi chiedo se qualcuno mi può suggerire un link ad una tabella GIUSTA.
Grazie!

P.S. non ho inserito tutto il codice per risparmiare spazio, il codice è corretto, non restituisce nessun errore, e gira, solo mi da altri caratteri.

Questo è l'ultimo test che ho fatto: (avevo trovato una tabella differente)

#include <Keyboard.h>

int s = 200;

void setup() {
  // put your setup code here, to run once:
  Keyboard.begin();
}

void loop() {
  // put your main code here, to run repeatedly:
  delay(5000);
  Keyboard.write('E');
  delay(s);
  Keyboard.write('P');
  delay(s);
  Keyboard.write('c');
  delay(s);
  Keyboard.press(100);
  Keyboard.press('è');
  delay(100);
  Keyboard.releaseAll();
  delay(s);
  Keyboard.write(0XBD); //ASCII for ]
  delay(s);
  Keyboard.write('W');
  Keyboard.write('W');
  Keyboard.write('W');
  Keyboard.write('W');
  Keyboard.write('W');
  Keyboard.write('W');
  Keyboard.write('W');
  Keyboard.write('W');
  delay(s);
  Keyboard.write('A');
  Keyboard.write('A');
  Keyboard.write('A');
  Keyboard.write('A');
  Keyboard.write('A');
  Keyboard.write('A');
  Keyboard.write('A');
  Keyboard.write('A');
  Keyboard.write('A');
  Keyboard.write('A');
  Keyboard.write('A');
  Keyboard.write('A');
  Keyboard.write('A');
  Keyboard.write('A');
  delay(100000);

}

Mi restituisce: EPcd3\WWWWWWWWAAAAAAAAAAAAAA

Ho letto il regolamento, cercato di seguire le indicazioni, "spero di avervi aiutato, ad aiutarmi!" (se ci sono errori, vi prego di segnalarmeli che appronto subito le correzioni). Grazie!

Buongiorno,
essendo il tuo primo post, nel rispetto del regolamento della sezione Italiana del forum (… punto 13, primo capoverso), ti chiedo cortesemente di presentarti IN QUESTO THREAD (spiegando bene quali conoscenze hai di elettronica e di programmazione ... possibilmente evitando di scrivere solo una riga di saluto) e di leggere con molta attenzione tutto il su citato REGOLAMENTO ... Grazie. :slight_smile:

Guglielmo

P.S.: Ti ricordo che, purtroppo, fino a quando non sarà fatta la presentazione nell’apposito thread, nessuno ti potrà rispondere, quindi ti consiglio di farla al più presto. :wink:
P.P.S: In conformità al suddetto regolamento, punto 13, il cross-posting è proibito (anche tra lingue diverse) per cui, il tuo post duplicato in altra sezione del forum è stato cancellato.
Ti prego, per il futuro, di evitare di aprire più post sullo stesso argomento in sezioni differenti del forum. Grazie.

Mi sono presentato, ho aggiunto una riga di dettaglio con le mie competenzeal presente
Per quanto riguarda il cross posting del pps, non so di cosa si stia parlando, io non ho fatto alcun cross posting...

Grazie scusate.

La presentazione la hai fatta
Aiutateci ad aiutarvi lo hai letto (complimenti)
e lo hai anche abbastanza seguito (sei il primo, ancora complimenti)
purtroppo io non uso quella libreria e non ho quell'hardware
Quindi non posso aiutarti, ma seguo con interesse, e se mi viene in mente qualcosa....

DannyTheMaster:
Per quanto riguarda il cross posting del pps, non so di cosa si stia parlando, io non ho fatto alcun cross posting...

... avevi aperto un thread relativo allo stesso/simile argomento in altra sezione di questo forum (thread che è stato eliminato). Questa cosa è quella che si chiama "cross-posting".

Guglielmo

Gugliemo, perdonami, quello era un post per l'hardware che non aveva nulla a che fare (come tipologia di richiesta) con questa che è del software. Io ci metto tutto il mio impegno per seguire le regole, ma se poi siete voi stessi a farmele violare.
Il post che tu ritieni simile, ha come soggetto in comune il progetto, ma fa una domanda specifica legata all'hardware, agli shift register, e ai Mosfets... nulla a che vedere con il Keyboard.h mapping di cui si parla qui. Perdonami ma non credo si posa considerare Cross Posting, sono due post che non hanno nulla in comune da un punto di vista tenico, se non il progetto... come dire che è cross post parlare di gomme, e di motore di un'auto.

Si, ho visto, ma se guardi un po' in giro qui sul forum, quando si apre una discussione su un "argomento" si cerca poi di contenere il tutto in quella discussione sia che si parli di SW che di HW (... si evita il proliferare di thread e il progetto rimane compatto, con tutte le informazioni, per chi un domani lo va a cercare).

Ci sono dei casi che, in mia assenza (... non posso essere SEMPRE presente) sfuggono, vanno avanti e ... a quel punto, quando me ne accorgo, lascio stare, ma, dove è possibile, un progetto (... come lo è il tuo) è utile che rimanga compatto in un thread :wink:

Se poi proprio vuoi fare due thread ... va bene, me ne farò una ragione, però ... ripeto, per i posteri, è meglio che dell'argomento si parli in un solo thread e che in esso trovino tutto quello che serve per realizzarlo :slight_smile:

Guglielmo

ciao...nel .cpp ho trovato il "const uint8_t _asciimap[128]" che riporta:

	0x2f,          // [
	0x30,          // ]

Orso, grazie, ho provato, ma non funziona... infatti io penso sia un exploit, qualcosa di diversamente settato.. ma COSA??? :open_mouth:

#include <Keyboard.h>

int s = 200;

void setup() {
  // put your setup code here, to run once:
  Keyboard.begin();
}

void loop() {
  // put your main code here, to run repeatedly:
  delay(5000);
  Keyboard.write('E');
  delay(s);
  Keyboard.write('P');
  delay(s);
  Keyboard.write(0x2f);
  delay(s);
  Keyboard.write(0x30);
  delay(s);
}

Questo è il responso:
EP-0

il trattino e lo 0...

Non ho davvero idea di cosa possa essere a fare questo risultato non in linea...

prova a dare un occhio a questo LINK

Ciao Orso, innanzitutto grazie per il supporto, ora guardo subito il link.
Solo per aggiornamento, questa mattina presto ho provato ad attaccare l'arduino ad un computer qualsiasi, stesso risultato. Poi ho provato su MAC (OSX) stesso risultato.

Potrebbe essere la scheda? (che magari ha una mappatura diversa)... ne dubito... anche perché è il software che gestisce queste cose... nella fattispecie la libreria.

Mi guardo il link che mi hai inviato... questa cosa resta alquanto oscura...
Grazie dell'aiuto man!

Eccomi Orso, sembra proprio che tu sia riuscito a trovare il problema, è proprio lo stesso mio.
C'è solo un dubbio, chi ha fatto l'articolo si riprometteva di allegare un file (suppongo la libreria) che pero non vedo allegata mai, tu pensi che funzioni? (adesso lo provo)... non mi è molto chiaro, lo studio un attimo, o nel caso lo testo.

P.S. mi sembra un problema legato alla scheda... che per 9 euro non ha senso... tu ritieni che con una Leonardo (official) il problema si possa ripresentare?

Grazie infinite

ciao...ieri sera ho dato una letta veloce all'articolo...nell'articolo stesso ci sono dei link...uno di questi dovrebbe portarti alla "patch" per poter usare la libreria con diverse tastiere (se non ho capito male in origine è solo AMERICANA) e dovrebbe consentirti di mappare, od ha già mappato, i vari caratteri non gestiti dall'originale.
se ho tempo leggo meglio...io non ho mai usato questa libreria e non ho possibilità di provare.

Ho provato tutto ieri, allora sembrava che stessi risolvendo, usando una tabella per i caratteri speciali, ma poi mi sono accorto che alla pressione del tasto di tastiera italiana, lui associa il carattere corrispondente del layout americano, con delle eccezzioni, così diventa incredibilmente assurdo, perché dovrei provare a trovare tutti i Layout. Sinceramente la guida di quel ragazzo non mi è molto chiara, proverò ad approfondirla dopo, intanto ho ordinato un Leonardo Normale (non micro) se risolvo, amen, il problema era la scheda, non ha senso impazzirci sopra, perché non ho necessità di risparmiare, e non ho necessità di miniaturizzazione. Avevo preso questo modello Micro Compatibile, perché pensavo fosse la stessa cosa, e non volevo buttare denaro, ma come capita di rado, quel risparmio fatto all'inizio, si tramuta in una spesa extra successiva. Vi tengo aggiornati.
Grazie dell'aiuto

Mi sa che il problema non è la scheda/micro ma la libreria...dai un occhio al reference di arduino.
Per questo il tipo ha fatto quella "implementazione" alla libreria.

Dubito che con una Leonardo chambi qualche cosa ...
... sia la Leonardo che la Micro montando il ATmega32U4 e questa è l'unica cosa che conta. Per il resto che una porti fuori certi pin, che abbia un regolatore di tensione piuttosto che un'altro, ecc. ecc. NON conta nulla.

A livello software ed interfaccia USB sono identiche e quello che gira su una DEVE girare sull'altra (identica MCU), quindi ... non credo che con la Leonardo risolverai.

Io invece contatteri l'autore di quell'articolo e chiederei aiuto :wink:

Guglielmo

Fra le varie ricerche effettuate sono capitato nella libreria corrispondente scritta da Paul Stoffregen per la Teensy

Dove si legge

#define ASCII_2D	KEY_MINUS				// 45 -
#define ASCII_2E	KEY_PERIOD				// 46 .
#define ASCII_2F	KEY_SLASH				// 47 /
#define ASCII_30	KEY_0					// 48 0

Mentre le parentesi quadre sarebbero

#define ASCII_5B	KEY_LEFT_BRACE				// 91 [
#define ASCII_5C	KEY_BACKSLASH				// 92
#define ASCII_5D	KEY_RIGHT_BRACE				// 93 ]

Ora, a parte la differente architettura, il codice mandato via USB dovrebbe essere lo stesso (che corrisponde anche a quello ASCII, sembra) e invece non lo è.

Sempre che non ho capito male e la libreria serva ad interpretare i dati ricevuti da una tastiera.

Mi sembra anche strano che stampando i 255 caratteri non siano uscite fuori prima, però.

Ho preso leonardo, ma non cambia niente, è proprio un problema di codifica... solo che tutte le guide/esempi che ho trovato sono troppo complessi, e anche mettendomici, cercando di seguire quelli meno tecnici e piu chiari, fanno tutti riferimneto al vecchio ide e alla sostituzione di file, che nella nuova IDE (APP di microsoft) non risiedono piu nella stessa posizione...

Che per assurdo, non mi interessa che diventi MAPPATO in italiano, mi basta trovare una "Tabella" con la mappatura di Arduino, la sua originale, in esadecimale, da dove poter prendere il codice necessario per fargli digitare il carattere che dico io.

Anche se ho visto che, le parentesi, angolari, graffe, e quadre, e caratteri come l'apice o altri, sono davvero una rogna... ho visto guide che rimappavano, ma non so davvero da che parte prenderle.

Nessuno ha qualche idea?

Guarda, io non devo farci un'applicazione molto elaborata, devo simulare la pressione della tastiera per poter comandare un gioco non FPS (quindi con timing accettabilmente lunghi). Per questo motivo, ho rimappato alla vecchia maniera, cercando di scoprire quali tasti premono quelli che interessano a me. Li metto a disposizione della comunità:

Keyboard.press('+'); // ^
  Keyboard.press('ù'); // ù
  Keyboard.press('ò'); // ,  u
  Keyboard.press('à'); // .  ,
  Keyboard.press(','); // , niente
  Keyboard.press('.'); // .
  Keyboard.press('-'); // '
  Keyboard.press('*'); // (
  Keyboard.press('_'); // ?
  Keyboard.press(':'); // ç
  Keyboard.press('ì'); // 7
  Keyboard.press('|'); // §
  Keyboard.press('!'); // !
  Keyboard.press('"'); // °
  Keyboard.press('£'); // x
  Keyboard.press('

Mano a mano che vado avanti aggiorno la lista... potrebbe diventare un post interessante, per chi come me, non ha molte competenze e non vuole mettersi a "smadonnare" (passatemi il termine) con sovrascritture di bootload, o rimappatura via codice, con un discreto carico di lavoro per piccoli controllori, uso di memoria, e tanta tanta buona volontà richiesta per "capire" cosa si sta inserendo nel proprio codice (fondamentale, ma non scontato).

P.S. la guida di Tensy l'ho trovata spesso anche io, ma non ho capito se Tensy è un tipo di scheda alternativa, un ide, entrambi... insomma, non devo diventare un tenico migliore, mi serve solo una soluzione fast, con un minimo dispendio di tempo, non devo diventare un tecnico elettronico/software migliore, perché non è il mio lavoro, quindi è inutile per non dire dispersivo investire ore e ore nello studio di "teniche", se ovviamente non strettamente necessario. Infatti ho fatto il rudimentale, ho sparato fuori tutti i tasti "particolari" e ho listato cosa restituivano... semplice, poco dispendioso.

Un saluto, grazie mille dei suggerimenti!); // $
 Keyboard.press('%'); // %
 Keyboard.press('&'); // /
 Keyboard.press('/'); // -
 Keyboard.press('('); // )
 Keyboard.press(')'); // =
 Keyboard.press('='); // ì
 Keyboard.press('?'); // _
 Keyboard.press('^'); // &
 Keyboard.press('é'); // 4
 Keyboard.press('*'); // (
 Keyboard.press('§'); // 2
 Keyboard.press('ç'); // 2
 Keyboard.press('°'); // niente
 Keyboard.press(';'); // ò
 Keyboard.press(':'); // ç
 Keyboard.press('#'); // £
 Keyboard.press('['); // è
 Keyboard.press(']'); // +
 Keyboard.press('@'); // "
 Keyboard.press('{'); // é
 Keyboard.press('}'); // *
 Keyboard.press('⟨'); // 3
 Keyboard.press('⟩'); // 4
 Keyboard.press('<'); // ;
 Keyboard.press('>'); // :


Mano a mano che vado avanti aggiorno la lista... potrebbe diventare un post interessante, per chi come me, non ha molte competenze e non vuole mettersi a "smadonnare" (passatemi il termine) con sovrascritture di bootload, o rimappatura via codice, con un discreto carico di lavoro per piccoli controllori, uso di memoria, e tanta tanta buona volontà richiesta per "capire" cosa si sta inserendo nel proprio codice (fondamentale, ma non scontato).

P.S. la guida di Tensy l'ho trovata spesso anche io, ma non ho capito se Tensy è un tipo di scheda alternativa, un ide, entrambi... insomma, non devo diventare un tenico migliore, mi serve solo una soluzione fast, con un minimo dispendio di tempo, non devo diventare un tecnico elettronico/software migliore, perché non è il mio lavoro, quindi è inutile per non dire dispersivo investire ore e ore nello studio di "teniche", se ovviamente non strettamente necessario. Infatti ho fatto il rudimentale, ho sparato fuori tutti i tasti "particolari" e ho listato cosa restituivano... semplice, poco dispendioso.

Un saluto, grazie mille dei suggerimenti!

Mi sono messo a leggere e adesso ho le idee più chiare.
La libreria non manda il carattere ascci ma il cosiddetto scancode che corrisponde al tasto fisico della tastiera. Cosa c'è scritto sopra dipende dalla tastiera.
La libreria Leonardo usa una tabella di conversione ASCCI scancode della sola tastiera americana, la libreria Teensy invece ha diverse tastiere.
Le guide consigliano di modificare la libreria HID.cpp

Allora mi sono messo a giocare e ho trovato questo

Keyboard.press(KEY_RIGHT_ALT);
Keyboard.write(0x5b);
Keyboard.write(0x5d);
Keyboard.releaseAll();

che da me scrive la coppia []