Aller au contenu


Photo
* * * * * 1 note(s)

Guide linéaire motorisé


  • Veuillez vous connecter pour répondre
172 réponses à ce sujet

#41 cook

cook

    Membre occasionnel

  • Membres
  • Pip
  • 118 messages

Posté 22 avril 2020 - 09:42

Oui , vous avez trouvé . Chapeau. Le détail en image ci dessous .

Mais ! il a fallu que je supprime  stepper.stop(); .

Je suppose que lui aussi à un besoin précis mais je sais pas lequel  . J'ai bien essayé pour briller un peu ;)

#include <AccelStepper.h>
AccelStepper stepper (1, 9, 8);



const int PinBoutonInit = A0; //Bouton qui déplacera le chariot vers la buté à 30 cm
const int PinContactButé = A1;// Contact qui stope le chariot à 30 cm



void  initMoteur () {


    if (digitalRead(PinBoutonInit) == 0) {
   
   Serial.println (" Initialisation en cours "  );


    while (digitalRead(PinContactButé) == 1) {
      stepper.runSpeed();
      // on attends la buté 
      }
       //stepper.stop();
    Serial.println ("Initialisation terminée " );
    
  }
}



void setup() {
  
  Serial.begin(9600);
  pinMode(A0, INPUT_PULLUP); //  pour le mettre en INPUT_PULLUP
  pinMode(A1, INPUT_PULLUP); //  pour le mettre en INPUT_PULLUP
     stepper.setMaxSpeed(4000);
  stepper.setSpeed(3900); 
}

void loop() {


  initMoteur ();
}


#42 Mike118

Mike118

    Staff Robot Maker

  • Administrateur
  • PipPipPipPipPip
  • 9 959 messages
  • Gender:Male
  • Location:Anglet

Posté 23 avril 2020 - 01:22

Quand tu mets le .stop dan ton programme, par hasard, est ce que ça marche une fois juste après que tu ais allumé ta carte et après ça ne marche plus du tout jusqu'à ce que tu éteigne à nouveau et rallume pour marcher une nouvelle fois?  ( PS tu peux aussi appuyer sur le bouton reset et relâcher au lieu d'allumer et d'éteindre. 


Si mon commentaire vous a plus laissez nous un avis  !  :thank_you:

Nouveau sur Robot Maker ? 

Jetez un oeil aux blogs, aux tutoriels, aux ouvrages, au robotscope  aux articles,  à la boutique  et aux différents services disponible !
En attendant qu'une bibliothèque de fichiers 3D soit mise en place n'hésitez pas à demander si vous avez besoin du fichier 3D d'un des produits de la boutique... On l'a peut être ! 
Si vous souhaitez un robot pilotable par internet n'hésitez pas à visiter www.vigibot.com et à lire le sous forum dédié à vigibot!

 

Les réalisations de Mike118  

 

 

 


#43 cook

cook

    Membre occasionnel

  • Membres
  • Pip
  • 118 messages

Posté 23 avril 2020 - 07:42

Oui le stepper.stop(); marche qu'une fois après la mise en route . Apres il a besoin que je fasse un reset pour à nouveau marché . Le moteur fait un bruit régulier mais ne tourne pas . Comme si il est était dans une boucle .



#44 Mike118

Mike118

    Staff Robot Maker

  • Administrateur
  • PipPipPipPipPip
  • 9 959 messages
  • Gender:Male
  • Location:Anglet

Posté 23 avril 2020 - 08:20

Et maintenant si tu essaye ça : 

Est ce que ça marche ? :P 
 

#include <AccelStepper.h>
AccelStepper stepper (1, 9, 8);

const int PinBoutonInit = A0; //Bouton qui déplacera le chariot vers la buté à 30 cm
const int PinContactButé = A1;// Contact qui stope le chariot à 30 cm

void  initMoteur () {


   if (digitalRead(PinBoutonInit) == 0) {
   
    Serial.println (" Initialisation en cours "  );

    
    stepper.setSpeed(3900); 

    while (digitalRead(PinContactButé) == 1) {
      stepper.runSpeed();
      // on attends la buté 
      }
    stepper.stop(); // On remet à 0 les consignes de vitesse ...
    Serial.println ("Initialisation terminée " );
    
  }
}



