Bouton poussoir sur Arduino

Bonsoir, j'expose mon problème ici aussi, si quelqu'un à la solution c'est bon a prendre !

Pour commencer, je me suis fait un shield bouton, comme suit : Le bouton de gauche fonctionne au poil, mais fait crisser des dents sur les forums électroniques... Le bouton de droite auquel j'ai enlevé le condensateur rebondis de façon très très marqué une fois dépourvu de son condo !

J'ai donc effectué le même montage sur la platine de test, et idem, ça rebondis !

Donc je me retrouve avec un shield imprimé dont le bouton switch à chaque appuie, et chaque relâche, ce n'est pas du rebond du coup, mais ça ne va pas :

J'ai donc 5 schémas :

A mes yeux, le schéma 1 et 3 sont identiques, j'ai bon ?

Le 1 rebondis Le 2 fonctionne parfaitement, mais n'est pas bon visiblement Le 3 rebondis Le 4 est celui sur mon shield imprimé (photo en fin de sujet) A mes yeux, le schéma 1 et 3 sont identiques, j'ai bon ? Le 5 est la modification que je pense lui apporté :

et l'original :

Et voilà le shield

Bref, je ne m'en sort pas :/

Bonsoir, C'est normal qu'un bouton rebondisse (c'est de la physique pur). Mettre un condensateur en // avec le bouton est l'une des solutions même si les puristes n'y sont pas favorables. Pour traiter les boutons sans condo en // fait une recherche sur Playground Arduino avec la recherche debounce et tu trouveras la solution. @+

Je vient de faire la modification, ça fonctionne parfaitement, mais qu’est-ce qui fait tiquer dans l’utilisation de condo pour debouncer ?

Je vais chercher ça pour debouncer sans condo et faire des tests sur la beadbord !

icare: Mettre un condensateur en // avec le bouton est l'une des solutions même si les puristes n'y sont pas favorables.

C'est qui les puristes ? Des purs softeux qui sont complètement étrangers à tout ce qui touche au matériel et qui font d'infâmes rustines logicielles parce qu'ils ne connaissent que ça ?

Comment des compagnies comme ATMEL, ST , NXP, FREESCALE qui sont considérées comme sérieuses, enfin il me semble, utiliseraient systématiquement des condensateurs en // sur les contacts de leurs cartes de démonstration à destination des professionnels si ce n'était pas LA solution ? Sans doute vaut-il mieux balader des parasites dans tout le montage plutôt que de les éliminer à la source .

Le seul et unique point délicat que je vois c'est quand les gens mettent les contacts au bout de 20, 50 cm, 1 m de fils. Dans ce cas on supprime bien les rebonds mais à cause de l'inductance des fils on créé un circuit RLC qui s'il n'est pas amorti peut ajouter des oscillations d'origine électrique. Mais le remède est très simple : il faut amortir le circuit avec une résistance série de 10 ou 100 ohms..

Edit : en plus avec la solution logicielle on perd plusieurs millisecondes ou dizaines de millisecondes alors qu'avec la solution matérielle la réponse est immédiate.

Bonsoir, @68tjs : Je suis tout à fait d'accord avec toi. Je viens du hard et hard je resterai mais les hardeux ne sont pas forcément sectaire ou dogmatique alors on évoque les autres solutions possibles.;) @+

68tjs:

icare: Mettre un condensateur en // avec le bouton est l'une des solutions même si les puristes n'y sont pas favorables.

C'est qui les puristes ? Des purs softeux qui sont complètement étrangers à tout ce qui touche au matériel et qui font d'infâmes rustines logicielles parce qu'ils ne connaissent que ça ?

Comment des compagnies comme ATMEL, ST , NXP, FREESCALE qui sont considérées comme sérieuses, enfin il me semble, utiliseraient systématiquement des condensateurs en // sur les contacts de leurs cartes de démonstration à destination des professionnels si ce n'était pas LA solution ? Sans doute vaut-il mieux balader des parasites dans tout le montage plutôt que de les éliminer à la source .

Le seul et unique point délicat que je vois c'est quand les gens mettent les contacts au bout de 20, 50 cm, 1 m de fils. Dans ce cas on supprime bien les rebonds mais à cause de l'inductance des fils on créé un circuit RLC qui s'il n'est pas amorti peut ajouter des oscillations d'origine électrique. Mais le remède est très simple : il faut amortir le circuit avec une résistance série de 10 ou 100 ohms..

Edit : en plus avec la solution logicielle on perd plusieurs millisecondes ou dizaines de millisecondes alors qu'avec la solution matérielle la réponse est immédiate.

Je ne pense pas, mais la personne craint que le bouton et le condo ne soit traverser par trop de courant, j'ai probablement oublier de lui préciser que c'était du 5v qui était transporter, et que par là il craint une usure prématuré des composants, il n'est visiblement pas "pur softeux" mais à une conception très droite de l'électronique (et ce n'est pas une critique, loin s'en faut)

Re,

Bizounours: Je ne pense pas, mais la personne craint que le bouton et le condo ne soit traverser par trop de courant, j'ai probablement oublier de lui préciser que c'était du 5v qui était transporter, et que par là il craint une usure prématuré des composants, il n'est visiblement pas "pur softeux" mais à une conception très droite de l'électronique (et ce n'est pas une critique, loin s'en faut)

La tension de 5V n'a rien à voir, dans [u]un cas extrême[/u] une tension de 5V qui alimente une résistance de 1 milli-ohms donne 5000 A. Si tu as une crainte (non justifié dans ce cas) tu peux mettre une résistance de 10 ohms en série avec ton condensateur. @+

icare: Re,

Bizounours: Je ne pense pas, mais la personne craint que le bouton et le condo ne soit traverser par trop de courant, j'ai probablement oublier de lui préciser que c'était du 5v qui était transporter, et que par là il craint une usure prématuré des composants, il n'est visiblement pas "pur softeux" mais à une conception très droite de l'électronique (et ce n'est pas une critique, loin s'en faut)

La tension de 5V n'a rien à voir, dans [u]un cas extrême[/u] une tension de 5V qui alimente une résistance de 1 milli-ohms donne 5000 A. Si tu as une crainte (non justifié dans ce cas) tu peux mettre une résistance de 10 ohms en série avec ton condensateur. @+

Faut de la grosse résistance là :grin: Ils en vendent de 25 000 W chez Conrad ? 8)

