Arduino: Problème de multiplexage boutons avec transistor

Bonjour,

Je débute en arduino, et j’aimerais augmenter le nombre de boutons poussoirs sur l’arduino en utilisant le même nombre d’entrées/sorties sur la carte, en utilisant les transistors NPN.

J’ai fait un petit montage test avec 2x4 boutons où chaque rangée de 4 boutons est pilotée par un transistor. J’arrive sans problème a recupere l’état des boutons, même en appuyant simultanément, sauf dans le cas où j’appuie sur deux boutons reliés à la même sortie de l’arduino, et que j’appui sur un autre bouton.

Si j’appuie sur 1 et 5, et aussi sur 3 par exemple, l’arduino m’affichera sur le Serial Monitor que les boutons 1, 5 et 3 sont appuyés, mais aussi le 7 relié à la même sortie que le 3, sans que j’appuie dessus. J’ai fait plusieurs tests dans le code, dans le montage, des recherches sur le web, en essayant de comprendre qu’est ce qui n’allait pas, sans trouver.

char donne[8];

void setup() {
  Serial.begin(9600);  
   for (int i=4; i<8; i++)
       pinMode(i, INPUT_PULLUP);
    for (int i=0; i<8; i++)
    donne[i]='0';
    
   pinMode(3, OUTPUT);
   pinMode(2, OUTPUT);
   digitalWrite(3, LOW);
   digitalWrite(2,HIGH);
  
}

void loop() {
  for (int i=0; i<8; i++)
    donne[i]='0';
    
  if (digitalRead(4)==false)
    donne[0]='1';
  if (digitalRead(5)==false)
    donne[1]='1';
  if (digitalRead(6)==false)
    donne[2]='1';
  if (digitalRead(7)==false)
    donne[3]='1';
digitalWrite(2,LOW);
digitalWrite(3, HIGH);
  if (digitalRead(4)==false)
    donne[4]='1';
  if (digitalRead(5)==false)
    donne[5]='1';
  if (digitalRead(6)==false)
    donne[6]='1';
  if (digitalRead(7)==false)
    donne[7]='1';
  
     digitalWrite(3, LOW);
  digitalWrite(2,HIGH);
   
 
    Serial.println(donne);

}

Voila le code arduino aussi.

J’espère avoir été clair, et désolé pour les éventuelles erreurs de code/montage/d’orthographes.

Je vous remercie pour l’aide que vous pourriez m’apporter! :slight_smile:

Bonsoir, le but est de pouvoir appuyer sur plusieurs touches en même temps ou d'être certain de détecter le bon bouton?

voir peut être par ici...

hello
ce qui t’arrive est on ne peut plus normal
vu la vitesse de la boucle loop

teste cette modif pour le constater

char donne[8];

void setup() {
  Serial.begin(9600);
  for (int i = 4; i < 7; i++)
    pinMode(i, INPUT_PULLUP);
  for (int i = 0; i < 8; i++)
    donne[i] = '0';

  pinMode(3, OUTPUT);
  pinMode(2, OUTPUT);
  digitalWrite(3, LOW);
  digitalWrite(2, HIGH);

}

void loop() {
  for (int i = 0; i < 8; i++)
    donne[i] = '0';

  if (digitalRead(4) == false)
    donne[0] = '1';
  if (digitalRead(5) == false)
    donne[1] = '1';
  if (digitalRead(6) == false)
    donne[2] = '1';
  if (digitalRead(7) == false)
    donne[3] = '1';
  Serial.println(donne);

  delay(2000);
  digitalWrite(2, LOW);
  digitalWrite(3, HIGH);
  if (digitalRead(4) == false)
    donne[4] = '1';
  if (digitalRead(5) == false)
    donne[5] = '1';
  if (digitalRead(6) == false)
    donne[6] = '1';
  if (digitalRead(7) == false)
    donne[7] = '1';

  digitalWrite(3, LOW);
  digitalWrite(2, HIGH);

  Serial.println(donne);
  delay(2000);
}

merci pour vos réponses rapides, le but est d'appuyer sur plusieurs boutons en même temps, et de détecter les bons boutons qui sont appuyer, il n'y a aucun soucis sauf quand j'appuie sur deux boutons reliés à la même sortie.

Quand je mets le delay, ça ne change pas mon erreur, il m' affiche "11001100" si j'appuie juste sur 3 boutons: le 1, 5 et le 2, et je comprends pas pourquoi le 6 est détecter activé!

Bonjour

Juste pour te signaler une autre possibilité de montage : utiliser un composant à interface I2C, qui permet d'étendre le nombre d'entrées/sorties numérique (TWI IO expander), un des plus courants étant le PCF8574

Tu peux brancher jusqu'à 8 boutons poussoirs sur un PCF8574 Le PCF8574 ne monopolise aucune pin arduino car il est commandé en I2C, via les pin SDA et SCL.

Le PCF8574 a une sortie qui permet de signaler un changement d'état d'une de ses 8 entrées. Cette sortie peut être reliée à une entrée numérique de l'arduino, à laquelle sera rattachée une interruption dont le traitement consistera à aller lire l'état des 8 entrées du PCF8574 via le bus I2C.

Tu peux brancher jusqu'à 8 PCF8574 sur ton bus I2C (=> 64 boutons, une seule pin arduino utilisée pour le signal d'interruption, hors SDA et SCL)