void setup() {
  
  Serial.begin(9600);
  pinMode(A0, INPUT_PULLUP); //  pour le mettre en INPUT_PULLUP
  pinMode(A1, INPUT_PULLUP); //  pour le mettre en INPUT_PULLUP
  stepper.setMaxSpeed(4000);

}

void loop() {


  initMoteur ();
}

Maintenant je te laisse nous expliquer ce que tu as compris de comment marche le stop :) 

=> Là tu as fais de l'apprentissage par essais. ( à faire que quand tu test qu'un truc par un truc pour bien comprendre ce qui marche comment ça marche pourquoi etc ... ) 

Sinon en général le mieux c'est de lire la doc quand elle est dispo  surtout que là elle l'est : https://www.airspayc...celStepper.html 

Dans notre cas on va direct à la fonction stop, en lisant on comprend que la fonction stop appelle la fonction move, qui appelle elle même la fonction move to ...
Et quand on regarde la fonction move to on lit : 
 

 

 

If you are trying to use constant speed movements, you should call setSpeed() after calling moveTo().

 

Enfin, si jamais la doc est pas disponible eh bien on peut regarder le code =) 

( Le but de ma remarque ici est d'essayer de t'aider à apprendre à apprendre ;) )

 

Maintenant tu peux peut être ajouter l'affichage sur l'écran =) 


Si mon commentaire vous a plus laissez nous un avis  !  :thank_you:

Nouveau sur Robot Maker ? 

Jetez un oeil aux blogs, aux tutoriels, aux ouvrages, au robotscope  aux articles,  à la boutique  et aux différents services disponible !
En attendant qu'une bibliothèque de fichiers 3D soit mise en place n'hésitez pas à demander si vous avez besoin du fichier 3D d'un des produits de la boutique... On l'a peut être ! 
Si vous souhaitez un robot pilotable par internet n'hésitez pas à visiter www.vigibot.com et à lire le sous forum dédié à vigibot!

 

Les réalisations de Mike118  

 

 

 


#45 cook

cook

    Membre occasionnel

  • Membres
  • Pip
  • 118 messages

Posté 23 avril 2020 - 02:47

C'est difficile de répondre mais je pense que le stop marchais en fait . C'est le stepper.runSpeed() qui à besoin de la vitesse pour fonctionner . Une fois que la lecture se fait dans la la fonction init Moteur , il faut lui rapeller la vitesse parce qu'il ne va plus la chercher dans le setup ( là ou j'avais mis la vitesse ) . Je suis pas sur avoir répondu en plein à la question !! 

En attendant , je vais essayer de faire fonctionner l'écran .



#46 cook

cook

    Membre occasionnel

  • Membres
  • Pip
  • 118 messages

Posté 23 avril 2020 - 05:36

J'ai commencé par écrire sur l’écran  " pour commencer appuyer sur INIT " (sa marche)

Pour la suite je cherche encore ! 

#include <AccelStepper.h>
AccelStepper stepper (1, 9, 8);
#include <LiquidCrystal.h>
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);

const int PinBoutonInit = A0; //Bouton qui déplacera le chariot vers la buté à 30 cm
const int PinContactButé = A1;// Contact qui stope le chariot à 30 cm

void  initMoteur () {
    if (digitalRead(PinBoutonInit) == 0) {

    Serial.println (" Initialisation en cours "  );
    stepper.setSpeed(3900);

    while (digitalRead(PinContactButé) == 1) {
      stepper.runSpeed();
      // on attends la buté
    }
    stepper.stop(); // On remet à 0 les consignes de vitesse ...
    Serial.println ("Initialisation terminée " );
  

  }
}
void setup() {

  Serial.begin(9600);
  pinMode(A0, INPUT_PULLUP); //  pour le mettre en INPUT_PULLUP
  pinMode(A1, INPUT_PULLUP); //  pour le mettre en INPUT_PULLUP
  stepper.setMaxSpeed(4000);
  lcd.begin(16, 2);
  lcd.setCursor(0, 0); {
    lcd.print("Pour commencer");
  }
  lcd.setCursor(0, 1); {
    lcd.print("appuyé sur INIT");
  }
}
void loop() {
initMoteur ();
}



