help code robot autonome

Bonjour,
Je suis en train de réaliser un robot à apprentissage automatique basé sur la régression linéaire (Le robot n'est à la base pas programmé pour se déplacer dans une pièce mais après l'avoir guidé avec une télécommande il comprend les tensions qu'il doit envoyé dans ses moteurs en fonction des valeurs retournées par ses capteurs.)
Bref, tout d'abord, il faut que je sache programmé le robot de façon à ce qu'il se déplace dans une pièce tout seul (comme roby) pour après passer à la partie intelligence artificielle.
Mais voilà je bloque. Je sais que mes fonctions avancer,reculer,droite,gauche sont juste (j'ai fait un programme ou le robot effectue les déplacements que je lui demande). Je sais aussi que les capteurs ultrasons sont programmés correctement puisque qu'avec le serial monitor j'ai vérifié que les valeurs retournées étaient justes.
C'est dans ma fonction "if" que j'ai des doutes...et j'ai peur aussi que je me trompe quand j'essaye de retourner les valeurs des capteurs obtenues dans les différentes fonctions. Pourtant j'ai vérifié qu'elles sont bien supérieurs à la valeur que je test mais le robot tourne sur lui même à droite.
Et si je change la valeur des if çà ne change rien le robot tourne quand même sur lui même!
Voilà le code si quelqu'un pouvait m'aider.
Merci beaucoup

/*--------------------------------------------------------*/
/** Déclaration des prototypes des fonctions **/
/*--------------------------------------------------------*/

// Capteurs US
void requete();
int mesure_distance(char capteur);
int mesure_reponse(char capteur);
void affichage();

//Déplacement
void avancer(char a,char B);
void reculer(char c,char d);
void droite(char e,char f);
void gauche(char g,char h);


/*--------------------------------------------------------*/
/** Déclaration des constantes et variables blobales **/
/*--------------------------------------------------------*/
//capteurs US
const int capteurdroit=7;
const int capteurgauche=8;
long duree;
int distance_cm;
int distancedroite, distancegauche;

//Moteurs
const int E1 = 5; // contrôle la vitesse du moteur 1 (gauche)
const int E2 = 6; // contrôle la vitesse du moteur 2 (droite)
const int M1 = 4; //contrôle la direction (avancer ou reculer) du moteur 1 (gauche)
const int M2 = 7; //contrôle la direction (avancer ou reculer) du moteur 2 (gauche)






/*--------------------------------------------------------*/
/** Début du programme - Setup **/
/*--------------------------------------------------------*/
void setup() {
Serial.begin(9600);

//direction robot
pinMode(M1, OUTPUT); //met la pin du moteur 1 en sortie
pinMode(M2, OUTPUT); //met la pin du moteur 2 en sortie
pinMode(E1, OUTPUT); //met la pin de E1 en sortie
pinMode(E2, OUTPUT); //met la pin de E2 en sortie
//direction robot
}

/*--------------------------------------------------------*/
/** Boucle principale du programme **/
/*--------------------------------------------------------*/
void loop()
{
distancedroite=mesure_distance(capteurdroit); //recupere l'info de distance de l'obstacle du capteur droit
//Serial.println("capteur droit:");
//affichage(); //affiche cette distance

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

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
}
//delay(1000); //attend pour un affichage plus clair
}




/*--------------------------------------------------------*/
/** Fonctions relatives aux capteurs US **/
/*--------------------------------------------------------*/
int mesure_distance(char capteur)
{
requete(capteur); //envoie la demande au capteur
mesure_reponse(capteur); //recupere la distance mesurée
return distance_cm;
}


void requete(char 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);
}




int mesure_reponse(char capteur)
{
pinMode(capteur,INPUT);

duree=pulseIn(capteur,HIGH); // attend l'impulsion du capteur, et retourne sa durée en microseconde

//if(duree>30000) //test de la condition d'abscence d'obstacle
// duree=0;

distance_cm=duree/58;
return distance_cm;
}


void affichage()
{

// if(duree==0) // Si on a détécté precedemment qu'il n'y a pas d'obstacle, on l'affiche
// Serial.println("Pas d'obstacle!!!!!");

// else // Si non, on affiche la distance
// {
Serial.print(duree);
Serial.println("uS");

Serial.print(distance_cm);
Serial.println("cm");
// }
}



/*--------------------------------------------------------*/
/** Fonctions relatives aux moteurs **/
/*--------------------------------------------------------*/


