Général Interruption bounce esp32 et telemecanique

  • Auteur de la discussion vibram
  • Date de début
V

vibram

Compagnon
Salut,

Je fais une bidouille avec un micro contrôler ESP32 qui a des résistance de tirage interne (input pull-up)
Malgré ces résistances de tirage, j'ai d'énormes soucis de bounce lorsque je tourne mes boutons telemecaniques.
Avez-vous déjà eu ce souci ?
J'utilise également un debounce logiciel mais malgré cela c'est loin d'être parfait.
Jai paramètré l'interruption a chaque changement (change) car je souhaite interrompre à la montée et à la descente

Avez vous déjà rencontré ce genre de souci avec ces microcontroller ?

Je les aime beaucoup mais j'avoue que c'est très pénalisant dans mon cas.

Un debounce matériel est-il obligatoire ?
Car je remarque quil y a aussi des ratés sur la lecture de la valeur de la pin

Merci
 
P

petit_lulu

Compagnon
s'ils ont été utilisés, c'est normal qu'il y ai plus de rebond.
tout comme la longueur de cable entre l'ESP et les boutons (parasites)
perso j'ai un automate chez moi avec des inters muraux et même a 12ms de filtrage, quelque fois j'ai encore des rebonds.
met une résistance de pull-up de plus faible valeur que celle de l'ESP (qui doit etre de plusieurs Kohm) pour limiter l'influence des parasites et un condensateur de 100nF (ou plus) entre l'entrée et la masse.
ça retarde un peut le signal mais réduit les rebonds.
 
V

vibram

Compagnon
Donc je configure l ESP en input standard et je fais moi même le tirage c'est juste ?

Jai vraiment besoin que le résultat soit propre sachant que effectivement il y a pas mal de parasites.

Ou alors je mets un bounce très important comme ce sont des boutons vraiment basique, je peux me permettre d'avoir 1 seconde par exemple...
Mais effectivement faut peut être que je rajoute une capa en plus.

Je peux mettre une capa en plus du tirage interne pour essayer en l'état ?

Solution 2:
J'hésite à changer de stratégie et de mettre une lecture dans le loop pour m assurer d'avoir le bon état sur le bouton...
 
P

petit_lulu

Compagnon
Donc je configure l ESP en input standard et je fais moi même le tirage c'est juste ?
oui, c'est bien ca.
Jai vraiment besoin que le résultat soit propre sachant que effectivement il y a pas mal de parasites.

Ou alors je mets un bounce très important comme ce sont des boutons vraiment basique, je peux me permettre d'avoir 1 seconde par exemple...
Mais effectivement faut peut être que je rajoute une capa en plus.

Je peux mettre une capa en plus du tirage interne pour essayer en l'état ?
tu peux essayer avec la pull-up interne et une capa de 10 a 100nF vers le 0V
Solution 2:
J'hésite à changer de stratégie et de mettre une lecture dans le loop pour m assurer d'avoir le bon état sur le bouton...
si le loop est calibré en temps de passage (ça m’étonnerai) alors oui.

sinon tu utilise un timer a 5 ou 10ms par exemple, a chaque déclenchement du timer tu va lire l’état de l'entrée et tu l'enregistre dans un registre FIFO de 3 bits par exemple.
a la fin, si les 3 cases sont a 1 alors ton entrée est considéré a 1 et si les 3 sont a 0, l'entrée est considéré a 0.
plus tu va augmenter le nombres de bits dans le FIFO, plus le filtrage va être efficace...ici a 10ms de lecture, ça te fais 30ms de retard.
ne pas oublier toujours ce condensateur bien sur.

pour avoir une idée du filtrage avec la resistance et le condensateur, tu multiplie les 2 valeurs.

par exemple 10K*100nF=1ms environ.

EDIT:
pour faire un registre FIFO, tu peux faire avec un octet ou un mot et un decalage et un masque pour ne garder que les xx bits du registre que tu as besoin.
 
V

vibram

Compagnon
Salut

Jai un doute sur mon branchement de capa
Jai mis une photo.
Initialement j'ai ce schéma, et j'ai voulais mettre la capa à la place de la branche verticale. J'ai testé comme ça mais j'ai plus aucune interruption de détectée. Pourtant c'est une petite capa

IMG_20231204_095021.jpg


IMG_20231204_095253.jpg
 
S

speedjf37

Compagnon
Bonjour.

Pour un projet Arduino Mega2560 avec boutons et encodeur ,j'ai utilisé 2 librairies.
Soit j'avais des loupés avec l'encodeur , soit le Switch était très lent.

#define SIMPLE_ROTARY_H

#ifdef SIMPLE_ROTARY_H
// Include the SimpleRotary library found here :https://github.com/mprograms/SimpleRotary
#include <SimpleRotary.h>
// Pin A, Pin B, Button Pin pas assez rapide 46 pin de détournement inutilisée
SimpleRotary rotary(5,4,46);

// Include the Bounce2 library found here : https://github.com/thomasfredericks/Bounce2
#include <Bounce2.h>
Bounce debouncer1_UP_Rouge = Bounce(); // Instantiate Bounce objects
Bounce debouncer2_DOWN_NOIR = Bounce();
Bounce debouncer3_SEL_VERT = Bounce();
//#ifndef SIMPLE_ROTARY_H trop lent
Bounce debouncer4_ENCODER = Bounce();
//#endif


Cordialement JF
 
Dernière édition:
V

vibram

Compagnon
Bonjour.

Pour un projet Arduino Mega2560 avec boutons et encodeur ,j'ai utilisé 2 librairies.
Soit j'avais des loupés avec l'encodeur , soit le Switch était très lent.

lib boutons
et tu avais utilisé les interruptions avec?
 
S

speedjf37

Compagnon
et tu avais utilisé les interruptions avec?
Je ne crois pas , il faut regarder dans les lib .

Mais en combinaison avec DCC EX (version de locoduino) qui utilise les int pour genérer le DCC ça ne perturbe pas

PS) j'ai complété ma réponse au dessus #6

JF
 
V

vibram

Compagnon
Merci, j'ai fait quelques tests et j'ai fini par abandonner l'interrupt sur les boutons type telemecanique et utilisé la lib bounce2 qui va très bien.
Je garde l'interrupt sur le codeur rotatif qui lui n'avait pas de souci de bounce etrangement
 
P

petit_lulu

Compagnon
content que tu y soit arrivé.
sinon pour le branchement c'est comme ça:
Capture.JPG

le contact du bouton a gauche décharge le condensateur et "tire" l'entrée du µC a 0V
lorsque le contact est ouvert, la resistance de pull-up recharge le condensateur et la tension remonte petit a petit a l'entrée du µC.
lors des rebonds, la fermeture du contact vide a chaque fois le condensateur avant qu'il ne soit charger.
 

Sujets similaires

Haut