Anti rebond pour multiplexeur

si vous commencez par la base je vous suggère d'explorer les tutos d'eskimon. Très didactiques ils vous prendront par la main pur vous faire grandir

commencez par des trucs simples, bâtissez des fondations solides. c'est un peu plus long mais vous verrez que c'est très gratifiant

En fait plutot que de faire en sorte que le changement d'état de mon switch induise un changement de 'fonction' de mes boutons reliés directement aux pins de mon arduino...(ou de mon multiplexeur?? mais je doute que cela soit possible?)

je ne suis pas sûr de comprendre le sens de cette phrase :slight_smile:

Le code que j'ai récupéré me permet juste d'utiliser le switch pour rediriger la pin d'info de mon multiplexeur vers deux entrées différentes en fonction de la position. Entrées programmées différemment...

ça ne présente que très peu d'intérêt à mon avis... si le switch était piloté à forte fréquence par un processus alors ce pourrait être pertinent, mais là c'est un truc géré à la main, donc autant régler cela directement dans votre arduino en fonction d'une variable d'état pilotée par la position du switch

loo:
"En fait plutot que de faire en sorte que le changement d'état de mon switch induise un changement de 'fonction' de mes boutons reliés directement aux pins de mon arduino...(ou de mon multiplexeur?? mais je doute que cela soit possible?)"

J-M-L:
je ne suis pas sûr de comprendre le sens de cette phrase :slight_smile:

En fait cela correspond à ce que vous me disiez précédemment:

loo:
"Une fois les 2 écrits, votre switch à 3 positions pourrait simplement être représenté par une variable d'état qui modifie à l'exécution le comportement des autres boutons quand ils sont appuyés -"

autrement dit:

si j'ai switch 1 et bouton 1 je joue TITITI
si j'ai switch 2 et bouton 1 je joue TITI

Je ne sais pas di cette solution est possible avec un multiplexeur. Autrement dit:

---> si j'ai switch 1 et signal du mux correspondant au bouton 1 alors TITITI
si j'ai switch 2 et signal du mux correspondant au bouton 1 alors TITI

loo:
Le code que j'ai récupéré me permet juste d'utiliser le switch pour rediriger la pin d'info de mon multiplexeur vers deux entrées différentes en fonction de la position. Entrées programmées différemment...

Je procède de cette manière à cause de ma limitation en matière de code..cela me permet aussi d'économiser quelques entrées sur mon arduino nano..(les boutons ne sont pas reliés a des entrées AD.)sachant que je souhaiterai que mon projet comporte de nombreux boutons et potentiometres..

Merci pour le lien vers les tutos d'Eskimon qui ont l'air vraiment bien fait! Je pense en effet qu' une fois qu'on prend le courage de se lancer, ça doit être assez addictif.

c'est vraiment sortir un marteau pour écraser une mouche si vous voulez mon avis...

si vous lisez l'anglais vous pouvez aller voir cette description sur le 74HC4051

en gros la carte (montée) ressemble à cela

vous avez 8 pins en bas notées Y[sub]0[/sub] à Y[sub]7[/sub] et en fonction des valeurs envoyées sur S0-S1-S2 en haut vous définissez quelle pin Y[sub]x[/sub] est connectée à la pin Z - que ce soit en entrée ou en sortie.

L'entrée E sert à activer le composant (active LOW, à connecter à la masse)

Par exemple (en ayant Enable sur LOW) si vous mettez 000 sur S2-S1-S0, soit l'adresse [color=blue]0[/color], vous dites de connecter Y[sub][color=blue]0[/color][/sub] à Z et si vous mettez 101 sur S2-S1-S0, soit l'adresse [color=purple]5[/color], vous dites de connecter Y[sub][color=purple]5[/color][/sub] à Z

En fixant l'adresse x votre Arduino peut lire depuis la pin Z l'état de la pin Y[sub]x[/sub]. votre arduino allant vite par rapport au temps humain, en changeant l'adresse x rapidement vous pouvez ainsi lire l'état de 8 boutons plusieurs dizaines de fois par seconde en ne monopolisant qu'une seule pin de votre arduino (reliée à Z) + 3 pins pour les adresses.

