IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Arduino Discussion :

Boutons dans HID PROJECT et KeyboardPress?


Sujet :

Arduino

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre à l'essai
    Homme Profil pro
    Enseignant
    Inscrit en
    Mars 2023
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : Belgique

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Mars 2023
    Messages : 5
    Par défaut Boutons dans HID PROJECT et KeyboardPress?
    Bonjour,

    A mes moments perdus, je bricole sur arduino.
    J'ai réalisé une plaque de commande "à pédales" 4 interrupteurs qui génèrent une lettre quand on appuie dessus.
    Chaque bouton permet de taper une lettre sans clavier. (raccourci en jeu)
    Un Leonardo, une bibliothèque HID-project, 4 interrupteurs poussoirs et ça fonctionne pas mal.

    Pourtant, je n'arrive pas à maintenir la touche enfoncée. La touche est tapée, relachée, tapée, relachée... Si je maintiens le bouton, j'obtiens plusieurs fois la même lettre.
    Mon code est simpliste, fonctionne mais je ne comprend pas cette répétition.
    J'ai dû oublier une subtilité ou mal employé les commandes.

    Une idée?
    Merci d'avance.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    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
    40
    #include <HID-Project.h>
    void setup() {
     
      pinMode(4, INPUT_PULLUP);
      pinMode(5, INPUT_PULLUP);
      pinMode(6, INPUT_PULLUP);
      pinMode(7, INPUT_PULLUP);
      Keyboard.begin();
      Consumer.begin();
    }
     
    void loop() {
      // lettres au hasard pour le moment.
     
      if (digitalRead(4) == LOW) {
        Keyboard.press('u');
      }
       if (digitalRead(4) == HIGH) {
        Keyboard.releaseAll();
      }
      if (digitalRead(5) == LOW) {
        Keyboard.press('t');
      }
      if (digitalRead(5) == HIGH) {
        Keyboard.releaseAll();
      }
      if (digitalRead(6) == LOW) {
        Keyboard.press('i');
      }
      if (digitalRead(6) == HIGH) {
        Keyboard.releaseAll();
      }
      if (digitalRead(7) == LOW) {
        Keyboard.press('o');
      }
      if (digitalRead(7) == HIGH) {
        Keyboard.releaseAll();
      }
      delay(100);
    }

  2. #2
    Membre Expert

    Homme Profil pro
    Directeur de projet
    Inscrit en
    Mai 2013
    Messages
    1 644
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Directeur de projet
    Secteur : Service public

    Informations forums :
    Inscription : Mai 2013
    Messages : 1 644
    Par défaut
    Bonjour,
    L'usage des Keyboard.releaseAll(); relache toutes les touches. Il faut utiliser Keyboard.release(c); pour la touche à relâcher et il faut vérifier avant qu'elle était appuyée donc l'avoir mémorisée. Par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    bool btn[4]; // 4..7 - 4 -> 0..3
    ...
      if (digitalRead(6) == LOW) {
        Keyboard.press('i');
        btn[6-4] = true;
      }
      else if(btn[6-4] && digitalRead(6) == HIGH) {
        Keyboard.release('i');
        btn[6-4] = false;
      }
    ...
    Un tableau des caractères à émettre permettrait de faire une boucle au lieu de répéter des instructions qui ne diffèrent que par le code envoyé.
    Salutations

  3. #3
    Membre à l'essai
    Homme Profil pro
    Enseignant
    Inscrit en
    Mars 2023
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : Belgique

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Mars 2023
    Messages : 5
    Par défaut
    Citation Envoyé par Guesset Voir le message
    Bonjour,
    L'usage des Keyboard.releaseAll(); relache toutes les touches. Il faut utiliser Keyboard.release(c); pour la touche à relâcher et il faut vérifier avant qu'elle était appuyée (...)
    Ben oui ... les autres boutons non-appuyés relâchent les frappes... j'avais loupé ça...
    Le Boléen, je maitrise pas trop, alors je reste avec du code brut
    Cela semble mieux comme ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    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
    40
    41
    42
     
    #include <HID-Project.h>
    void setup() {
     
      pinMode(4, INPUT_PULLUP);
      pinMode(5, INPUT_PULLUP);
      pinMode(6, INPUT_PULLUP);
      pinMode(7, INPUT_PULLUP);
      Keyboard.begin();
      Consumer.begin();
    }
     
    void loop() {
      // 
     
     
      if (digitalRead(4) == LOW) {
        Keyboard.press('u');
      }
      if (digitalRead(4) == HIGH) {
        Keyboard.release('u');
      }
      if (digitalRead(5) == LOW) {
        Keyboard.press('t');
      }
      if (digitalRead(5) == HIGH) {
        Keyboard.release('t');
      }
      if (digitalRead(6) == LOW) {
        Keyboard.press('i');
      }
      if (digitalRead(6) == HIGH) {
        Keyboard.release('i');
      }
      if (digitalRead(7) == LOW) {
        Keyboard.press('o');
      }
      if (digitalRead(7) == HIGH) {
        Keyboard.release('o');
      }
      delay(50);
    }

  4. #4
    Membre Expert

    Homme Profil pro
    Directeur de projet
    Inscrit en
    Mai 2013
    Messages
    1 644
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Directeur de projet
    Secteur : Service public

    Informations forums :
    Inscription : Mai 2013
    Messages : 1 644
    Par défaut Short
    Bonjour,
    Avec un tableau (pin et car pourraient être déclarés en const) :
    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    #include <HID-Project.h>
     
    typedef struct  {uint8_t pin; uint8_t last; char car;} Cmd_t;
    Cmd_t cmds[4] = { { 4, 1, 'u'}, {5, 1, 't'}, {6, 1, 'i'}, {7, 1, 'o'} };
     
    void setup() {
       for(int i = 0; i < 4; ++i) pinMode(cmds[i].pin, INPUT_PULLUP);
       Keyboard.begin();
       Consumer.begin();
    }
     
    void loop() {
       for(int i = 0; i < 4; ++i) 
          if(digitalRead(cmds[i].pin) != cmds[i].last) {
             if(cmds[i].last) Keyboard.press(cmds[i].car); else Keyboard.release(cmds[i].car);
             cmds[i].last ^= 1;                      // 0 ^ 1 -> 1 et 1 ^ 1 -> 0 et il n'y a que deux états possibles !
          }
       delay(50);
    }

    En ne travaillant que sur changement d'état on reproduit exactement le mouvement des pieds et on évite d'émettre des messages inutiles (ma première proposition supprimait les messages inutiles de remonté mais pas ceux d'appui).

    Salutations

  5. #5
    Membre à l'essai
    Homme Profil pro
    Enseignant
    Inscrit en
    Mars 2023
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : Belgique

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Mars 2023
    Messages : 5
    Par défaut
    Citation Envoyé par Guesset Voir le message
    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    #include <HID-Project.h>
     
    typedef struct  {uint8_t pin; uint8_t last; char car;} Cmd_t;
    Cmd_t cmds[4] = { { 4, 1, 'u'}, {5, 1, 't'}, {6, 1, 'i'}, {7, 1, 'o'} };
     
    void setup() {
       for(int i = 0; i < 4; ++i) pinMode(cmds[i].pin, INPUT_PULLUP);
       Keyboard.begin();
       Consumer.begin();
    }
     
    void loop() {
       for(int i = 0; i < 4; ++i) 
          if(digitalRead(cmds[i].pin) != cmds[i].last) {
             if(cmds[i].last) Keyboard.press(cmds[i].car); else Keyboard.release(cmds[i].car);
             cmds[i].last ^= 1;                      // 0 ^ 1 -> 1 et 1 ^ 1 -> 0 et il n'y a que deux états possibles !
          }
       delay(50);
    }
    Wow ! Là je suis largué ! Merci pour le coup de main, tout fonctionne avec mon code. Je testerai celui-là aussi. Y a-t-il vraiment une grosse différence au point de vue fonctionnel?

  6. #6
    Membre Expert

    Homme Profil pro
    Directeur de projet
    Inscrit en
    Mai 2013
    Messages
    1 644
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Directeur de projet
    Secteur : Service public

    Informations forums :
    Inscription : Mai 2013
    Messages : 1 644
    Par défaut
    Bonjour,

    La différence est que le code proposé n'émet un appui de touche qu'au moment où on appuie sur la pédale idoine, et, de même, ne relâche la touche qu'au moment où on relâche la pédale.

    Le code initial, même modifié, émet, toutes les 50 ms, 4 appuis/relâchés selon l'état des pédales, c'est à dire même si on n'utilise pas les pédales. Cela n'a peut être pas d'effet sur l'application cible mais comme c'est permanent, il faudra certainement débrancher la machine infernale pour pouvoir faire autre chose.

    Explications rapides
    Il y a 4 pédales rangées dans un tableau.
    La structure de chaque élément du tableau décrit une pédale :
    • pin indique sur quel port est raccordéel la pédale i.
    • last est le dernier état (0 ou 1) de la pédale i.
    • car est le caractère à envoyer si la la pédale i change d'état.

    Comme on ne veut envoyer un caractère qu'au changement d'état, on teste si l'état lu est différent du dernier état rangé dans last.
    S'il n'est pas différent on ne fait rien.
    S'il est différent et que last == 1 (traité comme true par le test) il vaut 0 : on a donc appuyé sur la pédale donc on presse la touche car.
    S'il est différent et que last == 0 (traité comme false par le test donc else...) il vaut 1 : on a donc relâché la pédale donc on relâche la touche car.
    S'il est différent on note dans last sa valeur pour la suite. On aurait pu relire celle-ci, mais comme il n'y a que 2 états, 0 et 1, il est plus économique d'inverser la valeur de last : cmds[i].last = 1 - cmds[i].last ; ou cmds[i].last = !cmds[i].last; ou cmds[i].last = cmds[i].last == 0; ou plus court mais moins lisible cmds[i].last ^= 1; qui est équivalent à cmds[i].last = cmds[i].last ^1;^ est le xor (ou exclusif) binaire qui retourne 0 pour les bit identiques et 1 sinon.

    Le but est d'offrir une solution à analyser pour progresser. Les témoins simples de progression sont la détection d'erreurs (je ne sais pas s'il y en a mais je suis rarement avare sur ce point ) et les améliorations.

    Salutations

  7. #7
    Expert confirmé

    Homme Profil pro
    mad scientist :)
    Inscrit en
    Septembre 2019
    Messages
    2 919
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : mad scientist :)

    Informations forums :
    Inscription : Septembre 2019
    Messages : 2 919
    Par défaut
    petites améliorations sans doute:

    - tester l'état de la pin dans le setup pour les petits malins qui allumeraient le système en tenant les pédales appuyées
    - le delay(50) peut créer une petite latence je suppose que c'est là comme anti-rebond ?

  8. #8
    Membre Expert

    Homme Profil pro
    Directeur de projet
    Inscrit en
    Mai 2013
    Messages
    1 644
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Directeur de projet
    Secteur : Service public

    Informations forums :
    Inscription : Mai 2013
    Messages : 1 644
    Par défaut
    Bonjour Jay M,

    Citation Envoyé par Jay M Voir le message
    - tester l'état de la pin dans le setup pour les petits malins qui allumeraient le système en tenant les pédales appuyées
    Si c'est le cas, le premier passage dans loop() constatera un appui (avec retard) et un cycle normal s'ensuivra. Si on lit dans le setup() on aura une remontée sans appui ce qui n'est pas dommageable mais me semble moins propre. Mais c'est un choix.

    Citation Envoyé par Jay M Voir le message
    - le delay(50) peut créer une petite latence je suppose que c'est là comme anti-rebond ?
    C'est ce que je pense aussi. Mais comme antirebond c'est un peu long. Dans la version qui émet beaucoup de messages cela peut se justifier car ça limite un peu le flux. Mais dans la version alternative, j'aurais dû diminuer ce temps, par exemple le diviser par 10, soit 5 ms (à moins que les pédales n'aient vraiment beaucoup de rebonds).

    Salut

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Nouvelle form avec bouton dans barre taches
    Par DarkChamallo dans le forum API, COM et SDKs
    Réponses: 3
    Dernier message: 17/05/2004, 20h44
  2. [FLASH 5]un bouton dans une image pour revenir sur une scene
    Par patato valdes dans le forum Flash
    Réponses: 7
    Dernier message: 28/04/2004, 20h21
  3. [BCB 5.0] Ajouter un bouton dans internet explorer
    Par GthrDns dans le forum C++Builder
    Réponses: 2
    Dernier message: 01/02/2004, 22h54
  4. Icone/bouton dans la barre des taches...
    Par dynobremo dans le forum API, COM et SDKs
    Réponses: 6
    Dernier message: 28/02/2003, 12h05
  5. Réponses: 2
    Dernier message: 31/08/2002, 14h00

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo