Onde Ultrason Utilisation

Bonjour,

Dans le cadre d’un projet, je me retrouve à devoir utiliser des émétteurs et récepteurs ultrasons.

N’étant pas tres bon dans tous ce qui est hardware, j’aimerais évité d’avoir à faire un circuit avec

amplificateur, pushpull, filtre passe bande, etc.

J’aimerais de ce fait, si possible, que vous me fournissiez une référence d’un émétteur récepteur prêt à être utilisé ( j’entend par la, que je n’aurais qu’à le brancher sur mon arduino sans me soucier de la porter d’émission et sans me soucier de la réception du signal).

Si vous n’avez pas de tel référence à me proposer, j’ai une autre question.

Il existe déja plein de capteurs ultrason prêt à l’utilisation ( par exemple comme celui fourni en piece jointe). Je me demandais si justement il était possible d’en utiliser deux pour les faires fonctionner comme cidessous:

Le premier capteur émet une onde qui vient être récupérer par le récepteur du second capteur.

Est ce possible?

Merci d’avance pour toutes les personnes qui fournirons l’effort de me répondre.

Cordialement.

ultra.PNG

le composant que vous référencez est un HC-SR04 et vous pouvez le piloter par la libraire NewPing mais elle sera à un niveau d'abstraction trop élevé si vous voulez avoir 2 capteurs en face à face.

Je pense que c'est jouable cependant - faudrait essayer:

Le principe général est le suivant: le module émet une ultrason qui se déplace dans l'air et s'il y a un objet ou un obstacle sur son chemin Il va rebondir et revenir au module où il sera détecté. Compte tenu du temps de vol (le temps entre l'envoi de l'onde et son retour), de la vitesse connue du son dans l'air (340 m/s) et du fait que le son fait un aller-retour vous pouvez calculer la distance entre l'émetteur et l'obstacle avec assez de précision (à partir de 2 à 3 cm de distance jusqu'à 4m en conditions normales avec une précision de quelques mm dans de bonnes conditions).

Ces composants ont 4 pins l'alimentation et la masse, et ensuite une pin pour déclencher un train d'onde (Trigger que vous connectez sur un pin de votre arduino, disons à

trigPin

) et une pin pour écouter le retour (Echo) que vous connectez à une autre pin, disons

echoPin

En pratique Il faut s'assurer que le module soit au repos, puis envoyer une impulsion niveau haut (+ 5v) pendant au moins 10 µs sur la broche

trigPin

; le capteur émet alors une série de 8 impulsions ultrasoniques à 40 kHz, puis il attend le signal réfléchi Lorsque celui-ci est détecté, il envoie un signal "high" sur la sortie echoPin, dont la durée est proportionnelle à la distance mesurée si le module détecte un objet. Il suffit donc d'attendre un front montant sur cette pin et de mesurer sa durée.

La distance parcourue par un son se calcule en multipliant la vitesse du son, environ 340 m/s par le temps de propagation, soit : d = v · t (distance = vitesse · temps) et on sait aussi que le son a fait un aller-retour.

donc 2 x distance = 340m/s x TEMPS_MESURE (µs)

distance = (TEMPS_MESURE x (34000 cm / 1 000 000 μs) ) / 2 (en cm)
distance = TEMPS_MESURE x 17000 / 1 000 000 (en cm)
distance = TEMPS_MESURE x 17 / 1000 (en cm)

Si vous lisez les doc on voit souvent la formule distance = durée / 58 pour l'obtenir en cm
Cela s'explique parce que multiplier par 17/1000 revient à diviser par 1000/17 qui vaut 58.8235.
Je préfère donc t x 17/1000 parce que c'est plus précis :slight_smile:

Le mode de fonctionnement standard est alors le suivant

digitalWrite([color=blue][tt]trigPin[/color], LOW); delayMicroseconds(2); // LOW pour 2 micro secondes
digitalWrite(

trigPin

, HIGH); delayMicroseconds(10); // HIGH pour 10 micro secondes
digitalWrite(

trigPin

, LOW); // on éteint[/tt]

et ensuite on écoute le train d'onde qui revient:

unsigned long tempo;
tempo = pulseIn([color=green][tt]echoPin

[/color], HIGH);

float distance = tempo * 17.0 / 1000.0; // en cm[/tt]

Une fois qu'on comprend cela, si vous avez 2 modules face à face et que vous voulez mesurer la distance entre les 2, la même méthode s'applique sauf que vous allez envoyer le train d'onde des 2 côté (parce que ça déclenche aussi au niveau du composant l'attende de la lecture) et lire le pulseIn() sur l'autre composant. Attention il faudra tenir compte du fait qu'il n'y a pas d'aller retour, donc dans la formule ce sera

float distance = tempo * 34.0 / 1000.0; // en cm

Bien sûr comme vous déclenchez des 2 côtés, il vaudrait mieux le faire vraiment simultanément, chaque micro second compte, donc utiliser les PORT pour mettre les 2 pins de trigger en bas/haut en même temps et bien sûr bidouiller le récepteur pour qu'il n'envoie pas vraiment d'ondes qui viendraient créer des perturbations.

Pour cela voir si vous pouvez simplement couper la patte d'alimentation du second émetteur ou le couvrir pour qu'il n'émette rien.

Précise ton besoin parce que les usages de l'ultrason sont multiples.
JML t'a exposé l'usage "habituel" des utilisateurs du monde "arduino".

Je crois avoir compris tu cherche à transmettre des informations entre deux modules un émetteur et un récepteur.
Est ce bien le cas ?

Voila un lien pour l'utilisation du hc-sr04 v
https://www.la-programmation.surleweb-france.fr/arduino-mesurer-distance-sonde-hc-sr04/

Merci a vous, c'est une réponse très précise.

Je vous donne un aperçu de l'application que je veux faire.

Jai un objet en mouvement dont je veux connaitre la position. Cette objet seras équipé d'un émetteur

ultrason et d'un trancieveur RF servant à la synchronisation (tout sa connecté sur une arduino uno )

Au plafond je vais placer une une arduino (leonardo je pense en fonction du nbre de pinouilles nécéssaire).

Cette arduino sera le centre nerveux de mon réseaux. Elle sera composé d'un transciever RF de même et tous les récepteur ultrason seront connecté à cette arduino mais placé à différents endroit de la pièce

(dailleurs si vous avez des fils assez long pour assurer la connection je sais pas comment les trouver ..).

Phase 1: Mon objet émet un RF qui vient être réceptionner par le centre nerveux.
Phase 2: Lors de la réception de L'onde RF, mon centre émet une réponse ACK et déclenche un timer/compteur.

PS: Je comptais mesurer le temps de propagation à l'aide de ce timer (résolution de 65.7ns ) Je pense que ce serais plus précis que de le calculer avec la fonction pulsin, qu'en pensez vous? Et je n'aurais pas besoin de synchroniser l'envoie des ultrasons des différents module pour les mettre en "écoute". non?

Phase 3: Une fois que l'objet reçoit la réponse ACK, il émet une onde US qui vient être capté par les différents récepteur espacé au plafonds.

Phase 4: Dès la réception des ondes ultrason par mes différents récepteur, un pulse est envoyé à larduino. Mais maintenant que vous m'avez dis que la pinouille echo passe à un dès lors de la réception, je ne pense pas avoir besoin d'émettre une impulsion.

Est il possible de déclencher une intérruption pour sauvegarder la valeur du timer 1 ( que je compte utiliser pour mesurer le temps ).

Enfin je transmet toutes mes données de distance à mon ordinateur qui me trouveras la position via trilatération.

Je pense avoir été assez clair! :slight_smile:

EN TOUT CAS merci pour vos réponses très instructif.

