Probleme delay et capteur ultrasons

Bonjour à tous.
Je rencontre un probléme dans l’utilisation d’un capteur ultrasons a 3 fils (pin commun reception/emission).
Le soucis se situe au niveau du fait que lorsque j’intégre un delay supplementaire (pour moteurs ou servo par exemple) dans la boucle il augmente le temps utilisé par la boucle et de ce fait le temps entre les impulsions du capteur…
Probléme: repérage par le capteur trés long…
Voici le programme:

//Declaration des bibliotheques
#include <Servo.h>

// Declaration des  pins moteurs
const int SENS_MOT_1=7;    // sortie broche 7-->M1  sens moteur 1
const int VIT_MOT_1=6;    // sortie broche 6-->E1 PWM vitesse moteur 1
const int SENS_MOT_2=4;    // sortie broche 4-->M2 sens moteur 2
const int VIT_MOT_2=5;    // sortie broche 5-->E2 PWM vitesse moteur 2

//Declaration broche capteur ultrasons
const int SignalPin = 10; //Broche D2 emission reception du signal ultrason
//Declaration servomoteurs
Servo servoultrasons;
//Declaration des variables
int pos = 0;   //variable de position servo ultrasons


void setup() 
{
      
//Declaration des connecteurs servomoteurs
servoultrasons.attach (9);
      
// Declaration des  pins moteurs en sorties 
pinMode (SENS_MOT_1,OUTPUT); // Broche sensMoteur1 configurée en sortie
pinMode (VIT_MOT_1,OUTPUT); // Broche vitesseMoteur1 configurée en sortie
pinMode (SENS_MOT_2,OUTPUT); // // Broche sensMoteur2 configurée en sortie
pinMode (VIT_MOT_2,OUTPUT); // Broche vitesseMoteur2 configurée en sortie
}
//Attention sorties 4,5,6,7 reservées aux moteurs!

void loop() {
 //Partie gestion servomoteur sonar ultrasons
 for(pos = 50; pos < 130; pos += 1)  // goes from 0 degrees to 180 degrees 
  {                                  // in steps of 1 degree 
    servoultrasons.write(pos);              // tell servo to go to position in variable 'pos' 
    delay(15);                       // waits 15ms for the servo to reach the position 
  } 
  for(pos = 130; pos>=50; pos-=1)     // goes from 180 degrees to 0 degrees 
  {                                
    servoultrasons.write(pos);              // tell servo to go to position in variable 'pos' 
    delay(15);                       // waits 15ms for the servo to reach the position 
  } 

 long impulsionsignal, cm; //variable de durée du signal ultrasons et conversion en cm

 //La broche 7 est utilisée comme emetteur puis recepteur du signal ultrasons
 //Phase emission
  pinMode(SignalPin, OUTPUT);//Broche 7 en sortie pour envoi signal ultrasons
  digitalWrite(SignalPin, LOW);//Broche 7 niveau bas
  delayMicroseconds(2);
  digitalWrite(SignalPin, HIGH);//Broche 7 niveau haut/emission signal
  delayMicroseconds(5);
  digitalWrite(SignalPin, LOW);//Broche 7 niveau bas
//Phase reception
  pinMode(SignalPin, INPUT);//Broche 7 en entrée pour reception signal ultrasons
  impulsionsignal = pulseIn(SignalPin, HIGH);//Broche 7 niveau haut pour reception signal

 //Conversion signal/cm
  cm = microsecondsToCentimeters(impulsionsignal);
  
 //Gestion des moteurs droit et gauche
          //moteur 1
          if (cm<10 ) {    // si distance < 10cm
          digitalWrite(SENS_MOT_1, LOW);    // Marche arriere moteur 1
          analogWrite(VIT_MOT_1,127);    // impulsion PWM vitesse moteur 1 demie vitesse
          delay (1000);  
          }
          if (cm>=10 && cm<=20 ) {    // si distance comprise entre 10 et 20 cm
          digitalWrite(VIT_MOT_1,0);   // broche PWM au niveau bas = pas d'impulsion PWM
          }
           if (cm>20) {    // si distance > 20cm
          digitalWrite(SENS_MOT_1, HIGH);   // Marche avant  moteur 1       
          analogWrite(VIT_MOT_1,255);    // impulsion PWM vitesse moteur 1 pleine vitesse 
          }

          
          // moteur 2
           if (cm<10 ) {    // si distance < 10cm
          digitalWrite(SENS_MOT_2, LOW);    // Marche arriere moteur 2     
          analogWrite(VIT_MOT_2,127);    // impulsion PWM vitesse moteur 2 demie vitesse
          delay (1000);     
          }
          if (cm>=10 && cm<=20  ) {    // si distance comprise entre 0 et 10 cm
          digitalWrite(SENS_MOT_2, LOW);//Marche arriere moteur 2
          analogWrite(VIT_MOT_2,127);   // broche PWM vitesse moteur 2 demie vitesse  
          delay (1000); //rajoute un delay de 1s pour terminer la rotation de la base
          }
           if (cm>20 ) {    // si distance > 10cm
          digitalWrite(SENS_MOT_2, HIGH);    // Marche avant  moteur 2 
          analogWrite(VIT_MOT_2,255);    // impulsion PWM vitesse moteur 2 pleine vitesse */ 
          }
          }