#47 cook

cook

    Membre occasionnel

  • Membres
  • Pip
  • 118 messages

Posté 23 avril 2020 - 05:51

Pour l'écran tout fonctionne . Après , marquer 30.00 cm sur l'écran c'est une autre histoire . Ce que j’essaye de faire depuis , mais je sais pas par ou il faut commencer . L'idée d' une variable qui suis les pas du moteur peut être me guiderai ?  

#include <AccelStepper.h>
AccelStepper stepper (1, 9, 8);
#include <LiquidCrystal.h>
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);

const int PinBoutonInit = A0; //Bouton qui déplacera le chariot vers la buté à 30 cm
const int PinContactButé = A1;// Contact qui stope le chariot à 30 cm

void  initMoteur () {
    if (digitalRead(PinBoutonInit) == 0) {
    lcd.clear();
    lcd.setCursor(0, 0); {
    lcd.print (" Initialisation  "  );}
    lcd.setCursor(0,1 ); {
    lcd.print (" en cours "  );}
     Serial.println (" Initialisation en cours "  );
    stepper.setSpeed(3900);

    while (digitalRead(PinContactButé) == 1) {
      stepper.runSpeed();
      // on attends la buté
    }
    stepper.stop(); // On remet à 0 les consignes de vitesse ...

    lcd.clear();
    lcd.setCursor(0, 0); {
    lcd.print (" Initialisation  "  );}
    lcd.setCursor(0,1 ); {
    lcd.print (" terminée "  );}


    
    Serial.println ("Initialisation terminée " );
  

  }
}
void setup() {

  Serial.begin(9600);
  pinMode(A0, INPUT_PULLUP); //  pour le mettre en INPUT_PULLUP
  pinMode(A1, INPUT_PULLUP); //  pour le mettre en INPUT_PULLUP
  stepper.setMaxSpeed(4000);
  lcd.begin(16, 2);
  lcd.setCursor(0, 0); {
    lcd.print("Pour commencer");
  }
  lcd.setCursor(0, 1); {
    lcd.print("appuyé sur INIT");
  }
}
void loop() {
initMoteur ();
}



#48 cook

cook

    Membre occasionnel

  • Membres
  • Pip
  • 118 messages

Posté 23 avril 2020 - 08:29

J'ai trouvé une solution pour écrire 30 cm à l'écran.

Que de lignes en plus ! mais l'info s'affiche . La butée est sur 30.00 cm . youpi 

#include <AccelStepper.h>
AccelStepper stepper (1, 9, 8);
#include <LiquidCrystal.h>
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);

const int PinBoutonInit = A0; //Bouton qui déplacera le chariot vers la buté à 30 cm
const int PinContactButé = A1;// Contact qui stope le chariot à 30 cm
float Distance = 0;

void  initMoteur () {
    if (digitalRead(PinBoutonInit) == 0) {
    lcd.clear();
    lcd.setCursor(0, 0); {
    lcd.print (" Initialisation  "  );}
    lcd.setCursor(0,1 ); {
    lcd.print (" en cours "  );}
     Serial.println (" Initialisation en cours "  );
    stepper.setSpeed(3900);

    while (digitalRead(PinContactButé) == 1) {
      stepper.runSpeed();
      // on attends la buté
    }
    stepper.stop(); // On remet à 0 les consignes de vitesse ...
    Distance = 30.0;
    
    lcd.clear();
    lcd.setCursor(0, 0); {
    lcd.print (" Initialisation  "  );}
    lcd.setCursor(0,1 ); {
    lcd.print (" terminée "  );}

    delay(3000);

     lcd.clear();
     lcd.setCursor(0, 0); {
    lcd.print (  " Butée " );}
    lcd.setCursor(7, 0); {
    lcd.print (  Distance  );}
     lcd.setCursor(13, 0); {
    lcd.print (  " cm "   );}


    
    Serial.println ("Initialisation terminée " );
  

  }
}
void setup() {

  Serial.begin(9600);
  pinMode(A0, INPUT_PULLUP); //  pour le mettre en INPUT_PULLUP
  pinMode(A1, INPUT_PULLUP); //  pour le mettre en INPUT_PULLUP
  stepper.setMaxSpeed(4000);
  lcd.begin(16, 2);
  lcd.setCursor(0, 0); {
    lcd.print("Pour commencer");
  }
  lcd.setCursor(0, 1); {
    lcd.print("appuyé sur INIT");
  }
}
void loop() {
initMoteur ();
}



