comment détecter un front ?

Rebonjour à tous,

Ca doit être assez courant comme pratique, mais j'ai encore du mal à me repérer dans la doc arduino, ou alors il s'agit d'un montage électronique à faire, ce qui du coup m'échappe donc certainement. Je cherche à détecter un front (montant) par l'Arduino, pour deux utilisations bien particulières : 1) l'utilisation d'un relais ILS pour compter des tours, c'est le cas le "plus simple" car je peux réutiliser les 5V de l'Arduino pour les faire passer par l'ILS ; 2) l'acquisition d'un signal bruité, pour détecter le moment où se produit l'étincelle d'une bougie dans un moteur à combustion d'une automobile (4cylindres).

Dans le cas 1) si je câble mon ILS avec une résistance sur le 5V j'obtiens le même effet qu'un bouton poussoir, mais en tant que compte-tours, vu que le moment pendant lequel l'ILS va être fermé sera très court (un pic), comment le détecter avec l'Arduino ?? Une fois le cas 1) compris, je pense que pour le cas 2) il y a certainement un montage "filtrant" à faire, mais je ne sais pas comment...

bonjour il n'y a pas de reponse unique à cette question (arduino ou autre ) :grin: fais une recherche avec "arduino debouncing" et tu aura déjà du "grain à moudre" :sunglasses:

ah ? on ne peut donc pas configurer un port comme un "compteur" qui compterait le nombre d'impulsions reçues ? :/ Je vais faire des recherches... merci pour les mots clé Artouste !

après une rapide recherche, je cherchais le "attachInterrupt()" en fin de compte. Après, le problème du "filtrage en amont" reste tout entier, quelque soit le montage (1 ou 2). Je préfèrerais faire du debouncing hard que soft pour mes cas d'application...

Merci pour ta réponse pepe !

Concernant l'ILS, c'est pour faire un compteur de vitesse, un peu comme sur les vélos, la fréquence du signal ne dépassera pas les 34Hz (200Km/h). Sinon oui en effet, il faut pallier aux rebonds, et je préfère la solution matérielle, car le filtrage soft est coûteux en CPU de mon point de vue. Cependant ta remarque suscite une petite question : quelle est la fréquence de capture de l'arduino sur ses entrées ? Sinon, je ne demande qu'à faire ce que tu me dis pour éviter les rebonds, mais je ne sais pas faire un filtre "passe-bas" et je n'ai pas la moindre idée de ce qu'un "trigger de Schmitt" peut bien être... J'apprécierais un petit schéma, qui m'aiderait à l'appliquer comme "recette de cuisine" dans un premier temps à condition d'avoir les indications pour dimensionner les éléments à mettre dessus (?).

Concernant le point 2, il s'agit de détecter le "pic" de déclenchement de l'allumage de la bougie (impulsion ?), ca peut se faire soit par induction (en enroulant un simple fil sur le fil HT) soit en le détectant sur l'entrée de la bobine d'allumage. Ce dernier est la méthode utilisée de façon la plus standard sur les vieilles autos. Le problème c'est que le signal est vraiment très parasité et je ne sais pas "filtrer" ce genre de signaux avec mes petites connaissances en électronique... :(

Le filtrage passe bas c'est un condensateur et une résistance, avec une constante de temps adaptée au signal.

Je viens de regarder sur Wikipédia, en effet ca a l’air plutôt simple, mais comment dimensionner R & C dans un filtre passe-bas ?
Comment l’appliquer à mon cas (U=5V, 0<Freq<34Hz) ?

Je suis tombé sur un doc disant que la fréquence de filtrage d'un filtre passe-bas s'exprime comme suit : f = 1 / (2.Pi.R.C)

Sachant que U=5V, j'ai dimensionné R à 470ohm et la fréquence à limiter de 40Hz (coupure). Ca donne un condensateur de 27nF.

Ai-je bon ? ou j'ai loupé quelque chose ?

Bonjour,
beaucoup de bonnes questions, quelques humbles réponses :

concernant 1) je crains que l’ILS s’usera à la longue, une solution non mécanique est préférable