void avancer(char a,char 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(char c,char d) //reculer
{
analogWrite (E1,c); //PWM Speed Control
digitalWrite(M1,LOW); //M1 recule
analogWrite (E2,d);
digitalWrite(M2,LOW); //M2 recule
}

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

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

Edit de Jean-François : merci de mettre le code entre les balises avec le bouton #

Voilà les résultats de quelques tests si çà peut vous aider:
Si à la place du if je lui fait faire des mouvements prédéfinis il n'y arrive pas. Maintenant si je supprime les lignes de code concernant le calcul de distancedroite et distancegauche çà marche (le robot exécute les bons mouvements.)
C'est donc ces fonctions qui posent problème. Pourtant je sais que les valeurs qu'elles prennent sont les bonnes (200cm car j'ai un appartement de 4m donc quand il est au milieu...)
Je me demande si comme j'ai écrit le programme le robot exécute seulement la 1ère instruction plein de fois et il arrive jamais au if?
Enfin j'en sais rien en fait je bloque dessus depuis 3 semaines c'est vraiment frustrant.
Merci pour votre aide
mopi

Salut!
Merci pour ta réponse :slight_smile:
Je ne sais pas si tu parles de la fonction afficher? Si c'est le cas, oui je ne l'appelle pas puisqu'elle me sert à rien c'était juste pour vérifier que j'avais bien programmé les capteurs en utilisant la datasheet et en effet ils me renvoient bien les bonnes distances.
Sinon j'utilise bien la fonction "mesuredistance" qui elle fait appelle à autres fonctions (les capteurs nécessitent une initialisation avant chaque mesure c'est pourquoi il faut faire une requête avant de mesurer un temps (que je convertis après en distance))
Voilà si tu as d'autres questions? Je suis vraiment bloqué là je te remercie pour ton aide
merci
mopi

Yep!

Pourquoi declares-tu la variable 'capteur' de type char ???

Pour ma part, ce serait plutôt une variable integrale !!! Quelles sont les infos que te retournent tes US (pin digital ou analogique) ???

@+

Zoroastre.

Salut
En fait j'utilise la même fonction pour trouver la distance d'un obstacle au capteur droit ou au capteur gauche.
Donc la fonction reçoit en entrée le capteur droit ou gauche qui sont à la patte 7 et 8 donc un char suffit amplement non?
Les ultrasons calculent un temps que je convertis en cm grâce à l vitesse du son dans l'air donc ils me retournent une distance en cm (environ 200cm dans mon appartement quand le robot est au milieu.)
Je n'ai jamais apprit la notion de variable integrale désolé.
Merci zoroastre !!!!!

Yep!

Essayes de remplacer :

int mesure_distance(char capteur);
int mesure_reponse(char capteur);

par

int mesure_distance(int capteur);
int mesure_reponse(int capteur);

Idem dans tes fonctions suivantes...

integral = int

Je pense que si tu declares un char, tu le convertis ensuite en valeur integrale. Et char(135) n'equivaut pas à int(135)...

@+

Zoroastre

Salut,

Voici la déclaration et l'intégration de ta fonction 'mesure_distance()':

int mesure_distance(char capteur);

...

int mesure_distance(char capteur)
{
requete(capteur); //envoie la demande au capteur
mesure_reponse(capteur); //recupere la distance mesurée
return distance_cm;
}

Tu utilises une variable de type char en paramètre.

Voici maintenant la variable que tu envoies en paramètre, dans la fonction 'mesure_distance()':

const int capteurdroit=7;

...

mesure_distance(capteurdroit);

Tu passes donc une variable type int dans une fonction qui demande une variable type char.
Remplace soit le type de la constante, soit le type de variable appelée dans ta fonction; essaie et tiens nous au courant.

EDIT: grillé par zoroastre 8)

Merci beaucoup pour votre aide çà fait du bien !!
Mais çà ne marche toujours pas il doit y avoir une autre erreur. Mais merci çà m'a permit d'apprendre qu'on passait pas d'un char à un int aussi facilement.
Voilà le nouveau programme si j'ai bien compris:

/*--------------------------------------------------------*/
/** Déclaration des prototypes des fonctions **/
/*--------------------------------------------------------*/

// Capteurs US
void requete(int capteur);
int mesure_distance(int capteur);
int mesure_reponse(int capteur);
void affichage();

//Déplacement
void avancer(char a,char B);
void reculer(char c,char d);
void droite(char e,char f);
void gauche(char g,char h);


