Des rebonds et des pattes en l'air
le 01 février 2014,Cet article au titre étrange fait suite à une discussion que j’ai eu avec un collègue qui fait ses premiers pas dans l’électronique moderne (j’entends par là Arduino, Raspberry Pi, etc.). Je me suis rendu compte que bon nombre de tutoriaux pourtant axés débutants faisaient l’impasse sur deux points cruciaux : les résistances de tirage (pull-up et pull-down) et les anti-rebonds.
Je vais donc tenter de revenir sur ces deux points en vous démontrant l’utilité de ces deux choses.
Les résistances de tirage
Le problème
Un nom barbare pour finalement pas grand chose, rassurez-vous. Il s’agit là d’un problème qui revient souvent sur les forums sous la forme suivante :
Je souhaite allumer une LED depuis mon Arduino quand j’appuie sur un bouton poussoir, mais ma LED n’en fait qu’à sa tête et s’allume même quand je n’appuie pas.
Le schéma type ressemble souvent à ça :
Quelqu’un qui n’a jamais été confronté au problème se dira surement que tout doit fonctionner, et pourtant on est loin du compte ! On peut facilement mettre le problème en évidence en affichant le nombre d’appui sur le bouton poussoir :
La cause de ce qui ce jour là s’apparentait aux yeux de mon collègue à un défaut ou à la mauvaise qualité du Raspberry Pi est pourtant connue et indépendante du matériel.
Cela est dû au fait que lorsque le boutton n’est pas appuyé, la broche de l’Arduino à laquelle il est connecté est “en l’air”. Or, une patte “en l’air” n’est pas à la masse ! Elle joue ici le rôle d’antenne, et elle ramasse toutes les perturbations électromagnétiques présentes dans l’air. Le niveau logique présent sur l’entrée de l’Arduino est donc indeterminé. D’ailleurs, si l’on vient mettre la sonde d’un oscilloscope sur ladite broche et qu’on zoome un tant soit peu, on s’en apperçoit assez rapidement :
Eh oui, on a tout sauf un 0v propre. Le microcontrôleur interprête “bêtement” ce signal comme une suite d’appuis sur le boutton poussoir.
La solution
La solution à ce problème consiste à forcer la broche du microcontrôleur à un niveau logique bas. Pour cela, une simple résistance mise à la masse suffit :
Ainsi, le problème disparaît :
Les rebonds
Pour être franc, j’ai triché dans la dernière vidéo en éliminant le problème des rebonds. En effet, on a vu qu’un appui provoquait un incrément. Dans la réalité, ça se passe rarement comme ça. Voyez plutôt :
Comme vous pouvez le constater, un appui provoque souvent plusieurs incréments. Ce phénomène est dû à la façon dont fonctionne le bouton. Je m’explique.
Un bouton poussoir peut être vu de la sorte :
Le contact A-B est alors effectué quand l’élement du haut les touches. Or, l’élément du haut à tendance à rebondir sur les parties A et B avant de se stabiliser. On obtient donc une suite de circuit ouvert / circuit fermé ; ce que le microcontrôleur inteprète comme un enchainement d’appuis.
Les solutions
Encore une fois, des solutions existent pour supprimer ces perturbations. Une d’entre elles consiste à placer un condensateur aux bornes du bouton poussoir. Ce dernier va alors absorber les rebonds.
À l’ancienne
Le schéma ressemblera à ça :
Pour ceux que ça interesse, voilà pourquoi le condensateur élimine les rebonds :
- Boutton non appuyé :
- Le condensateur se charge à travers R,
- Une fois le condensateur totalement chargé, il est équivalent (en régime continu) à un circuit ouvert.
- Boutton appuyé :
- Le condensateur est court-circuité et se décharge très rapidement,
- Les rebonds n’étant que très brefs, le condensateur n’aura pas le temps de se recharger. Il est donc équivalent (toujours en régime continu) à un circuit fermé.
Voici ce que ça donne en pratique :
Côté code
Il est également possible d’éliminer les rebonds côté code. Il suffira alors d’imposer un délai entre deux appuis pour que le ceux-ci soient pris en compte. Ainsi, tant qu’un délai t n’est pas passé, les appuis ne sont pas pris en compte.
En conclusion
Voici trois solutions simples à deux problèmes courants. Gardez bien ces schémas en tête, vous pouvez être certain d’y être un jour confronté si vous touchez aux Arduinos à vos heures perdues !
C’est terminé pour cet article. J’espère avoir répondu à certains d’entre vous. Je me ferai un plaisir de discuter avec vous dans les commentaires, ou sur Twitter.
À très bientôt !