Arduino Forum

International => Français => Topic started by: loo on Mar 04, 2018, 12:37 pm

Title: Anti rebond pour multiplexeur
Post by: loo on Mar 04, 2018, 12:37 pm
Bonjour à tous et à toutes!

Dans l'idée de me fabriquer un controlleur midi avec un arduino nano, je cherche à pouvoir modifier la

note crée par mes boutons grace à un switch 3 broches/3positions: SPDT.

Ces boutons sont reliés à un multiplexeur 74HC4051.

Le probléme est que l'activation de mes boutons déclenche plusieurs notes d'affilée. J'imagine donc que

c'est un problème de rebonds..

Je suis vraiment une bille en code et ait récupéré celui d'un totoriel, mais je vois bien que la fonction

INPUT_PULLUP est activée pour l'entrée du multiplexeur...

Comment puis-je procéder...?

Je vous joins un petit schéma pour plus de clarté.

merci d'avance!

(et un gros +1000 pour ce forum!!)


Title: Re: Anti rebond pour multiplexeur
Post by: J-M-L on Mar 04, 2018, 12:55 pm
Bonjour et bienvenue sur le forum

Plutôt que (EDIT) juste le schema du montage, postez (EDIT) aussi un bout de code que vous avez écrit. (EDIT) l'un ne va pas sans l'autre

Commencez par faire simple. écrivez un bout de code qui affiche dans la console les changements d'états de votre switch 3 broches.

écrivez un bout de code sur le même principe pour gérer les boutons. il y a 200,000 tutos sur le "bounce" des boutons (y compris des Librairies (https://playground.arduino.cc/Code/Bounce) documentées sur le forum  ou encore celle ci que je trouve sympa pour les machines à états simples la librairie OneButton (https://github.com/mathertel/OneButton))

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 - étendez votre code pour que si le switch est en position 1, alors les boutons affichent A et B, si le switch est en position 2, alors les boutons affichent C et D et si le switch est en position 3 alors les boutons affichent E et F (par exemple)


Pourquoi comptez vous utiliser un 74HC4051?

pour documentation - votre schéma
(http://forum.arduino.cc/index.php?action=dlattach;topic=532975.0;attach=247942)
Title: Re: Anti rebond pour multiplexeur
Post by: loo on Mar 04, 2018, 01:49 pm
Merci pour la réponse et l'accueil!

Pour tout dire, mon niveau de programmation tend malheureusement vers le néant...Rien que faire afficher ce changement d'état resque compliqué :D

Mais j'imagine qu'il n'est pas simple d'analyser le problème sans la partie progra..Je vais explorer les tuto sur le "bounce" des boutons, et complèterai ce post pour que ça soit plus clair..

Je souhaite utiliser le multiplexeur pour multiplier le nombre de boutons de mon projet...!

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?)

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...

Title: Re: Anti rebond pour multiplexeur
Post by: J-M-L on Mar 04, 2018, 03:10 pm
si vous commencez par la base je vous suggère d'explorer les tutos d'eskimon (http://eskimon.fr/category/arduino/partie-1). 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

Quote
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 :)

Quote
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
Title: Re: Anti rebond pour multiplexeur
Post by: loo on Mar 04, 2018, 03:31 pm
"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 :)

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

"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



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.
Title: Re: Anti rebond pour multiplexeur
Post by: J-M-L on Mar 04, 2018, 04:17 pm
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 (https://learn.sparkfun.com/tutorials/multiplexer-breakout-hookup-guide#74hc4051-breakout-overview)

en gros la carte (montée) ressemble à cela
(https://cdn.sparkfun.com/assets/learn_tutorials/5/5/3/breakout-top-rotated.jpg)


vous avez 8 pins en bas notées Y0 à Y7 et en fonction des valeurs envoyées sur S0-S1-S2 en haut vous définissez quelle pin Yx 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 0, vous dites de connecter Y0 à Z et si vous mettez 101 sur S2-S1-S0, soit l'adresse 5, vous dites de connecter Y5 à Z

En fixant l'adresse x votre Arduino peut lire depuis la pin Z l'état de la pin Yx. 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)

Title: Re: Anti rebond pour multiplexeur
Post by: loo on Mar 04, 2018, 05:20 pm
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.



Title: Re: Anti rebond pour multiplexeur
Post by: _pepe_ on Mar 04, 2018, 05:26 pm
Supprimé
Title: Re: Anti rebond pour multiplexeur
Post by: _pepe_ on Mar 04, 2018, 05:41 pm
Supprimé
Title: Re: Anti rebond pour multiplexeur
Post by: _pepe_ on Mar 04, 2018, 05:49 pm
Supprimé
Title: Re: Anti rebond pour multiplexeur
Post by: 68tjs on Mar 04, 2018, 06:21 pm
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 .
Title: Re: Anti rebond pour multiplexeur
Post by: J-M-L on Mar 04, 2018, 06:38 pm
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


Quote
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 :)
Title: Re: Anti rebond pour multiplexeur
Post by: loo on Mar 04, 2018, 06:52 pm
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!

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 (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!



Title: Re: Anti rebond pour multiplexeur
Post by: 68tjs on Mar 04, 2018, 07:00 pm
Quote
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.
Title: Re: Anti rebond pour multiplexeur
Post by: J-M-L on Mar 04, 2018, 07:07 pm
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
Title: Re: Anti rebond pour multiplexeur
Post by: 68tjs on Mar 04, 2018, 07:16 pm
Quote
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

Title: Re: Anti rebond pour multiplexeur
Post by: J-M-L on Mar 04, 2018, 07:34 pm
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?
Title: Re: Anti rebond pour multiplexeur
Post by: kamill on Mar 04, 2018, 09:18 pm
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).
Title: Re: Anti rebond pour multiplexeur
Post by: 68tjs on Mar 04, 2018, 09:55 pm
Quote
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.
Title: Re: Anti rebond pour multiplexeur
Post by: J-M-L on Mar 04, 2018, 10:30 pm
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 :)

(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 :)) )
Title: Re: Anti rebond pour multiplexeur
Post by: icare on Mar 04, 2018, 10:49 pm
Bonjour,
L'éternel bataille, cela fait 40 ans que l'on entend la même chose entre les hardeux et softeux. :)
Bientôt on ne saura plus le pourquoi de la bataille. ;)
Title: Re: Anti rebond pour multiplexeur
Post by: 68tjs on Mar 04, 2018, 11:08 pm
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.
Title: Re: Anti rebond pour multiplexeur
Post by: icare on Mar 04, 2018, 11:15 pm
Re,
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.
Title: Re: Anti rebond pour multiplexeur
Post by: J-M-L on Mar 04, 2018, 11:25 pm
Quote
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 :)
Title: Re: Anti rebond pour multiplexeur
Post by: Artouste on Mar 04, 2018, 11:27 pm
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.
8)
T'a parfaitement raison Icare
surtout lorsqu'il s'agit de remplir  des blocs
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.
8)
Principe basique , surtout  si tu fais la plongée sous "NITROX"
Title: Re: Anti rebond pour multiplexeur
Post by: _pepe_ on Mar 05, 2018, 02:47 am
Supprimé