Problème programme déplacement

Bonjour, je travail actuellement sur un projet de robot de salage automatisé, ma partie consiste en la programmation du déplacement du robot à l'aide de capteurs analogiques délivrant une tension continue variant de 0 à 5V qui permettrons après traitement par le programme de modifier le rapport cyclique de deux moteurs pour faire tourner le robot. Pour m'aider à visualiser l'effet du programme j'utilise deux générateurs de tension continue sur les entrées et les deux sorties sont reliées à un oscilloscope. Le problème est que, malgré une différence de tension entre les deux entrées le rapport cyclique ne se modifie pas.

//------------Programme Déplacement Camper Trolley---------------------------------------------------------------

//------------Définition des constantes et variables--------------------------------------------------------

int CaptHallD = 2; // Le capteur Hall droit est affecté à la broche analogique 0
int CaptHallG = 3; // Le capteur Hall gauche est affecté à la broche analogique 1
int MotChenG = 10; // L'actionneur moteur chenille gauche est affecté à la broche numérique 12
int MotChenD = 9; // L'actionneur moteur chenille droit est affecté à la broche numérique 13

//------------Variables---------------------------------------------------------------------------------------

int HallD; // Valeur Lue par le capteur Droit
int HallG; // Valeur Lue par le capteru Gauche
int HallDC; // Valeur du capteur droit convertie
int HallGC; // Valeur du capteur gauche convertie
int Difference; // Rapport des deux tensions

//------------Définition des entrées et sorties------------------------------------------------------------------------------------

void setup()
{
pinMode ( 2, INPUT ); // La broche 0 est une entrée
pinMode ( 3, INPUT ); // La broche 1 est une sortie
pinMode ( 10, OUTPUT ); // La broche 10 est une sortie
pinMode ( 9, OUTPUT ); // La broche 11 est une sortie
}

//------------Programme----------------------------------------------------------------------------------------------------------

void loop()
{
analogWrite(MotChenD, 128);
analogWrite(MotChenG, 128);
HallD = analogRead(CaptHallD); // On mesure la tension délivrée par le capteur droit
HallG = analogRead(CaptHallG); // On mesure la tension délivrée par le capteur gauche

debut:

Difference = (HallD - HallG); // Calcul de la différence des deux tensions converties

if(-50 < Difference < 50)
{
goto debut;
}

else if(50 <= Difference <= 512) // Cas où capteur Gauche relève la plus grande valeur
{
analogWrite(MotChenD, 191);
goto debut;
}

else if(512 < Difference) // Cas où la valeur du capteur gauche >> que valeur capteur droit
{
analogWrite(MotChenD, 230);
goto debut;
}

else if(-512 <= Difference <= -50)
{
analogWrite(MotChenG, 191);
goto debut;
}

else
{
analogWrite(MotChenG, 230);
goto debut;
}
}

Je ne vois vraiment pas d'où pourrais venir le problème ( qui était présent avant l'ajout des "goto" )

Bonjour,
Oh ! les vilains goto surtout qu'ils ne servent à rien.
Dans la première condition du if, tu ne fais rien, pourquoi ?
Comme tu ne donnes pas le type de carte utilisée les sorties sont-elles bien des sorties PWM ?
@+

En faisant un goto début dans chaque branche de tes if then else, tu court-cicuites loop et les commandes moteur et les acquisitions capteur ne sont exécutés qu'une seule fois au tout début.

Donc c'est normal que ça ne fonctionne pas.

retire le label debut: et tous les goto

Cette écriture n'est pas accepté en C

    if(-50 < Difference < 50)

à remplacer par

    if((-50 < Difference) && (Difference< 50))

Les goto sont parfaitement inutiles. Les if else étant mutuellement exclusifs les goto n'apportent rien.
En plus ils perturbent le fonctionnement correct de la fonction loop qui est intégrée dans une boucle (bien qu'invisible pour l'utilisateur). En effet, les goto renvoient à début qui se trouve après la lecture des capteurs qui du coup ne sont jamais lus.

Donc supprimer les goto. Ce qui donne ça:

void loop()
  {
    analogWrite(MotChenD, 128);
    analogWrite(MotChenG, 128);
    HallD = analogRead(CaptHallD); // On mesure la tension délivrée par le capteur droit
    HallG = analogRead(CaptHallG); // On mesure la tension délivrée par le capteur gauche
    
    Difference = (HallD - HallG); // Calcul de la différence des deux tensions converties
    
    if(-50 < Difference < 50)
      {
      }
      
    else if(50 <= Difference <= 512) // Cas où capteur Gauche relève la plus grande valeur
      {
        analogWrite(MotChenD, 191);
      }
      
    else if(512 < Difference) // Cas où la valeur du capteur gauche >> que valeur capteur droit
      {
        analogWrite(MotChenD, 230);
       }

    else if(-512 <= Difference <= -50)
      {
        analogWrite(MotChenG, 191);
      }
   
    else
      {
        analogWrite(MotChenG, 230);
      }     
  }

De plus, je pense que ces 2 lignes

    analogWrite(MotChenD, 128);
    analogWrite(MotChenG, 128);

devraient être mises dans ce if

   if(-50 < Difference < 50)
      {
      }

Merci bien pour ces réponse, j'ai modifié le programme en conséquence je retesterais ça Lundi quand j'aurais accès au matériel pour. La carte est une arduino Uno donc les sorties prise sont bien des PWM sauf erreur de ma part. :smiley:

fdufnews:
Cette écriture n'est pas accepté en C

    if(-50 < Difference < 50)

À vrai dire, c'est tout à fait valide comme écriture mais ça ne fait pas du tout ce que Skomanex pense que ça fait.

Et donc ce que tu suggères est effectivement ce que Skomanex attend (enfin je pense)

l'expression est évaluée de gauche à droite

-50 < Difference vaut 1 ou 0 selon que la comparaison est vraie ou fausse. Ensuite 1 ou 0 est comparé à 50 et le résultat est toujours vrai.

Donc la condition du premier if étant toujours vraie, le programme ne fait rien, même en enlevant les goto