concernant 2) :

  • le filtre rc est à déterminer en fonction de la fréquence des parasites, qu’il faudrait par conséquent connaitre …
  • si une constante rc élevée est utilisée, ce qui peut être le cas ici car < 34Hz, le risque est que les parasites, qui ne sont jamais entièrement éliminés par le filtre, se rendent coupables d’un tas déclenchements intempestifs au voisinage du point de commutation.
    Mais l’AVR est armé contre cela :
    a) hystérésis du port, ou au besoin, selon le niveau des signaux à traiter, utilisation du comparateur “embarqué” avec hystérésis idoine
    b) utilisation de la fonction capture avec mise en oeuvre du filtre digital. Cela dit, le filtrage peut également se faire par le soft, comme dit pepe, la charge de la cpu à cette vitesse est nulle

Non avec les valeurs que tu donnes, cela fait un condensateur de 8.5µF Alors si tu veux une valeur normalisée de condensateur avec la même résistance: 10µF donne une fréquence de coupure de 34Hz et 4.7µF donne 72Hz

ouahou ! beaucoup de réponses, beaucoup d'infos, faut que je compile tout ca dans ma tête ! En tout cas, merci à tous de prendre du temps pour m'expliquer, ca me fait avancer. Pour répondre rapidement :

trimarco232 : . quelle autre solution ai-je pour comptabiliser les tours d'un élément mécanique ? . Le reste de tes explications dépassent un peu mes compétences électroniques actuelles, j'ai du mal à suivre ce que tu essaies de m'expliquer... (désolé... :-[ )

fdufnews : . Peux-tu détailler comment tu fais le calcul ? je ne vois pas où je me suis trompé... J'ai fait un petit test autant avec 0.02µF qu'avec 10µF, en utilisant un bouton poussoir pour simuler l'ILS et ca ne marche pas (l'interruption n'est pas déclenchée). Il doit y avoir encore quelque chose qui m'échappe. Le montage est assez simple pourtant : +5V - Bouton - 470ohm (A) - C10µF - GND avec (A) qui part vers la PIN2/Arduino. Je me câble sur l'interruption 0 dans le code.

pepe : . Filtre logiciel : j'ai déjà essayé par le passé de faire cela, ca finit par marcher, mais pour pouvoir "lisser correctement" ca me rajoute une latence trop importante (jusqu'à 150ms) qui est visible par l'œil humain dans une interface graphique. D'où mon envie, cette fois-ci, d'apprendre à faire un filtre analogique qui tient la route. . Le filtre passe-bas m'a l'air suffisant pour gérer l'ILS, à condition que j'arrive à le dimensionner ; . le trigger de Shmitt a l'air de correspondre tout à fait à ce qu'il me faudrait pour filtrer le signal d'allumage qui est un signal plutôt du genre très pourri... Par contre le schéma que tu me fournis me semble un peu trop simplifié pour mes connaissances car au vu de la fiche technique le trigger de Schmitt a 3 entrées et 1 sortie... :fearful:

La solution logicielle est plus simple, plus souple, moins coûteuse

La solution matérielle = 1 condensateur = 5 centimes ! = 0 delai !

Je cauchemarde quand je vois l'usine à gaz qui est proposée. C'est sur que cela fonctionne. C'est même ceinture plus bretelles plus caleçon en zinc.

Mais : 1) toutes les entrées des avr disposent d'un hystérésis donc un trigger de schmitt externe est inutile.

2) Je n'ai jamais vu professionnellement utiliser de trigger de schmitt "tout fait" sur lesquels on ne peut rien régler. [u]Un simple comparateur LM393 et 4 résistances permet tous les réglages pour 10 fois moins cher[/u].

3) Zorro_X je t'engage à téléchargee le schéma électrique de ta carte arduino et regarder comment est câblé le bouton "Reset". Soit curieux et regarde comment Texas, NXP, ST, Frescale ..etc câblent leurs interrupteurs --> 1 interrupteur,1 condensateur, 1 résistance.

Le schéma proposé veut protéger le condensateur des attaques énormes qu'il subit à chaque appuis avec un courant de court-circuit quasi infini. on se demande même comment il ne part pas en fumée au premier appuis.

Je te propose une solution simple mais si tu préfère l'usine à gaz je ne me vexerais pas du tout.

