Une aide pour finir mon projet (j'en peux plus :(

Bonjour,

Voilà, mon projet est simple, un vehicule qui se déplace en évitant les obstacles, c'est je pense un bon exercice pour un début.
Alors mon premier projet était simple, j'ai même reussi à faire le code sans pomper ailleurs, j'ai passé du temps mais je suis satisfait.

Lorsque que le véhicule "rencontrait" un obstacle il l'évitait en tournant à gauche.

Mais maintenant j'ai eu l'idée de le faire évoluer, j'ai mis le detecteur de distance sur un servo, le servo à 3 positions de mesure, en fonction de la mesure (distance obstacle inferieur à 10cm) il change de trajectoire en fonction de la position du cerveau, malheureusement ça ne marche pas, je vous poste mon code (qui doit pas être optimisé)...

Donc si quelqu'un pouvait me filer un conseil... ça fait depuis 15h00 que je suis dessus:

#include "Ultrasonic.h"
#include <Servo.h> 

const int Trig = 7;
const int Echo = 6;
long cm;      
Ultrasonic HCSR04(Trig,Echo);


int motor1Pin1 = 8;    // MOTEUR GAUCHE
int motor1Pin2 = 9;    // MOTEUR DROIT
int enablePin1 = 2;     // COMMANDE GAUCHE

int motor2Pin4 = 10;    // MOTEUR DROIT
int motor2Pin3 = 11;    // MOTEUR DROIT
int enablePin2 = 3;     // COMMANDE DROITE

Servo servoexplo;

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

  // déclaration des sorties
  pinMode(motor1Pin1, OUTPUT);
  pinMode(motor1Pin2, OUTPUT);
  pinMode(enablePin1, OUTPUT);
  
  pinMode(motor2Pin4, OUTPUT);
  pinMode(motor2Pin3, OUTPUT);
  pinMode(enablePin2, OUTPUT);
  
  servoexplo.attach(5);


  digitalWrite(enablePin1, HIGH);
  digitalWrite(enablePin2, HIGH);
}

void loop() {
  Serial.println(cm);
  
    servoexplo.write(90);
    cm = HCSR04.convert(HCSR04.timing(), 1);
    delay(2500); 
 
  if (cm < 10) {
 digitalWrite(motor1Pin1, LOW);   //
 digitalWrite(motor1Pin2, HIGH);
 digitalWrite(motor2Pin4, LOW);   //
 digitalWrite(motor2Pin3, HIGH);  //
 
 delay (1800);
 
  }
  else {
      // Le moteur gauche AVANT 
  digitalWrite(motor1Pin1, HIGH);   //
  digitalWrite(motor1Pin2, LOW);  //
    // Le moteur droit AVANT
  digitalWrite(motor2Pin4, LOW);   //
  digitalWrite(motor2Pin3, HIGH);  //
  }
  
  
  servoexplo.write(140);
  cm = HCSR04.convert(HCSR04.timing(), 1);  
  delay(2500);  

 if (cm < 10) {
 digitalWrite(motor1Pin1, HIGH);   //
 digitalWrite(motor1Pin2, LOW);
 digitalWrite(motor2Pin4, HIGH);   //
 digitalWrite(motor2Pin3, LOW);  //
 
 delay (1800);
 
  }
  else {
      // Le moteur gauche AVANT 
  digitalWrite(motor1Pin1, HIGH);   //
  digitalWrite(motor1Pin2, LOW);  //
    // Le moteur droit AVANT
  digitalWrite(motor2Pin4, LOW);   //
  digitalWrite(motor2Pin3, HIGH);  //
  }  
  
  servoexplo.write(30); 
  cm = HCSR04.convert(HCSR04.timing(), 1);  
  delay(2500);   

 if (cm < 10) {
 digitalWrite(motor1Pin1, HIGH);   //
 digitalWrite(motor1Pin2, LOW);
 digitalWrite(motor2Pin4, HIGH);   //
 digitalWrite(motor2Pin3, LOW);  //
 
 delay (1800);
 
  }
  else {
      // Le moteur gauche AVANT 
  digitalWrite(motor1Pin1, HIGH);   //
  digitalWrite(motor1Pin2, LOW);  //
    // Le moteur droit AVANT
  digitalWrite(motor2Pin4, LOW);   //
  digitalWrite(motor2Pin3, HIGH);  //  
    
}
}

On a pas ton robot et on a peut être pas le temps de tout analyser.
Si tu détaillais ce que tu voulais obtenir comme comportement et ce que tu obtiens on gagnerait du temps.
Et accessoirement peut être que cela te ferait trouver ton problème .

Alors, comme je disais, c'est un vehicule, qui avance mais doit éviter des obstacles, la il y a un servo moteur avec un capteur de distance (hsr04), le servo moteur prend 3 positions succesivement, lorsqu'il mesure une distance inferieur de 10cm, il doit effectuer un changement de trajectoire, donc si il mesure à gauche moins de 10 cm, il va à droite, si il mesure à droite moins de 10 cm il va à gauche et tout droit si il mesure moins de 10cm il ira à gauche.

Voilà, après ça je peux pas être + clair, ce sera l'abandon :slight_smile:

Salut, si j'étais toi, je mettrais les actions dans des fonctions, because avec les if/else; on ne sait plus trop où on en est.
ça permettrai de regrouper la logique de fonctionnement dans un seul bloc.
Concernant le terme d'abandon: Un projet c'est comme un bock de bierre, plus on touille, et plus ça fait de mousse; il arrive un moment où on ne voit plus le niveau réel de la bierre; alors, faut laisser redescendre la mouse.

overskyline:
Alors, comme je disais, c'est un vehicule, qui avance mais doit éviter des obstacles, la il y a un servo moteur avec un capteur de distance (hsr04), le servo moteur prend 3 positions succesivement, lorsqu'il mesure une distance inferieur de 10cm, il doit effectuer un changement de trajectoire, donc si il mesure à gauche moins de 10 cm, il va à droite, si il mesure à droite moins de 10 cm il va à gauche et tout droit si il mesure moins de 10cm il ira à gauche.

Voilà, après ça je peux pas être + clair, ce sera l'abandon :slight_smile:

Là tu n'as répondu qu'a la moitié de ma question. Tu n'as toujours pas dit le comportement que tu obtiens. Qu'est-ce qui ne marche pas?
Si tu n'as pas d'obstacle qu'est-ce qu'il fait?
Si tu as un obstacle à gauche ou à droite qu'est-ce qu'il fait?
Quand on expose un problème, il faut être factuel.

Il faut peut être aussi attendre que le servo ait atteint sa position avant de lancer une mesure de distance, car tu enchaînes la mesure de distance directement après avoir envoyé la commande de position au servo ... Et je ne pense pas que la commande servo.write attende qu'il soit en position pour que le programme continue ...

Après la mesure de distance tu mets aussi un délai de 2500 ms ... Pourquoi ? Quand je vois un piéton à 10 cm de mon pare-chocs ... je n'attends pas 2,5 s avant de freiner ... Sauf si ton robot est un escargot...

Je mettrai pour chacune des 3 positions que tu testes :
servo.write...
Delay(200); // à toi de voir le temps qu'il faut au servo pour atteindre sa position
Cm = hrsc ... ;// quand cm est calculée ... Tu as ta distance et tu agis tout de suite s'il le faut
If ( cm < 10) action !

Je reviens pour cloturer et dire que j'ai résolu mon prob :slight_smile:
Je vais poster tout ça dans la section tutoriel de ce forum.

Le programme marche parfaitement, il est peut être pas très beau et pourrait être surement + court, mais ça marche :grin: