Problème de mesure d'un temps sur arduino uno

Bonjour, le problème est un peu complexe et je ne sais pas si il a déjà été posté sur le forum.

J'essaies de faire un détecteur d'ondes sismiques pour des tp de lycées. L'idée est d'avoir une barre d'une roche, placer deux capteurs piézoélectrique, un à la fin et l'autre au début de la barre, puis de donner un coup sur l'une des extrémités et mesurer le temps de propagation de l'onde pour calculer la vitesse de propagation de l'onde.

Seulement voilà, je débute avec l'arduino et je n'ai pas encore tout bien acquis par rapport à la gestion du temps dans les programmes.

Voici mon code : (ne faites pas attention aux commentaires, ils sont juste là pour faire des mesures si besoin)

#define piezo1 3
#define piezo2 0
int value1 =0;
int value2 = 0;
int max1 = 0;
int max2 = 0;
int seuil = 10;
long t1=0;
long t2=0;
long tf=0;

void setup() {
  // put your setup code here, to run once:
  Serial.begin(9600);
}

void loop() {
  // put your main code here, to run repeatedly:
  value1=analogRead(piezo1);
  value2=analogRead(piezo2);
  
  
  //Serial.println(value1,DEC);
  if (value1>seuil)
  {t1=micros();
  //Serial.print("capteur 1 : ");Serial.println(value1,DEC);
  }
  if (value2>seuil)
  {t2=micros();
  //Serial.print("capteur 2 : ");Serial.println(value2,DEC);
  }
  if(t2>0 and t1>0)
  {tf=t1-t2;tf=abs(tf);Serial.print("temps écoulé entre les deux détections (en microsecondes) : ");Serial.println(tf,DEC);tf=0;t1=0;t2=0;}
}

Quand je l'éxecute sur l'arduino (arduino uno, clock interne de 16MHz), les valeurs obtenus ne sont pas les bonnes. J'obtiens presque toujours des multiples de 224, peu importe la position des capteurs sur la roche, le problème ne peut donc pas venir du dispositif expérimental (j'ai déjà changé la roche et la position des capteurs sur celle ci), il vient donc du code.

Je voudrais donc savoir d'où le problème pourrait venir, mes pistes pour l'instant sont :

  • le code, comme je l'ai dit je débute, la gestion du temps dans le programme n'est certainement pas la meilleure.

  • le matériel, les temps à mesurer tourne dans les 17 microsecondes et je me dis que le problème vient peut être de la fréquence de l'arduino.

Voilà, désolé du pavé et merci d'avance de l'aide que vous pourrez m'apporter.

utilisez des unsigned long pour stocker le temps

ensuite le piezo 1 risque de continuer à déclencher pendant un petit moment. Il ne faudrait plus le lire tant que vous n'avez pas reçu le signal sur le piezo2

enfin, et c'est un gros problème, chaque analogRead() prend longtemps... 100 microsecondes donc c'est un souci si vous voulez en mesurer 17...

en 17 micro-secondes votre arduino ne peut faire que 272 instruction de base.. c'est peu pour faire du monitoring. il faudrait que l'impulsion initiale soit déclenchée par l'Arduino (par exemple c'est vous qui activez électriquement le premier piezo) et ensuite il faudrait que le captage du signal de l'autre côté déclenche une interruption sur un front rapide et utiliser les timers...

ça me semble complexe surtout pour la partie réception du signal et déclenchement.

hello, une idée:
D2 et D3 declarées en interruptions
piezzo 1 sur D2
piezzo 2 sur D3
D2 declenche le timer 1 TCCRB1 =0b00000001 (en one shoot ( par flag))
D3 le stoppe TCCRB1=0b00000000 (en one shoot (par flag))
ensuite, tu fais la conversion de TCNT1 en micros . TCNT1*0.0625

juste une idée, pas testé

EDIT: après tests, c'est OK

Cela devrait pouvoir fonctionner. Il faut aussi savoir qu'une fonction d'interruption dure au moins 4µs (le temps de sauvegarder les registres et de les restituer), mais avec deux appels, cela doit se compenser. Il faut aussi pour faire la mesure arrêter le timer 1 qui de temps en temps bloque tout pendant 6µs.Il faut aussi savoir que lorsqu'une interruption se présente, il faut finir l'instruction en cours avant de la traiter. Une instruction dure de 1 à 3 cycles d'horloge (1 cycle dure 0,0625µs). Il peut donc y avoir une différence jusqu'à 6 cycles entre deux mesures suivant où ont lieu les interruptions.

Tout dépend de le précision qui est voulue.

Une recherche basique avec Duck Duck Go donne plusieurs liens qui délivrent l'information pour ce type d'exercice qui semblent fréquents dans les Lycées.

La plupart proviennent de site de l'éducation nationale et parlent de cours de SVT niveau classe de première.

Merci de ta réponse, je suis entrain d'essayer de l'appliquer mais je dois déjà comprendre ce à quoi les interruptions correspondent et comment déclencher les timers mais je devrai m'en sortir.

parfait si tu t'en sors
en cas contraire, n'hésites pas à revenir, nous t'aiderons avec plaisir