Arduino Forum

International => Français => Topic started by: safa_1997 on May 23, 2019, 05:05 am

Title: capteur à ultrasons et robot suiveur de ligne
Post by: safa_1997 on May 23, 2019, 05:05 am
bonjour tout le monde :D

J'ai un problème avec mon capteur à ultrasons, je ne sais pas pourquoi cela ne fonctionne pas je pense  c'est un problème de code

mon projet est de créer un robot suiveur de ligne: pour cela, j'utilise 2 moteurs et 4 capteurs infrarouges.

mon robot suppose de s'arrêter lorsque les 4 capteurs en noir OU le capteur ultrsonique détectent un obstacle en 10 cm

quand je mets le code pour juste suivre la ligne cela fonctionne parfaitement mais quand j'ajoute les ultrasons ne fonctionnent jamais et il ne suit plus la ligne

Pouvez-vous m'aider s'il vous plaît

Code: [Select]
#include <NewPing.h>

// ****************************************
// Déclaration des constantes et variables
// ****************************************

// capteur de distance

#define trigPin   12  //  Pin Trigger branchée sur la broche 12 de l'arduino
#define echoPin   11  //  Pin Echo branchée sur la broche 11 de l'arduino



NewPing sonar(trigPin, echoPin);

int maximumDistance = 50;  // distance Maximale acceptée (de 0-450 cm)
int minimumDistance = 0;   // distance Minimale acceptée (en cm)
int cm = 0;


boolean PasObstacle = true;   // valeur à O ou true si pas d'obstacle détecté  sinon la valeur prend 1

const int distanceObstacle = 10; //  Distance de détection d'un obstable : ici 15 cm
int distance = 0;
int attenteCateur = 200;

//définition des bouttons
int button1=1;  //vert
int button=2;   //rouge
int z;
int w;

int cap1=3; 
int cap2=4; 
int cap3=5; 
int cap4=6; 

int varmot2=9;
int av2=7;       //avant
int ar2=8;       //arrière

int varmot1=14;
int av1=15;       //avant
int ar1=16;

boolean a;
boolean b;  //les deux capteurs au milieu
boolean c; //les deux capteurs au milieu
boolean d;

boolean stope;
boolean left;
boolean right;
boolean forward;
boolean backward;


void setup() {
  // dir.attach(13);
   //dir.write(90);
  pinMode(varmot1,OUTPUT);
  pinMode(av1,OUTPUT);
  pinMode(ar1,OUTPUT);

  pinMode(varmot2,OUTPUT);
  pinMode(av2,OUTPUT);
  pinMode(ar2,OUTPUT);
 
  Serial.begin(9600);

pinMode(button,INPUT);
  pinMode(button1,INPUT);

}

void loop() {
  int val1,val2,val3,val4 ;
  val1 = digitalRead(cap1) ;
    a = val1 ;                  //< 500;
  val2 = digitalRead(cap2) ;
    b = val2 ;                   //< 500;
  val3 = digitalRead(cap3) ;
    c = val3 ;                  //< 500;
  val4 = digitalRead(cap4) ;
    d = val4 ;                   //< 500;


 right=           (((!a)&&(d))&&(c||(!b)));   //(((!b)&&(!a))&& d);

 left=            ((a&&(!d))&&(b||(!c)));   //(((!d)&& a) &&(!c));

 backward=   (((!a)&&(!c))&&((!b)&&(!d)));      //||(b&&d)))||((!b)&&(!d)&&a&&c);

 forward=   ((!a)&&(b)&&(c)&&(!d));       //||(a&&d)))||(a&&(!b)&&(!c)&&d);

 stope=     (a&&b&&c&&d);
 
 lecture ();

   distance =  mesureDistance();  // on lit la valeur en cm

if (PasObstacle)  {
 
  z=digitalRead(1);
 w=digitalRead(2);
 
 if ((stope)&&(w==1))
{
  droite ();
  delay(500);
}
else if ((stope)&&(z==1))
{
avant();
delay(500);
  }


  if (left)
 
   {
    gauche () ;         
   }
   
  else if (right)
 
    {
      droite();
    }
 
  else if (forward)
 
   { 
    avant();
   }
 
 else if (backward)
 
   {
    arrier ();
   }
   
  else if (stope)
{
  stopp();}
}
  else
  {
    stopp();}
  // on lit la valeur en cm
  }
