VEAF
    • Site VEAF
    • Catégories
    • Récent
    • Populaire
    • Utilisateurs
    • Groupes
    • calendar
    • S'inscrire
    • Se connecter

    [Besoin Aide] Codage arduino Button Box

    La taverne des oiseaux
    2
    3
    260
    Charger plus de messages
    • Du plus ancien au plus récent
    • Du plus récent au plus ancien
    • Les plus votés
    Répondre
    • Répondre à l'aide d'un nouveau sujet
    Se connecter pour répondre
    Ce sujet a été supprimé. Seuls les utilisateurs avec les droits d'administration peuvent le voir.
    • Ti'RcoT
      Ti'Rco Membre du bureau
      dernière édition par Ti'Rco

      Bonsoir tout le monde,

      Comme certains le savent, j’ai terminé la fabrication d’une boîte à boutons pour notre cher simu, mais le code me pose quelques soucis.

      249298f5-3872-4826-a6fd-6b49d7b376f9-image.png

      Les composants sont les suivants :

      • 10 boutons On/Off classiques (couleur rouge, noir et doré)
      • 2 switchs 2 positions (cover rouge) --> problème
      • 2 switchs 3 positions -->problème
      • 2 switchs 3 positions momentanées
      • 4 potentiomètres cliquables
        *Carte Arduino Leonardo

      Voilà pour le contexte, en ce qui concerne le problème :

      Lorsqu’un des switchs (2 positions et 3 positions) revient à sa position initiale (donc interrupteur ouvert) je souhaiterais que cela soit reconnu comme une commande par Windows.
      La finalité étant de pouvoir affecter 2 commandes aux switchs 2 positions et 4 commandes aux switchs 3 positions.

      Avec mon niveau “pataugeoire” en informatique, j’ai récupéré le code suivant qui fonctionne très bien hormis le problème cité au-dessus :

      #include <Joystick.h>
      #include <Key.h>
      #include <Keypad.h>
      
      
      #define ENABLE_PULLUPS
      #define NUMROTARIES 4
      #define NUMBUTTONS 24
      #define NUMROWS 5
      #define NUMCOLS 5
      
      
      byte buttons[NUMROWS][NUMCOLS] = {
        {0,1,2,3,4},
        {5,6,7,8,9},
        {10,11,12,13,14},
        {15,16,17,18,19},
        {20,21,22,23},
      };
      
      struct rotariesdef {
        byte pin1;
        byte pin2;
        int ccwchar;
        int cwchar;
        volatile unsigned char state;
      };
      
      rotariesdef rotaries[NUMROTARIES] {
        {0,1,24,25,0},
        {2,3,26,27,0},
        {4,5,28,29,0},
        {6,7,30,31,0},
      };
      
      #define DIR_CCW 0x10
      #define DIR_CW 0x20
      #define R_START 0x0
      
      #ifdef HALF_STEP
      #define R_CCW_BEGIN 0x1
      #define R_CW_BEGIN 0x2
      #define R_START_M 0x3
      #define R_CW_BEGIN_M 0x4
      #define R_CCW_BEGIN_M 0x5
      const unsigned char ttable[6][4] = {
        // R_START (00)
        {R_START_M,            R_CW_BEGIN,     R_CCW_BEGIN,  R_START},
        // R_CCW_BEGIN
        {R_START_M | DIR_CCW, R_START,        R_CCW_BEGIN,  R_START},
        // R_CW_BEGIN
        {R_START_M | DIR_CW,  R_CW_BEGIN,     R_START,      R_START},
        // R_START_M (11)
        {R_START_M,            R_CCW_BEGIN_M,  R_CW_BEGIN_M, R_START},
        // R_CW_BEGIN_M
        {R_START_M,            R_START_M,      R_CW_BEGIN_M, R_START | DIR_CW},
        // R_CCW_BEGIN_M
        {R_START_M,            R_CCW_BEGIN_M,  R_START_M,    R_START | DIR_CCW},
      };
      #else
      #define R_CW_FINAL 0x1
      #define R_CW_BEGIN 0x2
      #define R_CW_NEXT 0x3
      #define R_CCW_BEGIN 0x4
      #define R_CCW_FINAL 0x5
      #define R_CCW_NEXT 0x6
      
      const unsigned char ttable[7][4] = {
        // R_START
        {R_START,    R_CW_BEGIN,  R_CCW_BEGIN, R_START},
        // R_CW_FINAL
        {R_CW_NEXT,  R_START,     R_CW_FINAL,  R_START | DIR_CW},
        // R_CW_BEGIN
        {R_CW_NEXT,  R_CW_BEGIN,  R_START,     R_START},
        // R_CW_NEXT
        {R_CW_NEXT,  R_CW_BEGIN,  R_CW_FINAL,  R_START},
        // R_CCW_BEGIN
        {R_CCW_NEXT, R_START,     R_CCW_BEGIN, R_START},
        // R_CCW_FINAL
        {R_CCW_NEXT, R_CCW_FINAL, R_START,     R_START | DIR_CCW},
        // R_CCW_NEXT
        {R_CCW_NEXT, R_CCW_FINAL, R_CCW_BEGIN, R_START},
      };
      #endif
      
      byte rowPins[NUMROWS] = {21,20,19,18,15}; 
      byte colPins[NUMCOLS] = {14,16,10,9,8}; 
      
      Keypad buttbx = Keypad( makeKeymap(buttons), rowPins, colPins, NUMROWS, NUMCOLS); 
      
      Joystick_ Joystick(JOYSTICK_DEFAULT_REPORT_ID, 
        JOYSTICK_TYPE_JOYSTICK, 32, 0,
        false, false, false, false, false, false,
        false, false, false, false, false);
      
      void setup() {
        Joystick.begin();
        rotary_init();}
      
      void loop() { 
      
        CheckAllEncoders();
      
        CheckAllButtons();
      
      }
      
      void CheckAllButtons(void) {
            if (buttbx.getKeys())
          {
             for (int i=0; i<LIST_MAX; i++)   
              {
                 if ( buttbx.key[i].stateChanged )   
                  {
                  switch (buttbx.key[i].kstate) {  
                          case PRESSED:
                          case HOLD:
                                    Joystick.setButton(buttbx.key[i].kchar, 1);
                                    break;
                          case RELEASED:
                          case IDLE:
                                    Joystick.setButton(buttbx.key[i].kchar, 0);
                                    break;
                  }
                 }   
               }
           }
      }
      
      
      void rotary_init() {
        for (int i=0;i<NUMROTARIES;i++) {
          pinMode(rotaries[i].pin1, INPUT);
          pinMode(rotaries[i].pin2, INPUT);
          #ifdef ENABLE_PULLUPS
            digitalWrite(rotaries[i].pin1, HIGH);
            digitalWrite(rotaries[i].pin2, HIGH);
          #endif
        }
      }
      
      
      unsigned char rotary_process(int _i) {
         unsigned char pinstate = (digitalRead(rotaries[_i].pin2) << 1) | digitalRead(rotaries[_i].pin1);
        rotaries[_i].state = ttable[rotaries[_i].state & 0xf][pinstate];
        return (rotaries[_i].state & 0x30);
      }
      
      void CheckAllEncoders(void) {
        for (int i=0;i<NUMROTARIES;i++) {
          unsigned char result = rotary_process(i);
          if (result == DIR_CCW) {
            Joystick.setButton(rotaries[i].ccwchar, 1); delay(50); Joystick.setButton(rotaries[i].ccwchar, 0);
          };
          if (result == DIR_CW) {
            Joystick.setButton(rotaries[i].cwchar, 1); delay(50); Joystick.setButton(rotaries[i].cwchar, 0);
          };
        }
      }
      
      

      Deux questions pour conclure ce post :

      • Pensez-vous que cela soit possible d’implémenter autant de fonctions supplémentaires ?
      • Si oui, l’un d’entres-vous serait-il motivé pour me venir en aide et pourquoi pas m’expliquer la démarche (que j’apprenne quelque chose quand même)

      Pour finir, je souhaite remercier @Marge pour ses conseils et ses ressources malgré mon impossibilité à les utiliser.

      PS : J’espère être au bon endroit pour ce genre de sujet 😇

      Ti'Rco - Pilote F/A-18C à la 14.735 Corsairs, KA-50 à la 99.735 Coyotes, M-2000C à la 10.735 Raptor Cell, RIO F-14 en cours…

      1 réponse Dernière réponse Répondre Citer 1
      • MitchM
        Mitch Membre VEAF
        dernière édition par

        Sans pouvoir t’aider dans l’immédiat, peux-tu éditer ton POST en conservant l’indentation et en utilisant la fonction “code” (icone </>) ?

        ça améliorera la visibilité, par exemple (extrait):

        #include <Joystick.h>
        #include <Key.h>
        #include <Keypad.h>
        
        #define ENABLE_PULLUPS
        #define NUMROTARIES 4
        #define NUMBUTTONS 24
        #define NUMROWS 5
        #define NUMCOLS 5
        
        byte buttons[NUMROWS][NUMCOLS] = {
          {0,1,2,3,4},
          {5,6,7,8,9},
          {10,11,12,13,14},
          {15,16,17,18,19},
          {20,21,22,23},
        };
        
        

        A-10CII - F-15E

        Mon profil VEAF

        Ti'RcoT 1 réponse Dernière réponse Répondre Citer 0
        • Ti'RcoT
          Ti'Rco Membre du bureau @Mitch
          dernière édition par

          @Mitch Merci pour l’astuce, ce sera clairement plus lisible comme ça !

          Ti'Rco - Pilote F/A-18C à la 14.735 Corsairs, KA-50 à la 99.735 Coyotes, M-2000C à la 10.735 Raptor Cell, RIO F-14 en cours…

          1 réponse Dernière réponse Répondre Citer 1
          • Premier message
            Dernier message