Mesures de distances -Ultra son- HC-SR04

Bonjour;
J'utilise un détecteur ultra son HC-SR04. mesure max de 5m.
Je l'exploite via la bibliothèque <newPing.h> commenté chez arduino.cc.

Je rencontre un problème de fiabilité de mesures.
A partir d'environs 1.2m le retour de mesure est faussé avec des écarts de plus de 10 cm voir 50cm parfois.
Si la distance a mesurer atteint plus de 1.4m le retour mesuré est incohérent alors que aucun objet se trouve a cette distance.
il reste très stable et précis sous 1m de détection sauf que Je fait mes tests avec un carton. Quant j'oriente la face du carton vers la droite ou la gauche je perd la mesure réel et j'obtiens un retour faussé. (même sous 1m). Le signale retourne seulement à 90°??
Le capteur est dit précis au millimètres mais fait des bon de 1cm a la lecture.

Malgré une tentative d’amortissement de mesure et de filtre rien ne change.
J'ai même essayé le filtre medium de la bibliothèque = négatif.

Après de long jours de recherche et contrôle je souhaiterais avoir des retours d’expérience de personnes ayant utilisé ce capteur. Car je commence à douter de la fiabilité du module.

Pour ceux qui voudrais essayer!

/*But du programme.
   Version 01) Afficher =>  Via <NewPing.h> la distance mesuré par le capteur ultra-son sur le moniteur serie .
               => Problemede stabilité mesures;
           02) Mettre en place la fonction MESURE_US_Ping.
               => Problemede stabilité mesures;
           03) Mettre en place la fonction d'amortissement DAMPING.+> filtrage des rebonds aléatoir ou incohérants.
               => Problemede stabilité mesures;
          
Materiels:   Capteur ultra-son HC-SR04.
             Carte arduino UNO.  

 Note utiles: Câblages des broches.
  | Arduino    | HC-SR04 |
  | ---------  | -----------
  | Pin (12)    => Echo.      Retour de la valeur mesuré.
  | Pin (11)    => Trig.      Lancement des puls de mesures. 
    Pour plus de details -HC-SR04- https://www.google.fr/search?q=hc-sr04+datasheet&ie=utf-8&oe=utf-8&gws_rd=cr&ei=UbthVZPSIIz_UK-egJAI
    
*/
//-------------------HC-RS04----------------------
#include <NewPing.h> // Biblioteque d'exploitation du ping de brochages.
#define echo 12 // Definition de la broches Echo.
#define trig 11 // Definition de la broche Trig.
NewPing US (11,12,500);//NewPing Nom_Variable (broche_trig, broche_echo, distance du ping a defaut 500cm) 

//------------------Tableaux utiles---------------
int mes [5] = {};//Tableau de releve de mesures.
int flt [5] = {};////Tableau de comparaisons.

void setup() {
 Serial.begin (115200);//Ouverture d'une liaison serie pour affichage de la mesure.

}//Fin de setup;

void loop() {
  
 mesure_US_00();//Traitement de la mesure.
 damping_02();//Filtre des retours de mesures.   
 
 //Serial.println(" ");
 //delay(1000);
 //while(1);
          


}//Fin de LOOP

/*Fonction mesure_US version 00. ==> mesure_US_00()
Notes utiles: -Ouvrire la bibliotheque <<NewPing.h> dans le programme principale.
              -Déclarer les broches pour l'utilisation de <NewPing.h>dans le programme principale.
              
Probleme rencontré => lecture aleatoire a partire de 1 metre +> revoir le mode d'acquisition mesure.
*/

void mesure_US_00(){
  int i = 0;
  
//----Réalise une premiere mesure qui sert de référence de comparaison avec les cinq prochaines. 
  //Serial.print ("Mesures: ");
   int Dist = US.ping();//Demande de lecture.
   //delayMicroseconds();
   int mesures = Dist/58;//mise a l'echelle.
   mes[0] = mesures;//Remplissage de la valeur de reference.
   //Serial.print(mes[0]); Serial.print (" ");//Visu de la mesure ref.
   //Serial.println (" ");
 
//----Réalise les cinq mesures utiles a la comparaison. 
for(i=1; i<=4; i++){ //Boucle d'integration des cinq mesures utiles au filtre
 int Dist = US.ping();//Demande de lecture.
 delayMicroseconds(60);
 int mesures = Dist/58;//mise a l'echelle.
 mes[i] = mesures;//Remplissage du tableau "mes" des relevés de mesures.
  //Serial.print(mes[i]); Serial.print (" ");//Visu des cinq mesures.
 }//fin de for.
 //Serial.println (" ");
 //delay(100);
}//Fin de fonction

Merci de votre intérêt.

manumanu:
Bonjour;
J'utilise un détecteur ultra son HC-SR04. mesure max de 5m.
Je l'exploite via la bibliothèque <newPing.h> commenté chez arduino.cc.

