Bonjour à tous, j'ai un montage d'un NE555 en astable:
la résistance R2 est remplacé par une résistance de 10k suivie 7 boutons en série avec une résistance de 1k entre chacun, donc bouton1=11k, bouton2=12k....
en gros en fonction du bouton pressé la fréquence de sortie du NE555 va varier entre 411 et 626hz
j'aimerais récupérer cette fréquence avec une Arduino nano atmega326 et afficher la fréquence sur le moniteur série.
Je pense que analogRead n'est pas adapté parcque la sortie est un PMW, il varie entre 0 et 5V et n'a pas de valeur entre les 2.
J'ai pensé à utiliser pulseIn mais je ne sais pas vraiment comment le mettre en place, parcque je voudrais mesurer la durée entre 2 état haut, une periode en gros, ce que fait pulseIn, le problème c'est que mon PMW de sortie il va varier entre 411 et 626hz, donc je ne peux pas vraiment mesurer une période du signal, ce qui pose problème pour la précision.
J'ai donc 3 questions:
pulseIn est elle une fonction adapté, si oui comment la mettre en place ?
y'a-t-il d'autres manière fiable et plutôt simple pour récupérer la fréquence et l'afficher ?
Pourquoi quand je met un condensateur pour filtrer entre la sortie et l'entrée analogique Arduino, ça ne marche pas ? ( j'ai mis un buzzer pour tester, sans condensateur ça marche, avec ça marche plus, il a une capacité de 10uF et est polarisé, j'ai mis le + coté sortie ne555 et le - coté buzzer, c'est un buzzer actif)
Pour mesurer la période avec pulsein il faut additionner la durée de l'état haut et la durée de l'état bas. unsigned long periode = pulseIn(pin, HIGH) + pulseIn(pin, LOW);
Sinon une meilleure méthode est d'utiliser les interruptions et de mesurer le durée entre deux interruptions. Il existe aussi des librairies basées sur cette méthode.
Un condensateur en série avec la sortie ne filtre pas, il laisse passer le signal alternatif et bloque la composante continue. Que veux tu dire par "ça marche plus".
eh bien quand je dis que ça ne marche plus c'est que le buzzer ne produit plus de son avec le condensateur en serie, mais Du coup pour filtrer je dois le mettre comment ?
dans mon schéma on me dit de le mettre comme ça:
les seuls condensateurs de 10uF que j'ai sont polarisés
pour pulseIn j'avais un autre capteur avec lequel j'utilisais cette fonction et j'ai juste fait pulseIn(capteur, HIGH) et ça marchait bien, rajouter le temps à l'état bas changeras grand chose ?
je vais me renseigner sur les interruptions, merci
Tu as un buzzer passif ou actif? Dans ton post tu partes de buzzer actif et dans ton schéma c'est un buffer passif. Si c'est un buzzer actif c'est fort possible qu'il ne fonctionne pas si tu mets un condensateur en série.
En parallèle avec la sortie en intercalant une résistance à la sortie.
Mais pourquoi tu veux filtrer? Tu auras une tension (presque) continue.
La tension ne dépendra pas de la fréquence, mais du rapport cyclique.
Ce qui me semble un peu bizarre est d'utiliser un 555 et une Arduino en même temps. Arduino est capable de délivrer un signal carré plus simplement que le 555, et on peut choisir facilement la fréquence. Le 555 ne délivre pas un signal de rapport cyclique 50% , ce qui n'est pas forcément important ici. Le seul intérêt du 555 est qu'il est capable de donner 200mA en sortie. Mais un Arduino + ampli (genre TBA820 ou même un simple pont) serait sans doute plus simple à gérer.
On peut d'ailleurs utiliser le 555 comme ampli copiant le signal carré issu d'une Arduino.
AnalogRead permet de lire une tension continue, on n'aura aucune information avec un signal digital effectivement.
En sortie du 555 on a une tension qui peut prendre la valeur 0V ou 5V. On peut décomposer ce signal en la somme de deux signaux, l'un continu d'environ 2,5V et d'une tension carrée alternative de moyenne nulle et de 2,5V d'amplitude. En mettant un HP en sortie, c'est la deuxième composante qui produit le son, la première consomme du courant pour rien. En mettant entre la sortie du 555 et la masse un condensateur, on va faire un court-circuit pour la deuxième composante ce qui va couper le son. Si on veut garder le son et ne pas consommer du courant pour rien (ne pas laisser passer la composante continue, il faut faire effectivement le montage du post#3:
On a alors pour la composante alternative comme un fil et on va récupérer le son. Pour la partie moyenne, elle ne va pas passer et va éviter de consommer. Pour cette composante, on va avoir environ 2,5V à gauche et 0V à droite. On peut donc mettre un condensateur polarisé en mettant le + du côté Arduino.
Si le 555 délivrait bien du 0V/5V , on aurait environ 2,5V crête dans le HP, et comme il fait 8Ω, cela ferait 2,5V2/8Ω soit 0,8W et un courant de 2,5V/8Ω soit 0,1A. Avec les tension de déchet du 555, on est limite pour le HP.
Presque, car le rapport cyclique dépend de la fréquence (plus la fréquence est faible, plus le rapport cyclique se rapproche des 50%. Mais avec un loi pas évidente. Avoir le rapport cyclique peut donner la fréquence, mais avec peu de précision et une formule plus complexe que la simple addition des deux temps.
Dans son cas si. le rapport cyclique vaut R2/(R1+2.R2). Pour faire varier la fréquence, arduino-hater-ah-ah fait varier R2, ce qui fait donc varier le rapport cyclique. Mais pas beaucoup et pas avec une loi simple.
Je plussoie @kamill, en fait tu n'a pas du PWM, mais une simple fréquence, un signal PWM, à la base, ne change pas de fréquence, mais change de rapport cyclique.
Donc, il te faut un fréquencemètre, pour lequel l'usage des interruptions est conseillé.
Personnellement, je ne vois aucun intérêt à se compliquer la vie avec les interruptions quand le simple unsigned long periode = pulseIn(pin, HIGH) + pulseIn(pin, LOW);
suffit.
Je ne vois pas en quoi l'usage des interruptions complique les choses, c'est universellement utilisé dans le cas d'un fréquencemètre et simple d'emploi. La fonction pulsein est bloquante ce qui n'est pas toujours très pratique.
Combien de lignes de code pour mesurer avec interruption?
On n'est pas en train de faire un exercice général, on cherche à répondre à un problème précis. Et 1) @arduino-hater-ah-ah sait-il ce qu'est une instruction bloquante?
2) Quel est l'intérêt de ne pas bloquer le programme quand on est obligé d'attendre la fin de la mesure pour faire un affichage et que l'on sera en plus obligé de mettre un delay(1000) pour que l'affichage ne change pas trop souvent?
Et un déménagement se fait de façon optimale avec un camion, même pour déménager la chambre d'étudiant de ma fille qui tient dans deux petites valises...
En informatique, comme dans la vie, il y a plusieurs solutions pour résoudre un problème et ce n'est pas toujours la même qu'il faut prendre. Cela va dépendre au cas par cas.
Et cela ne répond pas aux deux questions:
1) @arduino-hater-ah-ah sait-il ce qu'est une instruction bloquante?
2) Quel est l'intérêt de ne pas bloquer le programme
Au fait, c'est quoi une instruction bloquante? delayMicroseconds(1) est elle bloquante? Un fonction d'interruption l'est-elle aussi?
enfaite mon but c'est de détecter la fréquence envoyé par le ne555 pour après envoyer cette fréquence après un peu de modification à un buzzer avec l'arduino
donc en gros quand je clique sur un bouton, l'arduino lit la sortie du ne555 et envoie une fréquence au buzzer. quand je clique pas il n'y a aucun bruit qui sort du buzzer
si je voulais utiliser pulseIn c'était pour calculer chaque fréquences à partir du signal pour chaque boutons avec la valeur de temps renvoyé par pulseIn. au final je veux juste detecter sur quel bouton on a appuyé
après j'ai des if() dans le loop pour détecter quelle fréquence (donc quel bouton) on obtient après calcul, puis dans les if() je met des tone() avec des fréquences un peu modifiés pour qu'elles soient plus agréables à écouter.
c'est un exercice, le but est de comprendre le fonctionnement du ne555 astable, et si par exemple j'avais rajouter 30 boutons, il n'y a pas 30 pin numériques sur l'arduino et en utilisant le ne555 j'ai besoin d'une seul pin et j'ai juste a détecter la fréquence de sortie pour déterminer sur quel bouton j'ai appuyé
OK cela est donc justifié. Dans ce cas l'affichage du temps "HIGH" et du temps "LOW" sur la console pourrait être intéressante.
Au passage pour 30 boutons, on n'utiliserait pas 30 broches, mais on ferait une matrice 5x6 qui n'a besoin que de 11 broches. Pense au problème du clavier d'une centaine de touches!
Oui, si tu sait si ton signal est un carré rapport cyclique 50%/50% ou approchant, la lecture de la seule impulsion positive: int duration = pulseIn(pin, HIGH, timeout);
ou négative: int duration = pulseIn(pin, LOW, timeout);
devrait suffire.
Ne pas oublier de mettre une valeur de timeout, ça évite des attentes inutiles (default is one second) s'il n'y a pas d'impulsion à mesurer.