Je souhaite mettre en place un TP pour les secondes ayant pour but de définir la valeur de la vitesse du son.
Etant néophyte avec Ardiuno, j'ai utilisé le programme ci-dessous:
/Calcul de la vitesse du son avec Arduino
//Affichage du temps de reception d'un écho #include "Ultrasonic.h"
Ultrasonic ultrasonic(7);
int emetteur = 7; //branché sur trig du HC-SR04
int recepteur = 8; //branché sur echo du HC-SR04
long dureeEcho; //variable type long
byte compteur;
//boucle qui permet de réaliser 20 fois (0 à 19) la mesure de la durée de l'aller retour de la salve US de 10microsecondes
for(compteur=0 ; compteur<20 ; compteur++)
{
//Émission d'une pulse ultrason sur la broche 8 : emetteur allumé pour 10 microsecondes
digitalWrite(emetteur, HIGH);
delayMicroseconds(10);
digitalWrite(emetteur, LOW);
//Mesure du temps de reception de l'écho sur la broche 9
dureeEcho = pulseIn(recepteur, HIGH);
//Affichage du temps, rafraichi toutes les 1000ms
Serial.print("Duree = ");
Serial.println(dureeEcho);
delay (1000);
}
}
//Fin de la boucle for la variable compteur vaut 19
void loop (){
}
J'utilise l'émetteur récepteur US et un écran faisant office d'obstacle.
Cependant, je ne trouve pas de bibliothèque me permettant de mesurer le temps entre l'émetteur et le récepteur. Pourriez-vous m'aider svp?
Je vous remercie.
Cependant, je me heurte à un problème car je ne possède pas l'émetteur récepteur avec les 4 entrées/sorties "indépendantes" ( "4 fiches") mais ce type d'émetteur/carte type groove :
En utilisant un programme "standard" c'est à dire en prenant les données brutes de la carte, j'obtiens des résultats (durée allée/retour) totalement incohérents. Je pense devoir utiliser une bibliothèque comme cela se fait pour mesurer des distances avec ce type d'émetteur/récepteur (j'ai testé cette méthode et cela fonctionne très bien). Je n'ai pas de bibliothèque pour la mesure de temps pour ce type de capteur.
Le but du TP étant de déterminer la célérité du son dans l'air, il faut absolument que le résultat brut du programme soit une durée et non une distance "convertie" en temps calculé via le programme.
Où puis-je trouvé cette bibliothèque svp?
Pour mesurer une durée entre deux évènements avec un Arduino, on utilise la fonction millis() ou micros() si on a besoin de plus grande précision.
A l'arrivée du premier évènement, on stocke la valeur fournie par cette fonction. A l'arrivée du second évènement on fait la différence entre la valeur fournie et la valeur stockée.
Ces valeurs sont stockées dans des variables de type unsigned long.
Exemple :
// Arrivée premier évènement
unsigned long chrono = millis();
// Arrivée second évènement
chrono = millis() - chrono;
// chrono contient la durée de l'intervalle entre les deux évènements (en millisecondes).
Le programme que tu montres au message #1 utilise la fonction pulsin() qui retourne directement le temps aller-retour de la courte salve s'ultra-sons émise.
On n'a pas affaire ici à un temps calculé à partir d'une distance
NB Ce programme est conçu pour un module US relié par 2 signaux : Trig et Echo alors que ton module Groove utilise un seul signal : Sig, d'où des résultats aberrants
En plus des importantes demandes de @fudufnews j'ajoute que l'électronique aura un temps de traitement.
Pour que le signal traverse un amplificateur, il faut selon l'ampli des microsecondes, ou des nanosecondes ou des picosecondes.
Cela doit être pris en compte.
Le fameux capteur à ultrason à un microcontrôleur à l'intérieur. Ce microcontrôleur a son temps de traitement.
Les temps de traversée des composants et/ou de calcul étant inévitables, il faut les utiliser en s'arrangeant pour trouver un principe de mesure qui les fasse disparaitre avec une soustraction.
Exemple
Mesurer le temps entre le front utile du signal trig et la fin du signal echo.
Avec le même matériel faire deux mesures, chacune à une distance connue avec précision.
Sachant que le son à 330m/s parcours 1 mm en 3 µs, se pose la précision de la distance avec la cible.
Se pose aussi la question : est-ce que le microcontrôleur que j'ai choisi sait faire des mesures avec une précision de 1 µs.
Se pose plus généralement de quelle précision j'ai besoin ?
On peut valablement penser que la vitesse du son dans l'air dépend du nombre de molécules de gaz au m3.
La vitesse sera dépendante de la température et de la pression athmosphérique.
La librairie de SeeedStudio ne retourne que des distances mais en interne elle possède une méthode duration().
Il suffit d'éditer Ultrasonic.h et de retirer (ou de commenter) la ligne contenant private: dans le fichier. Tu pourras ainsi appeler duration() depuis ton programme et récupérer le temps de parcourt de l'onde.
C'est une bonne occasion d'apprendre la double mesure. On fait la mesure à 2 distances différentes ce qui permet d'annuler le temps, supposément constant, apporté par les circuits d'interface.
Tout d'abord, le programme que tu as mis en post #1, n'est pas adapté au module US Grove, ce programme est fait pour un émetteur à 2 broches TRIG et ECHO:
En mettant ton US sur D7 du shield, essaies ce bout de programme:
#define SIG_PIN 7 // Définir la broche SIG connectée au pin 7 de l'Arduino
#define DISTANCE_CM 100 // Distance en cm (1 mètre)
// Durée théorique de retour du signal pour une distance de 1 m
const long dureeTheorique = (DISTANCE_CM * 2.0) / 0.0343;
void setup() {
Serial.begin(9600);
pinMode(SIG_PIN, OUTPUT);
}
void loop() {
long duree;
// Envoyer une impulsion de 10 µs sur le pin SIG pour déclencher le capteur
pinMode(SIG_PIN, OUTPUT);
digitalWrite(SIG_PIN, LOW);
delayMicroseconds(2);
digitalWrite(SIG_PIN, HIGH);
delayMicroseconds(10);
digitalWrite(SIG_PIN, LOW);
// Changer la broche en entrée pour recevoir l'écho
pinMode(SIG_PIN, INPUT);
// Lire la durée du signal d'écho
duree = pulseIn(SIG_PIN, HIGH);
// Afficher la durée
Serial.print("Duree de retour: ");
Serial.print(duree);
Serial.println(" microsecondes");
// Vérifier si la durée est proche de la durée théorique
if (abs(duree - dureeTheorique) < 100) {
Serial.println("La mesure est proche de 1 metre.");
} else {
Serial.println("La mesure n'est pas proche de 1 metre.");
}
delay(1000); // Attendre 1 seconde avant la prochaine mesure
}
Avec un capteur à trois broches (Gnd, Vcc, Trig/Sig) :
Coté micro :
La pin qui est reliée à T/S du capteur sert à la fois pour émettre le signal de déclenchement de mesure et pour recevoir le résultat de la mesure.
Ce qui veut dire qu'il faut faire les actions suivantes pour lancer un ordre de mesure :
mettre la pin T/S en mode OUTPUT
envoyer le signal de trigger
immédiatement après faire passer la pin T/S en mode INPUT pour qu'elle soit apte à recevoir la réponse du capteur.
Coté capteur, c'est exactement l'inverse, mais c'est automatique :
Le capteur au repos la pin T/S est en mode INPUT pour recevoir le signal de déclenchement.
Celui-ci reçu, elle passe en mode OUTPUT pour pouvoir envoyer le résultat de mesure.