J’ai Juste une petite peur. Vu que lors de la réception il y a deux étage d’amplification (via le tl074), j’ai peur que l’amplification soit trop forte et donc qu’on est une tension supérieure à 5V.

Par ailleurs, la distance maximale d’utilisation est de 4m. Mais c’est dans le cas ou l’on doit récupérer l’echo du signal. Si je n’ai pas à récupérer l’echo du signal vu qu’il vas directement sur le recepteur en face de lui. ma distance maximale ne pourrais pas etre alors de 8m? ou peut etre un peu moins mais plus de 4m du moins?

Merci

Je ne suis pas certain que cette solution soit adaptée au besoin.
Je ne vois pas comment tu peux assurer une synchronisation précise entre les différents récepteurs.
Tu ne sais pas ce que fait le HC-SR04 lorsqu'il reçoit une impulsion pour lancer une acquisition (est-ce qu'il émet tout de suite une salve d'ultrasons?? est-ce que le délai s'il y en a un est constant d'un équipement à l'autre).
Et c'est pas la doc de ce composant qui va fournir la réponse.

L'émetteur émet les ultrasons dans un angle relativement étroit (15°). Est'ce que tes récepteurs seront dans le champ en question. Si oui il devront être si rapproché que la triangulation ne sera pas précise (voire impossible).

Oui je vois, effectivement cela peut poser un grave problème dans l'estimation du temps de propagation.
Et si l'on fonctionner dans l'autre sens?

Je veux dire par la, j'émet l'ultrason via le plafond et non via mon objet. Et mon objet en mouvement lui recoit toute les ultrasons. ( A ce moment la je les ferais émettre chacun leur tour (toute les 20ms par exemple) pour pouvoir traiter les données en sachant de quel capteur elle proviennent.

Enfin vous me direz qui me dit qu'à l'émission il ne vont pas avoir un temps de latence différents et donc faussez mes résultats.

Par ailleurs, si mon objet est positionner à 3-4m de l'émétteur, ne pourrais je pas utilisé la triangulation?

Sinon n'auriez vous pas un modèle qui émettent sur un angle plus important?

Merci.

Je me disais que je pouvais peut etre estimé le temps de latence lié a chaque composant de manière expérimentale.

Par exemple en utilisant le principe de la pyramide. Je met 4 tranceiver au plafond disposé en carré, et je met mon récepteur us a equidistance des quatre tranciever. En mesurant les temps je verrais bien la différence de temps entre les différentes réception et donc je pourrais estimé le temps de latence de 3 des composants par rapport à un autre. Après en connaissant la distance précisément et la vitesse de propagation de us dans le milieu ( en regardant humidité et température et en calculant la vitesse courante du son ) je pourrais estimer le temps de latence du premier et donc connaitre les temps de latences des quatres récepteur. Enfin c'est juste une idée je ne sais pas si c'est réalisable.

Désolé de redéranger, mais que pensais vous de l’utilisation du HRLV-MaxSonar- EZ

datasheet:http://www.maxbotix.com/documents/HRLV-MaxSonar-EZ_Datasheet.pdf

Votre approche ne me paraît pas jouable

La longueur des fils ca va créer sans doute des pbs de mesure.. (Si vous voulez des longs fils cela dit le moins cher c'est de prendre une rallonge téléphonique - vous avez 4 paires de fils de couleurs à l'intérieur de la gaine a un prix abordable et que vous trouverez dans toute bonne grande surface).

Ensuite il faut déclencher un ping pour que le composant de mette ensuite en attente de lecture donc il faut à tout prix que le ping du véhicule et celui des capteurs se fasse au même moment à la micro seconde près ... Comme votre véhicule est autonome et pas connecté au plafond ce n'est pas possible.

Si votre univers de déplacement est contraint (une pièce) - Si j'étais vous je regarderai plutôt du côté d'un capteur image au plafond avec une lentille grand angle couvrant la pièce. Vous accrochez une LED sur votre véhicule et une dans chaque coin de la pièce (si elle est rectangulaire) et lors de l'acquisition d'une trame image vous faites un filtre tout simple d'intensité (vous pouvez regarder openCV si vous voulez aller plus loin mais c'est plus gourmand en calcul)

