Go Down

Topic: Anti rebond pour multiplexeur (Read 1 time) previous topic - next topic

loo

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



J-M-L

#1
Mar 04, 2018, 12:55 pm Last Edit: Mar 04, 2018, 06:41 pm by J-M-L
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 documentées sur le forum  ou encore celle ci que je trouve sympa pour les machines à états simples la librairie 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

Hello - Please do not PM me for help,  others will benefit as well if you post your question publicly on the forums.
Bonjour Pas de messages privés SVP, postez dans le forum directement pour que ça profite à tous

loo

#2
Mar 04, 2018, 01:49 pm Last Edit: Mar 04, 2018, 02:11 pm by loo
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...


J-M-L

#3
Mar 04, 2018, 03:10 pm Last Edit: Mar 04, 2018, 03:13 pm by J-M-L
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

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
Hello - Please do not PM me for help,  others will benefit as well if you post your question publicly on the forums.
Bonjour Pas de messages privés SVP, postez dans le forum directement pour que ça profite à tous

loo

#4
Mar 04, 2018, 03:31 pm Last Edit: Mar 04, 2018, 03:43 pm by 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?)"
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.

J-M-L

#5
Mar 04, 2018, 04:17 pm Last Edit: Mar 04, 2018, 04:19 pm by J-M-L
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 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)

Hello - Please do not PM me for help,  others will benefit as well if you post your question publicly on the forums.
Bonjour Pas de messages privés SVP, postez dans le forum directement pour que ça profite à tous

loo

#6
Mar 04, 2018, 05:20 pm Last Edit: Mar 04, 2018, 05:33 pm by loo
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.




_pepe_

#7
Mar 04, 2018, 05:26 pm Last Edit: Aug 19, 2018, 03:15 am by _pepe_
Supprimé

_pepe_

#8
Mar 04, 2018, 05:41 pm Last Edit: Aug 19, 2018, 03:15 am by _pepe_
Supprimé

_pepe_

#9
Mar 04, 2018, 05:49 pm Last Edit: Aug 19, 2018, 03:15 am by _pepe_
Supprimé

68tjs

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 .

J-M-L

#11
Mar 04, 2018, 06:38 pm Last Edit: Mar 04, 2018, 06:45 pm by J-M-L
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 :)
Hello - Please do not PM me for help,  others will benefit as well if you post your question publicly on the forums.
Bonjour Pas de messages privés SVP, postez dans le forum directement pour que ça profite à tous

loo

#12
Mar 04, 2018, 06:52 pm Last Edit: Mar 04, 2018, 09:02 pm by loo
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

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




68tjs

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.

J-M-L

#14
Mar 04, 2018, 07:07 pm Last Edit: Mar 04, 2018, 07:11 pm by J-M-L
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
Hello - Please do not PM me for help,  others will benefit as well if you post your question publicly on the forums.
Bonjour Pas de messages privés SVP, postez dans le forum directement pour que ça profite à tous

Go Up