(et comme il est analogique et pas juste tout ou rien - ce composant sert à lire aussi une valeur de potentiomètre par exemple, dans ce cas en attachant la pin Z à une pin analogique sur votre arduino)

Super clair ! Je comprend mieux comment fonctionne ce composant.

Mais ce que je ne comprend pas,c'est que rediriger cette pin 'z' du multiplexeur via un switch,comme je l'ai fait, n'est pas beaucoup plus compliqué dans la réalisation que d'utiliser l'état 'logique' du switch via deux pins de l'arduino.

J-M-L:
Plutôt que le schema du montage, postez un bout de code que vous avez écrit.

Permet moi de ne pas être d'accord.

Si le schéma est faux tu aura beau écrire tout le code que tu veux cela ne fonctionnera jamais.

@Ioo

Une entrée reliée à un bout de fil capte tout ce qui passe à sa porter et la lecture est aléatoire.
Si tu ne met pas de résistance de tirage à un potentiel défini (les fameuses pull up) quand le contact n'est pas appuyé le fil se trouve en l'air.
C'est pour éviter cette situation qu'au repos on impose un potentiel qui peut être aussi bien l'alim que la masse.
Ici tu n'entendra parler que de résistances de tirage à l'alim parce que ces résistances se trouvent déjà dans le micro et peuvent être activées à la demande. Mais ce n'est qu'une solution de facilité.

Les contacts c'est la mécanique cela vibre et cela provoque des rebonds, c'est absolument inévitable.
Pour éliminer les rebonds deux approches différentes :

Les "softeux" qui n'ont pas de tiroir à "riblons" (résistances, condensateurs, etc) et n'aiment pas câbler, préféreront traiter le problème à l'arrivée sur le micro avec quelques lignes de code.

Les "hardeux" qui ont ce genre de tiroir et ne voient pas pourquoi on compliquerait le code pour quelque chose qui se résous très facilement matériellement préféreront traiter le problème à la base (au niveau du contact) en plaçant un condensateur en parallèle sur le contact, 100 nH suffisent et c'est une valeur absolument passe partout .

68tjs:
Permet moi de ne pas être d'accord.
Si le schéma est faux tu aura beau écrire tout le code que tu veux cela ne fonctionnera jamais.

Oui j'ai été un peu léger - je voulais dire de poster les 2. j'ai annoté le premier post pour être plus précis

Les "hardeux" qui ont ce genre de tiroir et ne voient pas pourquoi on compliquerait le code pour quelque chose qui se résous très facilement matériellement préféreront traiter le problème à la base (au niveau du contact) en plaçant un condensateur en parallèle sur le contact, 100 nH suffisent et c'est une valeur absolument passe partout .

moi je trouve que le chargement du condensateur ralentira significativement le moment où l'intention de l'utilisateur sera effectivement vue depuis le micro (hum... OK je grossis un peu le trait... allez allez pas de commentaire sur le temps, tout est relatif :)) )

et puis même si j'ai le bon tiroir, j'ai souvent la flemme d'y mettre les mains, j'avoue :slight_smile:

pepe:
Bonjour

Je ne suis pas sûr d'avoir bien compris la finalité.

Le but final est de pouvoir envoyer des notes midis différentes via mes boutons en fonction de mon switch.

pour ceux qui ne connaissent pas:

Le Midi est un protocole de communication et de commande intialement prévu pour les instruments de musique.Une librairie Arduino permet de l'exploiter.

Merci pour les explications et le code @pepe. Je vais essayer de prendre le temps de bien comprendre le principe et de tester tout ça. ça m'aide beaucoup!

68tjs:
Les "hardeux" qui ont ce genre de tiroir et ne voient pas pourquoi on compliquerait le code pour quelque chose qui se résous très facilement matériellement préféreront traiter le problème à la base (au niveau du contact) en plaçant un condensateur en parallèle sur le contact, 100 nH suffisent et c'est une valeur absolument passe partout .

Je débute mais possède effectivement plusieurs composants dont des condensateurs 100 nF et résistances a gogo.

Du coup il faut que je filtre la réponse des boutons qui sont reliés au multiplexeurs ( grâce à une résistance 10kohm?) en plus de l'état 'INPUT_PULLUP' de la pin sur lequel le signal 'z' du mux est envoyé..?

