Aller au contenu


Photo
* * * * * 1 note(s)

Guide linéaire motorisé


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

#121 cook

cook

    Membre occasionnel

  • Membres
  • Pip
  • 118 messages

Posté 13 mai 2020 - 06:04

Bonjour Sandro, Mike .J'ai continué. J'ai rajouté les millimètres et j'en est profité pour rajouter les  2 derniers boutons qui  était prévu, pour additionner ou soustraire 5 mm au compteur .  j'ai compris assez bien , sa marche .

Il reste la derniere étape pour terminer le code , c'est d’appuyé sur un autre bouton (que je dois rajouter d’ailleurs ) pour faire avancé le moteur en rapport avec ce qui est affiché sur l'écran . 

 

Et puis si c'est possible , c'était pas prévu .  j'aimerai rajouter quelque chose . Sous la mesure en cm qui est affiché sur l'écran , ce serai un confort d'avoir la dimension en pouce qui s'affiche . Le rapport est de 1 pouce pour 2.54 cm . Je lance le sujet ,  la mesure est anglaise . Vu la façon de régler la distance , c'est peut être une vrai galère . Voila , si vous avez un avis la dessus , c'est volontier .

#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 PinContactBute = A1;// Contact qui stope le chariot à 30 cm
const int PinBoutonReglageDistanceCm = A2;//Bouton de reglage distance en Cm
const int PinBoutonReglageDistanceMm = A3;//Bouton de reglage distance en Mm
const int PinBoutonReglageDistancePlus5Mm = A4;//Bouton de reglage distance + 5 Mm
const int PinBoutonReglageDistanceMoins5Mm = A5;//Bouton de reglage distance - 5 Mm

float  ReglageAffichageDistance   (float NouvelleDistance)  {
  
    
   
 if (digitalRead(PinBoutonReglageDistancePlus5Mm  ) == 0) { // Bouton + 5 mm
    NouvelleDistance = NouvelleDistance + 0.5 ;
    if (NouvelleDistance > 290) {
      NouvelleDistance = 30;}
      attendreMs(300);
      Serial.println(NouvelleDistance);
      AfficherLaDistance(NouvelleDistance);
    }
    
    if (digitalRead(PinBoutonReglageDistanceMoins5Mm ) == 0) { // Bouton - 5 mm
    NouvelleDistance = NouvelleDistance - 0.5 ;
    if (NouvelleDistance < 30) {
      NouvelleDistance = 290;}
      attendreMs(300);
      Serial.println(NouvelleDistance);
      AfficherLaDistance(NouvelleDistance);
    }


  if (digitalRead(PinBoutonReglageDistanceMm ) == 0) {  // Bouton réglage des millimetres
    NouvelleDistance = NouvelleDistance + 0.01 ;
    if (NouvelleDistance > 290) {
      NouvelleDistance = 30;}
    attendreMs(100);
    Serial.println(NouvelleDistance);
     AfficherLaDistance(NouvelleDistance);
  }

  while (digitalRead(PinBoutonReglageDistanceCm ) == 0) { // J'appuis sur réglage des cm

    NouvelleDistance = NouvelleDistance + 1 ;   // Le compteur s'incrémente de 1 cm
    if (NouvelleDistance > 290) {
      NouvelleDistance = 30;
    }
    attendreMs(300);                            // on attend 500 ms sans utiliser la fonction delay()
    Serial.println(NouvelleDistance);
    AfficherLaDistance(NouvelleDistance);
  }
  return NouvelleDistance;       // quand on a fini d'incrémenter on retourne la valeur au reste du programme
}


void attendreMs (unsigned int attente) {
  unsigned long InstantouJappuis = millis();           // Variable qui enregistre le déroulement du temps qui passe depuis l'appuis
  while (millis() - InstantouJappuis <  attente ) { // décompte de 500ms en cours
  }
}



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  AfficherInitTermine () {
  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 "  );

}
float initMoteur (float InitDistance ) {


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

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


    InitDistance  = 30.0;

    Serial.println (" D "  );
    Serial.println (InitDistance);

    AfficherInitTermine ();
    delay(1000);
    AfficherLaDistance(InitDistance) ;
  }
  return InitDistance;   // quand on a fini d'initialisé on retourne la valeur au reste du programme
}

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
  pinMode(A2, INPUT_PULLUP); //  pour le mettre en INPUT_PULLUP
  pinMode(A3, INPUT_PULLUP); //  pour le mettre en INPUT_PULLUP
  pinMode(A4, INPUT_PULLUP); //  pour le mettre en INPUT_PULLUP
  pinMode(A5, INPUT_PULLUP); //  pour le mettre en INPUT_PULLUP

  stepper.setMaxSpeed(4000);
  lcd.begin(16, 2);
  lcd.print("START PRESS INIT");
}