long microsecondsToCentimeters(long microseconds)//Variable de conversion signal/cm
{
  /*La vitesse du son est de 340m/s ou 29 microsecondes par centimetres.
  Le signal va et vient et il convient de diviser le resultat par 2 pour obtenir la distance réelle*/
  return microseconds / 29 / 2;
}

Si quelqu’un a une idée,je prend volontier :roll_eyes:

Kevo18:
for(pos = 50; pos < 130; pos += 1) // goes from 0 degrees to 180 degrees
{ // in steps of 1 degree
servoultrasons.write(pos); // tell servo to go to position in variable ‘pos’
delay(15); // waits 15ms for the servo to reach the position
}

( 130 - 50 ) x 15 = 1200 ms, plus d’une seconde dans chaque boucle, c’est long (et bloquant).

Tu peux accélérer en allant de 10° en 10 ° avec pos += 10 par exemple

Merci Christian_R Aprés essai il s'avére que les battements du servomoteur de gauche à droite sont beaucoup trop rapides (çà s'affole un peu :~). J'ai même supprimé carrément la fonction concernant la rotation du servo mais il reste les delay nécessaires aux moteurs... Je peux en supprimer pas mal en revoyant mon programme de plus prés (commande simultané des 2 moteurs par exemple). J'ai pensé utilisé un capteur 4 fils (trigger et echo séparés) pour résoudre mon probléme... Comme le boucle de temps ne concerne que le signal emis je me dis que c'est peut être ma solution. Je reste à l'écoute de tous les avis :grin:

essaie en regroupant toutes les fonctions en ralation avec tes moteurs et tes servo dans une boucle if qui teste le laps de temps passé (avec millis() ) tant que ce laps de temps n'est pas concrétisé tu ne rentre pas dans cette boucle. Ensuite tu vires tout les delay() présent dans ces fonctions.

Pour autant que tous les delay() aient une valeurs égale, autrement tu fait comme indiqué, mais avec un if par valeur de temps désirée.

Merci Jean Francois.
A vrai dire je patauge un peu avec la fonction millis() :roll_eyes:
J’ai pensé gerer le capteur ultrasons plutot que le reste avec la fonction millis en utilisant ce petit programme :

Mais rien n’y fait…Et puis comme je ne comprend pas trés bien le programme j’ai du mal a l’adapter à mes besoins.
Je suis au passage passé à un capteur 4 fils (aucun intéret si ce n’est que d’utiliser une entrée en plus…)
Pour l’instant,j’en suis là:

//Declaration des bibliotheques
#include <Servo.h>


// Declaration des  pins moteurs
const int SENS_MOT_1=7;    // sortie broche 7-->M1  sens moteur 1
const int VIT_MOT_1=6;    // sortie broche 6-->E1 PWM vitesse moteur 1
const int SENS_MOT_2=4;    // sortie broche 4-->M2 sens moteur 2
const int VIT_MOT_2=5;    // sortie broche 5-->E2 PWM vitesse moteur 2

//Declaration broche capteur ultrasons
const int TrigPin = 10; //Broche D10 emission du signal ultrasons
const int EchoPin =11; //Broche D11 reception du signal ultrasons
//Declaration servomoteurs
Servo servoultrasons;
//Declaration des variables
int pos = 0;   //variable de position servo ultrasons


void setup() 
{ 
  Serial.begin(9600);
      
//Declaration des connecteurs servomoteurs
servoultrasons.attach (9);
      
// Declaration des  pins moteurs en sorties 
pinMode (SENS_MOT_1,OUTPUT); // Broche sensMoteur1 configurée en sortie
pinMode (VIT_MOT_1,OUTPUT); // Broche vitesseMoteur1 configurée en sortie
pinMode (SENS_MOT_2,OUTPUT); // // Broche sensMoteur2 configurée en sortie
pinMode (VIT_MOT_2,OUTPUT); // Broche vitesseMoteur2 configurée en sortie


}
//Attention sorties 4,5,6,7 reservées aux moteurs!