il craint une usure prématuré des composants,

Dans ce cas on commence par ne pas acheter du matériel chinois. On va voir du coté de sociétés comme Crouzet ou Siemens , idem pour le condensateur on va voir du coté de chez Vishay, EuroFarad ou Avx, mais ce ne sera pas le même prix.

Ensuite qu’est-ce qui peut user un contact : c’est l’arc qui se forme à la coupure. Il faut rester raisonnable avec 5 V l’arc est peu actif. De plus il n’y a qu’un arc : à la première coupure puisque ensuite le condo maintient la tension proche de 0V. Alors que sans condensateur il y en aura une bonne dizaine.
Cela se traduit comment : le traitement des surfaces en contact se détériore. Mais cela donnera quoi ? Neuf on aura quelques milliohms, “usagé au bout de 5 ans” on aura des dixièmes d’ohms. Eh alors par rapport à la résistance en série de 10 kohms cela fera quoi ?

Pour le condensateur tu peux faire comme Icare te l’a proposé mais un condensateur n’est pas parfait et possède toujours une résistance parasite en série (de quelques milliohms à quelques ohms selon le modèle) plus une inductance (interne au condo + celle des connections).
Donc comme il y a de l’inductance le courant NE PEUT PAS s’établir instantanément ni atteindre la valeur maximale théorique U/R.
Je joins le schéma équivalent d’un condensateur REEL.
Comme quoi il ne faut pas être trop théorique et avoir les pieds au niveau du sol, surtout que ce bouton il sera pressé combien de fois ?

condo_schema_equi.jpg

Gnarf, gnarf, gnarf … en voici un débat passionné !
Condensateur or not condensateur ?

Il n’y a pas de souffreteux, de solution miracle, de panacée. Tout n’est que compromis.

