Localisation d'un robot par ultrasons

Bonjour,

Je suis actuellement entrain de concevoir un robot et j'aimerais qu'il puisse se repérer à l'aide d'ultrasons.
Le principe serait d'avoir trois récepteurs fixes(connectés à une première carte arduino) et un émetteur positionné sur le robot(connecté à une autre carte arduino), on en déduit alors les distances séparant les récepteurs à l'émetteur, et ainsi sa position.

Un peu naïf, j'ai acheté des modules HC-SR04, (sans s'avoir qu'on ne pouvait recevoir que si le module avait déjà émis), dont j'ai déssoudé l'émetteur pour trois d'entre eux.
L'idée est donc de "feinter" le module en envoyant l'onde depuis un autre module.

Mais pour se faire, je dois synchroniser les deux modules. J'utilise alors des modules bluetooth. Mais la synchronisation ne se passe pas tout a fait comme prévu(je crois).

En effet, à partir de ces deux codes :
Code récepteur :

#include <SoftwareSerial.h>
SoftwareSerial slave(10, 11); 
//int testVar = 0;
//
#define trigPin 5      
#define echoPin 4      
#define avertisseur 13 
#include <stdlib.h>
void setup()
{
    // j'ai augmenté les différents baudRate pour accéler la transmission de données
    
    
    Serial.begin(57600);
    
    
    slave.begin(115200);
    pinMode(trigPin, OUTPUT);  
    pinMode(echoPin, INPUT);   
    pinMode(avertisseur, OUTPUT); 
    
//    
}
void loop() {
  
  long duree,distance,sommeDistance;
  int nbMesures;
  int t1,t2;
  String car;
  sommeDistance = 0;
  int flag =0,envoi =0;
 
 String chaineReception=""; 
  int comptImpulsion = 0;
  String tpsMaster;
  long tpsSlave,tpsMasterLong,tpsDechlenche;
  char char_envoi;
  while (slave.available()>0) 
    { // Si l'émetteur nous avertit qu'il va envoyer une onde
      // On fait "semblant" d'envoyer une onde depuis le recepteur (dont le hp à été déssoudé)
      digitalWrite(trigPin,LOW);
      digitalWrite(trigPin,HIGH);
      delayMicroseconds(10);
      digitalWrite(trigPin,LOW);
      duree = pulseIn(echoPin,HIGH);

      distance = 340*duree/1000;
      Serial.print(distance);
      Serial.println(" mm");
      Serial.print(duree);
      Serial.println(" microsecondes");
      while(slave.available()) // on vide le buffer 
      {
        char t =slave.read();
        
      }
    }
    
}

Code Emetteur

#include <SoftwareSerial.h>

SoftwareSerial master(8, 7); // (RX, TX) (pin Rx BT, pin Tx BT)
#define trigPin 5      
#define echoPin 4       
#define avertisseur 13 

int envoi =0 ;
char char_envoi;
int premierCarac = 1;
void setup()
{
   
    Serial.begin(57600);
    
    
    master.begin(115200);
   
    
    
    pinMode(trigPin, OUTPUT);  
    pinMode(echoPin, INPUT);  
    pinMode(avertisseur, OUTPUT); 
    
}
void loop()
{
  int comptImpulsion =0;
// On envoie sur la voie série pour signaler l'émission US.
  master.println(0);
  comptImpulsion =0;
  // Envoi de l'onde
  digitalWrite(trigPin,LOW);
  digitalWrite(trigPin,HIGH);
  delayMicroseconds(10);
  digitalWrite(trigPin,LOW);
  // On recommence une seconde plus tard
  delay(1000);
  
}

,j'ai pas mal de soucis:

-avec ce code, le récepteur ne reçoit pas l'onde (elle est passé avant qu'il n'écoute).
-Lorsque je rajoute un délai dans le code de l'émetteur (déterminé empiriquement), l'émetteur reçoit bien l'onde mais ne calcule pas la bonne distance, mais le gros problème est que la distance calculée varie énormément d'une impulsion à une autre ( plus de 10m de différence).

J'aimerais donc savoir si il est possible de mieux synchroniser des arduinos,et si cette technique de localisation est finalement envisageable ( j'ai fait pas mal d'essais infructueux).

Je pense que tu aurais plus vite fait de mettre des réflecteurs sur les trois repères fixes et de mesurer les trois distances avec le HC-SR04