Avec la cartographie d'intensité lumineuse vous avez un pixel du CMOS qui indique la position du véhicule etles 4 pixels des coins qui vous permettent de trianguler et en fonction de la résolution de votre capteur et des dimensions connues de votre pièce vous savez instantanément ou se trouve le véhicule.

Regardez les Shield basés sur du OV5642 (Arducam-M) ça se trouve pour une 40aine d'euros et délivre 5 Mega pixels, dans une interface SPI et il y a même une fonction hardware de contrôle du capteur où vous pouvez booster le contraste ou l'exposition ce qui fait que ce sera super simple de trouver les pixels brillants dans l'image reçue. Si des LEDS visibles dans la pièce ou sur le véhicule sont un pb vous pouvez avec le bon objectif transformer le capteur en capteur d'infrarouges

Suivant la précision souhaitée (et votre temps calcul dispo) vous pouvez faire du 640x480 à 60 images par seconde ou 1920x1080 à 30 ips. Si vous voulez les 5Megas pixels 2592x1944 vous aurez environ 15 images par seconde. En pratique comme vous allez faire du traitement il vaut mieux compter 5 images par seconde. Il y a même du code déjà prêt

Peut être une piste à explorer ?

Effectivement, cela me parrait être une bonne méthode.

J'avoue que la je ne sais plus sur quoi partir, vendredi j'étais à la limite de commander mais j'ai préférer attendre lundi pour ne pas regretter, maintenant je sens que je vais devoir repartir de zéro! ..

Je vous tiendrez au courant de mes choix et continuerais à vous posez des questions.

Merci pour votre aide.

OK

si vous prenez des images de 2592x1944 bien sûr c’est bcp trop de place pour un arduino de base donc il faudra lire et analyser au vol mais trouver un point brillant ce n’est pas trop difficile.

si vous avez une pièce de 5m sur 4m par exemple les 5m seront représentés par 2592 pixels et les 4m par 1944 pixels. donc à la louche vous avez un 1 pixel identifiant 2mm2 de votre scène. c’est quand même pas mal comme précision. une fois que vous avez trouvé les coordonnées des 5 pixels allumés “brillant” dans le flux de données arrivant depuis la caméra vous avez donc les coordonnées de coins de la pièce et les coordonnées du véhicule en “pixels”

Oui effectivement, mais j'ai peur de ne pas savoir faire du traitement de vidéo en temps réel ! Enfin ça doit s'apprendre !

Pour ne pas jeter mes idées d'avant directement , une autre petite questions.

Si j'équipe tous mes tranciever US du plafon d'un tranciever RF, je n'aurais plus besoin de grand fil, il serais tous indépendant, et la synchronisation se ferais avec les la réception de l'onde RF.
Du coup, dès que mes balises reçoivent un RF, ils émettent, et le traitement se fait sur l'objet en mouvement qui reçoit les différentes ondes US émises par les différentes balises aux plafond.

On pourrais les faire émettre à un intervalle de une seconde (méthode TDMA).

Sachant que l'objet peut être fixe quand je vais localiser, je n'ai pas besoin de connaitre tout le temps sa postion dans ma piece cubique de 4m^3.

Après, est ce que la réception des différentes onde RF aux plafonds peux vraiment permettre de bien synchroniser mes balises? La vitesses de propagation étant celle de la lumière, c'est plus le temps de traitement une fois l'onde RF reçu qui me fait peur.

J-M-L,

