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 :


Schéma sans pull-down

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 :


Perturbations vues à l'oscilloscope
Désolé pour la qualité, mon oscilloscope doit avoir mon âge.

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 :


Schéma avec pull-down

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 :


Schéma aoutton poussoir

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 :


Schéma avec condensateur anti-rebonds

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 !