#49 Mike118

Mike118

    Staff Robot Maker

  • Administrateur
  • PipPipPipPipPip
  • 9 959 messages
  • Gender:Male
  • Location:Anglet

Posté 23 avril 2020 - 11:16

 

J'ai trouvé une solution pour écrire 30 cm à l'écran.

Que de lignes en plus ! mais l'info s'affiche . 

 

Comme tu le dis, beaucoup de ligne en plus c'est facile de s'y perdre ... Du coup dès que tu as un code qui marche comme ça on passe pas tout de suite à autre chose, on commence par chercher à l'épurer un peu en faisant des fonctions ... 

Tu peux faire une fonction  

" afficherMessageInit() " 

" afficherInitEnCours(); " 

" afficherFinInit();

 

" afficherDistance( float distance ); " 

Et pour le moment on va virer cette variable globale distance ! :P Tu as pas encore de suffisamment bonnes raisons pour garder l'usage d'une variable globale ! :P 


Si mon commentaire vous a plus laissez nous un avis  !  :thank_you:

Nouveau sur Robot Maker ? 

Jetez un oeil aux blogs, aux tutoriels, aux ouvrages, au robotscope  aux articles,  à la boutique  et aux différents services disponible !
En attendant qu'une bibliothèque de fichiers 3D soit mise en place n'hésitez pas à demander si vous avez besoin du fichier 3D d'un des produits de la boutique... On l'a peut être ! 
Si vous souhaitez un robot pilotable par internet n'hésitez pas à visiter www.vigibot.com et à lire le sous forum dédié à vigibot!

 

Les réalisations de Mike118  

 

 

 


#50 cook

cook

    Membre occasionnel

  • Membres
  • Pip
  • 118 messages

Posté 24 avril 2020 - 12:27

Je n'arrive pas avec void AfficherLaDistance () . Ma variable Distance est dans la fonction void initMoteur . Je suppose qu'il faut la sortie de l' pour l'envoyer dans void AfficherLaDistance () 

 

Je lis et relie mais je pige pas .

#include <AccelStepper.h>
AccelStepper stepper (1, 9, 8);
#include <LiquidCrystal.h>
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);

const int PinBoutonInit = A0; //Bouton qui déplacera le chariot vers la buté à 30 cm
const int PinContactButé = A1;// Contact qui stope le chariot à 30 cm


 void  AfficherLaDistance () {
   lcd.clear();
     lcd.setCursor(0, 0); {
    lcd.print (  " Butée " );}
    lcd.setCursor(7, 0); {
    lcd.print (  Distance  );}
     lcd.setCursor(13, 0); {
    lcd.print (  " cm "   );}
 }

 void  AfficherInitTerminée () {
    lcd.clear();
    lcd.setCursor(0, 0); {
    lcd.print (" Initialisation  "  );}
    lcd.setCursor(0,1 ); {
    lcd.print (" terminée "  );}
    Serial.println ("Initialisation terminée " );
 }
  void  AfficherInitEnCours () {
    lcd.clear();
    lcd.setCursor(0, 0); {
    lcd.print (" Initialisation  "  );}
    lcd.setCursor(0,1 ); {
    lcd.print (" en cours "  );}
     Serial.println (" Initialisation en cours "  );}
     