C'est une idée à peu près viable.
Mais comment gérer le cas où un obstacle réfléchit mieux les US que les 3 réflecteurs? (si le robot se déplace dans une pièce habitée, ce n'est pas irréalisable; dans un atelier, un terrain bien dégagé, c'est improbable)

Bonjour

Je vais aussi rencontrer une question similaire d'ici peu, à savoir la localisation d'un robot dans un plan de l'ordre du m avec une precison de l'ordre du cm (voir moins). Pour l'instant, j'en suis au stade de la réflexion uniquement.

Tout d'abord je pense que ton problème vient des delais de transmission et de traitement d'information de bluetooth et d'arduino, en non d'une impossibilité liée la physique. C'est bon signe, c'est beaucoup plus facile à résoudre.

Je pensais aussi partir sur un système à trois points.

Le problème avec les detecteurs à ultrasons en réflexion, c'est qu'ils sont directionnels (anisotrope). Pour que ça marche, il faut que le detecteur soit dans l'axe de son réflecteur fixe. Ce qui implique de pouvoir orienter le robot face à chaque détecteur(pourquoi pas une tête tournante sur un servomoteur) et connaitre son orientation(pourquoi pas en utilisant le champ magnetique terrestre ou autre avec une sonde a effet hall). C'est sans doute possible mais assez compliqué.

Du coup, je pense me diriger vers un système où le signal est (plus) isotropique (dans toutes les directions) mais dont la puissance varie avec la distance. C'est le cas de beaucoup de signaux physique : le son (donc les ultrasons), la lumière, le champ magnétique... La question est de trouver un signal dont la distance d'atténuation est compatible avec le déplacement de ton robot. J'avoue être attirée par l'utilisation des électroaimants, mais j'ai peur que la portée du champ soit trop faible.

Sinon, avec des sons/ultrasons, il faudrait (dans mon esprit du moins):

  • 3 émetteurs placés dans la pièce et pilotable à distance
  • 1 ou plusieurs récepteurs sur le robot, si le récepteur est trop anisotrope
    Les émetteurs ou les récepteurs peuvent être de simple haut parleur ou piezo de récupération. Les vieux téléphones fixes sans fils peuvent t'en fournir plusieurs.
  1. Tu ordonnes à l'émetteur 1 d'émettre
  2. L'émetteur émet, tu mesures l'intensité de la réponse (le volume sonore)
  3. A partir d'une calibration (en général en r cube) tu obtiens une distance.

Encore une fois, ce n'est qu'une ébauche de réflexion en cours. C'est toujours plus facile sur le papier. Je suis ouverte (et à la recherche) de toute alternative ou commentaire sur la faisabilité ce projet.

Bonjour et merci pour vos réponses.
J'aimerais conserver l'idée d'émetteur/récepteur séparés car il n'est pas garanti qu'il n'y ait pas d'obstacles sur lequel le signal pourrait rebondir entre un récepteur et émetteur.
Je pense qu'avec une synchronisation et un émetteur distinct d'un récepteur, l'onde traversera l'obstacle et en négligeant la différence de vitesse dans le milieu traversé,qui aura tout au plus une dizaine de cm d'épaisseur , ça devrait passer .

Fantoche:
Tout d'abord je pense que ton problème vient des delais de transmission et de traitement d'information de bluetooth et d'arduino, en non d'une impossibilité liée la physique. C'est bon signe, c'est beaucoup plus facile à résoudre.

Ca me rassure en effet, mais n'existerait-il pas des fonctions plus efficaces que celle que j'ai utilisé, (je ne sais pas si Serial.available est vraiment très efficace par exemple), pour optimiser le processus ?

Concernant le calcul de distance à partir de l'atténuation, pense-tu que pour une pièce d'1m l'atténuation sera mesurable ?

Et mis à part le bluetooth existe-t-il des manières plus simples de synchroniser (à une dizaine de microsecondes près) deux cartes arduinos entre elles ?

En tout cas merci pour vos réponses =)

Il me semble avoir vu un topic similaire récemment sur le forum, dans lequel Al1fch avait préconisé d'utiliser des beacons bluetooth. S'il passe par ici, il pourra en dire plus...

Je pense qu'avec une synchronisation et un émetteur distinct d'un récepteur, l'onde traversera l'obstacle et en négligeant la différence de vitesse dans le milieu traversé,qui aura tout au plus une dizaine de cm d'épaisseur , ça devrait passer .

