Gérer fonctionnement de capteurs ultrasons

Bonjour à tous,

Ma question va sûrement vous paraître toute bête… Est-il possible de commander le fonctionnement d’un capteur ultrason (modèle SRF05) ?

Voici mon petit bout de code pour lancer les mesures :

#define ECHO_PIN      11  // broche ECHO du SRF05 sur D11
#define TRIGGER_PIN   12  // broche TRIGGER du SRF05 sur D12

void setup() {
  pinMode(ECHO_PIN, INPUT);     //pin analogique
  pinMode(TRIGGER_PIN, OUTPUT);  //pin classique

} 

void loop() {
// déclenchement de la mesure
    digitalWrite(TRIGGER_PIN, HIGH);    // signal TRIGGER à l'état HAUT (5V)
    delayMicroseconds(12);              // durée de l'état haut = 12 microsecondes
    digitalWrite(TRIGGER_PIN, LOW);     // signal TRIGGER à l'état BAS (0V)
}

D’après ce code je pensais donc que pour stopper la mesure j’utilisais tout simplement “digitalWrite(TRIGGER_PIN, LOW)” mais je viens de tester et ça ne marche pas.

Dans mon projet commander la mesure des capteurs me servira à lancer une mesure tour à tour de 3 capteurs. Ainsi, si je les oriente dans une direction un peu près semblable, je n’ai pas de risque que le récepteur d’un capteur reçoive le signal d’un autre.

Merci par avance pour votre aide !

Bonjour,
Essaye ceci

void loop() {
// déclenchement de la mesure
    digitalWrite(TRIGGER_PIN, HIGH);    // signal TRIGGER à l'état HAUT (5V)
    delayMicroseconds(12);              // durée de l'état haut = 12 microsecondes
    digitalWrite(TRIGGER_PIN, LOW);     // signal TRIGGER à l'état BAS (0V)
   delayMicroseconds(12);              // durée de l'état bas = 12 microsecondes <<<<<<<<<<<<<<<<
}

Dans ton code après digitalWrite(TRIGGER_PIN, LOW); tu passes immédiatement digitalWrite(TRIGGER_PIN, HIGH); à cause de la boucle

Bin c'est sur que si tu le laisses comme ça la boucle boucle et donc l'histoire se répète ... Si tu écris ça :

void loop() {
// déclenchement de la mesure
    digitalWrite(TRIGGER_PIN, HIGH);    // signal TRIGGER à l'état HAUT (5V)
    delayMicroseconds(12);              // durée de l'état haut = 12 microsecondes
    digitalWrite(TRIGGER_PIN, LOW);     // signal TRIGGER à l'état BAS (0V)
delay(10000);
}

il n'y aura qu'une émission toutes les 10s

Tout d’abord merci pour vos réponses aussi rapides !

Mon code n’est pas exactement comme ça, en fait ce que je veux faire c’est actionner le deuxième capteur puis le troisième en fonction de la valeur du premier !

J’avais déjà essayé de rajouter des délai à droite à gauche et sans succès :confused:

Si elle est inférieur à une certaine valeur alors, je veux stopper momentanément ce capteur pour lancer la mesure du second puis du troisième.

Ici par exemple, j’essaye d’allumer des leds tout simplement en fct des capteurs :

#define ECHO_PIN1      11  // broche ECHO du SRF05 sur D11
#define TRIGGER_PIN1   12  // broche TRIGGER du SRF05 sur D12
#define ECHO_PIN2      10 
#define TRIGGER_PIN2   13
#define ECHO_PIN3      9
#define TRIGGER_PIN3   8

int Led = 7;
int Led1 = 4;
int Led2 = 2;

unsigned long echoPulseTime1 = 0;   // durée du signal ECHO en microsecondes
unsigned long echoPulseTime2 = 0;
unsigned long echoPulseTime3 = 0;


void setup() {
// configuration des E/S numériques de la carte Arduino
  pinMode(ECHO_PIN1, INPUT);     // la broche ECHO de la carte est une entrée numérique
  pinMode(TRIGGER_PIN1, OUTPUT); // la broche TRIGGER de la carte est une sortie numérique 
  pinMode(ECHO_PIN2, INPUT);    
  pinMode(TRIGGER_PIN2, OUTPUT);
  pinMode(ECHO_PIN3, INPUT);     
  pinMode(TRIGGER_PIN3, OUTPUT);
  pinMode(Led, OUTPUT);
  pinMode(Led1, OUTPUT);
  pinMode(Led2, OUTPUT);
  
  // initialisation du port série à 115200 bauds
  Serial.begin(9600);
} 