void initMoteur (float Distance) {
    if (digitalRead(PinBoutonInit) == 0) {
    AfficherInitEnCours ();  
    stepper.setSpeed(3900);

    while (digitalRead(PinContactButé) == 1) {
      stepper.runSpeed();
      // on attends la buté
    }
    stepper.stop(); // On remet à 0 les consignes de vitesse ...
    return Distance = 30.0;
    
   AfficherInitTerminée ();
     delay(3000);
     AfficherLaDistance ();
     
  }
}
void setup() {

  Serial.begin(9600);
  pinMode(A0, INPUT_PULLUP); //  pour le mettre en INPUT_PULLUP
  pinMode(A1, INPUT_PULLUP); //  pour le mettre en INPUT_PULLUP
  stepper.setMaxSpeed(4000);
  lcd.begin(16, 2);
  lcd.print("Appuyer sur Init");
 
}

void loop() {
initMoteur ();
}


#51 Mike118

Mike118

    Staff Robot Maker

  • Administrateur
  • PipPipPipPipPip
  • 9 959 messages
  • Gender:Male
  • Location:Anglet

Posté 24 avril 2020 - 12:44

Quelques remarques comme ça :

Tu as testé ton code actuel ?  Est ce que ça affiche ta fonction " AfficherInitTerminée (); " ?

Qui est dans ton init moteur ? Car vu que tu as mis un return avant ... Je pense pas que ça va se faire ...

Quand tu arrive sur un return tu sors tout de suite de la fonction et tu vas pas plus loin ... ( avec un "if " on peut choisir de quitter ou pas une fonction plus tôt if(jeSorsMaintenent) return; 
else jecontinueEncoreUnPeu(); 

 

 

 

 

Ensuite, dans tes fonctions tu as beaucoup d'accolades qui ne servent à rien mis à part à embrouiller tu peux regarder la fonction ci dessous : 
 

 void  AfficherLaDistance (float Distance) {
    lcd.clear();
    lcd.setCursor(0, 0); 
    lcd.print(" Butée ");
    lcd.setCursor(7, 0); 
    lcd.print(Distance);
    lcd.setCursor(13, 0); 
    lcd.print(" cm ");
 }

Et du coup ça t'indique comment passer un paramètre dans ta fonction ... 


Pour l'utiliser tu pourras faire : 
AfficherLaDistance (30.0) ;
 


Si mon commentaire vous a plus laissez nous un avis  !  :thank_you:

Nouveau sur Robot Maker ? 

Jetez un oeil aux blogs, aux tutoriels, aux ouvrages, au robotscope  aux articles,  à la boutique  et aux différents services disponible !
En attendant qu'une bibliothèque de fichiers 3D soit mise en place n'hésitez pas à demander si vous avez besoin du fichier 3D d'un des produits de la boutique... On l'a peut être ! 
Si vous souhaitez un robot pilotable par internet n'hésitez pas à visiter www.vigibot.com et à lire le sous forum dédié à vigibot!

 

Les réalisations de Mike118  

 

 

 


#52 Ludovic Dille

Ludovic Dille

    Habitué

  • Membres
  • PipPip
  • 185 messages
  • Gender:Male
  • Location:Belgique

Posté 24 avril 2020 - 12:47

Après un return, ta fonction se finit et n'exécute pas d'autres instructions (Donc ici AfficherInitTerminée(), delay(3000) et AfficherLaDistance()).

De plus tu as mis un paramètre à la déclaration de ta fonction initMoteur() mais pas dans son appel. Et tu n'utilises pas le parameère Distance dans ta fonction justement.

Mettre return distance = 30.0 ne me semble pas le plus pertinent ici, tu peux juste retourner 30 ou Distance (en fonction de ce que tu voulais faire)

À partir de ça tu pourras peut-être corriger ton programme pour avancer :)

Edit: Mike est plus rapide :P



#53 cook

cook

    Membre occasionnel

  • Membres
  • Pip
  • 118 messages

Posté 24 avril 2020 - 05:12

 

c'est une fonction. 

 