void loop() {

  static float maDistance = 29; // Variable qui va stocker la distance de consigne
  maDistance = initMoteur (maDistance);  // Permet d'initialisé ma distance sur 30 cm
  maDistance = ReglageAffichageDistance ( maDistance); // réglage de la distance de 30 à 290 cm
}


#122 Sandro

Sandro

    Pilier du forum

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

Posté 13 mai 2020 - 07:53

Et tu as une idée comment partir, ou tu as encore besoin d'être guidé?


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.


#123 cook

cook

    Membre occasionnel

  • Membres
  • Pip
  • 118 messages

Posté 13 mai 2020 - 08:57

Ah oui j'ai besoin . J'ai une piste . Ci dessous un code qui fait bougé mon moteur  au nombre de pas . J'ai calculé et

testé 42960 pas . Ce qui correspond  à mon moteur pour faire 1 tour .

1 tour moteur corresponde à 11 cm ou 110 mm . Ce qui fait 390,54 pas pour faire 1 mm .

 

Après il doit falloir transformer la distance en nombre de pas . Quelque chose comme ça .

#include <AccelStepper.h>

// Define a stepper and the pins it will use
AccelStepper stepper (1, 9, 8);

void setup()
{  
  // Change these to suit your stepper if you want
  stepper.setMaxSpeed(5000);
  stepper.setAcceleration(500);
  stepper.moveTo(42960);
}

void loop()
{
    
     

    stepper.run();
}


#124 Sandro

Sandro

    Pilier du forum

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

Posté 13 mai 2020 - 10:00

Du coup, deux questions :

1) est-ce que tu veux pouvoir stopper le moteur pendant qu'il bouge ou pas? (je sais pas quelle est l'application finale, donc je sais pas si c'est utile ou pas). S'il n'y a pas besoin de stopper le moteur ce sera un peu plus simple, mais si c'est utile, c'est pas un problème non plus.

2) est-ce que tu comprends bien l'anglais? Si oui, je te suggère de lire la liste des fonctions de la bibliothèque accelSteper que tu utilise ( http://www.airspayce.com/mikem/arduino/AccelStepper/classAccelStepper.html ) et d'essayer de voir quelles sont les fonctions qui peuvent te servir. Dans le cas contraire, je te traduirais celles qui je pense sont les plus pertinentes.


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.


#125 Mike118

Mike118

    Staff Robot Maker

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

Posté 13 mai 2020 - 10:36

Avant d'avancer, je rebondirais un peu plus sur ce qui a été fait : 

Rien de bien grave mais dans ta fonction " ReglageAffichageDistance"  si tu regardes tu as pleins de " blocs de code similaire ". 
Il faut savoir qu'il serait éventuellement possible de faire une fonction pour limiter le nombre de ligne dedans =) 

Au delà de cette simplification possible mais pas obligatoire au début il y a un truc à minima dans ta fonction que j'aimerais bien que tu modifies :P histoire de ne pas être "schizophrène" . En effet si tu regardes dans cette fonction tu as plein de "if " et un " while " . Pourquoi ?  
Y a t il une bonne raison à cette différence ? Lequel est le mieux pour toi et éventuellement, pour quelle raison ? =) 

Est ce que tu veux bien chercher à améliorer encore un peu ce que tu as déjà avant de passer à la suite ? 

Ou bien non tu veux quand même passer à la suite ? 

Je pense qu'en même temps lors de cette amélioration on peut en profiter intégrer la partie affichage de la distance en pouce. 
Pour cela, tu peux faire une fonction qui va convertir la distance en pouce =) qui va prendre en entré la distance en mm et qui retournera la distance en inc =) 

Et tu pourras l'utiliser dans ta fonction affichage distance pour afficher la distance en mm et en inch =)


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  

 

 

 


#126 cook

cook

    Membre occasionnel

  • Membres
  • Pip
  • 118 messages

Posté 14 mai 2020 - 10:53

Bonsoir , je vais commencé par répondre à Sandro . Stopper le moteur , eh bien en fait je compte mettre un arrêt urgence sur l'alimentation au cas ou . Pour le fun ! ça rassurera . Je me suis demandé si c'était bon de couper l'alimentation générale le moteur en marche ! Avec l’électronique ? 

 

Pour la bibliothèque Accel , c'est pas du tout mes premières heures la dessus . Mais c'est pas possible ! je sais pas si c'est l'anglais ( oui surement )  ou la façon de comment c'est fait ,  aussi , mais oufff 

Je fait plutôt avec les codes qu'il propose comme exemple .  Bon après sa fait trop peu de temps que j'essaye .

Malgré tout , j'y suis très très souvent à faire des tests ou du codage . A tel point que je dit plus que je code autour de moi ! C'est vrai j’exagère un peu . Ça fait pas si longtemps !

 

Y n’empêche que sa marche et que je suis le premier surpris . Je leur montrerai une fois fini !

 