L’anti-rebonds n’est qu’une difficulté technique dont on peut proposer globalement deux solutions :
Solution matérielle :
Le condensateur mis en parallèle sur les grains du contact.
Quelle valeur adopter ?
Plus le contact est de réalisation médiocre, plus il va mettre du temps à se stabiliser. Plus il faut une valeur élevée de la capacité pour engranger assez d’énergie pour « tenir la durée ». C’est un cercle vicieux, car l’intensité qui traverse le contact va aller de compagnie. Chaque étincelle dégrade les grains. C’est la raison pour laquelle les “attentifs” à la fiabilité du matériel ne sont pas favorables à cette solution. Si le clavier comporte 16 boutons, c’est 16 condensateurs qu’il faut ajouter au circuit imprimé, d’où le coût et la place qui en résultent. Pour un « bricoleur du Dimanche » c’est une solution acceptable, mais pour un produit qui sera réalisé en grande série et dont la fiabilité doit dépasser « la garantie », l’utilisation des condensateurs est bien moins séduisante.
Ajouter une résistance en série avec le condensateur va limiter l’étincelage, donc le « charbonage » des grains du contact. Oui … mais quelle valeur adopter ? On double le nombre de composants et si l’on choisit 10 ohms parce que cette valeur nous séduit, c’est un argument plus « politique que scientifique ». En résumé, le condensateur est une solution « facile », qui simplifie la programmation, mais qui va à l’encontre de la fiabilité et de l’encombrement.
NOTE : Contrairement à ce que j’ai lu plus avant, le condensateur ne va pas réduire le temps de lecture de l’entrée du µP. En effet, il faut attendre dans tous les cas que le contact soit stabilisé, surtout si l’on procède par interruptions. On est donc amené à temporiser d’une durée qui correspont à la durée statistique de stabilisation du contact adopté.
OUPS ! Combien de temps met mon bouton poussoir à se calmer ?
Ben facile, il suffit de créer un programme d’analyse des rebonds, on ajoute une marge de 20% et on peut considérer que la temporisation adoptée est fiable. OUAIS … mais alors que devient la simplicité d’élaboration du programme ?
Solution logicielle :
Une procédure spécifique pour lire une entrée dont le n° de la broche d’E/S est passée en paramètre. L’anti rebond consiste à analyser l’entrée lue jusqu’à ce que son état ne change plus. On est amené à définir la durée du « NE CHANGE PLUS ». Par exemple 500µS sont en général très suffisantes. Cette technique va consommer environ 50 octets en assembleur, peut être le double avec le compilateur. Mais elle présente l’avantage de gagner en fiabilité matérielle, en économie de composants et surtout elle minimise le temps qui sera consumé par le programme pour traiter l’enfoncement et (ou) le relâcher d’un bouton poussoir, le changement d’état d’un inverseur ou de position sur un commutateur.
Logiciel ou matériel … À chacun sa religion. Dans tous les cas ce sera une bonne solution, puisqu’elle correspondra à la priorité que vous accordez dans vos choix.

Bonjour, Bien résumé.

nulentout: OUPS ! Combien de temps met mon bouton poussoir à se calmer ?

Un certain temps mon Adjudant :)

nulentout: NOTE : Contrairement à ce que j’ai lu plus avant, le condensateur ne va pas réduire le temps de lecture de l’entrée du µP. En effet, il faut attendre dans tous les cas que le contact soit stabilisé, surtout si l’on procède par interruptions. On est donc amené à temporiser d’une durée qui correspont à la durée statistique de stabilisation du contact adopté. OUPS ! Combien de temps met mon bouton poussoir à se calmer ?