Tu garde l'interrupteur et la résistance en série (10k) . Par contre tu met le condensateur (100nF) directement en parallèle sur les contacts (comme sur le schéma de ta carte arduino) et puis c'est tout.

Au départ le condensateur est chargé à 5 volts, au court-circuit il se décharge complètement avec un courant qui est limité par les éléments parasites [u]qui sont bien présents même si on ne les voit pas[/u] : la résistance série interne au condensateur, l'inductance interne au condensateur et surtout celle qui est apportée par les fils de câblage. Dès qu'il y a de l'inductance le courant ne peut pas changer instantanément donc le courant "théorique maximal" qui pourrait atteindre plusieurs ampères ne peut jamais être atteint, c'est de la physique à raz des paquerettes mais c'est cela reste de la physique.

Au premier rebond le contact s'ouvre et le condensateur va se recharger mais au travers de la résistance de 10 k donc très lentement: la tension a ses bornes ne pourra jamais atteindre la valeur du seuil de commutation de l'entrée de l'avr. Le temps d'ouverture est très court le contact se rétabli et le condensateur est de nouveau complètement déchargé.

Ce qu'il faut retenir de cette solution c'est le signal utile pour ton programme est disponible immédiatement dès l'appuis sans aucun délai.

Maintenant que tu as l'information à toi de choisir.

PS conseil lit bien dans la datasheet tout ce qui correspond aux performances électriques des entrées de l'avr. Tu y trouveras beaucoup de données très utiles.

merci 68tjs, où puis-je trouver ce schéma de câblage du bouton reset ? Les solutions les plus simples sont souvent les meilleures, je n'en doûte pas. De toutes façons je commencerai par tester les solutions les plus simples, si elles ne sufissent pas, je passerai à plus compliqué. Mon souci dans le cadre de mes connaissances (jusqu'à ce matin tout du moins) c'est que même les solutions simples je ne les connaissais pas... Maintenant j'ai toute une palette pour faire des essais et trouver ma solution. Par contre j'ai encore pas l'impression de maîtriser et d'avoir tout compris, mais j'espère avoir saisi assez... Plus de nouvelles dès que j'aurais fait quelques tests...

Merci en tout cas à tous pour vos réponses et pour le temps que vous passez à m'aider, j'apprécie vraiment !

;)

où puis-je trouver ce schéma de câblage du bouton reset ?

Tu vas sur l'onglet "Product" de ce site, puis tu sélectionne ta carte et tu trouvera un schematic.pdf à télécharger.

Tu peux aussi aller sur le site du "frère ennemi" www.arduino.org et aussi télécharger le schéma en pdf. A mon avis tout ce qu'il y a de personnel le schéma arduino.org est plus clair que le schéma arduino.cc qui est assez brouillon.

Attention je ne cherche pas à faire de prosélytisme, chacun sa religion. J'ai souligné ce qui me choquais et exposé une autre approche, point barre.

Bon, alors voilà, pour l’ILS j’ai réalisé le montage en fichier joint, ça a l’air de fonctionner, les rebonds ont bien l’air d’être filtrés : vos commentaires et éventuelles corrections sont bien évidemment les bienvenus !
Sans la résistance de pull-down ca ne marche vraiment pas.

fdufnews : c’est bon, j’ai compris où je me suis planté dans le calcul de la capa. :sweat_smile: Du coup la formule que j’ai trouvé est bonne en fin de compte ? ( f = 1 / (2.Pi.R.C) )

Par ailleurs, il va sans dire que vos débats (pepe & 68tjs) dépassent le cadre de mes compétences et je ne saurais juger par moi même qui a raison, même si, par expérience, je pense que vous avez certainement raison tous les deux et que vos solutions sont adaptées à des cadres d’utilisation certainement distincts.
Au delà de tout ca, dans le cadre de mon besoin spécifique, le trigger de Schmitt me semble faire un bon filtre de lissage supplémentaire pour un signal déjà bruité, légèrement lissé par un filtre passe-bande…

68tjs, j’ai bien regardé le schéma de l’arduino et j’ai du mal à extraire l’information que tu m’as mis au défi de faire : je vois bien le bouton reset, mais les seuls condensateur & résistance que je vois “derrière” sont en série et vers la masse (?). Je ne suis pas certain d’avoir bien pigé, peux-tu m’éclairer un peu plus (un schéma ca me parle bien plus que 2 paragraphes d’explications en fait) ?