unsigned int mesureDistance() {
  // déclaration des variables locales



  int  cm = sonar.ping_cm();


  if (cm > distanceObstacle || cm  <= minimumDistance) {
    PasObstacle =  true;  // on renvoie true s'il n'y pas d'obstacle
  }
  else  {
    PasObstacle = false;  // on renvoie false s'il y a un obstacle
  }

  return cm; // retourne la distance du capteur en cm

}

void lecture ()
 {
    Serial.print(a);
    Serial.print(b);
    Serial.print(c);
    Serial.println(d);

  }


void gauche ()
  {
    analogWrite(varmot1,100);
    digitalWrite(av1,0);
    digitalWrite(ar1,0);
    //dir.write(50);
    analogWrite(varmot2,255);
    digitalWrite(av2,1);
    digitalWrite(ar2,0);
   
  }
void droite ()
 {
    analogWrite(varmot1,255);
    digitalWrite(av1,1);
    digitalWrite(ar1,0);
    //dir.write(130);
  analogWrite(varmot2,100);
    digitalWrite(av2,0);
    digitalWrite(ar2,0);
 }
 
void avant ()

  {
    analogWrite(varmot1,250);
    digitalWrite(av2,HIGH);
    digitalWrite(ar2,LOW);
    //dir.write(90);
    analogWrite(varmot2,250);
    digitalWrite(av1,1);
    digitalWrite(ar1,0);
  }
void arrier ()
  {
    analogWrite(varmot1,150);
    digitalWrite(av2,LOW);
    digitalWrite(ar2,HIGH);
    analogWrite(varmot2,150);
    digitalWrite(av1,0);
    digitalWrite(ar1,1);
  }

void stopp ()
  {
    digitalWrite(av1,LOW);
    digitalWrite(ar1,LOW);
    digitalWrite(av2,LOW);
    digitalWrite(ar2,LOW);   
    }

Title: Re: capteur à ultrasons et robot suiveur de ligne
Post by: J-M-L on May 23, 2019, 08:12 am
Vous utilisez newPing mais ou utilisez  vous attenteCateur ?

PS:

pourquoi cm est déclaré en int alors que la fonction ré tourne un unsigned int ?

Indentez le code en appuyant sur ctrl-T, et virez les grands espaces blanc en trop, séparez les fonctions ... c'est illisible

Ne gardez pas des commentaires faux dans le code, autant ne rien écrire du tout, Par exemple:
Code: [Select]
const int distanceObstacle = 10; //  Distance de détection d'un obstable : ici 15 cmLe mieux serait d'expliquer à quoi sert cette variable, par exemple // distance min en centimètres jusqu'à l'obstacle avant arrêt

Ou encore c'est quoi ce commentaire idiot < 500 ??
Code: [Select]
int val1,val2,val3,val4 ;
  val1 = digitalRead(cap1) ;
    a = val1 ;                  //< 500;
  val2 = digitalRead(cap2) ;
    b = val2 ;                   //< 500;
  val3 = digitalRead(cap3) ;
    c = val3 ;                  //< 500;
  val4 = digitalRead(cap4) ;
    d = val4 ;                   //< 500;
digitalRead retourne HIGH ou LOW...et pourquoi passer par une valeur intermédiaire pour simplement dupliquer dans un booléen? Écrivez juste
Code: [Select]
a = (digitalRead(cap1) == HIGH);
b = (digitalRead(cap2) == HIGH);
c = (digitalRead(cap3) == HIGH);
d = (digitalRead(cap3 == HIGH);


Les pins sont mieux en const byte que en int

Pourquoi la fonction lecture() ne fait que des écritures ?

Et Stop ne prend pas de e à la fin :)
Title: Re: capteur à ultrasons et robot suiveur de ligne
Post by: safa_1997 on May 23, 2019, 06:12 pm
tout d'abord merci bcp pour la réponse

et je suis désolé a propos les commentaires dans le code ... j'ai l'écrit pendant les tests

voila mon code avec les modification mais rien changé 

Code: [Select]

#include <NewPing.h>
// capteur ultrasonic

#define trigPin   12  //  Pin Trigger branchée sur la broche 12 de l'arduino
#define echoPin   11  //  Pin Echo branchée sur la broche 11 de l'arduino