Je suis partant pour simplifier le code ou le rendre plus lisible . Oui mais comment ?

Pour les if  , je me suis pas posé de question  . Ça a marché .... et voila  . Chui Curieux , simplifions 

La dimension en pouce , c'est du luxe . Ce serai bien  . 



#127 Sandro

Sandro

    Pilier du forum

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

Posté 14 mai 2020 - 11:16

Bonsoir , je vais commencé par répondre à Sandro . Stopper le moteur , eh bien en fait je compte mettre un arrêt urgence sur l'alimentation au cas ou . Pour le fun ! ça rassurera . Je me suis demandé si c'était bon de couper l'alimentation générale le moteur en marche ! Avec l’électronique ?

Je ne dirais pas que c'est "bon" de couper l'alimentation pendant que le moteur tourne, mais je penses pas que ça pose un problème en pratique. Et de manière générale, si tu veux un vrai arrêt d'urgence, il faut qu'il soit indépendant du programme (sinon si le programme plante, tu ne peux plus utiliser l'arrêt d'urgence).

Si en revanche tu veux prévoir un arrêt en utilisation "normale", alors il faudra passer par l'Arduino (et si tu veux être vraiment "propre" ajouter le bouton d'arrêt d'urgence sur l'alim pour les urgences).

 

 

Pour accelstepper, il y a la fonction runToNewPosition qui m'a l'air bien pratique (à condition de ne pas avoir besoin de pouvoir agir pendant que le moteur bouge). Il faudra la coupler avec une fonction permettant soit de fixer l'origine (setCurrentPosition) ou avec une fonction permettant de connaitre la position (currentPosition). Mais on reviendra sur cette question une fois qu'on aura fini les simplifications / améliorations de la lisibilité

 

 

Pour la question des if/while, est-ce que tu peux nous expliquer quelle est la différence de comportement entre les boutons avec un if et ceux avec un while?

Si tu ne trouves pas, ajoute un attendreMs(1000); à la fin du loop et teste, je pense que tu verra mieux la différence. Mais avant essaye de voir si tu arrives à la trouver en lisant le code.
 


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.


#128 Mike118

Mike118

    Staff Robot Maker

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

Posté 15 mai 2020 - 10:27

En attendant les retours de test des if / while et de l'ajout des pouces par cook, un petit complément sur le bouton d'arrêt d'urgence. 

Si le but est uniquement de couper un moteur, il y a le pin enable qui est sur ton driver de moteur pas à pas qui peut être utilisé pour la chose. 
En branchant ton bouton d'arrêt d'urgence sur ce pin tu peux décider de complètement arrêter ton moteur indépendamment du code arduino. 

 

Mais bon restons pour le moment sur le code à faire, pour aller plus vite et faire les choses bien le mieux est de ne pas trop s'éparpiller ;)

 


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  

 

 

 


#129 cook

cook

    Membre occasionnel

  • Membres
  • Pip
  • 118 messages

Posté 15 mai 2020 - 09:47

voili voila , j'ai retiré les if pour des while . En fait avec les if on passe par le loop . J'étais loin de penser à ce détail là parce que le if c'est la chose la plus facile à retenir . Je le pensais parfait . Au moins on encombre pas le loop inutilement .C'est bien de le savoir . Merci

 

L’affichage en  pouce y est aussi .J'ai trouvé en fait ! J'étais loin de me douter que le trait en travers c'était la division ! Rien à faire pour la variable globale . Elle y est comme la sardine est à l'huile !

// essais 18 reglage avec modif en while et affichage en pouce . Ne pas éffacer

#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 PinContactBute = A1;// Contact qui stope le chariot à 30 cm
const int PinBoutonReglageDistanceCm = A2;//Bouton de reglage distance en Cm
const int PinBoutonReglageDistanceMm = A3;//Bouton de reglage distance en Mm
const int PinBoutonReglageDistancePlus5Mm = A4;//Bouton de reglage distance + 5 Mm
const int PinBoutonReglageDistanceMoins5Mm = A5;//Bouton de reglage distance - 5 Mm
float DistancePouce=0;



