Modification durée appui bouton

Bonjour !

Voilà mon problème : j'ai des interférences sur une boite à bouton simracing branchée sur une Arduino micro Pro, tout fonctionne correctement mais quand j'allume mon volant situé à proximité, j'ai des "micro appuis" aléatoires sur les boutons poussoirs rétroéclairés par LED.
J'ai vérifié ça avec un logiciel de paramétrage d'assignation de bouton et effectivement quand je coupe le volant c'est bon...
Ce problème ne concerne que les bouton poussoirs qui possèdent une Led d'éclairage, les encodeurs rotatifs fonctionnent très bien !

Deux solutions s'ouvrent à moi : isoler la partie alimentation 5volts des LED ou éventuellement insérer dans mon code une durée minimum d'appui sur les boutons avant prise en compte de l'action ?

Comment faire cette modification de code ?
Merci à vous !

//BUTTON BOX 
//USE w ProMicro
//Tested in WIN10 + Assetto Corsa
//AMSTUDIO
//20.8.17

#include <Keypad.h>
#include <Joystick.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);
    };
  }
}

Voici le câblage correspondant au code

Bonjour nico70000

Ou quelques centaines de uF sur l'alimentation 5V.

Cordialement
jpbbricole

je viens de vérifier, j'ai retiré l'alimentation des LED avec volant allumé, plus de soucis... cela vient donc d'un problème de "parasites"...
tu parle d'un résistance à mettre sur le 5V ? A quel niveau ? je ne suis pas du tout calé la dessus...
Sachant que les LED sont alimentées séparément par une alimentation dédiées

Non, il parle d'un condensateur.

Ce n'est pas ce qui est fait sur ton schema.

Bonjour nico70000

Excuses moi, je me suis mal exprimé, je voulais parler d'un condensateur, ainsi:

Ou, une autre solution est de mettre des résistances de PULLUP supplémentaires, environ 10k sur les entrées ligne de la matrice du clavier. Les résistances internes de PULLUP sont activées par la bibliothèque (voir l'article de @J-M-L), mais si le milieu est perturbé des résistances supplémentaires, ça peut aider.

Cordialement
jpbbricole

Sur mon schéma il n'y a pas les alimentations électriques des LED, c'est juste le branchement à l'Arduino

et par rapport à mon schéma de branchement, où mettre ces résistances ?

Oui, tout à fait ton schéma est partiel :frowning:

effectivement mais il y a juste un pont + et + entre chaque bouton poussoir pour l'alimentation des LED intégrées...

Sur ces pin:
byte rowPins[NUMROWS] = {21,20,19,18,15};

Ok je vois le principe ! Mettre une résistance à l'entrée de chaque lignes reliées aux poussoirs...

Dans quel sens du coup ? il me semble qu'il y ai un sens de montage non ?

Un côté de la résistance à +5V, l'autre sur la pin de l'Arduino.
Une résistance n'a pas de sens, mais, pour faire "joli" tu peux les tourner toutes de telle façon que les bagues de couleurs soient dans le même ordre :wink:

De cette manière ?

Oui.

super ! je vais essayer ça ! Merci :wink:

autre question, si je remplace une micro pro par une micro, le code doit être
modifié ?

Je viens de casser le petit port usb de ma carte micro pro :slightly_frowning_face: et je changerais bien pour une plus "grosse" carte afin d'y intégrer un joystick...

Bonsoir,

J'aimerais bien comprendre ton histoire de pont + + pour alimenter la led integrée, parce que rajouter des résistances de PULLUP en guise de reméde, si on ne connait pas la cause, on finit par casser .

Tu dis ailleurs que ton PB vient des LEDs integrées, perso j'aimerais donc savoir comment elles sont réellement branchées, peux tu nous indiquer la ref de tes BP STP?

tout marche très bien à présent, merci :slightly_smiling_face:

il ne me reste plus qu'à intégrer un petit code pour un joystick dans mon code d'origine, mais je ne sais pas comment faire ...

On ne connaîtra pas, pour notre culture technique, la ref des BO à led🥴