Je rencontre un problème de fiabilité de mesures.
A partir d'environs 1.2m le retour de mesure est faussé avec des écarts de plus de 10 cm voir 50cm parfois.
Si la distance a mesurer atteint plus de 1.4m le retour mesuré est incohérent alors que aucun objet se trouve a cette distance.
il reste très stable et précis sous 1m de détection sauf que Je fait mes tests avec un carton. Quant j'oriente la face du carton vers la droite ou la gauche je perd la mesure réel et j'obtiens un retour faussé. (même sous 1m). Le signale retourne seulement à 90°??
Le capteur est dit précis au millimètres mais fait des bon de 1cm a la lecture.

Malgré une tentative d’amortissement de mesure et de filtre rien ne change.
J'ai même essayé le filtre medium de la bibliothèque = négatif.

Après de long jours de recherche et contrôle je souhaiterais avoir des retours d’expérience de personnes ayant utilisé ce capteur. Car je commence à douter de la fiabilité du module.

Pour ceux qui voudrais essayer!

/*But du programme.

Version 01) Afficher =>  Via <NewPing.h> la distance mesuré par le capteur ultra-son sur le moniteur serie .
              => Problemede stabilité mesures;
          02) Mettre en place la fonction MESURE_US_Ping.
              => Problemede stabilité mesures;
          03) Mettre en place la fonction d'amortissement DAMPING.+> filtrage des rebonds aléatoir ou incohérants.
              => Problemede stabilité mesures;
         
Materiels:  Capteur ultra-son HC-SR04.
            Carte arduino UNO.

Note utiles: Câblages des broches.
  | Arduino    | HC-SR04 |
  | ---------  | -----------
  | Pin (12)    => Echo.      Retour de la valeur mesuré.
  | Pin (11)    => Trig.      Lancement des puls de mesures.
    Pour plus de details -HC-SR04- hc-sr04 datasheet - Google Search
   
*/
//-------------------HC-RS04----------------------
#include <NewPing.h> // Biblioteque d'exploitation du ping de brochages.
#define echo 12 // Definition de la broches Echo.
#define trig 11 // Definition de la broche Trig.
NewPing US (11,12,500);//NewPing Nom_Variable (broche_trig, broche_echo, distance du ping a defaut 500cm)

//------------------Tableaux utiles---------------
int mes [5] = {};//Tableau de releve de mesures.
int flt [5] = {};////Tableau de comparaisons.

void setup() {
Serial.begin (115200);//Ouverture d'une liaison serie pour affichage de la mesure.

}//Fin de setup;

void loop() {
 
mesure_US_00();//Traitement de la mesure.
damping_02();//Filtre des retours de mesures.

//Serial.println(" ");
//delay(1000);
//while(1);

}//Fin de LOOP

/*Fonction mesure_US version 00. ==> mesure_US_00()
Notes utiles: -Ouvrire la bibliotheque <<NewPing.h> dans le programme principale.
              -Déclarer les broches pour l'utilisation de <NewPing.h>dans le programme principale.
             
Probleme rencontré => lecture aleatoire a partire de 1 metre +> revoir le mode d'acquisition mesure.
*/

void mesure_US_00(){
  int i = 0;
 
//----Réalise une premiere mesure qui sert de référence de comparaison avec les cinq prochaines.
  //Serial.print ("Mesures: ");
  int Dist = US.ping();//Demande de lecture.
  //delayMicroseconds();
  int mesures = Dist/58;//mise a l'echelle.
  mes[0] = mesures;//Remplissage de la valeur de reference.
  //Serial.print(mes[0]); Serial.print (" ");//Visu de la mesure ref.
  //Serial.println (" ");

//----Réalise les cinq mesures utiles a la comparaison.
for(i=1; i<=4; i++){ //Boucle d'integration des cinq mesures utiles au filtre
int Dist = US.ping();//Demande de lecture.
int mesures = Dist/58;//mise a l'echelle.
mes[i] = mesures;//Remplissage du tableau "mes" des relevés de mesures.
  //Serial.print(mes[i]); Serial.print (" ");//Visu des cinq mesures.
}//fin de for.
//Serial.println (" ");
//delay(100);
}//Fin de fonction





Merci de votre intérêt.

Le micro émetteur n'émet pas un flux d'ultrasons directif et cylindrique. Il émet un cône.
Plus la distance augmente plus la section du cône augmente et plus la mesure est sensible à des réflexions sur divers objets.

Le module fonctionne ainsi :
Il reçoit un ordre pour déclencer une mesure (Trig).
Il envoie un train de 8 périodes de 40 kHz dans le "micro" émetteur.
Comme résultat de mesure il envoie un signal 1L dont la longueur est égale au temps mis par l'onde sonore pour frapper l'objet, s'y réfléchir et atteindre le "micro" détecteur.

Le travail de la librairie consiste à calculer un temps avec la fonction pulseIn().
La seule chose à connaître est que la vitesse moyenne du son dans l'air est de 348 m par seconde.

Pour la précision de mesure il n'y a pas que l'environnement extérieur qui intervient.
Le module délivre une information de temps mais il est sensible il n'est pas insensible au niveau de puissance reçue.
Plus on s'éloigne, plus le cercle d'émission s'élargi. La puissance à l'émission étant constante de puissance par unité de surface diminuera.

