help code robot autonome

Yep!

Il faudrait peut être repartir de zero. Commencer par une serie de déplacement simple et en intégrant les US l'un aprés l'autre.

Je sèche pour ma part :grin:

@+

Zoroastre.

Ben le problème c'est que c'est exactement comme j'ai fait.
J'ai d'abord ordonné à mon robot de se déplacer pour voir si tout les mouvements programmés étaient bon et çà fonctionnait.
Ensuite j'ai programmé les capteurs et j'ai vérifié grâce au serial monitor que les valeurs renvoyées correspondaient à celles mesurées et c'était le cas.
Et là j'assemble les 2 et sa fonctionne plus :0
Mais j'imagine que çà doit pas être facile de trouver la solution sans le robot en débarquant dans un code pas très bien rédigé :S C'est pour çà que j'avais essayé de commenter.
Merci quand même pour ton aide

Bonjour,

Essaye ça pour voir :

//capteurs US
const int capteurdroit = 7;
const int capteurgauche = 8;

//Moteurs
#define E1 5
#define E2 6
#define M1 4
#define M2 7


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

  pinMode(M1, OUTPUT);
  pinMode(M2, OUTPUT); 
  pinMode(E1, OUTPUT);
  pinMode(E2, OUTPUT);
}

void loop()
{
  unsigned long distancedroite = mesure_distance(capteurdroit); //recupere l'info de distance de l'obstacle du capteur droit
  unsigned long distancegauche = mesure_distance(capteurgauche); //recupere l'info de distance de l'obstacle du capteur droit

  if(distancegauche < 20) //si un obstacle se presente à gauche
  {
    droite(100, 100); //on tourne à droite
    delay(400); //pendant 0,4 secondes
  } 
  else if(distancedroite < 20) //si un obstacle se presente à droite
  {
    gauche(100, 100); //on tourne à gauche
    delay(400); //pednant 0,4 secondes
  } 
  else
    avancer(130, 130); //sinon on avance tout le temps
}

unsigned long mesure_distance(int capteur)
{
  pinMode(capteur, OUTPUT);
  digitalWrite(capteur, LOW);
  delayMicroseconds(2); //delai d'attente au départ, au niveau 0
  digitalWrite(capteur, HIGH);
  delayMicroseconds(15); // delai de 15 uS, imposant un niveau '1' au capteur
  digitalWrite(capteur, LOW);

  pinMode(capteur, INPUT);
  unsigned long duree = pulseIn(capteur, HIGH);

  return duree / 58;
}

void avancer(byte a, byte B) //avancer
{
  analogWrite(E1, a); //PWM Speed Control a permet de changer la vitesse du moteur 1
  digitalWrite(M1, HIGH); //M1 avance
  analogWrite(E2, B);
  digitalWrite(M2, HIGH); //M2 avance
}

void reculer(byte c, byte d) //reculer
{
  analogWrite(E1, c); //PWM Speed Control
  digitalWrite(M1, LOW); //M1 recule
  analogWrite(E2, d);
  digitalWrite(M2, LOW); //M2 recule
}

void droite(byte e, byte f) //tourner à droite
{
  analogWrite (E1, e); //PWM Speed Control
  digitalWrite(M1, HIGH);
  analogWrite (E2, f);
  digitalWrite(M2, LOW);
}

void gauche(byte g, byte h) //tourner à gauche
{
  analogWrite (E1, g); //PWM Speed Control
  digitalWrite(M1, LOW);
  analogWrite (E2, h);
  digitalWrite(M2, HIGH);
}

J'ai juste viré les variables global, remplacer quelques const par des define et changer les char en byte (+ des int en unsigned long).

Merci pour ton aide,
J'ai essayé mais çà ne fonctionne pas le robot continu à tourner sur lui même.
Je ne vois vraiment pas d'où çà peut venir sachant que mes fonction avancer reculer droite gauche fonctionnent et que les capteurs renvoient les bonnes valeurs.
J'aimerai bien tout recommencer à zéro mais je ne vois pas ce que je programmerai différemment...
merci

Au fait je ne pense pas que çà changera quelque chose étant donné qu'elle se programme de la même façon mais j'ai une carte romeo pas une arduino. Elle permet juste d'avoir des moteurs CC car on peut les alimenter indépendamment avec une tension supérieur à 5v

Tu pourrait rajouter deux Serial.print dans loop pour avoir un idées des valeurs de distancegauche et distancedroite ?

Justement c'est çà qui est bizarre c'est qu'en rajoutant:

unsigned long distancedroite = mesure_distance(capteurdroit); //recupere l'info de distance de l'obstacle du capteur droit
    Serial.println("capteur droit:");
    Serial.println(distancedroite); 		//affiche cette distance
  unsigned long distancegauche = mesure_distance(capteurgauche); //recupere l'info de distance de l'obstacle du capteur droit
    Serial.println("capteur gauche:");
    Serial.println(distancegauche); 		//affiche cette distance

J'obtiens:
Si le robot est au milieu de mon appartement:
capteur droit:
268
capteur gauche:
157