NewPing sonar(trigPin, echoPin);

int cm = 0; //declare une variable cm qui je l'utilise dans la comparaison

boolean PasObstacle;

const int distanceObstacle =10; //  Distance de détection d'un obstable : ici 10 cm
int distance = 0;

//définition des bouttons

int button1=20;  //vert
int button=21;   //rouge
int z;
int w;
// définition des capteur ultrason
int cap1=3;  // cap gauche
int cap2=4;  // cap milieu
int cap3=5;  // cap milieu
int cap4=6;  // cap droite
// definition de boche de la carte de puissance
int varmot2=9;
int av2=7;       //avant
int ar2=8;       //arrière

int varmot1=14;
int av1=15;       //avant
int ar1=16;

boolean a;
boolean b;//les deux capteurs au milieu
boolean c;//les deux capteurs au milieu
boolean d;

boolean stope;// j'ecrit stope à la fin "e" car tt simplement lorque j'ecrit stop elle devient en rouge don je pense que c'est une fonction prédifine.
boolean left;
boolean right;
boolean forward;
boolean backward;


void setup() {
 
  pinMode(varmot1,OUTPUT);
  pinMode(av1,OUTPUT);
  pinMode(ar1,OUTPUT);

  pinMode(varmot2,OUTPUT);
  pinMode(av2,OUTPUT);
  pinMode(ar2,OUTPUT);
 
  Serial.begin(9600);

pinMode(button,INPUT);
pinMode(button1,INPUT);

}

void loop() {
 
 a = digitalRead(cap1) ; // a recoi la valeur de cap1 (1 ou 0)
                     
  b = digitalRead(cap2) ;// b recoi la valeur de cap2 (1 ou 0)
                   
 c = digitalRead(cap3) ;// c recoi la valeur de cap3  (1 ou 0)
                   
 d = digitalRead(cap4) ;// d recoi la valeur de cap4 (1 ou 0)
                     

 right=(((!a)&&(d))&&(c||(!b)));  // le robot doit tourner à droite lorsque la condition est vrai c'est à dire ( le capteur à droite est en noir OU bien le capteur droite ET le milieu en noir )

 left=((a&&(!d))&&(b||(!c)));   // le robot doit tourner à gauche lorsque la condition est vrai c'est à dire ( le capteur à gauche est en noir OU bien le capteur gauche ET le milieu  en noir )

 backward=(((!a)&&(!c))&&((!b)&&(!d))); // le robot doit étre marche en arriére lorsque il sort de map c'est à dire les 4 capteur en blanc     
 
 forward=((!a)&&(b)&&(c)&&(!d)); // le robot doit étre marche en avant lorsque le 2 capteur au milieu est en noir     
 
 stope=(a&&b&&c&&d);// le robot fait un stop lorsque les 4 capteur en noir
 
 lecture ();// fonction pour just affichier le valeur des capteur en moniteur série

   distance =  mesureDistance();  // on lit la valeur en cm

if (PasObstacle)  {
 
  z=digitalRead(20);
 w=digitalRead(21);
 
 if ((stope)&&(w==1)) // si le robot est en stop est on appui sue le bouton rouge il tourne droite
{
  droite ();
  delay(500);
}
else if ((stope)&&(z==1))  // si le robot est en stop est on appui sue le bouton vert rouge il marche avant
{
avant();
delay(500);
  }
 
  if (left)
 
   {
    gauche () ;         
   }
   
  else if (right)
 
    {
      droite();
    }
 
  else if (forward)
 
   { 
    avant();
   }
 
 else if (backward)
 
   {
    arrier ();
   }
   
  else if (stope)
{
  stopp();}
}
  else
  {
    stopp();}
  }
unsigned int mesureDistance() { // fonctin pour comparer la distance calculé avec la distanceobstacle

  int  cm = sonar.ping_cm();


  if (cm > distanceObstacle) {
    PasObstacle =  true;  // on renvoie true s'il n'y pas d'obstacle
  }
  else  {
    PasObstacle = false;  // on renvoie false s'il y a un obstacle
  }

  return cm; // retourne la distance du capteur en cm

}

void lecture ()
 {
    Serial.print(a);
    Serial.print(b);
    Serial.print(c);
    Serial.println(d);

  }


