Programme robot suiveur de ligne. Erreur introuvable !

Salut a tous, voila j'ai ecrit un petit programme pour guidée un robot avec un 6 led.

  • Si une led vois une ligne noir, la tension passe a environ 2v soit une valeur de 320.
  • Si une led ne vois rien ( ligne blanche ) environ 4v soir une valeur de 550

les moteurs sont commandés par un PWM de 0 - 255.

// Initialisation de la Variable de comparaison 

const int ligne = 410;

// Initialisation des Variables des entrées / sorties

// LEDS
const int ledG2 = 0; // capteur connectée à la broche numérique 12
const int ledG1 = 1; // capteur connectée à la broche numérique 11
const int ledCG = 2; // capteur connectée à la broche numérique 10
const int ledCD = 3; // capteur connectée à la broche numérique 9
const int ledD2 = 5; // capteur connectée à la broche numérique 7
const int ledD1 = 4; // capteur connectée à la broche numérique 6

// MOTEURS

const int MGs = 4; // Commande sens Moteur Gauche
const int MDs = 2; // Commande sens Moteur Droit

const int MG = 5; // Commande vitesse Moteur Gauche - PWM - 0/255
const int MD = 3; // Commande vitesse Moteur Droit - PWM - 0/255

// Initialisation des Variables vitesses moteur

int VMG;
int VMD;

// Initialisation des Variables internes ( Capteurs ) 

int etatledG3; //variable qui enregistre l'état du capteur
int etatledG2; //variable qui enregistre l'état du capteur
int etatledG1; //variable qui enregistre l'état du capteur
int etatledCG; //variable qui enregistre l'état du capteur
int etatledCD; //variable qui enregistre l'état du capteur
int etatledD3; //variable qui enregistre l'état du capteur
int etatledD2; //variable qui enregistre l'état du capteur
int etatledD1; //variable qui enregistre l'état du capteur

// On créer des variables tension afin de pouvoir afficher la tension de chaque LED

float tensionledG2;
float tensionledG1;
float tensionledCG;
float tensionledCD;
float tensionledD2;
float tensionledD1;


void setup()          //fonction d'initialisation de la carte et des variables
{
  Serial.begin(9600);      // ouvre le port série à 9600 bauds 
  // Initialisation broche sens moteurs / sortie
  pinMode(MGs, OUTPUT); //broche 4 comme étant une sortie
  pinMode(MDs, OUTPUT); //broche 2 comme étant une sortie

  // Mise a l'etat haut du sens des moteurs - NV
  digitalWrite(MGs, HIGH); // Sens moteur gauche Avancer 
  digitalWrite(MDs, HIGH); // Sens moteur droit Avancer



}



void loop()           //fonction principale

{

  // Lecture des valeurs des capteurs pour le guidage

  etatledG2 = analogRead(ledG2); //Lecture de la valeurs du capteur
  etatledG1 = analogRead(ledG1); //Lecture de la valeurs du capteur
 
  etatledCG = analogRead(ledCG); //Lecture de la valeurs du capteur
  etatledCD = analogRead(ledCD); //Lecture de la valeurs du capteur

  etatledD2 = analogRead(ledD2); //Lecture de la valeurs du capteur
  etatledD1 = analogRead(ledD1); //Lecture de la valeurs du capteur

  
   
  // Stop si pas de ligne
  if(etatledG2 > ligne && etatledG1 > ligne && etatledCG > ligne && etatledCD > ligne && etatledD2 > ligne && etatledD1 > ligne) 
    // Si les capteurs ne voient rien, les moteurs restent a l'arret
  {
    VMG = 0;
    VMD = 0;
  }

  if(etatledCG < ligne && etatledCD < ligne ) // Si les capteurs centres vois la ligne -> moteur 255
  {
    VMG = 255;
    VMD = 255;
  }

  // Verification Gauche

  if(etatledG1 < ligne && etatledCG < ligne) // Si le capteur vois la ligne sur le G1
  {
    VMG = 255;
    VMD = 200;
  }

  if(etatledG2 < ligne && etatledG1 < ligne) // Si le capteur vois la ligne sur le G2
  {
    VMG = 255;
    VMD = 125;
  }

  if(etatledG2 < ligne ) // Si le capteur vois la ligne sur le D3 ET D2 - Permet de faire un niveau de correction supplémentaire
  {
    VMG = 255;
    VMD = 0;
  }

  // Verification Droite

  if(etatledD1 < ligne && etatledCD < ligne) // Si le capteur vois la ligne sur le D1
  {
    VMG = 200;
    VMD = 255;
  }

  if(etatledD2 < ligne && etatledD1 < ligne) // Si le capteur vois la ligne sur le D2
  {
    VMG = 125;
    VMD = 255;
  }

  if(etatledD3 < ligne) // Si le capteur vois la ligne sur le D3 et D2 - Permet de faire un niveau de correction supplémentaire
  {
    VMG = 0;
    VMD = 255;
  }


  //Ecriture des valeurs pour les moteurs
  analogWrite(MG,VMG);
  analogWrite(MD,VMD);
}