/*--------------------------------------------------------*/
/** Déclaration des constantes et variables blobales **/
/*--------------------------------------------------------*/
//capteurs US
const int capteurdroit=7;
const int capteurgauche=8;
long duree;
int distance_cm;
int distancedroite, distancegauche;

//Moteurs
const int E1 = 5; // contrôle la vitesse du moteur 1 (gauche)
const int E2 = 6; // contrôle la vitesse du moteur 2 (droite)
const int M1 = 4; //contrôle la direction (avancer ou reculer) du moteur 1 (gauche)
const int M2 = 7; //contrôle la direction (avancer ou reculer) du moteur 2 (gauche)






/*--------------------------------------------------------*/
/** Début du programme - Setup **/
/*--------------------------------------------------------*/
void setup() {
Serial.begin(9600);

//direction robot
pinMode(M1, OUTPUT); //met la pin du moteur 1 en sortie
pinMode(M2, OUTPUT); //met la pin du moteur 2 en sortie
pinMode(E1, OUTPUT); //met la pin de E1 en sortie
pinMode(E2, OUTPUT); //met la pin de E2 en sortie
//direction robot
}

/*--------------------------------------------------------*/
/** Boucle principale du programme **/
/*--------------------------------------------------------*/
void loop()
{
distancedroite=mesure_distance(capteurdroit); //recupere l'info de distance de l'obstacle du capteur droit
//Serial.println("capteur droit:");
//affichage(); //affiche cette distance

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

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
}
//delay(1000); //attend pour un affichage plus clair
}




/*--------------------------------------------------------*/
/** Fonctions relatives aux capteurs US **/
/*--------------------------------------------------------*/
int mesure_distance(int capteur)
{
requete(capteur); //envoie la demande au capteur
mesure_reponse(capteur); //recupere la distance mesurée
return distance_cm;
}


void requete(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);
}




int mesure_reponse(int capteur)
{
pinMode(capteur,INPUT);

duree=pulseIn(capteur,HIGH); // attend l'impulsion du capteur, et retourne sa durée en microseconde

//if(duree>30000) //test de la condition d'abscence d'obstacle
// duree=0;

distance_cm=duree/58;
return distance_cm;
}


void affichage()
{

// if(duree==0) // Si on a détécté precedemment qu'il n'y a pas d'obstacle, on l'affiche
// Serial.println("Pas d'obstacle!!!!!");

// else // Si non, on affiche la distance
// {
Serial.print(duree);
Serial.println("uS");

Serial.print(distance_cm);
Serial.println("cm");
// }
}



/*--------------------------------------------------------*/
/** Fonctions relatives aux moteurs **/
/*--------------------------------------------------------*/


void avancer(char a,char 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(char c,char d) //reculer
{
analogWrite (E1,c); //PWM Speed Control
digitalWrite(M1,LOW); //M1 recule
analogWrite (E2,d);
digitalWrite(M2,LOW); //M2 recule
}

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

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

Re salut,

Voici le code de ta fonction 'requete()':

void requete(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);
}

