Capteurs ultrason arduino

Bonjour à tous,

J'ai réalisé un projet simple avec arduino: deux capteurs ultrasons reliés chacun à une LED et un buzzer. Si quelque chose passe devant l'un des capteurs, la LED correspondante brille et le buzzer sonne à une certaine fréquence. Si c'est l'autre capteur qui détecte quelque chose, alors la deuxième LED brille et le buzzer sonne à une fréquence différente.

Seulement voilà, quand j'essaye ma manip, seulement un capteur fonctionne et le buzzer bip à une certaine pulsation en continue. Je vous laisse le code ci-dessous.

Merci d'avance pour vos futurs réponses.

#define trigPin 13
#define echoPin 12
#define ledPin 7
#define echoPin2 6
#define trigPin2 5


void setup() {
 Serial.begin (9600);
 pinMode (ledPin, OUTPUT);
 pinMode(trigPin, OUTPUT);
 pinMode(echoPin, INPUT);
 pinMode(trigPin2, OUTPUT);
 pinMode(echoPin2, INPUT);
}

void loop() {
 long duration, distance;
 digitalWrite(trigPin, LOW); 
 delayMicroseconds(2); 
 digitalWrite(trigPin, HIGH);
 delayMicroseconds(10); 
 digitalWrite(trigPin, LOW);
 duration = pulseIn(echoPin, HIGH);
 distance = (duration/2) / 29.1;
 if (distance <= 10){
 tone(9,600,100);
 digitalWrite(ledPin, HIGH);
 }
 

 else {
  
 noTone(9);
 digitalWrite(ledPin, LOW);
 }


 long duration2, distance2;
 digitalWrite(trigPin2, LOW); 
 delayMicroseconds(2); 
 digitalWrite(trigPin2, HIGH);
 delayMicroseconds(10); 
 digitalWrite(trigPin2, LOW);
 duration2 = pulseIn(echoPin2, HIGH);
 distance2 = ((duration2)/2) / 29.1;
 if (distance2 <= 10){
 tone(9,600,100);
 digitalWrite(ledPin, HIGH);
 }
 

 else {
  
 noTone(9);
 digitalWrite(ledPin, LOW);
 }
 
}

Déjà, tu ne déclares qu'une seule LED

#define ledPin 7

Ensuite tu joues les mêmes fréquences :

 tone(9,600,100);

Pour noTone, voici un exemple d'utilisation:

// play a note on pin 6 for 200 ms:
  tone(6, 440, 200);
  delay(200);
  // turn off tone function for pin 6:
  noTone(6);

Il y a un delay pour faire durer la note, puis le noTone pour l'arrêter.
Dans ton cas, il faudrait :

 distance = (duration/2) / 29.1;
 if (distance <= 10){
  digitalWrite(ledPin, HIGH);
  tone(9,600,100);
  delay(200);
  noTone(9);
 }
 else {
  digitalWrite(ledPin, LOW);
 }

Mais l'utilisation du delay va décaler la mesure du second capteur. Il faudrait que tu utilises millis(), ce qui va pas mal compliquer ton code...

si on utilise la version de tone() avec le paramètre de durée, comme tone(6, 440, 200), il est inutile d'invoquer notone() à la suite. Le son s'arrête tout seul après la durée demandée.
En contrepartie, tout est bloqué pendant l'appel à tone().
dans ton code:

 tone(9,600,100);
 digitalWrite(ledPin, HIGH);

le son démarre, dure 100 ms, puis s'arrête.
ENSUITE seulement, tu allumes la LED.

Merci pour vos réponses !
Est ce que ça pose problème si j'utilise un buzzer pour les deux capteurs ?
Il faudrait donc que j'utilise la fonction tone comme spécifiée et le problème devrait être résolu ?

Essaye et reviens nous le dire :slight_smile:

const byte TrigPin = 9;
const byte TrigPin2 = 6;
const byte EchoPin = 8;
const byte EchoPin2 = 7;
int led = 13;
int buzzer = 5;
const unsigned long timeout = 25000UL;
void setup() {
  pinMode(TrigPin, OUTPUT);
  pinMode(TrigPin2, OUTPUT);
  pinMode(EchoPin, INPUT);
  pinMode(EchoPin2, INPUT);
  pinMode(led, OUTPUT);
  pinMode(buzzer, OUTPUT);
  

}

void loop() {
  digitalWrite(TrigPin, HIGH);
  delayMicroseconds(10);
  digitalWrite(TrigPin, LOW);

  long mesure1=pulseIn(EchoPin, HIGH, timeout);
  float distance = mesure1*0.034/2;

  digitalWrite(TrigPin2, HIGH);
  delayMicroseconds(10);
  digitalWrite(TrigPin2, LOW);

  long mesure2=pulseIn(EchoPin2, HIGH, timeout);
  float distance2 = mesure2*0.034/2;

  if(distance<10){
  digitalWrite(led,HIGH);
  delay(200);
  digitalWrite(led,LOW);
  }

  if(distance2<10);{
  digitalWrite(buzzer,HIGH);
  delay(200);
  digitalWrite(buzzer,LOW);
}
}

J'ai essayé ce nouveau code en assignant une led au premier capteur et un buzzer au seconde mais hélas un seul des capteurs fonctionne...

