Après avoir vu les rudiments de l’émulation de clavier, attardons nous maintenant sur une application simple mais concrète : associer une touche de clavier à un bouton poussoir ou à un switch à 2 positions stables. Il s’agit de deux situations très différentes, qui ne se programment pas du tout de la même façon.
Montage électronique associé : bouton avec Pull-Up
Le montage électronique associé est décrit à la page suivante dans la section « électronique ». On utilisera un bouton relié au pin digital n°3, déclaré en pull-up, ce qui signifie que l’interrupteur fermé provoque un état bas et l’interrupteur ouvert un état haut sur le pin.
On rappelle que l’on teste la négation d’une variable booléenne par l’ajout d’un ! devant cette variable.
Cela signifie que pour tester si l’interrupteur est fermé (le courant passe), on teste si !digitalRead(3) est vrai.
if (!digitalRead(3)) {
//action si l'interrupteur est fermé
}
Un bouton poussoir lié à une touche de clavier
Il s’agit certainement là de l’un des systèmes les plus simples à mettre en œuvre dans la réalisation d’un simulateur. Il s’agit en effet d’appuyer une touche de clavier lors de l’appui sur un bouton poussoir, et de la relâcher en même temps que le bouton, exactement comme si le bouton était la touche de clavier elle-même. Cela se traduit par le programme suivant :
#include <Keyboard.h>
int pin_bouton = 3;
void setup(){
Keyboard.begin();
pinMode(3, INPUT_PULLUP);
}
void loop(){
if !digitalRead(pin_bouton){
Keyboard.press('x');
}
else {
Keyboard.release('x');
}
}
Les cas d’utilisation de ce type de commande sont nombreux. il s’agira par exemple du bouton de sablage, ou encore du sifflet, qui se commandent par des appuis prolongés de la touche correspondante.
Un interrupteur on/off
Le deuxième type de commandes que l’on trouve couramment sur un pupitre sont les interrupteurs bistables on/off. Cela se traduit souvent dans la commande d’OpenRails pas une seule touche pour passer de off à on ou de on à off. Prenons l’exemple de l’ouverture des portes : un premier appui sur ‘a’ provoque l’ouverture des portes, un second provoque leur fermeture.
Le système se complique donc un peu : il va falloir connaitre l’état du système dans le jeu, et le comparer avec celui de l’interrupteur sur le pupitre. Si il n’y a pas égalité des états, on appui sur la touche. En reprenant notre exemple, si dans le jeu les portes sont « fermées », et que l’interrupteur du pupitre est sur « ouvert ». Comme « ouvert » différent de « fermé », on appui une fois sur ‘a’.
Pour connaitre l’état du système dans le jeu, il existe deux solutions :
1. On dispose d’un système de communication avec OpenRails qui nous donne cette information. Nous reviendrons sur cette possibilité dans un article ultérieur.
2. On ne dispose pas d’un tel système, on fait donc l’hypothèse d’un état au démarrage du programme (par exemple les portes sont fermées) que l’on enregistre dans une variable. Puis on modifie l’état de cette variable à chaque envoie d’une touche.
Nous nous concentrerons ici sur la solution 2, en sachant que la première solution est une simplification de la seconde lorsque l’on dispose d’un retour d’information qui sera étudié plus tard.
#include <Keyboard.h>
int pin_bouton = 3;
bool etat_jeu = 0;
void setup(){
Keyboard.begin();
pinMode(3, INPUT_PULLUP);
}
void loop(){
if (!digitalRead(pin_bouton) == 1 and etat_jeu == 0){
Keyboard.press('a');
delay(30);
etat_jeu = 1;
Keyboard.release('a');
}
if (!digitalRead(pin_bouton) == 0 and etat_jeu == 1){
Keyboard.press('a');
delay(30);
etat_jeu = 0;
Keyboard.release('a');
}
}
En analysant les similitudes entre les différents blocs, on voir que l’on peut simplifier le tout en une seule comparaison :
#include <Keyboard.h>
int pin_bouton = 3;
bool etat_jeu = 0;
void setup(){
Keyboard.begin();
pinMode(3, INPUT_PULLUP);
}
void loop(){
if (!digitalRead(pin_bouton) != etat_jeu){ // en cas de différence d'état
Keyboard.press('a'); // appui clavier
delay(30);
etat_jeu = !etat_jeu; // changement de l'état mémorisé du jeu
Keyboard.release('a');
}
}
Enfin, il reste à adapter ce code pour supprimer le delay(30) qui, bien que peu dérangeant, n’est pas une bonne pratique de programmation. Cela est expliqué dans l’articule sur les bases de l’émulation clavier.