Concernant la technique de localisation par vidéo que vous m'avez conseillé d'explorer, je récupérer l'image je filtre pour avoir que les composantes d'intensité qui devrais forcément être plus élevé au niveau des LeDs, mais comment appliquer la triangulation avec cette méthode. Je ne vois pas étant donné que l'image ne me retournerais que l'intensité des pixels donc je serais les identifier sur l'image mais comment évaluer les distances entre les différentes Led. Dans un environnement 2D je ne verrais pas de difficulté mais en 3D comment faire pour évaluer la profondeur ( dans l'image) ou se situe mes LeDs.

Je ne sais pas si c'est clair formuler comme cela. Dites moi si vous ne m'avez pas compris.

Cette piste mérite d'être explorer car je peux me permettre de prendre juste une image. Je m'explique, j'ai besoin de me localiser que à un seul moment, donc je peux par exemple appuyer sur un bouton qui viendras allumer prendre une photo de la pièce (avec mes 5Leds dessus) et du coup traiter une seul image rapidement. Ce qui pourrais de même me faire baisser ma consomation d'énergie.

je n'avais pas compris que votre véhicule volait. je pensais qu'il restait au sol. en 3D ça ne fonctionnera pas à moins d'avoir aussi une caméra et des LEDs sur un mur aussi comme ça vous avez une vue de dessus et une vue de côté et ça vous donne la position dans l'espace.

pour l'approche par RF j'ai des doutes sur la possibilité de synchroniser exactement vos paires émetteurs/récepteurs d'ultrasons. Oui la RF se déplace vite mais vous codez des 0 et des 1 qui sont envoyés à une certaine vitesse en bauds.... .

Oui il faudrais mettre deux caméras une au plafond parralèle a l'axe z et une autre sur le mur parralèlle à l'axe x ou y.

Mais quand bien même, je veux bien appliquer un filtre qui me redonnerais la matrice d'intensité lumineuse dans laquelle l'identification est facile. Mais je ne vois pas comment après en extraire une notion de distance.

Comment vous feriez pour en extraire cette distance?