J'ai essayé d'insérer un condensateur comme indiqué sur ce schéma que j'ai trouvé sur ce forum,mais sans résultats.
http://www.hostingpics.net/viewer.php?id=720311Sanstitre1.jpg

En tout cas merci à tous pour vos réponses, j'avance et c'est déjà beaucoup plus clair!

moi je trouve que le chargement du condensateur ralentira significativement le moment où l'intention de l'utilisateur sera effectivement vue depuis le micro

Désolé mais c'est exactement l'inverse.
Avec la solution "code" il faut attendre que la boucle ne détecte plus de changement d'état donc RETARD obligatoire.

Avec la solution matérielle l'information est immédiatement disponible : la décharge du condensateur est quasi instantannée.
Les rebonds ne pourront pas faire changer l'état car le condensateur se recharge à travers la résistance de tirage (Pull-up ou pull-down) qui est supérieure à 10 kohms --> constante de temps de charge très longue devant la durée des rebonds.

68tjs:
Désolé mais c'est exactement l'inverse.
Avec la solution "code" il faut attendre que la boucle ne détecte plus de changement d'état donc RETARD obligatoire.

Avec la solution matérielle l'information est immédiatement disponible : la décharge du condensateur est quasi instantannée.
Les rebonds ne pourront pas faire changer l'état car le condensateur se recharge à travers la résistance de tirage (Pull-up ou pull-down) qui est supérieure à 10 kohms --> constante de temps de charge très longue devant la durée des rebonds.

Non vous détectez le premier front et ensuite vous ne tenez compte d'aucun autre signal tant qu'un certain temps ne s'est pas passé, donc vous avez le signal immédiatement, pas besoin d'attendre la stabilisation

c'est le quasi instantané qui à mon avis (jamais vérifié) est plus long que le premier front sans condensateur

Non vous détectez le premier front et ensuite vous ne tenez compte d'aucun autre signal tant qu'un certain temps ne s'est pas passé

Faux dans le principe --> prendre un oscillo et faire la manip

imaginons un bouton + pullup = quand j'appuie sur le bouton je connecte la Pin de l'arduino sur GND, l'arduino reçoit le front descendant, puis ça oscille à cause des rebonds mais mon programme peut les ignorer (il est déjà en train de traiter l'appui du bouton et si je reviens tester c'est uniquement à ce moment que je vérifie qu'un temps suffisamment long s'est écoulé)

Dans le cadre d'un condensateur, il faut le temps de décharge une fois le bouton appuyé pour que le front descendant soit visible sur mon arduino, c'est donc forcément plus lent - même si la décharge est rapide.

pourquoi c'est faux?

Bonjour,