void loop() {
// déclenchement de la mesure
    digitalWrite(TRIGGER_PIN1, HIGH);    // signal TRIGGER à l'état HAUT (5V)
    delayMicroseconds(12);              // durée de l'état haut = 12 microsecondes
    digitalWrite(TRIGGER_PIN1, LOW);     // signal TRIGGER à l'état BAS (0V)
// lecture de la broche ECHO
    echoPulseTime1 = pulseIn(ECHO_PIN1, HIGH);
    Serial.println(echoPulseTime1);   // affichage du résultat brut dans le moniteur Série

    
   if (echoPulseTime1 <= 1000)
   {
    digitalWrite(Led, HIGH);
    
    digitalWrite(TRIGGER_PIN1, LOW);
    
    delay (50);
    
    digitalWrite(TRIGGER_PIN, HIGH);    // signal TRIGGER à l'état HAUT (5V)
    delayMicroseconds(12);              // durée de l'état haut = 12 microsecondes
    digitalWrite(TRIGGER_PIN2, LOW);
    echoPulseTime2 = pulseIn(ECHO_PIN2, HIGH);
    
    if (echoPulseTime2 <= 1000)
    {
      digitalWrite(Led1, HIGH);
    }
    
    digitalWrite(TRIGGER_PIN2, LOW);
    delay(50);
    
    digitalWrite(TRIGGER_PIN3, HIGH);   
    delayMicroseconds(12);              
    digitalWrite(TRIGGER_PIN3, LOW);
    echoPulseTime3 = pulseIn(ECHO_PIN3, HIGH);
    
    if(echoPulseTime3 <= 1000)
    {
      digitalWrite(Led2, HIGH);
    }
    
    digitalWrite(TRIGGER_PIN3, LOW);
    
   }

    delay(5000);   // temporisation en ms avant de recommencer la prochaine mesure
}

Déjà avant d’en faire 3, on en fait un :wink:

Donc :

void loop() {

  digitalWrite(TRIGGER_PIN1, HIGH);    
  delayMicroseconds(12);             
  digitalWrite(TRIGGER_PIN1, LOW);     

    echoPulseTime1 = pulseIn(ECHO_PIN1, HIGH);
    
   if (echoPulseTime1 <= 1000)    digitalWrite(Led, HIGH);
   else  digitalWrite(Led, LOW);

}

Ca marche ou pas ?

Oui ça marche parfaitement, j'arrive même à allumer des leds contrôlées chaque unes par un capteur mais dans ce cas les capteurs sont bien sûrs orientés dans différentes directions ! :)

Zaminus: Oui ça marche parfaitement, j'arrive même à allumer des leds contrôlées chaque unes par un capteur mais dans ce cas les capteurs sont bien sûrs orientés dans différentes directions ! :)

bonjour, si tu expliquais ce que tu veux faire exactement, ca serait plus simple, non? car mettre 3 US dans la même direction je ne vois pas l'intérêt.

Je pense tout simplement qu’il pointe ses trois capteurs dans trois directions différentes.

Bon pour trois capteurs maintenant : si tu observes code, tu remarqueras que tu répètes trois fois la même chose et qu’il n’y a que les pins qui change. Il est donc fortement recommander dans ce cas d’écrire une fonction qui prendra en argument les pins nécessaire :

unsigned long MesureDistance(byte TRIGGER_PIN, byte ECHO_PIN, byte LED_PIN) {

digitalWrite(TRIGGER_PIN, HIGH);    
  delayMicroseconds(12);             
  digitalWrite(TRIGGER_PIN, LOW);     

   unsigned long echoPulseTime = pulseIn(ECHO_PIN, HIGH);
    
   if (echoPulseTime1 <= 1000)    digitalWrite(LED_PIN, HIGH);
   else  digitalWrite(LED_PIN, LOW);

return echoPulseTime;

}

Puis dans le loop() pour un monitoring des trois :

void loop() {

MesureDistance(TRIGGER_PIN1,ECHO_PIN1,Led);
MesureDistance(TRIGGER_PIN2,ECHO_PIN2,Led1);
MesureDistance(TRIGGER_PIN3,ECHO_PIN3,Led2);

}

La fonction peut retourner la mesure de distance mais je ne m’en suis pas servi ici, après vous fait ce que vous voulez …

Nan les capteurs sont orientés dans une direction un peu près équivalente d'où mon questionnement sur le fait d'arrêter deucx capteurs pendant que le troisième effectue sa mesure (donc afin de ne pas la perturber).

Alors ce que je veux faire exactement :

Je travaille sur un projet de porte charge commandé à distance par un utilisateur via une application android. Toute la parte déplacement est réglée. J'ai également ajouter des capteurs ultrasons afin que le porte charge ne rentre pas dans des obstacles ou ne tombe pas d'un escalier. Cependant, pour le moment, l'appareil s'arrête, c'est à l'utilisateur de contourner l'obstacle en jouant avec les directions. Maintenant, j'aimerais supprimer au maximum cette demande d'effort à l'utilisateur. Mon idée: mettre trois capteurs US à l'avant du porte charge . Un au centre, un orienté vers l'avant mais un peu décalé vers la droite et l'autre un peu décalé vers la gauche. Celui au centre fonctionne en tout temps lest deux autres non. Lorsque le capteurs de devant détecte un obstacle, il se stoppe momentanément et le capteur droit puis le gauche sont activés à tout de rôle. Ensuite je compare les valeurs des US droite et gauche. Si j'ai pas d'obstacle à droite et un à gauche, j'évite l'obstacle en passant par la droite et inversement. Si l'obstacle est détecté des deux côté, l'appareil tâtonne d'un côté et si la manœuvre ne marche pas alors là seulement, l'utilisateur devra rentrer en jeu !

Voilà, c'est pas forcément génialissime comme idée mais pour l'instant c'est la seule que j'ai --'

J'ai pas tout pigé mais dans ce que tu veux faire, mais ce que je peux te dire c'est que faire les 3 mesures ne devrait pas prendre guère plus que 1 ms, donc tu peux très bien mesurer les trois alternativement en permanence, le temps de réaction étant alors au maximum d'1 ms, ce qui je pense est largement suffisant pour ton application

mais effectuer trois mesures dans une direction un peu près semblable n'est ce pas risqué ? je ne risque pas de capter le signal d'un de mes capteurs ?

qu'est ce que tu n'as pas compris exactement ?