float  ReglageAffichageDistance   (float NouvelleDistance)  {
  
    while (digitalRead(PinBoutonReglageDistancePlus5Mm) == 0) {// Bouton + 5 mm
    NouvelleDistance = NouvelleDistance + 0.5 ;
    if (NouvelleDistance > 290) {
      NouvelleDistance = 30;}
      attendreMs(300);
      Serial.println(NouvelleDistance);
      AfficherLaDistance(NouvelleDistance);
      AfficherLaDistancePouce(NouvelleDistance);
    }
    
    while (digitalRead(PinBoutonReglageDistanceMoins5Mm) == 0)  { // Bouton - 5 mm
    NouvelleDistance = NouvelleDistance - 0.5 ;
    if (NouvelleDistance < 30) {
      NouvelleDistance = 290;}
      attendreMs(300);
      Serial.println(NouvelleDistance);
      AfficherLaDistance(NouvelleDistance);
      AfficherLaDistancePouce(NouvelleDistance);
    }


  while (digitalRead(PinBoutonReglageDistanceMm) == 0) { // Bouton réglage des millimetres
    NouvelleDistance = NouvelleDistance + 0.01 ;
    if (NouvelleDistance > 290) {
      NouvelleDistance = 30;}
    attendreMs(100);
    Serial.println(NouvelleDistance);
     AfficherLaDistance(NouvelleDistance);
     AfficherLaDistancePouce(NouvelleDistance);
  }

  while (digitalRead(PinBoutonReglageDistanceCm ) == 0) { // Bouton réglage des cm

    NouvelleDistance = NouvelleDistance + 1 ;   // Le compteur s'incrémente de 1 cm
    if (NouvelleDistance > 290) {
      NouvelleDistance = 30;
    }
    attendreMs(200);                            // on attend 500 ms sans utiliser la fonction delay()
    Serial.println(NouvelleDistance);
    AfficherLaDistance(NouvelleDistance);
    AfficherLaDistancePouce(NouvelleDistance);
  }
  return NouvelleDistance;       // quand on a fini d'incrémenter on retourne la valeur au reste du programme
}


void attendreMs (unsigned int attente) {
  unsigned long InstantouJappuis = millis();           // Variable qui enregistre le déroulement du temps qui passe depuis l'appuis
  while (millis() - InstantouJappuis <  attente ) { // décompte de 500ms en cours
  }
}



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

void  AfficherLaDistancePouce  (float Distance) {
  DistancePouce = Distance / 2.54;
  lcd.setCursor(1, 1);
  lcd.print (  DistancePouce  );
  lcd.setCursor(11, 1);
  lcd.print (  " inch "   );
}



void  AfficherInitTermine () {
  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 "  );

}
float initMoteur (float InitDistance ) {


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

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


    InitDistance  = 30.0;

    Serial.println (" D "  );
    Serial.println (InitDistance);

    AfficherInitTermine ();
    delay(1000);
    AfficherLaDistance(InitDistance) ;
  }
  return InitDistance;   // quand on a fini d'initialisé on retourne la valeur au reste du programme
}

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
  pinMode(A2, INPUT_PULLUP); //  pour le mettre en INPUT_PULLUP
  pinMode(A3, INPUT_PULLUP); //  pour le mettre en INPUT_PULLUP
  pinMode(A4, INPUT_PULLUP); //  pour le mettre en INPUT_PULLUP
  pinMode(A5, INPUT_PULLUP); //  pour le mettre en INPUT_PULLUP

  stepper.setMaxSpeed(4000);
  lcd.begin(16, 2);
  lcd.print("START PRESS INIT");
}

void loop() {

  static float maDistance = 29; // Variable qui va stocker la distance de consigne
  maDistance = initMoteur (maDistance);  // Permet d'initialisé ma distance sur 30 cm
  maDistance = ReglageAffichageDistance ( maDistance); // réglage de la distance de 30 à 290 cm
  
}


#130 Sandro

Sandro

    Pilier du forum

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

Posté 15 mai 2020 - 10:37

 

voili voila , j'ai retiré les if pour des while . En fait avec les if on passe par le loop . J'étais loin de penser à ce détail là parce que le if c'est la chose la plus facile à retenir . Je le pensais parfait . Au moins on encombre pas le loop inutilement .C'est bien de le savoir . Merci

La différence principale est qu'avec le if, on considère au maximum un appui sur le bouton, alors qu'avec le while on considère qu'on appui sur le bouton tant qu'on ne l'a pas relaché (ie un nombre non limité d'appuis).

Dans un if, tu exécute ce qu'il y a dans le if soit 0 fois (si la condition est fausse) soit une fois (si la condition est vraie). Dans un while, tu peux éxécuter le code qui est à l'intérieur 0 fois, 1 fois , 2 fois, ... bref, autant de fois que la condition reste vraie (potentiellement une infinité de fois).
 

 

Rien à faire pour la variable globale . Elle y est comme la sardine est à l'huile !

Pourquoi? Pourquoi est-ce que tu tiens à y mettre une variable globale alors que tu utilise la valeur DistancePouce uniquement  à l'intérieur de la fonction AfficherLaDistancePouce?

C'est complètement inutile. Une variable locale à la fonction AfficherLaDistancePouce fait parfaitement l'affaire.

A toi de jouer!

 

 

 

Enfin, regarde maintenant le code pour tes 4 boutons : est-ce que tu ne trouves pas qu'ils sont quasiment identiques? (bon, le bouton -5mm est un peu plus différents).

Je te propose donc :

1) identifier les différences entre les boutons +1 cm, + 5mm et + 1mm

