Modifier vitesse fonction keyboard.write pour simulateur de train

Bonjour à tous

J'ai créé un simulateur de train sur la base d'un vieux pupitre de locomotive. Il est presque terminé mais je bute encore sur une difficulté. Pour faire fonctionner l'avertisseur, il faut maintenir la touche "I" appuyée. J'utilise évidemment l'un des boutons du pupitre. Le code est le suivant :slight_smile:

if (etatAvertisseur == LOW) 
  {
       Keyboard.write('I');
  }

Néanmoins, en utilisant train simulator, je constate que l'avertisseur reste en fonctionnement même si je relâche le bouton. En ouvrant un traitement de texte, j'ai constaté que la vitesse d'impression est très élevée. J'ai donc modifié le code avec la fonction delay.

if (etatAvertisseur == LOW) 
  {
       Keyboard.write('I');
       delay(16);
  }

La valeur de 16 a été déterminée par itérations mais le résultat n'est pas très satisfaisant. L'avertisseur alterne démarrage et arrêt alors que je maintiens le bouton appuyé.

Pourriez vous svp m'aider ?

Merci

la bibliothèque Keyboard supporte Keyboard.press() - Arduino Reference et Keyboard.release() - Arduino Reference

➜ vous appelez press() lors de l'appui du bouton et release() lors de la relâche - je suppose que etatAvertisseur est maintenu à jour par votre code

Merci pour cette réponse. Je viens d'essayer avec les fonctions keyboard.press() et keyboard.release() mais, malheureusement, une fois l'avertisseur démarré il ne s'arrête plus alors que j'ai relâché le bouton. Je constate sur un traitement de texte que la lettre "I" défile très vite lorsque j'appuie sur le bouton et qu'elle s'arrête lorsque je le relache.

Tu peux donner ton code entre balise < code>
Si tu as la lettre I qui s'affiche en double, c'est que tu envois bien le caractère à travers le clavier virtuel.
Si l'avertisseur reste actif, alors que tu ne vois plus de i, c'est que la détection de l'arrêt de la touche i, ne doit pas ce faire correctement.

Rajoutez une LED par exemple qui s’allume lors de l’envoi du press et qui s’éteint lors du release

Comment est câblé le bouton?

Sinon oui, postez le code

Le code est le suivant :

if (etatCloche == LOW) 
  {
     Keyboard.press('B');
  }
if (etatCloche == HIGH) 
  {
     Keyboard.releaseAll();
  }

J'ai connecté le bouton poussoir à l'arduino tel qu'illustré sur la page web suivante (avec résistance et condensateur) : Un simple bouton - Arduino : premiers pas en informatique embarquée • Tutoriels • Zeste de Savoir

OK donc vous avez un bouton sans rebond câblé en INPUT_PULLUP externe s'il est bien câblé comme cela


(source)

essayez ce code où pinCloche est le N° de broche connectée au bouton (dans le dessin ci dessus, ce serait 2)

// variable globale
bool clocheActive = false;

...


// dans votre code

  // si bouton appuyé et qu'on n'a pas encore envoyé la touche
  if (digitalRead(pinCloche) == LOW && !clocheActive) { 
    Keyboard.press('B');   
    clocheActive = true;
  }

  // si bouton relâché et qu'on n'a pas envoyé le relâchement de la touche
  if (digitalRead(pinCloche) == HIGH && clocheActive) { 
      Keyboard.release('B'); 
      clocheActive = false;
  }

Merci de votre réponse. J'ai implémenté le code. Il permet de n'écrire qu'une seule lettre sur le traitement de texte. Le problème est le suivant : pour que la cloche sonne, il faut maintenir la touche "B" appuyé.

le code tel qu'il est maintient B appuyé puis le relâche plus tard

certaines applications gèrent l'auto-repeat, d'autres non ou alors pour certaines touches seulement

ici il semble donc que votre application ne gère pas l'auto-repeat, il faut donc que l'arduino envoie des appuis réguliers, on n'a pas besoin de press et release dans ce cas

// variables globales
const byte pinCloche = ... ; // le bon N° de pin pour le bouton
bool clocheActive = false;
unsigned long debutCloche;

...


// dans votre code

  // si bouton appuyé et qu'on n'a pas encore envoyé la touche
  if (!clocheActive && digitalRead(pinCloche) == LOW) { 
    Keyboard.print('B');
    debutCloche = millis();
    clocheActive = true;
  }

  // si bouton relâché et qu'on n'a pas noté le relâchement de la touche
  if (clocheActive  && digitalRead(pinCloche) == HIGH) { 
      clocheActive = false;
  }

  // si la cloche est active et que le temps entre 2 appuis (ici 100ms) est écoulé, on renvoie un appui
  if (clocheActive && millis() - debutCloche >= 100) {
    Keyboard.print('B');
    debutCloche = millis();
  }


Merci pour le code. Il semble fonctionner. Il me faut juste calibrer le temps entre 2 appuis car une durée 100 ms ne semble pas appropriée.

j'ai pris 100 au hasard :wink:

(j'ai édité le post ce dessus pour mettre le test sur le booléen en premier, ça évite de faire le digitalRead dans bien des cas et donc ça améliorera la performance)

J'ai essayé par itérations de modifier la valeur et j'ai réussi à en trouver une (13) qui semble convenir. Merci de votre aide !

Cool

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