Et si je met mes mains devant
capteur droit:
4
capteur gauche:
5

Donc pas de problème de ce côté là :S

Et le plus bizarre c'est que si je remplace que par des "avancer dans mon if comme celà:

if(distancegauche < 20) //si un obstacle se presente à gauche
  {
    avancer(130, 130); //on tourne à droite
    delay(400); //pendant 0,4 secondes
  } 
  else if(distancedroite < 20) //si un obstacle se presente à droite
  {
    avancer(130, 130); //on tourne à gauche
    delay(400); //pednant 0,4 secondes
  } 
  else
    avancer(130, 130); //sinon on avance tout le temps
}

Et ben le robot tourne quand même sur lui même....

Si tu fais avancer(130,130) pendant un certain temps, ton robot il va bien droit.
Parce que bon, ton système il fonctionne en boucle ouverte. Rien ne vérifie que les 2 roues tournent exactement à la même vitesse par conséquent ce n'est pas très étonnant s'il tourne. Pour être certain de le faire aller droit, il faudrait avoir des encodeurs sur les roues, compter les impulsions et corriger la vitesse des moteurs en conséquence.

Ben çà marche si je fais pas en fonction des valeurs retournées par les capteurs mais si j'en tiens pas compte alors ou il avance mais moi je veux le faire en fonction des capteurs pas en fonction de roues codeuses... je comprend pas j'ai des valeurs retournées par des capteurs et je le fait aller tout droit sauf si il y a un obstacle, je comprend pas ce qu'il y a de compliqué à çà pourquoi çà marche pas et pourquoi je bloque dessus depuis 3 semaines^^

Yep!

Comme ton robot tourne à droite par defaut, je dirais comme çà que le programme prend en compte la première condition. Donc ta valeur mesurée est inférieure à 20.

Reprends le code de skywodd et ajoutes des Serial.print pour vérifier les valeurs retournées pas tes US.

void loop()
{
  unsigned long distancedroite = mesure_distance(capteurdroit); //recupere l'info de distance de l'obstacle du capteur droit
  unsigned long distancegauche = mesure_distance(capteurgauche);

  Serial.println(distancedroite); Serial.println(distancegauche);
...

Petite question : Quelles sont les délais relatifs ou normatifs pour le retour des US ??? Si la fonction mesure_distance ne retourne rien sous les delais imposés, la valeur retournée sera zero, non ???
Dans ce cas, peut être prévoir un intervalle :

if ((distancegauche > 0) && (distancegauche < 20)) { }
etc...

@+

Zoroastre.

Essaye de rajouter un Serial.print("droite"); "gauche" "centre" ... pour voir si les if sont bien pris en compte :

//capteurs US
const int capteurdroit = 7;
const int capteurgauche = 8;

//Moteurs
#define E1 5
#define E2 6
#define M1 4
#define M2 7


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

  pinMode(M1, OUTPUT);
  pinMode(M2, OUTPUT); 
  pinMode(E1, OUTPUT);
  pinMode(E2, OUTPUT);
}

void loop()
{
  unsigned long distancedroite = mesure_distance(capteurdroit); //recupere l'info de distance de l'obstacle du capteur droit
  unsigned long distancegauche = mesure_distance(capteurgauche); //recupere l'info de distance de l'obstacle du capteur droit

  Serial.print("Dist D : ");
  Serial.println(distancedroite, DEC);
  Serial.print("Dist G : ");
  Serial.println(distancegauche, DEC);

  if(distancegauche < 20) //si un obstacle se presente à gauche
  {
    Serial.println("Go D");
    droite(100, 100); //on tourne à droite
    delay(400); //pendant 0,4 secondes
  } 
  else if(distancedroite < 20) //si un obstacle se presente à droite
  {
    Serial.println("Go G");
    gauche(100, 100); //on tourne à gauche
    delay(400); //pednant 0,4 secondes
  } 
  else {
    Serial.println("Go C");
    avancer(130, 130); //sinon on avance tout le temps
  }
}

unsigned long mesure_distance(int capteur)
{
  pinMode(capteur, OUTPUT);
  digitalWrite(capteur, LOW);
  delayMicroseconds(2); //delai d'attente au départ, au niveau 0
  digitalWrite(capteur, HIGH);
  delayMicroseconds(15); // delai de 15 uS, imposant un niveau '1' au capteur
  digitalWrite(capteur, LOW);

  pinMode(capteur, INPUT);
  unsigned long duree = pulseIn(capteur, HIGH);

  return duree / 58;
}

void avancer(byte a, byte B) //avancer
{
  analogWrite(E1, a); //PWM Speed Control a permet de changer la vitesse du moteur 1
  digitalWrite(M1, HIGH); //M1 avance
  analogWrite(E2, B);
  digitalWrite(M2, HIGH); //M2 avance
}

void reculer(byte c, byte d) //reculer
{
  analogWrite(E1, c); //PWM Speed Control
  digitalWrite(M1, LOW); //M1 recule
  analogWrite(E2, d);
  digitalWrite(M2, LOW); //M2 recule
}