2) écrire une fonction qui, en lui donnant les bons arguments, remplace le code pour un de ces 3 boutons (les arguments permettront de préciser les éléments qui diffèrent)

 

Fais au moins l'étape 1), si tu bloque pour l'étape 2) je pourrais te donner un indice une fois que tu aura posté les résultats de l'étape 1)
 


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.


#131 cook

cook

    Membre occasionnel

  • Membres
  • Pip
  • 118 messages

Posté 17 mai 2020 - 06:44

Bonjour, 

j'ai pu retirer la variable de l'affichage en pouce . Finalement " print "  peut afficher directement le résultat de la division .

 Plus simple du coup .

 

Apres pour simplifier le while , la structure est la même , c'est vrai mais 

les boutons sont differents .  (digitalRead(PinBoutonReglageDistance)

l'incrémentation ( NouvelleDistance = NouvelleDistance ) est different
Le temps d'attente aussi .( attendreMs(200); )

Ca fait beaucoup . Sans parler du moins 5 mm qui à une différence supplémentaire .

#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 PinContactBute = A1;// Contact qui stope le chariot à 30 cm
const int PinBoutonReglageDistanceCm = A2;//Bouton de reglage distance en Cm
const int PinBoutonReglageDistanceMm = A3;//Bouton de reglage distance en Mm
const int PinBoutonReglageDistancePlus5Mm = A4;//Bouton de reglage distance + 5 Mm
const int PinBoutonReglageDistanceMoins5Mm = A5;//Bouton de reglage distance - 5 Mm




float  ReglageAffichageDistance   (float NouvelleDistance)  {
  
    while (digitalRead(PinBoutonReglageDistancePlus5Mm) == 0) {// Bouton + 5 mm
    NouvelleDistance = NouvelleDistance + 0.5 ;
    if (NouvelleDistance > 290) {
      NouvelleDistance = 30;}
      attendreMs(300);
      Serial.println(NouvelleDistance);
      AfficherLaDistance(NouvelleDistance);
      AfficherLaDistancePouce(NouvelleDistance);
    }
    
    while (digitalRead(PinBoutonReglageDistanceMoins5Mm) == 0)  { // Bouton - 5 mm
    NouvelleDistance = NouvelleDistance - 0.5 ;
    if (NouvelleDistance < 30) {
      NouvelleDistance = 290;}
      attendreMs(300);
      Serial.println(NouvelleDistance);
      AfficherLaDistance(NouvelleDistance);
      AfficherLaDistancePouce(NouvelleDistance);
    }


  while (digitalRead(PinBoutonReglageDistanceMm) == 0) { // Bouton réglage des millimetres
    NouvelleDistance = NouvelleDistance + 0.01 ;
    if (NouvelleDistance > 290) {
      NouvelleDistance = 30;}
    attendreMs(100);
    Serial.println(NouvelleDistance);
     AfficherLaDistance(NouvelleDistance);
     AfficherLaDistancePouce(NouvelleDistance);
  }

  while (digitalRead(PinBoutonReglageDistanceCm ) == 0) { // Bouton réglage des cm

    NouvelleDistance = NouvelleDistance + 1 ;   // Le compteur s'incrémente de 1 cm
    if (NouvelleDistance > 290) {
      NouvelleDistance = 30;
    }
    attendreMs(200);                            // on attend 500 ms sans utiliser la fonction delay()
    Serial.println(NouvelleDistance);
    AfficherLaDistance(NouvelleDistance);
    AfficherLaDistancePouce(NouvelleDistance);
  }
  return NouvelleDistance;       // quand on a fini d'incrémenter on retourne la valeur au reste du programme
}


void attendreMs (unsigned int attente) {
  unsigned long InstantouJappuis = millis();           // Variable qui enregistre le déroulement du temps qui passe depuis l'appuis
  while (millis() - InstantouJappuis <  attente ) { // décompte de 500ms en cours
  }
}



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

void  AfficherLaDistancePouce  (float Distance) {
  
  lcd.setCursor(1, 1);
  lcd.print (  Distance / 2.54  );
  lcd.setCursor(11, 1);
  lcd.print (  " inch "   );
}



void  AfficherInitTermine () {
  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 "  );

}
float initMoteur (float InitDistance ) {


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

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


    InitDistance  = 30.0;

    Serial.println (" D "  );
    Serial.println (InitDistance);

    AfficherInitTermine ();
    delay(1000);
    AfficherLaDistance(InitDistance) ;
  }
  return InitDistance;   // quand on a fini d'initialisé on retourne la valeur au reste du programme
}

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
  pinMode(A2, INPUT_PULLUP); //  pour le mettre en INPUT_PULLUP
  pinMode(A3, INPUT_PULLUP); //  pour le mettre en INPUT_PULLUP
  pinMode(A4, INPUT_PULLUP); //  pour le mettre en INPUT_PULLUP
  pinMode(A5, INPUT_PULLUP); //  pour le mettre en INPUT_PULLUP

  stepper.setMaxSpeed(4000);
  lcd.begin(16, 2);
  lcd.print("START PRESS INIT");
}

