Bonjour, je suis un novice en arduino et je rencontre des difficultés dans le choix de mes composants.
Mon projet est le suivant, je souhaite connaitre le point d'impact d'un objet à l'aide de microphones.
Le problème est que avec une carte arduino uno classique je suis bridé à des mesures de 4µs. J'obtiens alors des mesures correctes pour la distance séparant chaque micro du point d'impact mais celles-ci sont échelonnées de 4cm en 4cm. L'incertitude est beaucoup trop grande, il m'en faudrait une de l'ordre de 3mm ou dans le pire des cas de 1cm.
L'incertitude de distance étant due à celle sur le temps (vitesse_son = distance / temps). La solution serait de franchir la barrière des 4µs pour arriver à des centaines de nanosecondes mais c'est là que je bloque. En faisant des recherches je ne parviens pas à trouver un moyen à ma portée (financièrement et en terme de programmation pure). Je crois comprendre qu'il est possible d'empêcher la division par 64 de la fréquence de 16MHz pour s'affranchir d'une fréquence de 250kHz mais je n'y arrive pas.
Avez vous de solutions à proposer?
hello
tu dis être novice, mais tu vas jouer avec les 4µs
projet scolaire ?
et toi, qu'as tu utilisé comme capteurs? des microphones ???
Oui je suis en classe prépa c'est pour mon TIPE. Donc forcément ça doit être précis pour que je puisse le présenter. J'ai utilisé deux types de micros pour m'assurer que le problème ne venait pas d'eux: MAX4466 et des JY-037. Ma carte est une arduino uno R3 mais je peux en changer si il faut.
Si tu veux descendre en dessous de la microseconde, ce n'est pas un microcontrôleur qu'il te faut mais un FPGA.
Et ça impacte quoi ? Car ta courbe n'est pas là même si c'est une cible carton ou métal par exemple
Et si c'est une cible carton, comment fais tu lorsque tu as 2 balles qui passent dans le même trou ?
Voir Question sur une fonction - C'est plus rapide, ou non ? - International / Français - Arduino Forum
En fait l'idée est de localiser l'impact d'une balle sur le sol qu'est ce que tu entends par courbe?
Donc si je comprends bien en ajoutant simplement "TCCR0B &=0b11111101;" à mon programme j'aurai une résolution de 62.5µs? Mais étant donné qu'on modifie l'horloge interne les temps renvoyés sont-ils toujours des secondes ou est ce qu'une nouvelle "échelle" ou "unité" entre en jeu? Parce qu'en ajoutant ça à mon programme j'obtiens des valeurs incohérentes.
Bonjour,
La résolution de 62,5 ns, et non pas 62.5 µs, ne s'applique que sur le timer sélectionné.
Le timer qui a été choisi pour les fonctions de temps Wiring/Arduino est le timer 0.
Si tu modifies la valeur du pré-scaler (diviseur d'horloge) du timer 0 les fonctions de temps et la PWM qui y sont ratachées seront modifiées.
Mais si tu fais l'effort de lire la datasheet du microcontroleur qui équipe la UNO tu vois qu'il y a deux autres timers.
Remarque : la datasheet d'un atmega328p est ultra-facile à comprendre si on la compare à celles des micro ARM ou Espressif.
Les timer 0 et 2 sont des timers 8 bits
Le timer 1 est un timer 16 bits.
Le timer 1 n'apporte aucun avantage dans ton cas, seulement des inconvénients.
Comme le micro est un micro 8 bits (1 octet) les registres sont 8 bits et peuvent être lu en une seule passe.
Le timer 1 étant 16 bits, le contenu de ses registres est lus en 2 passes avec procédure de bufferisation pour le cas où la valeur aurait été modifiée entre les deux passes.
Donc c'est plus long.
En pratique, sauf si tu aimes vivre dangereusement, tu as le choix entre le timer 2 et le timer 2.
Pour l'instant les cas que j'ai vu étaient du tir sur des cibles soit en papier soit en métal.
Je n'ai pas étudié les cas où on devait trouver un impact au sol mais cela m'intéresse énormément.
localisation d'un l'impact sur le sol avec des micros = utilisation de la vitesse de propagation du son dans l'air , son émis par l'impact ?
J'oubliais un point important :
Le compteur est 8 bits (ou 16 bits) cela a pour conséquence que plus le pas de mesure est petit, moins la valeur max est élevée.
Il faut :
Soit ne pas chercher le pas minimal, mais le pas juste suffisant, et vérifier qu'un compromis est trouvable.
Soit se diriger vers la technique utilisée dans micro() et delay().
D'accord va pour le timer 2 c'est un peu flou pour moi sur la façon de l'utiliser dans mon script donc je vais faire des tests et reviendrai vers vous plus tard. Oui je m'étais trompé je voulais dire 62.5ns
Oui c'est ça j'utilise le lien de proportionnalité de d = v*t avec:
-d la distance du capteur au point d'impact (inconnue)
-v la vitesse du son
-t le temps mesuré par le microphone quand il capte l'impact (ce qui pose problème)
Tout va alors 64 fois plus vite. Par exemple si on veut une attente de 1 seconde, il faut mettre delay(64*1000L); // Le L sur au moins une opérande fait un calcul sur des long
L'intérêt de ceci est qu'on n'a pas besoin d'aller trifouiller plus dans les timers.
D'où l'intérêt d'utiliser éventuellement le compteur n°1. Qui va donc jusqu'à 4ms avec une résolution de 62,5ns au lieu de 15µs pour le timer 0 ou 2.
As tu compris ce que j'ai sugéré ?
Un compteur 8 bit c'est un compteur qui compte de 0 à 255
Un timer de fréquence horloge 16 MHz c'est un timer qui compte des pas de 62,5 ns
Donc temps max = 255 * 0,0625 ~= 16 µs
Quand le compteur arrive à 255 il repasse à 0.
252; 253; 254; 255; 0; 1; 2;
Tu n'a pas justifié cette demande de compter par pas inférieur à 100 nS.
Si tu te bases sur la propagation du son (330m/s)
une distance de 1 mm représente 30 µs
une distance de 1cm représente 300 µs
Tu n'as pas dis comment tu détectes "un état touché" à partir d'un son capté par un microphone.
Il est bien trop tôt, ce n'est évidement que mon avis, pour passer au code le projet n'est pas assez bordé, ou alors tu n'as pas encore tout dis.
This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.