pour activer le buzzer, c'est la fonction tone().

Bonjour,

if(distance2<10);{

Tu as vraiment testé ton code? :wink:

Je ne suis pas expert du tout, mais je pense que dès le départ, il est bon de commenter copieusement son code et de l'organiser au mieux, ça évite de se demander un jour pourquoi y'a un truc qui machine pas comme on voudrait.

J'ai appris à mes dépends que les capteurs du type HC-SR04 par exemple aiment bien qu'on les laisse bosser tranquilou. Utilise un serial.println et un petit delay(50) à chaque opération, je n'ai pas testé ton code, je 'ai qu'un capteur US et je ne peux pas tester ton montage, mais je ne serais pas étonné que ton capteur ne renvoie rien, il lui faut du temps.

Merci pour vos réponses mais hélas aucun résultats. J'ai testé le programme suivant :

#define trigPinL 9  //on définit les pins
#define echoPinL 8
#define trigPinR 6
#define echoPinR 7
#define buz1 5
#define buz2 4
void setup() {            
  pinMode(trigPinL, OUTPUT);     //on définit les entrées sorties 
  pinMode(echoPinL, INPUT);
  pinMode(trigPinL, OUTPUT);
  pinMode(echoPinL, INPUT);
  pinMode(buz1, OUTPUT);
  pinMode(buz2, OUTPUT);
  Serial.begin(9600);
  
  
  

}

void loop() {
  long durationL, distanceL, distanceR, durationR;
  digitalWrite(trigPinL, LOW);
  delayMicroseconds(2);
  digitalWrite(trigPinL, HIGH);
  delayMicroseconds(10);
  digitalWrite(trigPinL, LOW);

  durationL=pulseIn(echoPinL,HIGH);  //envoi d'une pulsation
  distanceL=(durationL/2)/29.1;

  digitalWrite(trigPinR, LOW);
  delayMicroseconds(2);
  digitalWrite(trigPinR, HIGH);
  delayMicroseconds(10);
  digitalWrite(trigPinR, LOW);

  durationR=pulseIn(echoPinR,HIGH);
  distanceR=(durationR/2)/29.1;

  Serial.println(distanceL);
  Serial.println(distanceR);
  delay(1000);

  if (distanceL < 15 ){
    tone (5,600,100);   //on fait un son avec le buzzer


  }

  else{
    noTone(5);
  }
  if (distanceR < 15){
    tone (5,400,200);
    
  }

   else{
    noTone(5);
  }

}

Le seul résultat que j'ai, c'est le buzzer qui émet une pulsation régulière.

1 - tes variables distanceL et distanceR doivent être de type float, et non pas unsigned long.
En travaillant sur des entiers, tu t'exposes à des erreurs d'arrondi.

2 - tes appels à notone() ne servent à rien.
comme tu as utilisé la forme de tone() à 3 paramètres :

  • la durée du son est fixée dès l'appel, à 100 ou 200 ms dans ton cas
  • pendant ces 100 ou 200 ms, le programme est bloqué.
    Voir la doc de tone().

3 - ton delay ( 100 ) est mal placé (il est entre la mesure/affichage et l'action).
Mets le en début ou en fin de loop()

Tu veux quoi exactement ?

  • tant qu'une distance est inférieure à un certain seuil, émettre un son (en continu)
  • dès qu'une distance devient inférieure à un certain seuil, émettre un seul bip.
  • si tes deux distances sont inférieures aux seuils, tu fais quoi ? tu ne pourras pas émettre deux sons en même temps !

Tu dois préciser tes spécifications.

J'aimerai que si un obstacle passe devant le capteur, le buzzer sonne et une led (non présente dans le dernier programme) s'allume et idem pour le deuxième capteur (led d'une autre couleur et buzzer sonne à une autre fréquence). Il faudrait en effet que je rajoute une condition si les deux capteurs s'activent en même temps.

Le problème que je rencontre est le suivant: un seul capteur fonctionne, quand quelque chose passe devant le second rien ne se passe, et le buzzer va émettre un bip à un certain rythme et la led va clignoter au même rythme et ce de manière continu.

Les deux capteurs sont-ils orientés de manière à ne pas se gêner ?

Note que pulsein ne correspond pas à l'envoi d'une pulsation mais à l'écoute. La syntaxe est :

pulseIn(pin, value, timeout)
Parameters:
pin: the number of the pin on which you want to read the pulse. (int)
value: type of pulse to read: either HIGH or LOW. (int)
timeout (optional): the number of microseconds to wait for the pulse to start; 
default is one second (unsigned long)

Ton code est séquentiel : il fait écouter le premier capteur puis le second. Mais le timeout du premier est de 1 seconde par défaut: si rien ne revient pendant cette seconde, le code va attendre puis passer à l'écoute du second capteur. Si un signal revient au second capteur pendant l'attente du premier, rien n'est capté au final.

Je pense que tu devrais faire un code plus rapide, avec des timeout plus courts. Si tu veux détecter des obstacles à 15 cm, le timeout optimal serait le temps pour le son de parcourir 30 cm (15 cm aller et retour), soit à 300m/s ça fait 1 ms. Tu peux mettre une marge et prendre 1.5 ms soit 1500 microsecondes...

Oui les deux capteurs sont de sens opposés, je vais essayer de voir avec les timeout.