Problème lors de l utilisation du deuxième HC-SR04.

Bonjour à tous,

Pour un petit projet personnel, j 'utilise des actionneurs linéaires pour fermer une porte.

Afin de sécuriser celle-ci , je dispose deux sondes ultrason HC- SR04 pour connaitre la distance et donc arreter les vérins si la porte est proche de se fermer sur quelqu'un.

Lorsque je fais ce code test, si je décide d'utiliser une seule de ces sondes, tout fonctionne au mieux. Mais lorsque décide de mesurer la distance à deux endroits différents, cela ne fonctionne plus je n'arrive pas à utiliser ces deux sondes en même temps.

Lorsque j'appelle la fonction safety1() tout est ok , mais lorsque que j ajoute ensuite safety2() plus rien ne fonctionne...

J'ai essayé pas mal de chose mais rien ne fonctionne.

Voici, ci-joint le code que j'utilise.

Merci pour votre temps :slight_smile:

testBPswitch.ino (5.14 KB)

Bonjour

la lecture d'un fichier ino sur un smartphone ou une tablette n'étant pas aiséee je réponds sans voir le code

Prendre en compte les inévtables interférences entre les E/R Ultra sons.
Combien de temps s'acoule entre l'appel des deux fonctions safe
Décaler dans le temps l'utilisation des deux HC-SR04 de manière à ce que leurs signaux et échos n'interfèrent pas.

Pour ce qui est du code mieux vaut le mettre dans le corps du message en respectant les balises appropriées (voir les messages épinglés en tête de Forum) .
Publier comme ceci le code augmente le nombre de réponses

Le code :

//Fin de course et position
int inSwitchbas = 11;
int inSwitchhaut = 12;
int switchbas = 0;
int switchhaut = 0;
//Position des vérins
int Position1 =0;
int Position2 =0;
// valeur analogique correspondant à la position haute et basse // Il faudra peut etre donner PB2 PH2
int PB = 300 ;
int PH = 700;
//Moteur
const int Ana1 = A5;
int D1A = 9;
int D1B = 8;
const int Ana2 = A0;
int D2A = 11;
int D2B = 13;
// Signal 12V ancienne gache
int insignalvalue = 10;
int signalvalue = 0;
//Bouton sortie "urgence"
int BP = 0;
int inBP =7;
//Montre si porte est fermée
int EtatPorte = 0;
//Mesure de la distance
const byte TRIGGER = 6;// 
const byte ECHO = 5; 
const byte TRIGGER2 = 4; 
const byte ECHO2 = 3; 
const unsigned long MEASURE_TIMEOUT = 25000UL; // 25ms = 8m à 340m/s
const float SOUND_SPEED = 340.0 / 1000;

void setup() {
  
  pinMode(inSwitchbas, INPUT);
  pinMode(inBP, INPUT);
  pinMode(inSwitchhaut, INPUT);
  pinMode(insignalvalue, INPUT);
  pinMode(D1A, OUTPUT);
  pinMode(D1B, OUTPUT);
  pinMode(D2A, OUTPUT);
  pinMode(D2B, OUTPUT);
  pinMode (Ana1, INPUT);
  pinMode (Ana2, INPUT);
  pinMode(TRIGGER, OUTPUT);
  digitalWrite(TRIGGER, LOW);
  pinMode(ECHO, INPUT);
  pinMode(TRIGGER2, OUTPUT);
  digitalWrite(TRIGGER2, LOW);
  pinMode(ECHO2, INPUT);
  Serial.begin(115200);
}
void loop() {
  BP = digitalRead (inBP);
  switchbas = digitalRead (inSwitchbas);
  switchhaut = digitalRead (inSwitchhaut);
  Position1 = analogRead (Ana1);
  Position2 = analogRead (Ana2);

  if (switchbas == HIGH){

    while (Position1<900){
      Position1 = analogRead (Ana1);
      Position2 = analogRead (Ana2);
      moteurp();
      safety1();
      
      //safety2();
    }
    SynchroMoteurp ();
    
    moteur0();
  }
    if (switchhaut == HIGH){
    moteurn();
    delay (2000);
    moteur0();
  }
    if (BP == HIGH){
    moteurp();
    delay (2000);
    moteurn();
    delay (2000);
    moteur0();
  }

}
//moteur sens +
void moteurp (){
  digitalWrite (D1A, HIGH);
  digitalWrite (D1B, LOW);
  digitalWrite (D2A, HIGH);
  digitalWrite (D2B, LOW);
}

void moteur1p (){
  digitalWrite (D1A, HIGH);
  digitalWrite (D1B, LOW);
}