void loop() {

  static float maDistance = 29; // Variable qui va stocker la distance de consigne
  maDistance = initMoteur (maDistance);  // Permet d'initialisé ma distance sur 30 cm
  maDistance = ReglageAffichageDistance ( maDistance); // réglage de la distance de 30 à 290 cm

  
}


#132 Mike118

Mike118

    Staff Robot Maker

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

Posté 17 mai 2020 - 07:08

Question, est ce que tu veux explorer cette proposition de sandro dès maintenant, malgré les difficultés que tu vois ? Ou bien préfère tu éventuellement voir ça plus tard et passer à la gestion du moteur ? 

Si jamais tu veux explorer la proposition de sandro voici un gros indice : 

Faire une fonction générique qui prend plusieurs paramètre en fonction de toutes les différences que tu vas rencontrer et gérer tous les cas dans ta fonction générique. 

Exemple : Regarde ce que fait cette fonction ci dessous : 

const uint16_t MINDISTANCE = 30;
const uint16_t MAXDISTANCE = 290;

float updateDistance ( float NouvelleDistance, uint8_t pin, float value, uint16_t temps) {
  while (digitalRead(pin) == 0)  { 
    NouvelleDistance = NouvelleDistance + value ;
    if (NouvelleDistance < MINDISTANCE ) 
      NouvelleDistance = MAXDISTANCE;
    if (NouvelleDistance > MAXDISTANCE ) 
      NouvelleDistance = MINDISTANCE;
    
    Serial.println(NouvelleDistance);
    AfficherLaDistance(NouvelleDistance);
    AfficherLaDistancePouce(NouvelleDistance);
    attendreMs(temps);

  }
  return NouvelleDistance; 
}

Mets des commentaires dans cette fonction modifie là et essaye de l'utiliser dans ta fonction " réglage affichage distance " ... 

D'ailleurs prend l'habitude de bien mettre toutes " constantes " en haut de ton code avec des noms de variables explicites, et à ne pas laisser des chiffres magique au milieu de ton code =) 


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  

 

 

 


#133 cook

cook

    Membre occasionnel

  • Membres
  • Pip
  • 118 messages

Posté 18 mai 2020 - 10:26

Euh bon , je reverrai demain pour la fonction générique . Je sèche un peu là ....  .

J'ai une question concernant l'arduino uno . Est ce que l'on peut envoyer la valeur d'une variable   d'une carte uno à une autre . Dit autrement , es ce que 2 cartes uno peuvent  communiquer entre elle en permanence ?



#134 Mike118

Mike118

    Staff Robot Maker

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

Posté 19 mai 2020 - 12:43

 

J'ai une question concernant l'arduino uno . Est ce que l'on peut envoyer la valeur d'une variable   d'une carte uno à une autre . Dit autrement , es ce que 2 cartes uno peuvent  communiquer entre elle en permanence ?

 

 

Oui c'est possible sans problème avec plusieurs façon différentes ... Mais bon déjà il faut que tu puisses comprendre la fonction "updateDistance" que j'ai fais. 

 

 

Euh bon , je reverrai demain pour la fonction générique . Je sèche un peu là ....  .

 

 

Etape 1) comprendre la fonction updateDistance que je t'ai proposé. 

Lis la plusieurs fois, met des commentaires dedans à chaque ligne si nécessaire , et cherche le lien avec le code que tu avais avant. Comprends bien le rôle de chacun des paramètres , relis la question  1) de sandro dans son dernier message  sachant que la fonction que je te propose c'est un peu la réponse à sa question 2 ... 


Etape 2) quand tu as bien compris ce que fais cette fonction, il faut que tu modifie la fonction  ReglageAffichageDistance : de sorte à utiliser la nouvelle fonction à l'intérieur autant de fois que tu as de boutons, en utilisant les bons paramètre,  au lieu de répéter les gros bloc de code complet qui sont similaire ... 
En plus il faudra utiliser la même astuce que tu utilise partout pour modifier la distance ... 

Maintenant tu as du boulot pour demain ;)


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  

 

 

 


#135 cook

cook

    Membre occasionnel

  • Membres
  • Pip
  • 118 messages

Posté 23 mai 2020 - 03:59

Bonjour , 

C'est trop compliqué . J'ai bien compris les trois paramètres à intégrer . Mais comment ! c'est trop vaste et trop compliqué.  J'ai plus le temps comme en confinage . On va laissé les while comme ils étaient et faire tourné le moteur .

Si vous n' y voyez pas d'inconvénient .



#136 Mike118

Mike118

    Staff Robot Maker

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

