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.)
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?
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.
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.
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
j'ai essayé avec un délai un peu plus faible et de même.
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 !
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.
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
}