Je ne suis pas sûr de ce que j'avance, mais il me semble qu'utiliser pinMode() en plein programme ne fonctionne pas (mais je peux me tromper, il me semblait l'avoir lu ici même une fois). Il faut utiliser la manipulation de port à la place.

Essaie de mettre les pinMode() dans le setup(), et tiens nous au courant.

Si çà peut vous aider, voilà ce que j’obtiens dans mon serial monitor si j'active l'affichage:
(une première mesure au milieu de l'appartement puis je mets mes mains devant les capteurs)

capteur droit:
17855uS
307cm
capteur gauche:
11839uS
204cm
capteur droit:
797uS
13cm
capteur gauche:
501uS
8cm

Je suis obligé de le faire dans la requête car il faut la mettre en sortie avant chaque nouvelle mesure et vu que la setup se lance qu'une seule fois c'est pas possible comme çà.
J'ai quand même essayé et du coup il fait qu'une seule mesure et après les capteurs renvoient 0 donc j'ai triché et j'ai fait un
if(duree==0) duree=20000;

Comme çà après la 1ère mesure les capteur renvoient une très grande distance. Mais çà veut quand même pas marché donc çà ne doit pas venir de là.
Merci pour ton aide en tout cas.

Yep!

Tes resultats ont l'air correct, non ??? (Il faut pas diviser le temps du signal par 2 pour aller/retour ???)

Faudrait virer tout les char, ceux des déplacements aussi. Ca fait pas propre d'envoyer des a, des z, etc au moteur...

Lorsque tu fais gauche (100,100);, on sait pas trop si tu envoies char(100) ou int(100). A priori, c'est un char que tu envoies et je ne vois pas comment tes pins sorties moteur peuvent l'interpreter...

@+

Zoroastre.

J'ai bien divisé par 2. (et les résultats sont correct oui)

J'ai changé le programme mais en fait j'avais fait çà car les pin E1 et E2 permettent de contrôler les vitesses des moteurs mais bon je peux faire comme tu me dis et mettre des vitesses constantes comme ceci (mais ce code ne marche toujours pas, le robot tourne sur lui même vers la droite et si je met main devant le capteur gauche rien ne ce passe et si je la met devant le droit, le robot recule alors que je ne fait jamais appel à la fonction reculer je ne comprend plus rien! )
merci pour ton aide !!!!!!

/*--------------------------------------------------------*/
/** Déclaration des prototypes des fonctions **/
/*--------------------------------------------------------*/

// Capteurs US
void requete(int capteur);
int mesure_distance(int capteur);
int mesure_reponse(int capteur);
void affichage();

//Déplacement
void avancer();
void reculer();
void droite();
void gauche();


/*--------------------------------------------------------*/
/** Déclaration des constantes et variables blobales **/
/*--------------------------------------------------------*/
//capteurs US
const int capteurdroit=7;
const int capteurgauche=8;
long duree;
int distance_cm;
int distancedroite, distancegauche;

//Moteurs
const int E1 = 5; // contrôle la vitesse du moteur 1 (gauche)
const int E2 = 6; // contrôle la vitesse du moteur 2 (droite)
const int M1 = 4; //contrôle la direction (avancer ou reculer) du moteur 1 (gauche)
const int M2 = 7; //contrôle la direction (avancer ou reculer) du moteur 2 (gauche)






/*--------------------------------------------------------*/
/** Début du programme - Setup **/
/*--------------------------------------------------------*/
void setup() {
Serial.begin(9600);

//direction robot
pinMode(M1, OUTPUT); //met la pin du moteur 1 en sortie
pinMode(M2, OUTPUT); //met la pin du moteur 2 en sortie
pinMode(E1, OUTPUT); //met la pin de E1 en sortie
pinMode(E2, OUTPUT); //met la pin de E2 en sortie
//direction robot
}

/*--------------------------------------------------------*/
/** Boucle principale du programme **/
/*--------------------------------------------------------*/
void loop()
{
distancedroite=mesure_distance(capteurdroit); //recupere l'info de distance de l'obstacle du capteur droit
//Serial.println("capteur droit:");
//affichage(); //affiche cette distance

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

if (distancegauche<20) //si un obstacle se presente à gauche
{
droite (); //on tourne à droite
delay(400); //pendant 0,4 secondes
}

else if (distancedroite<20) //si un obstacle se presente à droite
{
gauche (); //on tourne à gauche
delay(400); //pednant 0,4 secondes
}

else
{
avancer (); //sinon on avance tout le temps
}
//delay(1000); //attend pour un affichage plus clair
}




/*--------------------------------------------------------*/
/** Fonctions relatives aux capteurs US **/
/*--------------------------------------------------------*/
int mesure_distance(int capteur)
{
requete(capteur); //envoie la demande au capteur
mesure_reponse(capteur); //recupere la distance mesurée
return distance_cm;
}


void requete(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);
}




int mesure_reponse(int capteur)
{
pinMode(capteur,INPUT);

duree=pulseIn(capteur,HIGH); // attend l'impulsion du capteur, et retourne sa durée en microseconde

//if(duree>30000) //test de la condition d'abscence d'obstacle
// duree=0;

distance_cm=duree/58;
return distance_cm;
}


void affichage()
{

// if(duree==0) // Si on a détécté precedemment qu'il n'y a pas d'obstacle, on l'affiche
// Serial.println("Pas d'obstacle!!!!!");

// else // Si non, on affiche la distance
// {
Serial.print(duree);
Serial.println("uS");

Serial.print(distance_cm);
Serial.println("cm");
// }
}



/*--------------------------------------------------------*/
/** Fonctions relatives aux moteurs **/
/*--------------------------------------------------------*/


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

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

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

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

Yep!

Commentes cette première partie et vois comment ton robot réagit.

/*
//Déplacement
void avancer();
void reculer();
void droite();
void gauche();
*/

@+

Zoroastre.

J'ai essayé mais çà ne change rien...
Merci pour ton aide en tout cas...

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