Posté 23 mai 2020 - 06:06

Juste pour te montrer que c'était pas " si compliqué " je te lâche la solution 




const uint16_t MINDISTANCE = 30;
const uint16_t MAXDISTANCE = 290;

float updateDistance (float NouvelleDistance, uint8_t pin, float value, uint16_t temps) {
 while (digitalRead(pin) == 0) { 
  NouvelleDistance = NouvelleDistance + value ;
  if (NouvelleDistance < MINDISTANCE ) 
   NouvelleDistance = MAXDISTANCE;
  if (NouvelleDistance > MAXDISTANCE ) 
   NouvelleDistance = MINDISTANCE;

  Serial.println(NouvelleDistance);
  AfficherLaDistance(NouvelleDistance);
  AfficherLaDistancePouce(NouvelleDistance);
  attendreMs(temps);

 }
 return NouvelleDistance; 
}


float  ReglageAffichageDistance   (float NouvelleDistance)  {
  
  NouvelleDistance = updateDistance (NouvelleDistance, PinBoutonReglageDistancePlus5Mm, 0.5, 300);
  NouvelleDistance = updateDistance (NouvelleDistance, PinBoutonReglageDistanceMoins5Mm, -0.5, 300);
  NouvelleDistance = updateDistance (NouvelleDistance, PinBoutonReglageDistanceMm, 0.1, 100);
  NouvelleDistance = updateDistance (NouvelleDistance, PinBoutonReglageDistanceCm, 1, 200);
    
  return NouvelleDistance;       // quand on a fini d'incrémenter on retourne la valeur au reste du programme
}

Après en effet c'était peut être un peu tôt pour ce genre de " factorisation"  (sachant qu'on pourrait encore factoriser un peu =) ) et j'avais pas forcément prévu de te faire voir ça tout de suite avant que sandro ne l'évoque =) Mais d'un autre côté il avait peut être raison de l'évoquer maintenant =) 

 

Bref on passe aux moteurs ;)

+>  Tu avais dis que tu savais faire tourner le moteur, 

 

Juste pour être bien sûr Tu vas déjà faire le "test unitaire " = code d'exemple tout simple avec que cette fonction capable de faire bouger le moteur dans le code qui permet de vérifier que ça marche. 

Genre un code ou le moteur tourne tout doucement pendant 3 secondes, pour s'arrête pendant 2 secondes. Et tu vas vérifier que tu peux choisir dans quel sens le moteur tourne =)

 

Une fois ce code de test vu et maîtrisé tu vas pouvoir intégrer le code dans ton code actuel dans la fonction d'initialisation du moteur. ( Fais bien tourner le moteur doucement ^^ )  
Si possible fais le avec le moteur pas connecté au système de manière à ce que le moteur puisse tourner librement sans rien entraîner et appuis toi sur la butée pour imiter l'action du chariot entraîné par le moteur et vérifie que ça marche comme tu veux =)
 


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  

 

 

 


#137 cook

cook

    Membre occasionnel

  • Membres
  • Pip
  • 118 messages

Posté 27 mai 2020 - 10:25

Bonsoir , 

La factorisation c'est compliqué . Je vais conserver les while encore un peu . C'est plus clair dans un premier temps pour moi . J'ai des essais à faire et qui dit essais dit souvent modif . Alors je verrai .

 

Autant que ça profite à tous le monde , alors pour le moteur j'en était resté avec Sandro , à l'utilisation runToPosition ()  qui bloque tant que les pas ne sont pas tous fait . Ce qui est plutôt pas mal  .

Mais  je viens de me rendre compte qui si j'initialise pas et que je change ma mesure . Si je relance le moteur , eh bien les dimensions s'additionnent !! Et mon plateau sort du guide !

Bref ,  mon code n'est pas utilisable en l'état .


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


void setup() {

 

  stepper.setMaxSpeed(3000);
  stepper. setAcceleration ( 500 ) ;
}


void loop() {
    
  stepper. moveTo ( 42960 ) ;
  
  stepper. runToPosition () ;
 
  delay(1000);
 
  stepper. moveTo ( 0 ) ;
  stepper. runToPosition () ;
   
  delay(2000);
}



#138 Sandro

Sandro

    Pilier du forum

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

Posté 27 mai 2020 - 10:55