Si tu as des doutes prend un SPICE quelconque et fait une simulation ! On part d'un contact OUVERT (1logique) qu'on FERME (0Logique). Tu verra que le condensateur qui était chargé avant l'appui se décharge instantanément au travers d'une résistance et d'une INDUCTANCE très faibles mais qui interdit une tangente verticale et impose une tangente horizontale---> un fil rectiligne en l'air c'est 10nH/cm, s'il fait une boucle cela peut faire énormément plus ! Quand le contact s'ouvre du fait des rebonds le condensateur se recharge à travers 10K ou 60 Kohms --> comme l'ouverture c'est quelques millisecondes la tension au bornes du contact ne peut pas dépasser quelques centaines de mV donc cela reste un 0Logique--> donc la réponse est immédiate et il n'y a besoin d'aucune temporisation. Et pas la peine de se prendre la tête avec la valeur du condensateur : comme les phénomènes mécaniques sont les mêmes pour des petit boutons poussoir tout le monde prend 100 nF parce que c'est une valeur excessivement courante et passe-partout et que du coup elle est très bon marché --> les façonniers l'achètent par sac de 100kg.

Bonjour les copains,
Je sais parfaitement qu’utiliser un condensateur de 0,1µF pour s’affranchir des faux rebonds dans un programme “lent” va résoudre le problème. Faisons une expérience simple :

  • Une résistance de 10k Ohms relie l’entrée numérique D3 au +5Vcc.
  • Un condensateur de 0,1µF est placé entre cette entrée et la masse.
  • Un bouton poussoir de qualité peut forcer un état “0” entre D3 et la masse.
    Un programme qui détecte le front descendant, qui incrémente un compteur, qui attend l’état “1”, puis qui visualise la valeur du compteur va se comporter normalement. Chaque fois que l’on appui sur le B.P. la valeur du compteur va augmenter de un.
    Mais toutes ces instructions prennent du temps, le programme est “lent” et les faux rebonds passent à la trappe.

Si le bouton poussoir est traité par interruptions, y compris avec ce condensateur de “forte valeur” qui va sur le moyen terme charbonner les grains du contact électrique, il y aura des comptages erronés.
Pour le visualiser, réalisez le petit montage décrit dans les trois lignes ci-avant.
Téléchargez ce petit programme sur votre Arduino :

/*  Tester les contacts d'un bouton poussoir. */

/* Ce petit programme affiche en boucle la valeur d'un compteur
   qui est incrémenté chaque fois que l'on active un B.P.
   La détection de l'activation est effectuée par interruption. */

// Entrée binaire D3 utilisée pour déclencher l'interruption.
volatile int COMPTEUR = 0;
int Visualiser = 0;

#define LED_Arduino 13
// variables du programme.
boolean LEDeteinte;

void setup() {Serial.begin(115200); pinMode(LED_Arduino, OUTPUT);
  attachInterrupt(1, Procedure_Interruption, FALLING); }
  // L’interruption se déclenche sur front descendant de D3.}

void loop(){
  /* faire clignoter la LED sur sortie 13 */
  if (LEDeteinte) {digitalWrite(LED_Arduino, HIGH);}
     else {digitalWrite(LED_Arduino, LOW);}
  LEDeteinte = 1-LEDeteinte; delay(100);
  /* Visualiser la valeur du compteur */
  Serial.print("Nombre de comptages = "); Serial.println(COMPTEUR); }
      
void Procedure_Interruption() {COMPTEUR++;}

La boucle de base se contente de faire clignoter la LED 13. Elle passe surtout son temps dans la temporisation du clignotement. La routine d’interruption incrémente la valeur d’un compteur chaque fois qu’un front descendant est détecté. Normalement on devrait avoir un comptage unique à chaque appui sur le B.P.
Pour ma part j’ai utilisé un bouton poussoir de qualité qui rebondit environ 7 fois statistiquement. (Mesuré avec un compteur numérique rapide en technologie TTL) Notez que certains B.P. de qualité médiocre peuvent avoir jusqu’à 130 à 150 rebonds avant de se stabiliser ! Donc, tous ces composants du commerce ne sont absolument pas équivalents. Il faut les “mesurer” pour s’en rendre compte.

Et bien vous allez constater que parfois il y a double ou triple contacts pris en compte.
Je persiste à croire que placer un condensateur d’aussi forte valeur ne va pas dans le sens de la fiabilité. Personnellement, je préfère placer une petite temporisation calibrée judicieusement dans la routine d’interruption. Elle ne coûte que quelques octets et prend moins de temps que souder un condensateur sur le circuit imprimé. Et surtout, elle ménage la longévité du bouton poussoir quel que soit la qualité de ce dernier.