Exemple: Aller-retour

Différentes méthodes pour faire un tour dans un sens, un tour dans l'autre.

Liens

Pour faire fonctionner cet exemple, il faut soit télécharger QuickStepExemples.zip contenant tous les fichiers d'exemples, soit télécharger Aller-retour.zip contenant cet exemple, soit créer un répertoire du nom de l'exemple et mettre dedans:
- le fichier Aller-retour.ino de l'exemple
- le fichier de configuration QuickStepConf.h propre à cet exemple
- les trois fichiers (QuickStep.h, QuickStep.cpp et digitalWriteFast.h) pour avoir la bibliothèque (identiques pour toutes les applications)

QuickStepConf.h (extrait)

//  Hybride 200pas/tr en mode 16 micro-pas
#define UN_TOUR 200*16 pas_ou_micro_pas
#define VITESSE_MAXI 1.0 RPS
#define STEP 2
#define DIR 5
#define ENABLE 8

Aller-retour.ino

4 méthodes sont proposées, dans la version complète, on fait un aller retour avec chacune des 4 méthodes et on boucle. Ici, je vais faire comme si il y avait 4 programme différents.

La pile des ordres ne contient qu'une place, les mouvements ne sont pas mémorisés à l'avance. Ici on aurait pu passer en comptage 16 bits, mais on a plein de place.

Aller-retour.ino, première possibilité (extraits)

#
  $menu = ":QS";
  include "QuickStep.h"

void setup()
{
  quickStepInit(); // Obligatoire pour utiliser QuickStep
}

void loop()
{ 
  // Première possibilité: On fait un mouvement, on attend qu'il soit fini,
  // on fait un mouvement en sens inverse, on attend qu'il soit fini, on
  // attend 1s, et on boucle

  // Un tour dans un sens, une seconde d'arrêt
  quickStepRotation(UN_TOUR, 1 RPS); // Demande pour aller dans un sens
  quickStepWait(); // Attente de la fin de l'aller (dure le temps de la rotation soit 1s)
  delay(1000);
  
  // Un tour dans l'autre sens, une seconde d'arrêt
  quickStepRotation(-UN_TOUR, 1 RPS); // Demande pour aller en sens inverse
  quickStepWait(); // Attente de la fin du retour (dure le temps de la rotation soit 1s)
  delay(1000);
  
}

Dans cette version, on demande le mouvement par quickStepRotation(UN_TOUR, 1 RPS); qu est une fonction non bloquante. On attend ensuite avec la fonction quickStepWait(); que va attendre la fin du mouvement (fonction bloquante). Au sortir de cette fonction, le moteur vient de s'arrêter, et il nous suffit d'attendre 1s. Pour le retour, on fait le mouvement inverse.

Aller-retour.ino, deuxième possibilité (extraits)

#
  $menu = ":QS";
  include "QuickStep.h"

void setup()
{
  quickStepInit(); // Obligatoire pour utiliser QuickStep
}

void loop()
{ 
  // Deuxième possibilité: le mouvement dure 1s (1 tour à l vitesse de 1tr/s)
  // et l'attente dure 1s l'ensemble dure 2s. quickStepRotation prend un
  // temps négligeable devant les 2s, la rotation se fait pendant le début
  // de delay(2000).
  
  // Un tour dans un sens, une seconde d'arrêt
  quickStepRotation(UN_TOUR, 1 RPS); // Demande pour aller dans un sens
  delay(2000); // Rotation 1s + attente 1s = 2s
  
  // Un tour dans l'autre sens, une seconde d'arrêt
  quickStepRotation(-UN_TOUR, 1 RPS); // Demande pour aller en sens inverse
  delay(2000); // Rotation 1s + attente 1s = 2s
  
}

Comme le mouvement dure 1s (un tour à 1tr/s), on va compter le temps à partie du début de la rotation. Cela économise l'appel à la fonction quickStepWait().

Aller-retour.ino, troisième possibilité (extraits)

#
  $menu = ":QS";
  include "QuickStep.h"

void setup()
{
  quickStepInit(); // Obligatoire pour utiliser QuickStep
}

void loop()
{ 
  // Troisième possibilité: On fait un mouvement, on attend qu'il soit fini,
  // on attend 1s, on demande à revenir en position d'origine, on attend que
  // ce soit fait, on attend 1s, et on boucle

  // Un tour dans un sens, une seconde d'arrêt
  quickStepRotation(UN_TOUR, 1 RPS); // Demande pour aller dans un sens
  quickStepWait(); // Attente de la fin de l'aller (dure le temps de la rotation soit 1s)
  delay(1000);
  
  // Un tour dans l'autre sens, une seconde d'arrêt
  quickStepRotationAbsolu(position_absolue 0, 1 RPS); // Demande pour le retour au départ
  quickStepWait(); // Attente de la fin du retour (dure le temps de la rotation soit 1s)
  delay(1000);
}

Pour l'aller, on tourne de 1 tour, et pour le retour, on revient à sa position de départ par une rotation absolue. On retrouve le quickStepWait() de la première solution.

le mot position_absolue est un commentaire ignoré par le compilateur. Il ne sert qu'à donner le type de paramètre. On aurait pu mettre quickStepRotationAbsolu(0, -60); mais ce n'est pas très explicite.

Aller-retour.ino, quatrième possibilité (extraits)

#
  $menu = ":QS";
  include "QuickStep.h"

void setup()
{
  quickStepInit(); // Obligatoire pour utiliser QuickStep
}

void loop()
{ 
   // Quatrième possibilité: on mixte les deux dernières
  
  // Un tour dans un sens, une seconde d'arrêt
  quickStepRotation(UN_TOUR, 1 RPS); // Demande pour aller dans un sens
  delay(2000); // Rotation 1s + attente 1s = 2s
  
  // Un tour dans l'autre sens, une seconde d'arrêt
  quickStepRotationAbsolu(position_absolue 0, 1 RPS); // Demande pour le retour au départ
  delay(2000); // Rotation 1s + attente 1s = 2s
}