J'ai donc par la suite ajouter des serialprint pour lire toutes mes variables. Tout est correct. Sauf que quelque soit le cas VMG et VMD reste a 0 !!!!

Merci de votre aide.

Ps : Comment fait ont, dans le moniteur serie, pour que les lectures se mettent a la ligne et non a la suite ?

leprosylv:
Comment fait ont, dans le moniteur serie, pour que les lectures se mettent a la ligne et non a la suite ?

Serial.println()

Peut-être manque-t-il ça déjà :

 pinMode(MG, OUTPUT); 
  pinMode(MD, OUTPUT);

Sur tous les exemples du site du zero en PWM, il n'y a pas le pinmode :confused:

Je t'assure qu'il le faut, j'avais un montage hier qui marchait pas justement à cause de ça, je l'avais oublié.

Au pire ça changera rien ... Et il y est sur la reference arduino analogWrite() - Arduino Reference, je pense qu'ils sont plus calés question arduino que le site du zéro :wink:

ok, je vais l'ajouter alors !

Le problème est que je regarde les valeurs de mes variables VMG et VMD sur le moniteur serie, et elle ne change pas !

Qu'il y est une erreur sur la generation de la PWM ok, mais bon, les valeurs des variables devrait quand meme changer !

Un serial.print dans chacun des if pour voir où passe le programme devrait permettre de comprendre ce qui ce passe.
Beaucoup de if les uns derrière les autres compliquent pas mal la compréhension du déroulement.

Typiquement ça c'est sûrement non voulu. La première condition est écrasée par la suivante:

  if(etatledG2 < ligne && etatledG1 < ligne) // Si le capteur vois la ligne sur le G2
  {
    VMG = 255;
    VMD = 125;
  }

  if(etatledG2 < ligne ) // Si le capteur vois la ligne sur le D3 ET D2 - Permet de faire un niveau de correction supplémentaire
  {
    VMG = 255;
    VMD = 0;
  }

Lorsqu'il y a pas mal de cas, il peut être plus sur de créer un octet qui combine les entrées et de faire un switch .... case...
On est certain que les cas sont mutuellement exclusif. On a un cas par défaut. Et on peut plus facilement voir ce qui ne va pas.

#define vuD2 1
#define vuD1 2
#define vuCD 4
#define vuCG 8
#define vuG1 16
#define vuG2 32

condition = (etatledG2 < ligne)<<5 | (etatledG1 < ligne)<<4 | (etatledCG < ligne)<<3 | (etatledCD < ligne)<<2 | (etatledD1 < ligne)<<1 | (etatledD2 < ligne);
switch(condition){
    case (vuG2 | vuG1) :
           VMG = 255;
           VMD = 125;
           break; 
    case (vuG1 | vuCG) :
           VMG = 255;
           VMD = 200;
           break;
    case :
    case :
    default:
          VMG = 0;
          VMD =0;
          break;
}

Edit remplacement des + par des | dans les opérations logiques et quelques fautes de frappes

Merci, je comprend pas trop la syntaxe mais je vais essayer de trouver un cour la dessus

En il s'agit de cumulé les conditions en une seule variable "condition". Quand une condition est vrai, ça fait 1. Avec la l'opérateur logique << on décale le résultat. Ainsi à la fin tu obtiens par exemple 10000 (16 en décimal) si etatledG2 < ligne. Ensuite avec la fonction switch/case tu choisis quelle réaction adopter en fonction du résultat de condition. Par exemple ici si c'est 16 ou 8 alors :

VMG = 255;
VMD = 200;