Capteurs ultrasons en série

Bonsoir,

Pour un projet scolaire, je cherche à équiper un robot télécommandé de capteurs ultrasons afin de détecter la présence d'objets barrant la route à mon appareil. Rien de très compliqué normalement, mais je dois avoir fait une petite erreur, donc ça ne marche pas. En bref, je fais varier l’intensité d'une led en fonction de la distance entre le capteur et l'objet. Pour un seul capteur, le programme fonctionne parfaitement. Mais, lorsque j'essaye de passer à deux ultrasons je rencontre deux trois problèmes: une led est constamment allumée et l'autre varie d'intensité mais avec un gros temps de latence. j'ai testé les capteurs séparément, ils sont tous deux fonctionnels.

Voici mon code (répétition de deux fois le même mais avec des constantes différentes.)

const int pingPin = 7;
int led = 3;
int ledlevel = 0;
const int pingPin1 = 8;
int led1 = 10;
int ledlevel1 = 0;


void setup () 
{
  Serial.begin (9600);
}

void loop ()
{
long duration;
long duration1;

pinMode (pingPin, OUTPUT);
digitalWrite (pingPin, LOW);
delayMicroseconds (2);
digitalWrite (pingPin, HIGH);
delayMicroseconds (5);
digitalWrite (pingPin, LOW);
pinMode (pingPin, INPUT);


pinMode (pingPin1, OUTPUT);
digitalWrite (pingPin1, LOW);
delayMicroseconds (2);
digitalWrite (pingPin1, HIGH);
delayMicroseconds (5);
digitalWrite (pingPin1, LOW);
pinMode (pingPin1, INPUT);

duration = pulseIn (pingPin, HIGH);

duration1 = pulseIn (pingPin1, HIGH);

if (duration <= 1000)
{
  ledlevel=255;
  analogWrite (led, ledlevel);
}
else if (duration <= 2000)
{
 ledlevel=100;
 analogWrite (led, ledlevel);
}
else if (duration <= 3000)
{
 ledlevel=20;
 analogWrite (led, ledlevel);
}
else
{
 digitalWrite (led, LOW);
}


if (duration1 <= 1000)
{
  ledlevel1=255;
  analogWrite (led1, ledlevel1);
}
else if (duration1 <= 2000)
{
 ledlevel1=100;
 analogWrite (led1, ledlevel1);
}
else if (duration1 <= 3000)
{
 ledlevel1=20;
 analogWrite (led1, ledlevel1);
}
else
{
digitalWrite (led1, LOW);
}


}

j'ai juste oublié de vous demander un petit truc : normalement avec une arduino uno on peut tout à fait commander plusieurs capteurs et un moteur sans que le temps de réponse du microcontrôleur soit trop important non?

D'avance merci pour vos réponses !

Le second capteur d'ultrasons émet un signal avant d'attendre que le premier capteur ait bien reçu son écho.
Il doit sans doute ramasser un écho qui ne lui est pas destiné.

Donc avant de faire la seconde mesure attendre un délai supérieur au temps de réponse du premier capteur pour ne pas avoir d'interférences.

Merci!

J'avais mis un "delay (100)" avant et ce n'était soit pas suffisant soit pas efficace
Je vais réessayer mais je ne comprends pas comment il pourrait recevoir un mauvais échos sachant qu'ils ne sont pas orientés dans la même direction.

Zaminus:
... je ne comprends pas comment il pourrait recevoir un mauvais échos sachant qu'ils ne sont pas orientés dans la même direction.

un signal US ricoche +/- sur les obstacles, il faut comme expliqué par christian attendre "un temps certain" pour amortissement naturel

Bonjour,

J'ai séparé le code de façon à ce qu'il s'occupe d'un capteur, délai (de 5000 au hasard) puis autre capteur.
Le système fonctionne, je peux faire varier l'intensité de mes deux leds mais, j'ai toujours un temps de latence extrêmement long entre le moment où je place un objet devant le capteur et celui où la led s'allume :confused:
j'ai essayé avec un délai un peu plus faible et de même.

