Pas de réponse d'un jeu de simulation avec la fonction keyboard

Bonjour à tous
Je suis en train de construire un simulateur de train avec un vieux pupitre de commande de locomotive. J'utilise la fonction keyboard pour transformer le pupitre en un clavier. En ouvrant un traitement de texte, je constate que mon émulation de clavier fonctionne bien. En revanche, j'ai quelques déconvenues avec certains jeux : l'émulation semble fonctionner avec Train Simulator mais pas du tout avec Open Rails. Pourtant, pour ce dernier jeu, lorsque j'utilise le clavier "normal", je peux piloter une locomotive.
Je ne vois pas ce qui pourrait clocher.
Pourriez vous svp m'aider ?
Merci

Je ne suis pas sûr car ma boule de cristal est encore au lave vaisselle mais il semble qu'il y a un bug ligne 42 et le fil rouge n'est pas bien branché...


blague à part, lisez les recommandations listées dans "Les bonnes pratiques du Forum Francophone” et postez en conséquence.

Bonjour Jackson

J'ai pris connaissance des bonnes pratiques mais je ne vois pas ce qui manque dans mon message.

Pourriez vous svp éclairer ma lanterne ?

merci

  • le type de carte arduino
  • le circuit et le détail des composants utilisés
  • l'alimentation
  • le code utilisé (posté avec les balises de code)
  • les tests que vous avez effectués et ce que vous constatez

....

Pardon Jackson !

Il s'agit d'un arduino Leonardo.

Le circuit est constitué d'une résistance 10 kohm en série et un condensateur 10 nF en parallèle de l'interrupteur (voir page internet : Un simple bouton - Arduino : premiers pas en informatique embarquée • Tutoriels • Zeste de Savoir)

L'arduino est connecté à mon PC.

J'ai testé le code avec un traitement de texte : il fonctionne très bien. En revanche, il ne fonctionne pas avec openrails.

Le code est le suivant :

#include "Keyboard.h"

const int Veille = A4;
const int vitesseveille = 200;

long veilletemps1;
long veilletemps2;

void setup()
{
pinMode(Veille,INPUT);
etatVeille = HIGH;
veilletemps1 = 0;
veilletemps2 = 0;
}

void loop()
{
etatVeille = digitalRead(Veille);

if (etatVeille == LOW) 
   {
      veilletemps1 = millis();
      
      if (veilletemps1 - veilletemps2 >= vitesseveille)
            {
                  Keyboard.print("a");
                  veilletemps2 = millis();    
          }
  }
}

OK donc vous avez un pullup externe avec amortissement des rebonds du bouton en matériel et vous envoyez la lettre 'a' toutes les 200ms tant que le bouton est appuyé

il manque le

  Keyboard.begin();

dans le setup mais je ne suis pas sûr que ce soit suffisant et vos variables de temps devraient être en unsigned long et pas long

je ne connais pas openRails, faut-il le configurer de manière particulière pour qu'il reconnaisse plusieurs claviers branchés simultanément ?

Bonjour Jackson
Merci pour ta réponse.
J'ai pris en compte tes remarques.
Entretemps, j'ai également trouvé un site de passionnés de chemin de fer qui explicite leurs cheminements pour créer un simulateur : Emulation de clavier avec Arduino | FerroviSim
J'ai corrigé mon code selon leurs remarques.

Extrait:

//Augmenter frein train
  
  if (etatFreinTrainPlus == LOW) 
  {
        if (FreinTrainAllume == 2 and millis() > freintemps1 + 50) {
             Keyboard.release('n'); 
             FreinTrainAllume = 1;
             freintemps1 = millis();
       }
       if (FreinTrainAllume == 1 and millis() > freintemps2 + 200) {
             Keyboard.press('n'); 
             FreinTrainAllume = 2;
             freintemps2 = millis();
       }
  }

Le code fonctionne très bien sur un traitement de texte mais toujours pas sur openrails.

en gros ce qu'ils font c'est appuyer la touche 'n' pendant un certain nombre de ms sans mettre de delay dans le code

PS:

ce code n'est pas terrible car il ne faut pas faire d'addition avec le temps sous peine de risque de rollover, il faut écrire

//Augmenter frein train
  
  if (etatFreinTrainPlus == LOW) 
  {
        if (FreinTrainAllume == 2 and millis() - freintemps1 > 50) {
             Keyboard.release('n'); 
             FreinTrainAllume = 1;
             freintemps1 = millis();
       }
       if (FreinTrainAllume == 1 and millis() - freintemps2 > 200) {
             Keyboard.press('n'); 
             FreinTrainAllume = 2;
             freintemps2 = millis();
       }
  }

Keyboard.h émule un clavier US par défaut. Ce n'est pas ça qui te pose problème?

Bonjour fdufbews

La question de l'émulation ex azerty a été réglée grâce à la commande suivante

Keyboard.begin(KeyboardLayout_fr_FR);

Bonjour Jackson

Merci pour cette suggestion.

Je viens de l'implémenter mais malheureusement sans qu'elle puisse régler le problème.

PS : qu'est ce qu'un rollover ?

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.