void moteur2p (){
  digitalWrite (D2A, HIGH);
  digitalWrite (D2B, LOW);

}
//moteur sens -
void moteurn(){
  digitalWrite (D1A, HIGH);
  digitalWrite (D1B, HIGH);
  digitalWrite (D2A, HIGH);
  digitalWrite (D2B, HIGH);
}
void moteur1n(){
  digitalWrite (D1A, HIGH);
  digitalWrite (D1B, HIGH);
}
void moteur2n(){
  digitalWrite (D2A, HIGH);
  digitalWrite (D2B, HIGH);
}
//moteur sens stop
void moteur0(){
  digitalWrite(D1A,LOW);
  digitalWrite(D1B,LOW); 
  digitalWrite(D2A,LOW); 
  digitalWrite(D2B,LOW); 
}
float distance() {
  
  digitalWrite(TRIGGER, HIGH);
  delayMicroseconds(10);
  digitalWrite(TRIGGER, LOW);  
   long measure = pulseIn(ECHO, HIGH, MEASURE_TIMEOUT); 
   
   float distance_mm = measure / 2.0 * SOUND_SPEED;

  //Serial.println("distance ");
  //Serial.print(distance_mm / 10.0, 2);
  //Serial.print("cm de ");

  return distance_mm ;
}
float distance2() {
  
  digitalWrite(TRIGGER2, HIGH);
  delayMicroseconds(10);
  digitalWrite(TRIGGER2, LOW);  
  
  long measure2 = pulseIn(ECHO2, HIGH, MEASURE_TIMEOUT);
  
  
  float distance_mm2 = measure2 / 2.0 * SOUND_SPEED;
  //Serial.println("distance ");
  //Serial.print(distance_mm2 / 10.0, 2);
  //Serial.print("cm de ");

  return distance_mm2 ;
}
void safety1 () {
  if ((distance()< 150.00) ){

    //if ((Position1) >= 150){
  //((((Position1) > 150 || (Position2) > 150))&&(((distance()< 150.00) || (distance2()< 150.00)))){        
      moteur0();
      delay (5000);
    }
    }

void safety2 () {
  if ((distance2()< 150.00) ){

    //if ((Position1) >= 150){
  //((((Position1) > 150 || (Position2) > 150))&&(((distance()< 150.00) || (distance2()< 150.00)))){        
      moteur0();
      delay (5000);
    }
    }


void SynchroMoteurp () {
  
  if ((Position1 - Position2) > 10 ){

    digitalWrite(D1A,LOW); 
    digitalWrite(D1B,LOW);
    
      while ( (Position1 - Position2) > 1){
        Position1 = analogRead (Ana1);
        Position2 = analogRead (Ana2);
        moteur2p ();           
      
      }      
    }
    if ((Position2 - Position1) > 10 ){

    digitalWrite(D2A,LOW); 
    digitalWrite(D2B,LOW);
    
      while ( (Position2 - Position1) > 1){
        Position1 = analogRead (Ana1);
        Position2 = analogRead (Ana2);
        moteur1p ();       
      
      }      
    }
    }
void SynchroMoteurn () {
  
  if ((Position2 - Position1) > 10 ){

    digitalWrite(D1A,LOW); 
    digitalWrite(D1B,LOW);
    
      while ( (Position2 - Position1) > 1){
        Position1 = analogRead (Ana1);
        Position2 = analogRead (Ana2);
        moteur2n ();           
      
      }      
    }
  if ((Position1 - Position2) > 10 ){

    digitalWrite(D2A,LOW); 
    digitalWrite(D2B,LOW);
    
      while ( (Position1 - Position2) > 1){
        Position1 = analogRead (Ana1);
        Position2 = analogRead (Ana2);
        moteur1n ();       
      
      }      
    }
    }

en activant qausi simultanément les deux E/R , comme cest le cas actuellement, c'est la cacophonie assurée au niveau des ultra sons.
Ajouter un delai avant d'activer safety2 de manière a ce que les échos les plus tardifs du premier émetteur aient eu le temps de voyager.

chacun son tour... en attendant le silence de l'autre....

Un grand merci pour vos réponses .

Malheureusement j ai déjà essayé en mettant un delay(2000).

Merci pour l info d affichage je pensais que le code se mettrai à la suite.

bonsoir.

le problème avec un retard de 2s c'est que l'écho a eu le temps de revenir plusieurs fois et de s'amortir totalement : le son parcourt tout de même 340*2 = 680m durant ce laps de temps ! et même si ton obstacle est aussi loin, je doute que l'amplitude de l'écho soit suffisante pour stimuler le récepteur ...

Deux secondes ça permet d'espérer que le second E/R ne sera pas perturbé par les echos tardifs de l'autre E/R.
Le delai que j'ai proposé sert a séparer suffisement les emissions de salves des deux E/R, pour chacun d'eux n'ait affaire a ses propres salves.
Il ne s'agita pas d'un délai entre le TRIG (émission d'une salve) et le PULSIN() (attente d'écho) du même E/R.

au temps pour moi, je n'avais pas tout lu, j'avais supposé qu'il s'agissait d'un retard sur la capture pour éviter de lire le "bruit" de l'émetteur durant ... l'émission.

néanmoins, après lecture (difficile) du code, j'ai du mal à comprendre comment une seule impulsion (dans les fonctions distance() et distance2() il n'y a aucune répétition du top sur les sorties) peut solliciter les transducteurs ... même si je sais qu'il ne s'agit pas du sujet de ce topic

la salve 40kHz (8 périodes) est produite par le petit microcontrôleur des HC-SR04 à réception d'une seule impulsion sur l'entrée TRIG.

merci, bon à savoir, d'habitude je génère moi-même mon 40kHz avec un timer ... et des "pastilles à l'ancienne"

[EDIT]
OK, je viens de lire la doc : en fait il fait tout à ta place ...
mais je préfère tout maîtriser moi-même ...
[/EDIT]

Bonjour à tous,

Merci pour votre aide, j'ai changé l attribution de mes pins et tout rentre dans l'ordre :cold_sweat:

cool, mais c'est al1fch qu'il faut remercier

pour ma culture perso et informer les autres : ta réallocation d'E/S a changé quoi ? de quelle façon ? et quelles sont les nouvelles broches utilisées ?