Son nom c'est : " initMoteur ".
Son type est : Void => c'est une fonction qui ne retourne rien ! Si on voulait faire une fonction qui retourne une variable de type int8_t par exemple  on aurait fait : 

 

int8_t initMoteur (){
Serial.println(" Le bouton est appuyé " );
return 1;
}

Je sais plus  , je reviens au départ en sortant un exemple cité plus haut . je vais donc prendre cet exemple que je met en pratique ci dessous dans mon code pour afficher ma distance  .

 

Voila l'erreur que je releve dans mon void AfficherLaDistance quand je compile 

 

lcd.print ( Distance ); La variable Distance n'est pas déclaré !

#include <AccelStepper.h>
AccelStepper stepper (1, 9, 8);
#include <LiquidCrystal.h>
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);

const int PinBoutonInit = A0; //Bouton qui déplacera le chariot vers la buté à 30 cm
const int PinContactButé = A1;// Contact qui stope le chariot à 30 cm

void  AfficherLaDistance () {
  lcd.clear();
  lcd.setCursor(0, 0);
  lcd.print (  " Butée " );
  lcd.setCursor(7, 0); 
  lcd.print (  Distance  );
  lcd.setCursor(13, 0);
  lcd.print (  " cm "   );
 


  void  AfficherInitTerminée () {
    lcd.clear();
    lcd.setCursor(0, 0);
    lcd.print (" Initialisation  "  );
    lcd.setCursor(0, 1 );
    lcd.print (" terminée "  );
    Serial.println ("Initialisation terminée " );
  }

  void  AfficherInitEnCours () {
    lcd.clear();
    lcd.setCursor(0, 0);
    lcd.print (" Initialisation  "  );
    lcd.setCursor(0, 1 );
    lcd.print (" en cours "  );
    Serial.println (" Initialisation en cours "  );
  }

  int8_t initMoteur () {
    if (digitalRead(PinBoutonInit) == 0) {
      AfficherInitEnCours ();
      stepper.setSpeed(3900);

      while (digitalRead(PinContactButé) == 1) {
        stepper.runSpeed();
        // on attends la buté
      }
      stepper.stop(); // On remet à 0 les consignes de vitesse ...
      Distance = 30.0;

      AfficherInitTerminée ();
      delay(3000);
      AfficherLaDistance ();

      return Distance;
    }
  }
  void setup() {

    Serial.begin(9600);
    pinMode(A0, INPUT_PULLUP); //  pour le mettre en INPUT_PULLUP
    pinMode(A1, INPUT_PULLUP); //  pour le mettre en INPUT_PULLUP
    stepper.setMaxSpeed(4000);
    lcd.begin(16, 2);
    lcd.print("Appuyer sur Init");

  }

  void loop() {
    initMoteur ();
  }


#54 Sandro

Sandro

    Pilier du forum

  • Modérateur
  • PipPipPipPipPip
  • 1 260 messages
  • Gender:Male

Posté 24 avril 2020 - 05:38

Bonjour,

 

il faut que tu passes la distance en argument à ta fonction, comme te l'expliquait Mike dans le message #51.

 

Ta fonction doit commancer avec

void  AfficherLaDistance (float Distance) {

au lieu de

void  AfficherLaDistance () {

De cette manière, si tu appelle correctement la fonction :

AfficherLaDistance (30.0);

Alors dans la fonction, la variable Distance, de type float existera et vaudra 30.0
 

 

 


Aidez-nous à vous aider : partagez toutes les informations pertinentes : description précise du problème, contexte, schéma de câblage, liens vers la documentation des composants, votre code (ou encore mieux un code minimal reproduisant le bug), ...

Vous recevrez ainsi plus de réponses, et elles seront plus pertinentes.


#55 cook

cook

    Membre occasionnel

  • Membres
  • Pip
  • 118 messages

Posté 24 avril 2020 - 06:21

Je risque de vous énervé un peu , mais je comprend vraiment pas  .Meme le blog eskimon je le comprends pas . 

 


Ma variable est dans la fonction initMoteur () .  Je ne sais déja pas comment la sortir !!!

après je veux la transférer dans une autre fonction qui s'appelle  void AfficherLaDistance .

 

Je pense comprendre que ce mécanisme est nécessaire pour que ma distance s'affiche  dans void AfficherLaDistance  .

Je me trompe ou ?



#56 Sandro

Sandro

    Pilier du forum

  • Modérateur
  • PipPipPipPipPip
  • 1 260 messages
  • Gender:Male

Posté 24 avril 2020 - 06:52

Il y a deux cas de figure :

 

1) ta variable Distance est disponible dans ta fonction InitMoteur, et tu veux pouvoir l'employer dans la fonction AfficherLaDistance qui est appelée DANS InitMoteur.

Dans ce cas, il faut donner la valeur en ENTRÉE à la fonction AfficherLaDistance  : pour cela, il faut :

a) que tu modifie la fonction void AfficherLaDistance ()  en void AfficherLaDistance (float Distance)

B) et qu'ensuite dans la InitMoteur, tu indique quelle valeur tu souhaite passer : pour celà, tu remplace

      AfficherLaDistance ();

