controler plusieurs capteurs utrasons sr04

bonjour, j'aimerais utiliser 4capteurs ultrasons pour eviter que mon robot percute des obstacle ...

j'arrive avec1seul capteurs, mais 2non alors que je veux en faire 4 ( je suis mal parti ), je vous ai épargné le code pour les déplacements aussi :wink:

#define dir_1 2
#define pwm_1 3
#define dir_2 4
#define pwm_2 5
#define dir_3 7
#define pwm_3 6
#define dir_4 8
#define pwm_4 9
int pwm_value;
int execute_timer = 0;

const byte TRIGGER_PIN = 12; // Broche TRIGGER
const byte ECHO_PIN = 11; // Broche ECHO
const byte TRIGGER_PIN2 = 24; // Broche TRIGGER
const byte ECHO_PIN2 = 22;
const byte TRIGGER_PIN3 = 0; // Broche TRIGGER
const byte ECHO_PIN3 = 0;
const byte TRIGGER_PIN4 = 0; // Broche TRIGGER
const byte ECHO_PIN4 = 0;
/* Constantes pour le timeout /
const unsigned long MEASURE_TIMEOUT = 25000UL; // 25ms = ~8m à 340m/s
const unsigned long MEASURE_TIMEOUT2 = 25000UL; // 25ms = ~8m à 340m/s
/
Vitesse du son dans l'air en mm/us */
const float SOUND_SPEED = 340.0 / 1000;
const float SOUND_SPEED2 = 340.0 / 1000;

void setup() {
/* Initialise le port série */
Serial.begin(115200);

/* Initialise les broches */
pinMode(TRIGGER_PIN, OUTPUT);
digitalWrite(TRIGGER_PIN, LOW);
pinMode(ECHO_PIN, INPUT);

pinMode(TRIGGER_PIN2, OUTPUT);
digitalWrite(TRIGGER_PIN2, LOW);
pinMode(ECHO_PIN2, INPUT);
while (!Serial);
pinMode(pwm_1,OUTPUT);
pinMode(dir_1,OUTPUT);
pinMode(pwm_2,OUTPUT);
pinMode(dir_2,OUTPUT);
pinMode(pwm_3,OUTPUT);
pinMode(dir_3,OUTPUT);
pinMode(pwm_4,OUTPUT);
pinMode(dir_4,OUTPUT);

}

void loop() {

/* 1. Lance une mesure de distance en envoyant une impulsion HIGH de 10µs sur la broche TRIGGER /
digitalWrite(TRIGGER_PIN, HIGH);
digitalWrite(TRIGGER_PIN2, HIGH);
delayMicroseconds(10);
digitalWrite(TRIGGER_PIN, LOW);
digitalWrite(TRIGGER_PIN2, LOW);
/
2. Mesure le temps entre l'envoi de l'impulsion ultrasonique et son écho (si il existe) /
long measure = pulseIn(ECHO_PIN, HIGH, MEASURE_TIMEOUT);
long measure2 = pulseIn(ECHO_PIN2, HIGH, MEASURE_TIMEOUT2);
/
3. Calcul la distance à partir du temps mesuré /
float distance_mm = measure / 2.0 * SOUND_SPEED;
float distance_mm2 = measure / 2.0 * SOUND_SPEED2;
/
Affiche les résultats en mm, cm et m */
Serial.print(F("Distance: "));
Serial.print(distance_mm);
Serial.print(F("mm"));
Serial.print(F(" Distance2: "));
Serial.print(distance_mm2);
Serial.println(F("mm"));

if(distance_mm <= 100){
analogWrite(pwm_2,0);
analogWrite(pwm_1,0);
analogWrite(pwm_3,0);
analogWrite(pwm_4,0);
delay(250);
digitalWrite(dir_1,HIGH); //controls the direction the motor
digitalWrite(dir_2,HIGH);
analogWrite(pwm_2,40);
analogWrite(pwm_1,40);
digitalWrite(dir_3,HIGH); //controls the direction the motor
digitalWrite(dir_4,HIGH);
analogWrite(pwm_3,40);
analogWrite(pwm_4,40);
delay(1000);
analogWrite(pwm_2,0);
analogWrite(pwm_1,0);
analogWrite(pwm_3,0);
analogWrite(pwm_4,0);
}
if(distance_mm2 <= 100){
analogWrite(pwm_2,0);
analogWrite(pwm_1,0);
analogWrite(pwm_3,0);
analogWrite(pwm_4,0);
delay(250);
digitalWrite(dir_1,LOW); //controls the direction the motor
digitalWrite(dir_2,LOW);
analogWrite(pwm_2,40);
analogWrite(pwm_1,40);
digitalWrite(dir_3,LOW); //controls the direction the motor
digitalWrite(dir_4,LOW);
analogWrite(pwm_3,40);
analogWrite(pwm_4,40);
delay(1000);
analogWrite(pwm_2,0);
analogWrite(pwm_1,0);
analogWrite(pwm_3,0);
analogWrite(pwm_4,0);
}
}

bonjour,
édite ton post et mets le code entre balise code </>

ne pas mettre les mêmes pins pour

const byte TRIGGER_PIN3 = 0; // Broche TRIGGER
const byte ECHO_PIN3 = 0;
const byte TRIGGER_PIN4 = 0; // Broche TRIGGER
const byte ECHO_PIN4 = 0;

le plus simple est de faire un void pour chaque capteur et surtout d'organiser ton code un peu mieux.

dans ton loop

void loop(){
capteur1();
capteur2();
capteur3();
capteur4();
// test des distance avec les if
}

void capteur1(){
digitalWrite(TRIGGER_PIN, HIGH);

delayMicroseconds(10);
digitalWrite(TRIGGER_PIN, LOW);

/* 2. Mesure le temps entre l'envoi de l'impulsion ultrasonique et son écho (si il existe) */
long measure = pulseIn(ECHO_PIN, HIGH, MEASURE_TIMEOUT);

/* 3. Calcul la distance à partir du temps mesuré */
float distance_mm = measure / 2.0 * SOUND_SPEED;
}

void capteur2(){
idem que le 1 mais avec les bons param
}
etc...

Les transducteurs à ultra son qui équipent les modules HC- SR04 ont des cones d'émission de 60 °.
Bien évidement 60 degrés c'est selon la norme. En réalité ils peuvent "arosser" plus large".
Ils ont tous le même principe et donc le même codage. Il faut faire attention qu'il ne se poluent pas mutuellement.

68tjs:
Les transducteurs à ultra son qui équipent les modules HC- SR04 ont des cones d'émission de 60 °.
Bien évidement 60 degrés c'est selon la norme. En réalité ils peuvent "arosser" plus large".
Ils ont tous le même principe et donc le même codage. Il faut faire attention qu'il ne se poluent pas mutuellement.

Bonsoir 68tjs
Je m'etais amusé avec plusieurs SR04 , à déclencher "simultanément" l’émission US
et ensuite à "tenter" la reception selon TOA pour discrimination (un peu à a louche 8) ) , de mes souvenirs ça fonctionnait finalement "pas trop mal"

Bon matin,

Pas de doute que cela fonctionne en prenant des précautions, mais autant faire une piqure de rappel au cas où !
Les transducteurs de ces machins sont vraiment bas de gamme (à la hauteur du prix de vente, il ne faut pas croire au père Noel) et sont à des années lumière d'être directifs.