Le code Keyboard_Azerty.ino est attaché a ce message
[Mise à jour, prend en charge certains caractères spéciaux directement V1.01]
[Mise à jour, amélioration du code V1.02]
Explication du fonctionnement de la librairie Keyboard
Nous allons étudier la façon dont la librairie keyboard fonctionne, son utilisation pour produire les caractères français ainsi que les problèmes de conversion.
Le clavier est un ensemble de touches, à chaque touche correspond un code 8 bits (scan code) qui n'est pas directement en rapport avec le caractère qui lui est assigné, c'est le système d'exploitation qui va mapper le scan code suivant le type de clavier qui est déclaré dans le système, il peut être d'ailleurs changé en passant par les paramètres. La touche a du clavier français AZERTY dont la disposition correspond à la valeur 'q' du clavier QWERTY a la valeur 0x14 en hexa soit 20 en décimal.
Pour voir l'ensemble des scan codes du clavier QWERTY, cliquer sur ce lien, l'image se trouve en bas de page:
par rapport au clavier AZERTY, l'emplacement de la touche 0x31 fait partie de la touche 'Entrée', par contre l'emplacement de la touche du scan code 0x32 sera pour nous le 0x31 et correspond à la touche '* et µ'.
Il existe un document PDF microsoft listant une correspondance HID USB et PS2 où l'on retrouve ces scan codes, suivre la colonne HID Usage ID :
La librairie Keyboard n'offre pas la possibilité directement de simuler les touches du clavier par leurs 'scan codes' mais offre une translation par l'alphabet à partir du clavier de référence qui est le QWERTY. On comprend tout de suite les problèmes que l'on va rencontrer, d'une part parce que l'emplacement des caractères n'est pas la même ou diffère demandant l'appui du shift pour la produire et d'autre part le nombre de caractère français est plus important et demande en plus de la commande shift, l'utilisation de la commande Alt Gr pour produire l'ensemble des caractères de notre clavier AZERTY.
Cependant, la lecture du code source de la librairie Keyboard.cpp nous permet de comprendre que l'on peut utiliser les scan codes en ajoutant la valeur 0x88 en hexa ou 136 en décimal.
Voici un exemple de code qui reproduit la frappe des 48 touches imprimables par les scan codes:
// ---------------------------------------------------
// nico78
// scancode keyboard qwerty et correspondance azerty
// ---------------------------------------------------
// ' ' est le symbole qui désigne un espace, il a la valeur 44
// Alt Gr azerty € ~ # { [ | ` \ ^ @ ' ' ] } ¤
// Shift azerty Q B C D E F G H I J K L ? N O P A R S T U V Z X Y W 1 2 3 4 5 6 7 8 9 0 ' ' ° + ¨ £ µ No fr M % NONE . / § >
// azerty q b c d e f g h i j k l , n o p a r s t u v z x y w & é " ' ( - è _ ç à ' ' ) = ^ $ * No fr m ù ² ; : ! <
// qwerty a b c d e f g h i j k l m n o p q r s t u v w x y z 1 2 3 4 5 6 7 8 9 0 ' ' - = [ ] \ No US ; ' ` , . / No US
// scancode 4, 5, 6, 7, 8, 9, 10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39, 44, 45,46,47,48,49, 50, 51,52, 53, 54,55,56, 100};
#include <Keyboard.h>
void setup() {
// put your setup code here, to run once:
Keyboard.begin();
delay(5000);
for (int c=4; c<40; c++){
keyboardScanCode(c);
}
// 50 ou 0x32 n'est pas utilisé sur notre clavier
for (int c=44; c<50; c++){
keyboardScanCode(c);
}
for (int c=51; c<57; c++){
keyboardScanCode(c);
}
// Scan code pour la touche '< et >'
keyboardScanCode(100);
Keyboard.end();
}
void loop() {
// put your main code here, to run repeatedly:
}
void keyboardScanCode(byte code){
Keyboard.press(code+136);
delay(5);
Keyboard.release(code+136);
}
Pour composer les caractères nécessitant l'appui de la touche shift ou Alt Gr, il faut le programmer tel qu'on le ferait à la main sur le clavier, en voici quelques exemples:
// ---------------------------------------------------
// nico78
// scancode keyboard qwerty et correspondance azerty
// ---------------------------------------------------
// ' ' est le symbole qui désigne un espace, il a la valeur 44
// Alt Gr azerty € ~ # { [ | ` \ ^ @ ' ' ] } ¤
// Shift azerty Q B C D E F G H I J K L ? N O P A R S T U V Z X Y W 1 2 3 4 5 6 7 8 9 0 ' ' ° + ¨ £ µ No fr M % NONE . / § >
// azerty q b c d e f g h i j k l , n o p a r s t u v z x y w & é " ' ( - è _ ç à ' ' ) = ^ $ * No fr m ù ² ; : ! <
// qwerty a b c d e f g h i j k l m n o p q r s t u v w x y z 1 2 3 4 5 6 7 8 9 0 ' ' - = [ ] \ No US ; ' ` , . / No US
// scancode 4, 5, 6, 7, 8, 9, 10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39, 44, 45,46,47,48,49, 50, 51,52, 53, 54,55,56, 100};
#include <Keyboard.h>
void setup() {
// put your setup code here, to run once:
Keyboard.begin();
delay(5000);
// Pour composer le A majuscule"
Keyboard.press(KEY_LEFT_SHIFT);
keyboardScanCode(20); // ou keyboard.print('q');
Keyboard.release(KEY_LEFT_SHIFT);
// Pour composer le caractère @
// Alt Gr = Ctrl + Alt
Keyboard.press(KEY_LEFT_CTRL);
Keyboard.press(KEY_LEFT_ALT);
keyboardScanCode(39); // ou keyboard.print('0');
Keyboard.release(KEY_LEFT_ALT);
Keyboard.release(KEY_LEFT_CTRL);
// Pour composer le caractère ê
// nécessite deux séquences de touches, l'appui sur la touche ^ (0x2F)(dead key)
// puis ensuite la touche e (0x08)
keyboardScanCode(47);
keyboardScanCode(8); // ou keyboard.print('e');
Keyboard.end();
}
void loop() {
// put your main code here, to run repeatedly:
}
void keyboardScanCode(byte code){
Keyboard.press(code+136);
delay(5);
Keyboard.release(code+136);
}
Keyboard_French1-2.ino (20 KB)