par

      AfficherLaDistance (Distance);   //on donne la valeur de Distance en entrée

dans ta fonction InitMoteur
 

NB : dans ce cas de figure, tu n'as pas besoin de SORTIR ta variable de InitMoteur, il suffit de la FAIRE RENTRER dans AfficherLaDistance

 

 

Un petit code exemple

void ma_fonction_2(int mon_entrée)
{
   Serial.print("Mon entrée est : ");
   Serial.println(mon_entrée);
}

void ma_fonction_1() {
   int ma_variable_de_la_fonction_1 = 1;
   ma_fonction_2(ma_variable_de_la_fonction_1);    //vas afficher "Mon entrée est : 1"
}

 

 

 

2) Le second cas, serait celui où tu voudrais récupérer la valeur de distance après être sorti de InitMoteur (par exemple dans loop). là il faudra faire SORTIR la valeur de Distance de la fonction InitMoteur. Je te propose qu'on laisse cette seconds option de coté dans l'immédiat, ça évitera de t'embrouiller : on y reviendra quand tu aura maitrisé le premier cas.
 


Aidez-nous à vous aider : partagez toutes les informations pertinentes : description précise du problème, contexte, schéma de câblage, liens vers la documentation des composants, votre code (ou encore mieux un code minimal reproduisant le bug), ...

Vous recevrez ainsi plus de réponses, et elles seront plus pertinentes.


#57 cook

cook

    Membre occasionnel

  • Membres
  • Pip
  • 118 messages

Posté 25 avril 2020 - 10:16

eh ben pareil . Je trouve pas  . Même en modifiant certains paramètres , ou retourné dans tous les sens ,  J'ai toujours le  message d’erreur qui s'affiche au niveau de la fonction void initMoteur () { a fonction-definition is not allowed here before " {" token

Des fois je vais prendre l'air quand meme ; sinon je change de couleur  ! :)

#include <AccelStepper.h>
AccelStepper stepper (1, 9, 8);
#include <LiquidCrystal.h>
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);

const int PinBoutonInit = A0; //Bouton qui déplacera le chariot vers la buté à 30 cm
const int PinContactButé = A1;// Contact qui stope le chariot à 30 cm