D'accord avec J-M-L.
Avec un filtrage soft (bien conçu) la prise en compte du premier front se fait sans retard (autre que le temps de polling mais qui est aussi valable dans le cas d'un filtrage hard).

Dans le cadre d'un condensateur, il faut le temps de décharge une fois le bouton appuyé pour que le front descendant soit visible sur mon arduino, c'est donc forcément plus lent - même si la décharge est rapide.

pourquoi c'est faux?

Fixons les conditions :
Rien d'original boutons entre la masse et une entrée du micro, résistance de tirage entre l'entrée du bouton et l'alim.

Au départ le système est au repos, la résistance impose le potentiel de l'alim sur l'entrée du micro et le condensateur est chargé.

Quand on appuis sur le bouton on décharge le condensateur quasi instantanément soit en étant court-circuité par les contacts du bouton (quelque milliohms) soit au travers d'une résistance de protection disons de 100 ohms si on est très, très, très prudent. Et 100 ohms c'est du paranoïaque.

Comme il est indiqué dans tous les bons livres d'électronique un paramètre essentiel dans la charge/décharge d'un circuit RC est la constante de temps appelée Tau.
Il existe une propriété remarquable : pour t = Tau le signal a atteint 63 % de sa valeur finale.
Pour t = 5 Tau la charge du condensateur atteint 99,3 % de la valeur finale, qui mathématiquement ne peut être atteinte qu'au bout d'un temps infini.

Cas 1 : Avec le court-circuit franc 100nF/ 10 milliohms la constante de temps Tau = 1ns
Cas 2 : Avec 100 nF et 100 ohms la constante de temps Tau = 10µs.

Appliquons à un micro avr dont le seuil de décision 0 ou 1 est situé vers Vcc/2 soit 2,5V, prenons 2,4V comme pire cas. 63% de 5 V font 3.15V.
Attention point délicat : comme on part d'un point de repos de 5V, pour atteindre 0V on superpose un échelon négatif d'amplitude **-**5V à la tension statique de +5 V.
Nous sommes dans le domaine de l'électronique impulsionnelle.

Donc pour t = TAU la tension vaut Vcc - 0,63*Vcc soit V = 1,85 V et l'avr a déjà basculé dès 2,4V.
Prendre le temps égal à la constante de temps est encore un pire cas supplémentaire.

Avec un court-circuit franc (ce qui au passage est fait dans quasiment toutes les cartes manufacturées que l'on peut trouver) on a une réponse en moins de 1 ns.
Avec la solution ceinture + bretelles + caleçon en zinc (100 ohms en série avec le condensateur) on a une réponse en 10µs soit pour une carte UNO une réponse en 160 périodes horloge.
Et bien sur avec une résistance de sécurité plus raisonnable de 10 ohms réponse en 16 périodes horloge.

Dans l'autre sens au moment du rebond quand les contacts s'ouvrent la résistance de charge est sans commune mesure plus élevée (entre 30k et 70k avec les pull-up internes du micro) donc le condensateur ne peut pas atteindre la valeur fatidique du seuil de décision des entrées du micro.

Combien faut-il de cycles horloge avec la solution logicielle ?
Combien prend rien qu'un seul tour de boucle while ou for ?

Restons cool 0, 16 ou 400 cycles ne changeront rien en comparaison du temps qu'il faut pour appuyer sur un bouton.

On est bien d’accord vous venez de démontrer que C’est donc plus long - pas de beaucoup mais plus long - en tant que Softeux et mathématicien quel que soit le temps de décharge ce sera plus long que sans... dans un ordi qui tournerait en gigahertz on aurait le temps de faire plein de choses...

Cela dit - Dans nos Arduinos et vu qu’il s’agit d’un bouton opéré par un humain ça n’a que peu d’importance et c’est pour cela que j’écrivais

—-
(hum... OK je grossis un peu le trait... allez allez pas de commentaire sur le temps, tout est relatif :)) )
——

C’etait Juste pour entretenir la guerre entre les hardeux et softeux :slight_smile:

(Et vous avez raison la solution soft grille plein de cycles d’horloges coûteux pour déterminer si c’est un rebond ou pas - mais vous avez déclenché au plus près possible de l’impulsion c’est une grande satisfaction intellectuelle :)) )

Bonjour,
L'éternel bataille, cela fait 40 ans que l'on entend la même chose entre les hardeux et softeux. :slight_smile:
Bientôt on ne saura plus le pourquoi de la bataille. :wink:

Tu as raison.
Néanmoins avant de stopper définitivement je voudrais bien que l'on réfléchisse à cette question :

Si la programmation était la solution merveilleuse pourquoi dans les microcontroleurs les fondeurs utilisent des bloc d'électronique numérique pure comme pour la liaison série, les timers, le SPI, etc...
Bizare non !
Un peu de raison et moins de mauvaise foi.

Re,

68tjs:
Un peu de raison et moins de mauvaise foi.

Personnellement, j'ai l'intime conviction que les softeux n'ont pas raison.
J'arrête de mettre de la graisse sur les bouteilles d'oxygène.

Si la programmation était la solution merveilleuse pourquoi dans les microcontroleurs les fondeurs utilisent des bloc d'électronique numérique pure comme pour la liaison série, les timers, le SPI, etc...

Ils mettent du soft dans le silicium pour pas que les hardeux le voit :slight_smile:

icare:
Re,Personnellement, j'ai l'intime conviction que les softeux n'ont pas raison.
J'arrête de mettre de la graisse sur les bouteilles d'oxygène.

T'a parfaitement raison Icare
surtout lorsqu'il s'agit de remplir des blocs

icare:
Re,Personnellement, j'ai l'intime conviction que les softeux n'ont pas raison.
J'arrête de mettre de la graisse sur les bouteilles d'oxygène.

Principe basique , surtout si tu fais la plongée sous "NITROX"