Et si ce n'est pas assez, il y a aussi des io expander à 16 bits

Quelques références : PCF8574, PCF8575, MCP23008, MCP23016, ...

ok merci, je vais également explorer cette piste qui me paraît très interessante, plus compliqué par contre!

Dans le setup()

  for (int i = 4; i < 7; i++)
    pinMode(i, INPUT_PULLUP);

essaye de remplacer i<7; par i<=7; pour que l’entrée 7 soit configurée en INPUT_PULLUP…

oui, merci, j'ai changé cette erreur du code, par contre cela ne change rien au bug, le bug vient d'ailleurs...

Bonsoir, Je ne vois pas sur ton schéma de résistances de pull-out(risque de cramer des sorties) , ni de gestion anti-rebond des contacts http://eskimon.fr/96-arduino-204-un-simple-bouton.

Merci, j'ai regarde ce tutoriel, si j'ai bien compris, j'ai active les résistances internes de pull up de l'arduino dans le code "pinMode(i, INPUT_PULLUP);", donc pas besoin d'en rajouter il me semble? c'est vrai que je ne gère pas l'anti rebonds, je n'ai pas de condensateurs sous la main pour l'instant, mais je n'ai pas eu de problèmes pour l'instant a cause de ca.

J'en reviens à la Library Keypad...

L'exemple MultiKey devrait faire ce que tu cherches (et en plus tu économise 2 transistors!)

Bonsoir,
Je soulignait aussi le manque de résistance de limitation en courant dans la base des transistors.
Ça marche comme ça mais sans limitation lors des transitoires, ton arduino souffre et durera moins longtemps.

Pour ton problème, je pense que la fonction loop() effectue plusieurs cycles lors d’un appuie sur un bouton et qu’il faut savoir quel transistor est activé lors de la lecture .

Par exemple :

boolean t1 = true;// premier transistor actif
   digitalWrite(3, LOW);
   digitalWrite(2,HIGH);

et dans loop() :
if (t1==true){
  for (int i=4; i<8; i++)
   {
     if (digitalRead(i)==false)
    donne[i-4]='1';
    delay(100);// anti-rebond
    }
}
else if (!t1){
  for (int i=4; i<8; i++)
   {
     if (digitalRead(i)==false)
    donne[i]='1';
    delay(100);// anti-rebond
    }
}

Y a peut-être des erreurs, je débute aussi mais pas en électronique :wink:

Bonjour,

Ce que j'ai pensé ne fonctionnera pas non plus : quand une entrée est déjà mise à 1 par un bouton, que l'autre soit à 1 ou 0 ne change rien, même avec des diodes.

pepe, Pour l'échelle de résistances en série sur la même entrée, c'est seulement la valeur du bouton placé au plus haut sur l'échelle qui sera prise en compte, non ?

Tu penses peut-être à ça

matthieu92, on peut voir ton système comme les 2 premières colonnes de ce clavier : |500x320

En in1, on ne sait pas voir si sw1 et sw2 sont commutés ensembles.

La solution serait d'alterner les entrées en in/out, non ?

.

Ha OK!

En extrapolant, si on part de 100 ohm pour la première résistance et la dernière 12.8 k, on peut avoir 8 boutons sur une entrée. A savoir jusqu’où on peut aller sans perte de stabilité ?

Pour les claviers multiplexés sans résistance, on joue avec l'alternance in/out des entrées sorties, c'est ça ?

Pour les claviers multiplexés sans résistance, on joue avec l'alternance in/out des entrées sorties, c'est ça ?[/b]

Bonjour,

il n'y a pas besoin de résistance, il faut s'assurer qu'une seule sortie à la fois soit configurée en out. Si les autres sorties doivent être configurées en in (pas facile d'être clair ...), c'est pour éviter les courts-circuits quand plusieurs touches d'une même colonne sont appuyées simultanément. tu peux néanmoins mettre des résistances pour éviter les courts-circuits en cours de développement

concernant ton souci de lecture simultanée de plusieurs touches, je crains que sans diode (ou la solution analogique de pepe), point de salut, imagine une matrice simple : 1 2 3 4 si par exemple les boutons 1, 3 et 4 sont appuyés simultanément, tout est court-circuité, il n'y plus aucun moyen de savoir l'état du bouton 2 certes, j'ai vu des claviers d'instruments de musique polyphoniques constitués de simples matrices : sans doute les combinaison comme celle que je viens de démontrer sont considérées comme étant non musicales, et donc n'ayant aucun risque de se produire. Le reste doit être traité avec un soft emberlificoté dont je n'imagine pas les difficultés de mise au point

enfin, à mon humble avis, les microcontrôleurs sont faits pour se passer au mieux de composants externes, s'il te manque des broches, c'est peut-être que tu as choisi trop petit ...

Merci les gars ;) Et ben ! j'en apprends des choses depuis que je traine par ici. Ça s'est bien démocratisé l'automatisation !

Je ne suis pas l'auteur du sujet, mais ça m'intéresse aussi.

Nulentout, qu'est pas du tout nul avait offert ce tuto sur le mini-clavier 16 touches http://forum.arduino.cc/index.php?action=dlattach;topic=223006.0;attach=71581

Bonsoir, merci beaucoup pour vos nombreuses réponses, j'ai réglé mon problème en rajoutant des diodes avant chaque bouton et il y a aucun souci, il y avait effectivement un court-circuit!