void loop() {
 

 long impulsionsignal, cm; //variable de durée du signal ultrasons et conversion en cm

 //La broche 7 est utilisée comme emetteur puis recepteur du signal ultrasons
 //Phase emission
  pinMode(TrigPin, OUTPUT);//Broche 10 en sortie pour envoi signal ultrasons
  digitalWrite(TrigPin, LOW);//Broche 10 niveau bas
  delayMicroseconds(5);
  digitalWrite(TrigPin, HIGH);//Broche 10 niveau haut/emission signal
  delayMicroseconds(5);
  digitalWrite(TrigPin, LOW);//Broche 10 niveau bas
//Phase reception
  pinMode(EchoPin, INPUT);//Broche 11 en entrée pour reception signal ultrasons
  impulsionsignal = pulseIn(EchoPin, HIGH);//Reception signal quand Broche 11 niveau haut
   
//Conversion signal/cm
  cm = microsecondsToCentimeters(impulsionsignal);
  Serial.print(cm);
  Serial.println("cm");
  
  delay(100);


  
 //Gestion des moteurs droit et gauche
          //moteur 1
          if (cm<30 ) {    // si distance < 30cm
          digitalWrite(SENS_MOT_1, LOW);    // Marche arriere moteur 1 et 2
          digitalWrite(SENS_MOT_2, LOW);
          analogWrite(VIT_MOT_1,90);    // impulsion PWM vitesse moteur 1 et 2
          analogWrite(VIT_MOT_2,90);
            
          }
          if (cm>=40 && cm<=50 ){     // si distance comprise entre 40 et 50 cm
          digitalWrite(SENS_MOT_2,LOW);//Marche arriére moteur 2
          analogWrite(VIT_MOT_1,0);   // broche PWM au niveau bas = pas d'impulsion PWM
          analogWrite(VIT_MOT_2,127); //Vitesse moteur 2
          }
           if (cm>50) {    // si distance > 50cm
          digitalWrite(SENS_MOT_1, HIGH);   // Marche avant  moteur 1 et 2
          digitalWrite(SENS_MOT_2, HIGH);     
          analogWrite(VIT_MOT_1,160);    // impulsion PWM vitesse moteur 1 et 2
          analogWrite(VIT_MOT_2,160); 
          }
          //Partie gestion servomoteur sonar ultrasons (Impossible pour probléme de delay)
/* for(pos = 50; pos < 130; pos +=1)  // goes from 0 degrees to 180 degrees 
  {                                  // in steps of 1 degree 
    servoultrasons.write(pos);              // tell servo to go to position in variable 'pos' 
    delay(15);                       // waits 15ms for the servo to reach the position 
  } 
  for(pos = 130; pos>=50; pos-=1)     // goes from 180 degrees to 0 degrees 
  {                                
    servoultrasons.write(pos);              // tell servo to go to position in variable 'pos' 
    delay(15);                       // waits 15ms for the servo to reach the position 
  } */
          
          }


long microsecondsToCentimeters(long microseconds)//Variable de conversion signal/cm
{
  /*La vitesse du son est de 340m/s ou 29 microsecondes par centimetres.
  Le signal va et vient et il convient de diviser le resultat par 2 pour obtenir la distance réelle*/
  return microseconds / 29 / 2;
}

J’ajoute que je souhaite utiliser une commande vocale via easyVR pour commander mon robot.
J’ai donc le programme sous la main(easyVR uniquement) mais je ne peux compiler l’ensemble (easyVR+capteur ultrasons) sans rencontrer de gros problémes les delay().
Bref,je suis en train de m’arracher les cheveux…Help!!
Si quelqu’un a un petit exemple a me donner en partant du programme plu haut et en ajoutant des delay() aux commandes moteur(par exemple) je veux bien. :grin:

Bon, je vais essayer de t'aider comme je peux :)

Si j'ai bien compris ton code, ton capteur (HC-SR04 ?) est monté sur un servo qui fait des aller/retour de 0-180° comme un radar. A chaque degrés/position tu contrôles la distance en cm ?

J'espere que je me plante pas :D

Bref, je te suggere 2 méthodes. Après avoir fais comme toi, le truc ultrason à la main, j'utilise au choix deux librairies : - la NewPing : https://code.google.com/p/arduino-new-ping/ - Ou la UltraSonic : http://wiki.tetrasys-design.net/HCSR04Ultrasonic

Avec la Newping, il y a un exemple d'interuption qui peut être intéressant pour toi...

J'ai comme projet un truc similaire, mais j'ai pas encore les servos ni les moteurs =(

Mais je vais le coder comme ça :

En interruption : la rotation du servo+contrôle distance. Le robot avance... Si dans les positions autour de 90° du servo/ultrason (donc pratiquement tout droit) -> mode ralenti Je regarde la ou il y a le plus de distance et je tourne jusqu'à ce que ma zone soit proche de 90° On peut ajouter un mode urgence quand on est proche d'un mur avec une petite marche arrière. Et on boucle...

Voilà en gros. Je vais bientôt le faire, je te donnerai des news.

Bon courage !

Salut ph3nix, Tu as bien compris le programme :D Je pense effectivement qu'il y a des solutions interessantes dans les liens que tu as mis (aprés les avoir rapidement survolés,j'avoue) Je bosse aussi sur un projet avec easyvr (reco vocale) et j'ai un peu mis celui-ci de coté mais je vais revenir trés vite dessus. Tiens moi au courant de l'avancé de ton montage et je fais de même de mon coté. Un grand merci en tous cas! A bientôt

ph3nix: Si j'ai bien compris ton code, ton capteur (HC-SR04 ?) est monté sur un servo qui fait des aller/retour de 0-180° comme un radar. A chaque degrés/position tu contrôles la distance en cm ?

Aller de 1° en 1° avec un capteur qui a un champ de 15° c'est peut être un peu exagéré. Tu pourrais avoir un pas un peu plus grand.