Pour ce qui concerne la différence de vitesse et donc de durée de la traversée, ça se discute. De mémoire, la vitesse d'un son dans un milieu dépend directement de sa dureté. Je suppose que si tu traverses un corps mou (un humain), ce sera moins perturbé qu'un corps dur (béton, métal).
C'est pour ça qu'il faudrait mieux choisir un signal physique qui traverse tes milieux sans être trop perturbé (magnetique, onde radio)

Concernant le calcul de distance à partir de l'atténuation, pense-tu que pour une pièce d'1m l'atténuation sera mesurable ?

C'est tout à fait possible. Si tu colles ton oreille à un haut parleur (ne pas tester) tu entends un son beaucoup plus fort qu'à un mètre du haut parleur.
Avec deux haut parleurs et un circuit minimaliste tu devrais pouvoir tester facilement

Les marins savent, depuis quelques siècles, se localiser avec 3 phares.... sans avoir d'info de distance.

J'aime beaucoup cette idée. Mais je ne pense pas que les leds soient de bonnes solutions (perturbation par la lumière ambiante, obstacle qui bouche la vue). Peut-être qu'un système avec trois emetteurs ultrasons à trois fréquences différentes fonctionnerait sur le même principe ?

Bonsoir

au message #5 lesept a écrit :

Il me semble avoir vu un topic similaire récemment sur le forum, dans lequel Al1fch avait préconisé d'utiliser des beacons bluetooth. S'il passe par ici, il pourra en dire plus...

Il me semble avoir évoqué les balises BLE pour de la détection de proximité , pas pour de la triangulation. On n'a accès qu'à une simple estimation de distance.
Très insuffisant pour bâtit la dessus une triangulation précise.

Par contre une 'piste' BluetoothBLE est en vue avec le Bluetooth 5.1 qui intègre une nouvelle fonctionnalité de "détection de la direction des signaux." , "Direction Finding"

https://3pl46c46ctx02p7rzdsvsg21-wpengine.netdna-ssl.com/wp-content/uploads/Files/developer/1903_RDF_Technical_Overview_FINAL.pdf

Nous aurons probablement bientôt des modules BlueTooth BLE T 5.1 dotés de nouvelles commandes AT permettant d'accéder à cette fonctionnalité 'Direction Finding"
Ce sera sans doute en courte portée , quelques mètres.

MorelE:
Je pense qu'avec une synchronisation et un émetteur distinct d'un récepteur, l'onde traversera l'obstacle et en négligeant la différence de vitesse dans le milieu traversé,qui aura tout au plus une dizaine de cm d'épaisseur , ça devrait passer .

L'onde a très peu de chance de traverser l'obstacle.
Les impédances acoustiques feront que la réflexion sera totale au niveau de l'interface air/obstacle.
Et c'est bien comme cela que fonctionnent les télémètres à ultrasons.
Dis toi bien que si dans les échographies les radiologues utilisent du gel spécial c'est bien parce que naturellement à l'interface sonde_US/ peau la réflexion est totale.

Bonjour,et tout d'abord toutes mes excuses pour cette réponse un peu longue...
Les modules Bluetooth BLE semblent super intéressant mais je n'en avais jamais entendu parler.
Si je comprends bien avec de nouveau modules Bluetooth je pourrais directement avoir accès à la direction du signal envoyé ?
Avez-vous une idée de quand seront-ils disponibles ?
Je vais essayer de me renseigner.

Sinon j'ai découvert un problème plus fondamental que la transmission ultrasons: j'ai juste synchronisé mes deux arduinos en Bluetooth, enfin tester cette synchronisation.
Du fait de la vitesse des ultrasons il faudrait qu'elles soient synchronisées à la dizaine/centaine de microsecondes près (ce qui donnerait une précision théorique de 0.3cm/3cm), mais lorsque je n'arrive pas à faire mieux qu'une synchro à la milliseconde près ce qui donne une précision insuffisante.
pensez-vous qu'il est possible de faire mieux ou suis-je limiter par les arduinos/ les modules bluetooths ?

Bonjour

Si je comprends bien avec de nouveau modules Bluetooth je pourrais directement avoir accès à la direction du signal envoyé ?

Oui, avec la version 5**.1** du Bluetooth BLE

Disponibilité ? Aucune idée
Voici le site d'un fabricant de modules BT variés (entre autres le célèbre HM-10) à ce jour il en est à la version 5.0
.... à suivre
(Ce fabricant semble utiliser essentiellement des puces Texas Instruments (CC....) , peut être faut-il attendre que TI sorte une puce BT BLE 5.1 comme l'a déjà fait Nordic Semiconductor avec le nRF52811)

http://jnhuamao.cn/bluetooth.asp?id=1