void  AfficherLaDistance  (float Distance) {
  lcd.clear();
  lcd.setCursor(0, 0);
  lcd.print (  " Butée " );
  lcd.setCursor(7, 0); 
  lcd.print (  Distance  );
  lcd.setCursor(13, 0);
  lcd.print (  " cm "   );
}
 


  void  AfficherInitTerminée () {
    lcd.clear();
    lcd.setCursor(0, 0);
    lcd.print (" Initialisation  "  );
    lcd.setCursor(0, 1 );
    lcd.print (" terminée "  );
    Serial.println ("Initialisation terminée " );
  }

  void  AfficherInitEnCours () {
    lcd.clear();
    lcd.setCursor(0, 0);
    lcd.print (" Initialisation  "  );
    lcd.setCursor(0, 1 );
    lcd.print (" en cours "  );
    Serial.println (" Initialisation en cours "  );
  }

  void initMoteur () {
    if (digitalRead(PinBoutonInit) == 0) {
      AfficherInitEnCours ();
      stepper.setSpeed(3900);

      while (digitalRead(PinContactButé) == 1) {
        stepper.runSpeed();
        // on attends la buté
      }
      stepper.stop(); // On remet à 0 les consignes de vitesse ...
      float Distance = 30.0;

      AfficherInitTerminée ();
      delay(3000);
      AfficherLaDistance(Distance) ;

      
    }
  }
  void setup() {

    Serial.begin(9600);
    pinMode(A0, INPUT_PULLUP); //  pour le mettre en INPUT_PULLUP
    pinMode(A1, INPUT_PULLUP); //  pour le mettre en INPUT_PULLUP
    stepper.setMaxSpeed(4000);
    lcd.begin(16, 2);
    lcd.print("Appuyer sur Init");

  }

  void loop() {
    initMoteur ();
  }


#58 Sandro

Sandro

    Pilier du forum

  • Modérateur
  • PipPipPipPipPip
  • 1 260 messages
  • Gender:Male

Posté 25 avril 2020 - 10:56

Bonsoir,

je sais pas pourquoi ça t'indique l'erreur à cet endroit là.

Mais il te manque l'accolade fermante à la fin de la fonction AfficherLaDistance, juste après la ligne

  lcd.print (  " cm "   );

Je pense que si tu la rajoute ça résoudra le problème.
 


Aidez-nous à vous aider : partagez toutes les informations pertinentes : description précise du problème, contexte, schéma de câblage, liens vers la documentation des composants, votre code (ou encore mieux un code minimal reproduisant le bug), ...

Vous recevrez ainsi plus de réponses, et elles seront plus pertinentes.


#59 cook

cook

    Membre occasionnel

  • Membres
  • Pip
  • 118 messages

Posté 26 avril 2020 - 07:25

Merci Sandro , 

Je l'ai corrigé  . Si en plus je  rajoute des  complications ou il y en a pas !! . C'est pas faute de relire mais je l'ai pas vu du tout . En fait quelques soit l'accolade manquante qui termine une fonction , l'erreur affichée est  la même. C'est à dire problème sur la fonction void initMoteur ()  .! 

Si tu veux m'explique la seconde méthode , c'est volontiers .



#60 Sandro

Sandro

    Pilier du forum

  • Modérateur
  • PipPipPipPipPip
  • 1 260 messages
  • Gender:Male

Posté 26 avril 2020 - 10:15

Du coup ton code fonctionne maintenant?

Et tu voudrais que je t'explique comment sortir une variable d'une fonction?

 

Si c'est ça, j'aimerais bien avant te montrer encore quelque chose d'important lorsqu'on fait ENTRER des variables (on dit aussi qu'on passe une/des variables en ARGUMENT).

Essaye le code suivant :

void plus_un(int n)
{
  Serial.print("Dans la fonction plus_un, AVANT l'addition : n=");
  Serial.println(n);
  n=n+1;
  Serial.print("Dans la fonction plus_un, APRÈS l'addition : n=");
  Serial.println(n);
}

void setup() {
  Serial.begin(9600);
  int n=10;
  Serial.print("Dans le setup, AVANT l'appel à la fonction plus_un, n=");
  Serial.println(n);
  plus_un(n);
  Serial.print("Dans le setup, AVANT l'appel à la fonction plus_un, n=");
  Serial.println(n);
}

void loop() {
  // put your main code here, to run repeatedly:
}

Regarde bien le résultat dans le sérial monitor : que remarques tu de surprenant?

Spoiler


Aidez-nous à vous aider : partagez toutes les informations pertinentes : description précise du problème, contexte, schéma de câblage, liens vers la documentation des composants, votre code (ou encore mieux un code minimal reproduisant le bug), ...

Vous recevrez ainsi plus de réponses, et elles seront plus pertinentes.





0 utilisateur(s) li(sen)t ce sujet

0 members, 0 guests, 0 anonymous users