Enfin, pour en revenir au trigger Schmitt, sur la page Wikipédia j’ai vu cette image qui, j’avoue, m’a fait un peu peur quant au montage à faire, surtout au dimensionnement des résistances à mettre en place (encore et toujours…).

Petite remarque globale, au vu de vos remarques à vous : “le coût” qu’il m’intéresse de réduire n’est pas financier mais en termes de traitement CPU, pour obtenir une fréquence de capture le plus rapide possible. Tant qu’un composant ne coûte pas 50€ mais que cela reste dans les prix abordables allant de quelques centimes à quelques euros cela me convient parfaitement.

Je ne suis pas chez moi, j'ai juste une mini ardoise électronique: pas vraiment terrible.

si tu n'est pas trop pressé je sélectionne les copies d'écran et je les envoie.

Mais si tu va sur le site mon club électronique où si tu lis le tuto d'Eskimon tu devrais y trouver des réponses.

je ne suis pas pressé, mais en attendant je peux aller jeter un œil sur le site de ton club (monclubelectronique.fr ???)

Après un rapide test en suivant le montage du tuto (je suppose qu'il s'agit du tuto Premiers pas en informatique embarquée, chapitre "Récupérer l'appui du bouton" p.124 ?). Alors, le tuto est en pull-up, pourquoi pas... Et en détectant cette fois les fronts descendants pour mon IT (FALLING) ca marche aussi ! J'ai juste une résistance de moins par rapport à ma première tentative fonctionnelle (cf Schéma 3 posts plus haut). Ceci étant, ce montage (avec le condo en parallèle) ne ressemble pas à celui d'un filtre passe-bas, la question qui m'inquiète c'est par conséquent le dimensionnement du condensateur pour savoir jusqu'à quelle fréquence je peux filtrer (?).

Dans tous les cas, la notion de pull-up & pull-down je ne la connaissais pas avant hier, c'est une notion qui semble limite vitale ! elle fait peut-être partie des "bases" pour vous, mais moi je découvre... ;)

Bonjour,

montage (avec le condo en parallèle

je suis anti ILS, mais forcément d'accord avec pepe pour mettre une résistance en série avec le 10nF, ses arguments relèvent du bon sens ...

le dimensionnement du condensateur pour savoir jusqu'à quelle fréquence je peux filtrer

alors petit calcul : t = rc - pour r prenons 36kR, c'est la résistance de pull-up interne à l'Atmega328p - pour c la valeur indiquée sur le schéma, soit 10nF : t = 36*10e3 * 10*10e-9 = 360µs, ou 0.36ms

avec ceci tes rebonds seront filtrés, et le condensateur aura largement le temps de se recharger, il lui faut 1ms max et il dispose de 29ms entre 2 mesures

J’ai des copies de schémas.
Chez Arduino les schémas sont dessinés pour tenir sur une page (version gratos de Eagle oblige) : ils sont bordéliques.

Je joint 3 copies de schéma réalisés par des industriels:

Une copie d’un launchpad de chez Texas Instrument. Si on accepte de faire l’effort de relier les points de renvoi on voit que pour les deux interrupteurs les condensateurs sont reliés directement en parallèle sur les contacts.

Deux copies tirées du schéma des cartes Nucleo de chez ST.
Comme je necherche pas à avoir raison à n’importe quel prix je joint deux versions :

  • un cas identique au précédent.
  • un cas ou une résistance de 100 ohms est en série avec le condensateur.
    Avec ces deux versions tout le monde y trouvera son compte a moins de penser que les ingénieurs de développement de chez Texas et ST sont de parfaits imbéciles, chose que je ne me permettrait pas.

Sur un site comme celui-ci on se doit d’être neutre et d’accepter qu’il puisse y avoir d’autres solutions.
Il est tout à fait dans l’esprit du forum d’exposer un avis différent.
Chacun à une expérience différente qui ne peut être que personnelle, c’est la richesse de ce forum d’avoir des avis différents mais en aucun cas il n’est tolérable d’accepter que quelqu’un cherche à imposer sa solution.