Pour runToPosition (ou runToNewPosition comme je suggérais, les deux devraient faire l'affaire), je précisais en effet qu'il fallait initialiser la position ( ou prendre en compte la position actuelle pour faire des déplacements relatifs).

Pour accelstepper, il y a la fonction runToNewPosition qui m'a l'air bien pratique (à condition de ne pas avoir besoin de pouvoir agir pendant que le moteur bouge). Il faudra la coupler avec une fonction permettant soit de fixer l'origine (setCurrentPosition) ou avec une fonction permettant de connaitre la position (currentPosition). Mais on reviendra sur cette question une fois qu'on aura fini les simplifications / améliorations de la lisibilité

Pour la position prise en compte par stepper, il considère qu'au mement où stepper est créé, la position est 0. Donc le "0" est là où se trouve le moteur lorsque tu allume l'arduino (ou fais un reset, ou charges le nouveau sketch), et non pas là où tu voudrais qu'il soit (30 cm plus loin que ta butée).

Du coup, tu as deux solutions :

1) Tu vas à la butée, et tu mesures "reset" la position de stepper en lui disant "oublie la position que tu connais, maintenant ici c'est ce qu'on vas appeler la position 30cm". Pour ça, à la fin de l'initialisation, quand ton moteur est venu se mettre en butée contre le bouton, tu dois faire :

stepper.setCurrentPosition(30.0*NBR_PAS_PAR_CM);

où NBR_PAS_PAR_CM est le nombre de pas qu'il faut pour parcourir un cm

2) Tu vas à la butée, et tu demande à stepper où il pense qu'il est avec la fonction currentPosition :

int32_t cur_pos=stepper.currentPosition();   //position où le moteur pense qu'on est
int32_t offset=cur_pos - 30.0*NBR_PAS_PAR_CM;  //écart entre où le moteur pense être et où il est d'après notre convention

Ensuite, quand tu veux aller à la position x, au lieux de faire

stepper.moveTo(ma_nouvelle_position);

Tu fais

stepper.moveTo(ma_nouvelle_position + offset);

pour compenser la différence entre ton origine et celle du moteur
 

A toi de voir quelle solution te semble plus facile/logique.

 

 

 

Nb : pour runToNewPosition, sauf erreur de ma part, ça revient exactement à la même chose que de faire moveTo suivit de runToPosition, sauf que les deux choses sont faites avec un seul appel de fonction au lieu de deux.

 

 


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.


#139 Mike118

Mike118

    Staff Robot Maker

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

Posté 27 mai 2020 - 11:01

Bon cette fois ci je vais te mâcher tout le travail :)

Je vais juste chercher à t'aider à définir quelles sont les étapes que tu as besoins. 
Si c'est pas déjà lu je t'invite à lire : https://www.robot-ma...programmer.html

 

 

Ok tu es capable de faire bouger un moteur . 

0 ) Etape "vérification que le matériel fonctionne " => Ok . 

Ensuite Think : de quoi as tu besoin ? 

 

=>Quelle est la première fonction qu'on cherche à réaliser dans le code que tu as ? 
=> Est ce que tu peux découper ça en plusieurs " étapes élémentaires " ? 
=> Quelles sont les fonctions que tu as à ta disposition dans la librairie ?  ( si tu ne le sais pas c'est le moment d'aller lire la doc ;)  / de la retrouver (j'ai  déjà fournit un lie ;)
=> Quelles sont les fonctions qui te paraissent utile dans le lot ? / Quelle fonction aimerait tu avoir que tu n'as pas ? ( c'est quoi le lien entre le nombre de pas et les cm ? :P

Normalement à la fin de cette étape tu devrais savoir quels sont les essais que tu dois faire 
=> Test d'initialisation 
=> Validation de déplacement 
=> Création de fonctions spécifiques
etc ... avec les choses que tu as vu .. Et donc planifier dans quel ordre tu vas essayer les choses :)

Enfin il ne te restera plus qu'à agir. =) 

Bien entendu si tu as des questions on reste dispo =) . 

J'ai essayé de te guider à travers des questions un peu comme on guide un étudiant dans un TP ;) 
 

EDIT : je me suis fait devancé par sandro ;) Mais je te recommande quand même vivement de lire les différentes fonctions présentes dans la lib avant de foncer en suivant ce que sandro propose :) 

 


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  

 

 

 


#140 cook

cook

    Membre occasionnel

  • Membres
  • Pip
  • 118 messages

Posté 31 mai 2020 - 03:45

Bonjour , il n'y a aucune différence à utilisé runToPosition ou runToNewPosition(5000) , mis a part que avec que avec run to position il faut utiliser en plus moveTo ( 5000 ) pour avoir le nombre de pas que l'on cherche .

 

Ci dessous l'explication de AccelStepper 

runToNewPosition

Déplace le moteur (avec accélération / décélération) vers la nouvelle position cible et bloque jusqu'à ce qu'il soit en position. Ne l'utilisez pas dans les boucles d'événements, car il se bloque.

runToPosition

Déplace le moteur (avec accélération / décélération) vers la  position cible et bloque jusqu'à ce qu'il soit en position. Ne l'utilisez pas dans les boucles d'événements, car il se bloque.

 

D'aprés mes essais c'est vrai .

N'est ce pas bizarre de créer deux fonctions qui font la même chose ?

 






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

0 members, 0 guests, 0 anonymous users