void gauche ()
  {
    analogWrite(varmot1,100);
    digitalWrite(av1,0);
    digitalWrite(ar1,0);
    analogWrite(varmot2,255);
    digitalWrite(av2,1);
    digitalWrite(ar2,0);
   
  }
void droite ()
 {
    analogWrite(varmot1,255);
    digitalWrite(av1,1);
    digitalWrite(ar1,0);
  analogWrite(varmot2,100);
    digitalWrite(av2,0);
    digitalWrite(ar2,0);
 }
 
void avant ()

  {
    analogWrite(varmot1,250);
    digitalWrite(av2,HIGH);
    digitalWrite(ar2,LOW);
    analogWrite(varmot2,250);
    digitalWrite(av1,1);
    digitalWrite(ar1,0);
  }
void arrier ()
  {
    analogWrite(varmot1,150);
    digitalWrite(av2,LOW);
    digitalWrite(ar2,HIGH);
    analogWrite(varmot2,150);
    digitalWrite(av1,0);
    digitalWrite(ar1,1);
  }

void stopp ()
  {
    digitalWrite(av1,LOW);
    digitalWrite(ar1,LOW);
    digitalWrite(av2,LOW);
    digitalWrite(ar2,LOW);   
    }
Title: Re: capteur à ultrasons et robot suiveur de ligne
Post by: 68tjs on May 23, 2019, 07:42 pm
Code: [Select]
void stopp ()

Ca peut compiler ?
Title: Re: capteur à ultrasons et robot suiveur de ligne
Post by: J-M-L on May 23, 2019, 07:47 pm
Vous auriez pu presser ctrl-T et tenir compte des autres remarques...
Title: Re: capteur à ultrasons et robot suiveur de ligne
Post by: safa_1997 on May 23, 2019, 07:48 pm
Code: [Select]
void stopp ()

Ca peut compiler ?

Désole-je ne te comprends pas !? mais la compilation de programme est n'avait pas aucun problème!
Title: Re: capteur à ultrasons et robot suiveur de ligne
Post by: safa_1997 on May 23, 2019, 07:55 pm
j'ai modifié selon les remarques que j'ai comprend

Code: [Select]

#include <NewPing.h>
// capteur ultrasonic
#define trigPin   12  //  Pin Trigger branchée sur la broche 12 de l'arduino
#define echoPin   11  //  Pin Echo branchée sur la broche 11 de l'arduino
NewPing sonar(trigPin, echoPin);
int cm = 0; //declare une variable cm qui je l'utilise dans la comparaison
boolean PasObstacle;
const int distanceObstacle = 10; //  Distance de détection d'un obstable : ici 10 cm
int distance = 0;
//définition des bouttons
int button1 = 20; //vert
int button = 21; //rouge
int z;
int w;
// définition des capteur ultrason
int cap1 = 3; // cap gauche
int cap2 = 4; // cap milieu
int cap3 = 5; // cap milieu
int cap4 = 6; // cap droite
// definition de boche de la carte de puissance
int varmot2 = 9;
int av2 = 7;     //avant
int ar2 = 8;     //arrière
int varmot1 = 14;
int av1 = 15;     //avant
int ar1 = 16;
boolean a;
boolean b;//les deux capteurs au milieu
boolean c;//les deux capteurs au milieu
boolean d;
boolean stope;// j'ecrit stope à la fin "e" car tt simplement lorque j'ecrit stop elle devient en rouge don je pense que c'est une fonction prédifine.
boolean left;
boolean right;
boolean forward;
boolean backward;
void setup() {
  pinMode(varmot1, OUTPUT);
  pinMode(av1, OUTPUT);
  pinMode(ar1, OUTPUT);
  pinMode(varmot2, OUTPUT);
  pinMode(av2, OUTPUT);
  pinMode(ar2, OUTPUT);
  Serial.begin(9600);
  pinMode(button, INPUT);
  pinMode(button1, INPUT);

}