void droite(byte e, byte f) //tourner à droite
{
  analogWrite (E1, e); //PWM Speed Control
  digitalWrite(M1, HIGH);
  analogWrite (E2, f);
  digitalWrite(M2, LOW);
}

void gauche(byte g, byte h) //tourner à gauche
{
  analogWrite (E1, g); //PWM Speed Control
  digitalWrite(M1, LOW);
  analogWrite (E2, h);
  digitalWrite(M2, HIGH);
}

merci pour votre aide...

Voilà les résultats dans le serial monitor qui prouvent que tout va bien pourtant...(j'ai mis mes mains devant le capteur quand les mesures sont faibles...)

Dist D : 134
Dist G : 252
Go C
Dist D : 136
Dist G : 252
Go C
Dist D : 8
Dist G : 252
Go G
Dist D : 5
Dist G : 6
Go D
Dist D : 5
Dist G : 7
Go D
Dist D : 191
Dist G : 252
Go C

Woo! Strange donc ce serais un probléme au niveau de la gestion des moteurs !? Je comprend plus rien ...

C'est dingue j'ai même essayé çà et çà marche pas:

if((distancegauche>0)&&(distancegauche < 20)) //si un obstacle se presente à gauche
  {
    Serial.println("Go D");
    droite(100, 100); //on tourne à droite
    delay(5000); //pendant 0,4 secondes
  } 
  else if((distancedroite>0)&&(distancedroite < 20)) //si un obstacle se presente à droite
  {
    Serial.println("Go G");
    gauche(100, 100); //on tourne à gauche
    delay(5000); //pednant 0,4 secondes
  } 
  else if ((distancedroite>20)&&(distancegauche>20)){
    Serial.println("Go C");
    avancer(130, 130); //sinon on avance tout le temps
    delay(5000);
  }
  else if ((distancedroite==00)&&(distancegauche==0)){
    Serial.println("Go C");
    avancer(130, 130); //sinon on avance tout le temps
    delay(5000);
  }

Oui c'est vraiment bizarre.
J'ai un capteur infrarouge je vais essayé voir si çà marche mieux car il me renvoie directement une distance.

Ahah (nerveux) je viens de griller mon capteur sharp :0

mopi:
Ahah (nerveux) je viens de griller mon capteur sharp :0

Comment t'as fait ton compte :astonished: les capteurs IR sharp c'est increvables, à moins de lui avoir coller du 12v à l'envers je vois pas comment ta fait ...

mopi:
merci pour votre aide...

Voilà les résultats dans le serial monitor qui prouvent que tout va bien pourtant...(j'ai mis mes mains devant le capteur quand les mesures sont faibles...)

Dist D : 134
Dist G : 252
Go C
Dist D : 136
Dist G : 252
Go C
Dist D : 8
Dist G : 252
Go G
Dist D : 5
Dist G : 6
Go D
Dist D : 5
Dist G : 7
Go D
Dist D : 191
Dist G : 252
Go C

Si la logique de commande est bonne alors le problème est ailleurs.
Il faut investiguer la partie pilotage des moteurs. Ou comme je le proposais précédemment la partie mécanique. Une roue qui patine un peu, un moteur qui tourne un peu moins vite et assez rapidement la ligne droite devient une courbe.

Une autre question ne tourne-t-il pas trop vite? En regardant ton code on voit que tu mets un moteur dans un sens et l'autre en sens inverse donc le mobile tourne rapidement sur lui même. Cela ne perturbe pas les mesures?

Ben je sais pas non pourtant c'est bien en 5v mais je pense avoir inversé la masse et le +5v en tout cas le capteur était très chaud et odeur de cramé donc je pense qu'il est mort surtout qu'en mettant le capteur sur la patte analogique 5 quand je met ma main devant ou non j'obtiens tout le temps 900 avec ce code basique:

const int Voie_5=5; 
int mesure_brute=0;


void setup()   {  

Serial.begin(115200); 
} 

void loop(){ 
  
mesure_brute=analogRead(Voie_5); 

Serial.println(mesure_brute); 

delay(100);

}

Sinon je vais essayé ce que tu me recommandes fdufnews mais comme je l'ai expliqué si j'enlève les capteurs et que je fait tout simplement avancer(130,130) ou droite(130,130) en ben çà marche !! :S vraiment bizarre

mopi:
Ben je sais pas non pourtant c'est bien en 5v mais je pense avoir inversé la masse et le +5v en tout cas le capteur était très chaud et odeur de cramé donc je pense qu'il est mort surtout qu'en mettant le capteur sur la patte analogique 5 quand je met ma main devant ou non j'obtiens tout le temps 900 avec ce code basique:

Défaut matériel peut être ... si y avait une odeur de cramé il est foutu.

mopi:
Sinon je vais essayé ce que tu me recommandes fdufnews mais comme je l'ai expliqué si j'enlève les capteurs et que je fait tout simplement avancer(130,130) ou droite(130,130) en ben çà marche !! :S vraiment bizarre

Donc en gros la situation actuelle : WHAT THE F*CK ! :grin:
C'est pas la logique, c'est pas les moteurs, c'est pas les capteurs ...