Bonjour!
Dans le cadre d'un projet en prépa scientifique, on essaye avec un ami de mesurer une distance entre un récepteur et un émetteur ultra-sonore séparés (de 30cm par exemple). Ce n'est pas la norme visiblement, beaucoup de monde travaille plutôt sur un système où les deux sont accolés et le signal rebondi sur un obstacle.
Nos modules sont les HC-SR04 (bien connus je crois), ils comportent émetteur et récepteur mais on s'était dis pas grave on n'utilisera qu'un sur les deux à chaque fois.
Ne sachant pas coder en arduino on a récupérer le code d'un tutoriel et on l'a légèrement modifié pour l'adapter :
const int pinTrig = 5;
const int pinEcho = 4;
const int inutile1 = 10;
const int inutile2 = 12;
long temps;
float distance;
void setup() {
pinMode(pinTrig, OUTPUT);
pinMode(pinEcho, INPUT);
digitalWrite(pinTrig, LOW);
Serial.begin(9600);
}
void loop() {
digitalWrite(pinTrig, HIGH);
delayMicroseconds(10);
digitalWrite(pinTrig, LOW);
temps = pulseIn(pinEcho, HIGH);
if (temps > 25000) {
Serial.println("Echec de la mesure");
}
else {
distance = (temps*340)/10000.0;
Serial.print("Distance: ");
Serial.print(distance);
Serial.println(" cm");
}
delay(2000);
}
On a simplement retirer le "/2" dans la mesure de distance, et dans le montage on a brancher le port 4 sur le port récepteur ("echo") d'un des modules et le port 5 sur le port émetteur ("trigg") de l'autre module, qui sont donc placé l'un en face de l'autre.
Cependant la mesure affichait alors 0m constamment. On s'est dit qu'il fallait peut être quand même brancher les autres ports même si on ne s'en servait pas, d'où les "inutile1" et "inutile2". A partir de là on a bien eu une mesure, mais c'était alors l'un des deux modules (celui qui était censé être récepteur) qui faisait la mesure tout seul (à la fois émetteur et récepteur, le signal rebondissant juste sur l'obstacle). Je ne comprend pas trop comment c'est possible vu qu'il n'aurait pas dû émettre.
Je ne comprends pas bien ton message, tu parles de mesure de distance entre deux capteurs, mais ensuite tu parles d'un obstacle.
Peux-tu faire un schéma de principe (la photo d'un dessin à main levée suffira) pour expliquer ton expérience et un second sur lequel tu précises comment tout ça est connecté ?
Pour un signal plus propre tu peux ajouter un petit temps à l'état bas avant
Pour information : sur un HC-SR04 la partie réception n'est pas totalement indépendante de la partie émission
il me semble que la sortie ECHO n'est activée qu'après la fin de l'envoi d'une salve (émission)
L'émetteur envoie une salve d'impulsions sur l'émetteur piezo, ce moment est pour lui T0.
Il attend un retour sur le récepteur et il calcule le delta de temps.
Il faut donc que les deux transducteurs soient pilotés par le même module HC-SR04.
Je pense que votre manip devrait être faisable si vous dessoudez l'émetteur (ou le récepteur) d'un module et que vous le raccordez au module par un fil de la longueur nécessaire.
Attention cependant
liaison entre module HC-SR04 et émetteur piezo il peut y avoir un peu de puissance donc ne pas câbler avec des fils trop fins.
liaison entre module HC-SR04 et récepteur piezo le signal est faible il faut donc câbler avec du fil blindé en éviter la proximité avec des signaux "bruyants" sinon la réception sera perturbée et la mesure de distance imprécise (voir impossible).
Merci à tous pour vos réponses rapides et votre aide, c'est vraiment sympa!
Quand j'ai parlé d'un obstacle je voulais dire qu'avec notre programme, on a qu'un seul des deux modules qui s'active et il fait de la détection d'obstacle (ce qu'on ne veut pas). Désolé pour le manque de clarté.
Je vois pourquoi ça ne fonctionne pas maintenant, si les parties émetteurs et récepteurs sont liées.
Je ne suis pas sûr qu'on ai le savoir faire et le matériel pour la solution que tu proposes fdufnews, et l'objectif final est que le récepteur se déplace (en ligne droite) jusqu'à une distance donné de l'émetteur. L'usage d'un câble semble donc compliqué.
Cependant n'y a t-il pas moyen de contourner le problème en faisant émettre les deux modules en même temps, et en "bouchant" l'émetteur d'un des deux ?
Ou bien le récepteur envoie une fausse salve au même moment que l'émetteur et attend de recevoir celle de l'émetteur. En décalant d'un petit angle le récepteur afin qu'il puisse recevoir le signal de l'émetteur mais pas le rebond de son propre signal, ça pourrait marcher...?
Voire même en insérant un morceau de carton courbe entre les deux piezo du récepteur pour envoyer son propre signal dans une autre direction et éviter qu'il le reçoive après un rebond ?
Edit : je vous qu'on a eu la même idée... Le plus simple pour savoir si ça marche, c'est d'essayer.
Je confirme ce qui a été déjà écrit :
Le capteur à ultra-son est piloté par un microcontroleur et la mesure de la distance se passe dans le microcontroleur.
C'est absolument normal que si un transducteur n'est plus raccordé au microcontroleur cela ne peut pas fonctionner.
Autre problème lié à la réalisation HC-SR04 :
Le HC-SR04 est une copie d'un autre circuit dont j'ai encore une fois oublié le nom mais qui comporte moitié moins de composant.
La raison est simple, elle était détaillée sur le site Emil's Projects, malheureusement ce site à été mis à jour et le décorticage du HC-SR04 a été retiré.
Le filtre passe bande (réduction du bruit) sur la partie réception n'est pas centré sur 40 kHz mais sur 20 kHz ce qui fait qu'à 40 kHz le signal utile est affaibli de plus de 20 dB. Les concepteurs du HC-SR04 ne se sont pas rendu compte de leur erreur et ont ajouté une amplification de malade pour obtenir un signal d'amplitude suffisante pour être prise en compte par le micro d'origine chinoise inconnue.
Conclusion le circuit fonctionne, il fait son boulot, mais à la limite de la stabilité.
Le fait de relier le transducteur de réception par des fils de 30 cm peut fort bien le faire entrer en oscillation.
Vu que vous êtes en prépa vous avez accès à des oscilloscopes et à des analyseurs de spectre. Je pense que devriez vous intéresser aux signaux à l'intérieur du HC-SR04 et notamment comparer les signaux entre un HC-SR04 encore intact et le HC-SR04 que vous avez modifié.
Virgile_:
Je ne suis pas sûr qu'on ai le savoir faire et le matériel pour la solution que tu proposes fdufnews,
Euh là, il est question de dessouder l'un des deux piezo et de souder un fil. Il faut être soigneux mais pas besoin d'un bac+12 en câblage pour y arriver. En plus tu as 2 modules donc même si tu te plantes il te reste un joker.
Virgile_:
Cependant n'y a t-il pas moyen de contourner le problème en faisant émettre les deux modules en même temps, et en "bouchant" l'émetteur d'un des deux ?
En général, ces modules ne possèdent pas de broche permettant de les synchroniser.
Votre solution ne fonctionne pas correctement pour plusieurs raisons outre le phénomène lié au fait qu'un module ne sait pas discriminer sa propre émission de celle du module situé en face.
DigitalWrite n'est pas très efficace en matière de programmation et il introduit un retard donc le T0 ne sera pas le même entre un module et l'autre. De plus le délai entre la sortie du trig et la génération de la salve n'est peut-être pas constant (ni le même entre 2 modules) donc vous allez accumuler des aléas de mesure.
Le premier problème peut-être contourné en écrivant directement dans les registres qui pilotent les entrées/sorties plutôt que d'utiliser digitalWrite. Ou en utilisant la librairie digitalWriteFast qui fait la même chose de manière transparente.
Comme je ne suis plus intéressé par ce produit (c'était juste par curiosité) je pense que je vais encore oublier
Mais je sais que je peux compter sur toi pour donner la bonne réponse .
A noter les astuces :
utilisation d'un Max232 (ici ST232) en étage de sortie. Grace à la pompe de charge incorporée il transforme un signal 0V/+5V en un signal -9V/+9V soit quasiment un gain de 4.
En réception l'impédance d'entrée du premier étage d'amplification est adaptée sur l'impédance de sortie du transducteur récepteur (Zc = 2kohms)
utilisation de deux boîtiers pour la chaîne amplification : un boîtier ampli op à 2 ampli et un boîtier opto coupleur.
A comparer avec la réalisation HCSR04 : un seul boîtier à 4 ampli --> moins bonne stabilité à cause de la diaphonie à l'intérieur du boîtier.
fdufnews:
DigitalWrite n'est pas très efficace en matière de programmation . Ou en utilisant la librairie digitalWriteFast qui fait la même chose de manière transparente.
Pas tout à fait. DigitalWriteFast ne fait que supprimer la batterie de contrôle anti-connerie. Il conserve l'utilisation des macros qui font passer de la dénomination des E/S par Arduino (chiffre de 1 à N) à celle d' ATMEL (organisation en Ports repérés par des lettres et indice dans le port).
En résumé :
digitalWrite ~ 65 cycles horloge
digitalWriteFast ~ 30 cycles horloge
Registres ~ 8 cycles horloge.
J'utilise le tilde ~ parce que des tests réalisés avec différentes versions d'avr-gcc donnent de légères variations dans les résultats et que cela fait un bout de temps que je n'ai pas refait de tests.
En ce qui concerne les ESP j'ai commencé quelques tests avec un analyseur logique (Saleae 24 MHz).
ESP12 (esp8266) ~ 80 cycles horloge
ESP32 ~ 30 cycles horloge
En temps de réponse brut la version ESP12 de digitalWrite/Read est meilleure que la version avr/arduino uniquement parce que l'horloge est à 80 MHz sinon c'est encore moins bien optimisé que sur avr/arduino.
La mouture pour ESP32 semble plus réussie.
Comme je ne suis plus intéressé par ce produit (c'était juste par curiosité) je pense que je vais encore oublier
Dans mon cas c'est 'gravé' parce qu'il y a une quinzaine d'années j'ai eu à décortiquer le fonctionnement, l'expliquer et reproduire le détecteur ....(sur un CD quelque part (??) j'ai sans doute le code source pour un petit PIC 12Fxxxx )
Le schéma du SFR04 m'avait impressionné par son 'intelligence'
+Le Max232 n'est alimenté que pendant la production de la salve, on n'est donc pas pénalisés côté réception par le bruit de la pompe de charge
le seuil décroissant (c'est un comparateur LM311/LP311 dont la sortie en collecteur ouvert a été mise en évidence) en réception est également remarquable pour compenser approximativement l'affaiblissement des échos au fur et à mesure de la propagation
al1fch:
Dans mon cas c'est 'gravé' parce qu'il y a une quinzaine d'années j'ai eu à décortiquer le fonctionnement, l'expliquer et produire un clone......sur un CD quelque part (??) j'ai sans doute le code source pour un petit PIC 12Fxxxx
Le schéma du SFR04 m'avait impressionné par son 'intelligence'
+Le Max232 n'est alimenté que pendant la production de la salve, on n'est donc pas pénalisésôté réception par le bruit de la pompe de charge
le seuil décroissant (c'est un comparateur LM311/LP311 dont la sortie en collecteur ouvert a été mise en évidence) en réception est également remarquable pour compenser approximativement l'affaiblissement des échos au fur et à mesure de la propagation
+1
Il faut prendre les HC-SR04 "asia" pour ce qu'ils sont
un "capteur" à pas cher qui permet aux novices assez simplement de découvrir le domaine US
c'est la cas ici
aprés, une fois çà assimilé , "on" rentre dans du spécifique et comme pour beaucoup de domaines : le "diable se cache souvent dans les détails" 8)
68tjs:
Pas tout à fait. DigitalWriteFast ne fait que supprimer la batterie de contrôle anti-connerie. Il conserve l'utilisation des macros qui font passer de la dénomination des E/S par Arduino (chiffre de 1 à N) à celle d' ATMEL (organisation en Ports repérés par des lettres et indice dans le port).
Bonjour,
DigitalWriteFast est optimisé pour une valeur de pin constante. Dans ce cas le compilateur évalue les expressions donnant le port et le mask lors de la compilation. Donc pour une valeur de pin connue à la compilation, digitalWriteFast prend le même temps que l'accès direct aux registres.
Bien sur si le numéro de pin est une variable, la détermination du port et du mask ne peuvent pas être faits à la compilation et l'accès est plus long.