Quand a la synchronisation par RF, c'est ce qui est tout le temps utilisé pour des technologies de localisation par ultra son. Je pense que même si je met un baud peu élevé pour les synchroniser, je n'ai pas besoin d'envoyer beaucoup de donnée. Enfin je pense.
Ce qui me freine principalement c'est les temps de latence liée au composant capteur ultrason. Et même dans le code pour mon arduino j'aurais un temps de latence via les instructions (encore qu'il esst possible d'en tenir compte lors de l'élaboration du code et donc de rajouter ou d'enlever un nombre de tour d'horloge selon le nombre d'instructions en question.

une photo - surtout si vous confiture le capteur en noir et blanc en avec fort contraste - c’est simplement pour chaque pixel un niveau d’intensité lumineuse - un niveau de gris en gros. Les LEDs vont briller par rapport au reste de la pièce qui sera relativement uniforme.

Imaginons que vous soyez en résolution 2592x1944 pour l’appareil photo, en gros - Quand vous lisez les données d’une photo, vous recevez le flux de pixels en provenance de l’appareil et vous allez recevoir pour la ligne 0 les pixels 0, 1, 2, 3, 4, … 2591, puis passer à la ligne 1 et recevoir à nouveau les pixels 0, 1, 2, 3, 4, … 2591 de cette ligne et ainsi de suite jusqu’à la ligne 1943.

Pour chaque pixel reçu vous connaissez sa position x et y en pixels dans l’image et vous avez l’intensité. Comme vous avez mis des LEDs dans les coins de la pièce et sur le véhicule, vous allez conserver uniquement les (x,y) des points brillants - ceux dont le luminosité est au dessus d’une certaine valeur que vous allez décider par test et qui correspond à l’intensité de votre LED. Comme ça pas de pb de mémoire, c’est juste quelques octets à conserver, pas les 5 mega de l’image… Si c’est bien calibré, vous allez identifier 5 zone brillantes, 4 dans les coins de la photo — et celles là ne bougeront jamais puisque votre caméra est fixe et donc peuvent même être calculés une fois pour toute précisément (X1,Y1) (X2,Y2), (X3,Y3) et (X4,Y4) plus une zone / un point plus brillant quelque part ailleurs dans la photo aux coordonnées du Véhicule (Xv, Yv) .

Je suppose bien sûr que vous avez bien installé la caméra et que le plan de photographie de la caméra est bien parallèle au sol (donc pas d’effet de parallaxe - donc que le mobile ne s’approche pas trop de la caméra sinon la LED occupera bien sûr bcp plus de place sur la photo)

Vous pouvez mesurer dans la pièce en cm la distance séparant les LEDs des coins, ça va vous donner une échelle sur l’axe des X et des Y et ensuite par simple règle de 3 vous obtenez la position en cm Dx * (Xv - X1) / (X2-X1) dans le repère des 4 diodes des coins (ie celle en bas à gauche sera à la position (0,0)).

Idem sur les y.

Un petit schéma valant mieux qu’un long discours…

Le principe est le même pour l’autre axe et vous allez retrouver le Z pour la position dans l’espace.

Schéma très explicite! tout comme les explications. Par contre, il me faut une précision millimétrique!

Mais, pour moi il y a un petit bémol, vous me direz ce que vous en pensez:

Imaginon mon véhicule est à une haute Zv!=0. Mes Leds elles sont placé à Z=0, si je connais X1,Y1,X2,..Y4 sachant que Z1,2,3,4 est à zéro, comment pourrais je connaitre précisément (Xv,Yv).

Quoi que en l'écrivant, je me dis que peu importe l'altitude Zv, sur l'image qui sera selon l'axe z, la position du pixel du véhicule sera toujours la même! Du coup cela peut marcher.

Effectivement votre idée me plait beaucoup, je pense qu'elle est plus adapter à ma demande et de même plus simple à la réalisation!

Ne serait il pas plus judicieux de partir sur cela ?

Merci beaucoup JML, vous m'êtes d'une grande aide.

Quoi que en l’écrivant, je me dis que peu importe l’altitude Zv, sur l’image qui sera selon l’axe z, la position du pixel du véhicule sera toujours la même! Du coup cela peut marcher.

J’ai simplifié au dessus pour vous laisser faire des maths et de la géométrie :wink: - je ne vais pas tout résoudre pour vous, ce serait trop facile…

Bon alors au dessus on n’est pas tout à fait exact: si le plan de la caméra est bien parallèle au sol et que la caméra est suffisamment haut par rapport au mobile (en théorie infiniment loin pour que les rayons soient orthogonaux au sol) mais ce n’est pas vrai dans la vraie vie…

Mais la LED n’apparaitra pas comme un point selon le Z…

à nouveau un petit schéma cette fois ci plus réaliste:

2 LEDs sur le mobile peuvent permettre aussi de calculer la dimension perçue de l’objet volant par la caméra et donc sa proximité avec la caméra puisque vous connaissez la distance entre les 2 LEDs du véhicule en réel. (avec qu’une seule LED vous verrez une zone en surveillance, si le véhicule est au sol, vous aurez sans doute qu’un ou 2 pixels brillants alors que s’il est proche de la caméra vous aurez une zone plus large, ça vous donne une idée des dimensions).

(faudra sans doute aussi corréler avec l’autre photo qui vous redone aussi une position alors vous lisez X,Y avec la caméra du plafond et vous lisez Z (et à nouveau X ou Y selon le mur sur lequel vous installez la caméra) depuis la seconde caméra)

par contre précision mm ça sera difficile. Vous êtes directement limité par la précision du capteur photo. 1 pixel correspond à un certains nombres de mm2 suivant la résolution du capteur.

Comme mentionné plus haut, si vous avez une caméra 5 mega pixels pour 20m2 et que la caméra couvre toute la pièce alors vous aurez une précision de 200 000 mm2 / 5 000 000 = 0,4cm2 par pixel. ce n’est peut être pas suffisant pour votre besoin.