Même si les US sont faiblement atténués dans l'air un objet de surface 10 cm2 situé à 1 m renverra plus d'énergie que le même objet situé à 3 m.

Un carton orienté de traverse se comporte vis à vis des ultrasons un peu comme un miroir avec de la lumière, il va réfléchir mais pas vers le capteur.

La précision "au millimètre" me semble illusoire avec ce capteur.

Bonjour et merci a vous;
j'ai fait des essais suivant vos infos car je comptais réaliser un petit robot autonome en déplacement -histoire d'amuser mes petits- mais je réalise qu'avec de petit obstacle (surface) comme des pieds de chaises je risque la collision.

Il est vrais que j'ai été borné sur l'utilisation de la même bibliothèque. J ai donc chercher une autre.
Et j'ai trouver via snootlab <Ultrasonic.h> je viens de le testé et la fiabilité est plus grande = la mesure reste constante sans trop d'écarts à 1.4m. Mais un objet (carton 400/400) oblique situé à 25cm dans l'axe de visée est mesuré à 91cm.

Je peut donc conclure que si celui ci se dirige vers un obstacle orienté avec un certain angle ou trop petit il vas lui rentré dedans.

En fait le problème est comment commander un arrêt dans cette configuration??

Faudrait que j'ajoute un autre moyenne pour détecter les objets a proximité.

manumanu:
...
Le capteur est dit précis au millimètres mais fait des bon de 1cm a la lecture.

Bonjour
precision garantie au mm , tres surement pas :sunglasses:
La velocité du "son" dans l'air est dependant "aussi" de facteurs qui ne sont là absolument pas pris en compte (en vrac T° P° et ... autres )
il ne faut pas esperer mieux en environnement "courant" que le cm à +/-0.5 (et encore :sunglasses: ) avec un HC-SR04

pour revenir à la lib , je ne la connais pas
perso j'utilise de l'interruption , j'ai encore installé semaine derniere un SR04 en detecteur d'approche (auto rentrant dans un garage) et entre ~ 2.5m et 5 cm le rendu d'info est tres coherent.

Bonjour et merci Artouste.

Que veux tu dire par interruption ? activation de broche tout ou rien?

Récemment, je suis tombé là dessus :
https://code.google.com/p/arduino-new-ping/
Les retours semblaient positifs....

manumanu:
Bonjour et merci Artouste.

Que veux tu dire par interruption ? activation de broche tout ou rien?

bonsoir
un truc simple
genre ça à adapter

#define broche_Trig 4
#define broche_Echo 3 // interupt 1 sur uno 
unsigned long debut_ping = 0;
const double k_Mach = 29.412;
byte distance;
bool en_attente = false;
void setup() {
  pinMode(broche_Trig, OUTPUT);
  pinMode(broche_Echo, INPUT);
  Serial.begin (115200);
}

void loop() {
  
  if(en_attente == false) {
    delay(100);
    digitalWrite(broche_Trig, HIGH);
    delayMicroseconds(10);
    digitalWrite(broche_Trig, LOW);
    attachInterrupt(1, echo_R, RISING);
    en_attente = true;
    }
}

void echo_R(){
    debut_ping = micros();
  detachInterrupt(1);
  attachInterrupt(1, echo_terminee, FALLING);

}  

void echo_terminee(){
  
  distance = ((0.5/ k_Mach) * (micros() - debut_ping));//f(x) = ax
  
  if (!(distance >= 300 || distance <= 0)){
     
    Serial.print(distance);
    int nbt=distance/5;
    Serial.print(" ");
    
    for (int i=0; i <= nbt; i++){
      Serial.print("_");
      
   } 
  Serial.println();  
  }
  
  detachInterrupt(1);
  en_attente = false;
 
}

Bonjour et merci tahitibob35 et Artouste.

tahitibob35 <newPINg.h> est justement la bibliothèque que j'utilise.

Artouste Je découvre ce que sont les interruptions, un outils qui vas être utile pour le développement de mon projet.
J'ai essayé ton programme et j'ai toujours le même problème de stabilité de mesures au delà de 1,4m.
Peut-être a cause de l'environnement de mon salon.

-suite a tout les retours que j'ai eu plus les tests réalisés- je reconsidère mon projet de robot.
=> L’orientation des obstacles pose problème.
=> L’éloignement et l’environnement peut être perturbant et faussé la mesure.
Êtes vous d'accord avec ça?

En gros j'ai besoins que celui ci ne fonce pas dans les obstacles et qu'il les détectes de manière fiable a une distance mini de 15cm=> Je doit donc travailler a minima. (j'ai été borné sur les 5m hypothétique)
Inutile de détecter loin car l'utilité est la proximité. (j'en ai mis du temps ...)
De plus la détection est très fiable a partir de 1m -a condition que l'objet soit de face-

Je suis donc entrain de chercher et me renseigner sur d'autres capteurs avec un mode de détection différents(ex. IR) plus fiable sur des obstacles orienté de divers façons et qui ne prennent en compte que ce qui se trouve sur un axe bien précis. Ce dernier sécurisera des mesures faussés.
Je mettrais en corrélation les deux capteurs pour valider une commande de mouvements.

Merci encor!