Et en permutant physiquement tes deux capteurs c'est pareil ?
Un capteur ultrason répond normalement en quasi instantané.

Oui c'est, exactement la même chose alors que si je les teste un par un, la les s'allume et varie d'intensité instantanément, donc je ne pense pas que cela vienne des capteurs mais plutôt de mon code qui est plutôt archaïque !

met ton code modifié

J'ai effectué les changements que l'on m'a donc conseillé de faire et j'ai un peu réorganisé le tout mais pas de changements radicaux de mon code d'origine.

const int pingPin = 7;
int led = 3;
int ledlevel = 0;
const int pingPin1 = 8;
int led1 = 10;
int ledlevel1 = 0;


void setup () 
{
  Serial.begin (9600);
}

void loop ()
{

long duration; //premier capteur

pinMode (pingPin, OUTPUT);
digitalWrite (pingPin, LOW);
delayMicroseconds (2);
digitalWrite (pingPin, HIGH);
delayMicroseconds (5);
digitalWrite (pingPin, LOW);
pinMode (pingPin, INPUT);


duration = pulseIn (pingPin, HIGH);

if (duration <= 1000)
{
  ledlevel=255;
  analogWrite (led, ledlevel);
}
else if (duration <= 2000)
{
 ledlevel=100;
 analogWrite (led, ledlevel);
}
else if (duration <= 3000)
{
 ledlevel=20;
 analogWrite (led, ledlevel);
}
else
{
 digitalWrite (led, LOW);
}

delay (1000) ; //temps d’attente pour éviter les conflits

long duration1; //deuxième capteur

pinMode (pingPin1, OUTPUT);
digitalWrite (pingPin1, LOW);
delayMicroseconds (2);
digitalWrite (pingPin1, HIGH);
delayMicroseconds (5);
digitalWrite (pingPin1, LOW);
pinMode (pingPin1, INPUT);

duration1 = pulseIn (pingPin1, HIGH);


if (duration1 <= 1000)
{
  ledlevel1=255;
  analogWrite (led1, ledlevel1);
}
else if (duration1 <= 2000)
{
 ledlevel1=100;
 analogWrite (led1, ledlevel1);
}
else if (duration1 <= 3000)
{
 ledlevel1=20;
 analogWrite (led1, ledlevel1);
}
else
{
digitalWrite (led1, LOW);
}


}

J'ai réussi à régler mon problème ! Enfin j'ai changé de code. Le système marche sans temps de latence maintenant, seul inconvénient j'utilise deux fois plus de pins...
Merci beaucoup pour votre aide !

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


unsigned long echoPulseTime1 = 0;   // durée du signal ECHO en microsecondes
unsigned long echoPulseTime2 = 0;   
int LED = 13;
int led = 7;

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(LED, OUTPUT);
  pinMode(ECHO_PIN2, INPUT);      
  pinMode(TRIGGER_PIN2, OUTPUT);
  pinMode(led, OUTPUT);
// initialisation du port série à 115200 bauds
  Serial.begin(115200);
} 

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);    // attend le retour du signal ECHO au niveau BAS et retourne la durée du signal
    Serial.println(echoPulseTime1);   // affichage du résultat brut dans le moniteur Série
   
   if (echoPulseTime1 <= 1000)
    {
     digitalWrite (LED, HIGH);
    }
   else
    {
      digitalWrite (LED, LOW);
    }
   
    delay(100);
   
    digitalWrite(TRIGGER_PIN2, 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);  
    Serial.println(echoPulseTime2);
    
    if (echoPulseTime2 <= 1000)
    {
     digitalWrite (led, HIGH);
    }
   else
    {
      digitalWrite (led, LOW);
    }
    
    delay(100);   // temporisation en ms avant de recommencer la prochaine mesure
}