void loop() {
  a = digitalRead(cap1) ; // a recoi la valeur de cap1 (1 ou 0)
  b = digitalRead(cap2) ;// b recoi la valeur de cap2 (1 ou 0)
  c = digitalRead(cap3) ;// c recoi la valeur de cap3  (1 ou 0)
  d = digitalRead(cap4) ;// d recoi la valeur de cap4 (1 ou 0)
  right = (((!a) && (d)) && (c || (!b))); // le robot doit tourner à droite lorsque la condition est vrai c'est à dire ( le capteur à droite est en noir OU bien le capteur droite ET le milieu en noir )
  left = ((a && (!d)) && (b || (!c))); // le robot doit tourner à gauche lorsque la condition est vrai c'est à dire ( le capteur à gauche est en noir OU bien le capteur gauche ET le milieu  en noir )
  backward = (((!a) && (!c)) && ((!b) && (!d))); // le robot doit étre marche en arriére lorsque il sort de map c'est à dire les 4 capteur en blanc
  forward = ((!a) && (b) && (c) && (!d)); // le robot doit étre marche en avant lorsque le 2 capteur au milieu est en noir
  stope = (a && b && c && d); // le robot fait un stop lorsque les 4 capteur en noir
  lecture ();// fonction pour just affichier le valeur des capteur en moniteur série
  distance =  mesureDistance();  // on lit la valeur en cm
  if (PasObstacle)  {
    z = digitalRead(20);
    w = digitalRead(21);
    if ((stope) && (w == 1)) // si le robot est en stop est on appui sue le bouton rouge il tourne droite
    {
      droite ();
      delay(500);
    }
    else if ((stope) && (z == 1)) // si le robot est en stop est on appui sue le bouton vert rouge il marche avant
    {
      avant();
      delay(500);
    }
    if (left)
    {
      gauche () ;
    }
    else if (right)
    {
      droite();
    }
    else if (forward)
    {
      avant();
    }
    else if (backward)
    {
      arrier ();
    }
    else if (stope)
    {
      stopp();
    }
  }
  else
  {
    stopp();
  }
}
unsigned int mesureDistance() { // fonctin pour comparer la distance calculé avec la distanceobstacle
  int  cm = sonar.ping_cm();
  if (cm > distanceObstacle) {
    PasObstacle =  true;  // on renvoie true s'il n'y pas d'obstacle
  }
  else  {
    PasObstacle = false;  // on renvoie false s'il y a un obstacle
  }
  return cm; // retourne la distance du capteur en cm
}

void lecture ()
{
  Serial.print(a);
  Serial.print(b);
  Serial.print(c);
  Serial.println(d);
}
void gauche ()
{
  analogWrite(varmot1, 100);
  digitalWrite(av1, 0);
  digitalWrite(ar1, 0);
  analogWrite(varmot2, 255);
  digitalWrite(av2, 1);
  digitalWrite(ar2, 0);
}
void droite ()
{
  analogWrite(varmot1, 255);
  digitalWrite(av1, 1);
  digitalWrite(ar1, 0);
  analogWrite(varmot2, 100);
  digitalWrite(av2, 0);
  digitalWrite(ar2, 0);
}

void avant ()
{
  analogWrite(varmot1, 250);
  digitalWrite(av2, HIGH);
  digitalWrite(ar2, LOW);
  analogWrite(varmot2, 250);
  digitalWrite(av1, 1);
  digitalWrite(ar1, 0);
}
void arrier ()
{
  analogWrite(varmot1, 150);
  digitalWrite(av2, LOW);
  digitalWrite(ar2, HIGH);
  analogWrite(varmot2, 150);
  digitalWrite(av1, 0);
  digitalWrite(ar1, 1);
}
void stopp ()
{
  digitalWrite(av1, LOW);
  digitalWrite(ar1, LOW);
  digitalWrite(av2, LOW);
  digitalWrite(ar2, LOW);
}
Title: Re: capteur à ultrasons et robot suiveur de ligne
Post by: J-M-L on May 24, 2019, 08:31 am
Pour à b c et d j'ai pris la peine de vous donner du code... vous ne l'avez meme pas intégré

Posez vous la question de combien de temps met un Ping à répondre et quelle est la conséquence d'avoir un delay(500) aussi dans le code

Le rouge sur stop() ça veut dire que la fonction est connue de l'IDE dans un des librairies mais ce n'est pas grave. C'est un peu bête de faire des mots avec un souci d'orthographe (et d'écrire de 2 façons différentes) pour cela, sinon appelez la fonction arretMoteur() par exemple, la langue française est assez riche pour trouver d'autres noms clairs et compréhensibles qui documentent le programme