Configuration

Pour pouvoir atteindre des grandes vitesses, il est nécessaire que la configuration soit en dur, par exemple que le nom des broches soit une constante et non pas une variable. Pour faire cela, il y a un fichier de configuration qui est avec les fichiers de la bibliothèque. C'est pour cela que je conseille de mettre tous les fichiers de la bibliothèque dans le répertoire de travail. Ce fichier de configuration s'appelle QuickStepConf.h .

Equivalences

Une première partie de ce fichier est repéré par le titre Equivalences Cette partie permet de définir des constantes, des équivalences, des commentaires qui peuvent être employés dans le reste de ce fichier, d'où leur présence. A priori, on n'a pas besoin d'y toucher.

Timer utilisé

Pour fonctionner cette bibliothèque a besoin d'un timer pour l'ensemble des moteurs. Il peut être choisi librement. Utiliser un timer 16 bits a deux petits avantages, d'une part pouvoir aller très lentement, jusqu'à 1 pas toutes les 17 minutes, alors qu'avec un timer 8 bits, on a au moins 1 pas toutes les 4 secondes. Mais pour des vitesses aussi faibles, il vaut mieux écrire son propre programme, c'est plus précis.L'autre avantage d'un timer 16 bits est que la base de temps peut être choisie avec plus de précision.

Par défaut, si on ne dit rien, c'est le timer 2 qui est utilisé car il semble moins choisi que les autres. Pour modifier le choix, il suffit de décommenter la ligne correspondante au timer désirer. Par exemple:

//#define timer0pourQuickStep
#define timer1pourQuickStep
//#define timer2pourQuickStep // Par défaut si on ne dit rien
//#define timer3pourQuickStep
//#define timer4pourQuickStep
//#define timer5pourQuickStep

utilisera le timer 1

Il est possible d'utiliser le timer 0 avec quelques réserves:
- si on n'utilise pas les fonctions delay(), millis() et micros(), le PWM sur les broches associées, on peut utiliser le timer 0 sans restrictions
- si on souhaite garder les fonctions, il faut forcer la base de temps (voir quickStepBaseDeTemps(); à 1024µs). Le PWM de la broche 6 pour Uno/Nano ou 13 pour Mega ne peut plus être utilisée
- si la base de temps est de 128µs, 409µs ou 16384µs les 3 fonctions tourneront mais pas à la bonne vitesse (pour les autres bases de temps, le temps système est suspendu).

Le timer 0 est utilisé entre autre par delay(), millis() et micros(), le PWM des broches 5 et 6 d'une Nano ou d'une Uno, le PWM des broches 4 et 13 d'une Mega.

Le timer 1 est utilisé entre autre par la bibliothèque Servo, le PWM des broches 9 et 10 d'une Nano ou d'une Uno, le PWM des broches 11 et 12 d'une Mega.

Le timer 2 est utilisé entre autre par tone(), le PWM des broches 3 et 11 d'une Nano ou d'une Uno, le PWM des broches 9 et 10 d'une Mega.

Le timer 3 est utilisé entre autre par la bibliothèque Servo, le PWM des broches 2, 3 et 5 d'une Mega.

Le timer 4 est utilisé entre autre par la bibliothèque Servo, le PWM des broches 6, 7 et 8 d'une Mega.

Le timer 5 est utilisé entre autre par la bibliothèque Servo, le PWM des broches 44, 45 et 46 d'une Mega.

Configuration d'un moteur

La bibliothèque peut gérer pour l'instant 8 moteurs pas à pas (si le besoin s'en fait sentir, c'est facile d'en gérer plus, mais il faudrait se poser la question de savoir si on privilégie la performance avec un gros code, ou la taille du code). Les moteurs sont repérés par des lettres X, Y, Z, T, U V et W, le dernier moteur n'a pas de nom. Je décris ici la configuration pour le moteur sans nom, pour les autres le principe est le même.

Dans cette configuration, pour définir une constante, il suffit de la décommenter (supprimer les // en début. Les ?? éventuels doivent être remplacés par la bonne valeur numérique.

UN_TOUR

Ligne d'origine dans le fichier QuickStepConf.h:

//#define UN_TOUR ?? pas_ou_micro_pas // Indispensable si on utilise RPM ou RPS

Définit le nombre de pas ou de micro-pas pour le moteur. C'est un entier. Je conseille fortement de suffixer par la lettre L par défaut (la mettre en trop n'est pas grave). Si on utilise une mulitplication pour définir le nombre de pas, il vaut mieux au moins lettre le L sur la première valeur numérique (on peut la mettre sur les deux). Un 28BYJ-48 à en général 2048 pas par tour, et la ligne peut devenir (on peut rajouter une ligne de commentaire pour donner le hard):

// Moteur 28BYJ-48 piloté par un ULN2003 en mode demi-pas 
#define UN_TOUR 2048 pas_ou_micro_pas // Indispensable si on utilise RPM ou RPS

Je conseille plutôt de laisser le commentaire initial pour une modification ultérieure. Pour un moteur hybride en mode 16 micro-pas, on peut écrire:

// Moteur 17HS4401 piloté par un A4498 en mode 16 micro-pas 
#define UN_TOUR (200L*16) pas_ou_micro_pas // Indispensable si on utilise RPM ou RPS

ou

// Moteur 17HS4401 piloté par un A4498 en mode 16 micro-pas 
#define UN_TOUR (200L*16L) pas_ou_micro_pas // Indispensable si on utilise RPM ou RPS

Il n'est pas indispensable de renseigner le nombre de pas par tour du moteur, mais cela peut être pratique si on veut faire tourner le moteur d'un tour ou si on veut donner les vitesses en tr/mn ou tr/s. Sans ce paramètre, les indications en tr/mn et tr/s sont ignorées par la bibliothèque (elle n'a aucun moyen de faire les calculs).

Je conseille fortement les parenthèses si le nombre contient une opération car cela peut donner:

// Moteur 17HS4401 piloté par un A4498 en mode 16 micro-pas 
#define UN_TOUR 200L*16L pas_ou_micro_pas // Indispensable si on utilise RPM ou RPS
...
Serial.print(2 * UN_TOUR); Serial.println(" pas"); // Pour afficher "6400 pas" (correct)
Serial.print(1000000L / UN_TOUR); Serial.println(" µs/pas"); // Pour afficher "312 µs/pas"
...

Dans la deuxième ligne, le calcul est "1000000L / 200L * 16L" et comme les opérations sont faites de la gauche vers la droite, on effectue en fait "(1000000L / 200L) * 16L". Le résultat est 80000 et pas 312,5. C'est un bug peu évident à trouver. Avec les parenthèses, tout rentre dans l'ordre.

VITESSE_MAXI

Ligne d'origine dans le fichier QuickStepConf.h:

//#define VITESSE_MAXI ?? // Rajouter l'unité: micro_secondes_par_pas, RPM, ou RPS

On peut renseigner aussi la vitesse maximale de rotation du moteur, mais ce n'est pas indispensable. Donner ce paramètre va permettre à la bibliothèque de calculer au mieux la fréquence des interruptions du timer. Si aucune vitesse maxi n'est renseignée, le timer est interrompu toutes les 1024ms. Si on renseigne plusieurs paramètres, c'est le moteur le plus rapide qui va imposer la base de temps (fréquence des interruptions du timer).

Pour exprimer les vitesses, on peut la donner en tr/mn (RPM), en tr/s (RPS) ou donner le temps entre deux pas (ou deux micro-pas). Cela peut donner par exemple une de ces trois formes:

// pour 50µs/pas:
#define VITESSE_MAXI 50 micro_secondes_par_pas // Rajouter l'unité: micro_secondes_par_pas, RPM, ou RPS

// pour 5 tr/s:
#define VITESSE_MAXI 5 RPS // Rajouter l'unité: micro_secondes_par_pas, RPM, ou RPS

// pour 500 tr/mn:
#define VITESSE_MAXI 500 RPM // Rajouter l'unité: micro_secondes_par_pas, RPM, ou RPS

STEP

Pour piloter un moteur pas à pas, on peut avoir une commande STEP/DIR ou piloter directement les tensions sur les bobines. Si on est dans le premier cas, il faut décommenter au moins la ligne STEP et éventuellement les lignes DIR et ENABLE. Il ne faut pas définir PREM_BOBINE et ses copines. STEP doit présenter un front montant pour l'avance d'un pas.

Ligne d'origine pour STEP dans le fichier QuickStepConf.h:

//#define STEP ?? // N° de la broche pour STEP

Ce n'est pas compliqué, enlevez les // et remplacez les ?? par le numéro de la broche sur laquelle est branchée STEP. Cela peut donner si STEP est connecté à la broche 3:

#define STEP 3 // N° de la broche pour STEP

DIR

DIR est facultatif si on ne tourne que dans un sens et que l'on a branché DIR au 5V ou à la masse. Si DIR n'est pas défini, cela économise quelques octets de code, et le sens est ignoré dans les déplacements. Ligne d'origine pour DIR dans le fichier QuickStepConf.h:

//#define DIR ?? // N° de la broche pour DIR, facultatif

Si on n'utilise pas DIR, laissez la ligne telle qu'elle est. Sinon si DIR est par exemple connecté à la broche 5:

#define DIR 5 // N° de la broche pour DIR, facultatif

ENABLE

ENABLE est facultatif, elle peut être directement branchée à la masse. Ligne d'origine pour ENABLE dans le fichier QuickStepConf.h:

//#define ENABLE ?? // N° de la broche pour ENABLE. Si on la veut à l'état bas

Décommenter cette ligne mettra la broche en question à l'état bas. On peut écrire par exemple:

#define ENABLE 8 // N° de la broche pour ENABLE. Si on la veut à l'état bas

PREM_BOBINE

Pour piloter un moteur pas à pas, on peut piloter directement les tensions sur les bobines ou avoir une commande STEP/DIR. Si on est dans le premier cas, il faut décommenter deux lignes si la commande utilise 2 broches ou 4 lignes si on utilise 4 broches. Il ne faut pas définir STEP et ses copines.

Lignes d'origine pour la commande directe des bobines dans le fichier QuickStepConf.h:

//#define PREM_BOBINE ?? // N° de la broche pour la première bobine
//#define DEUX_BOBINE ?? // N° de la broche pour la deuxième bobine
//#define TROIS_BOBINE ?? // N° de la broche pour la troisième bobine, ou ordre inverse de la première bobine
//#define QUATRE_BOBINE ?? // N° de la broche pour la quatrième bobine, ou ordre inverse de la deuxième bobine

Si on a une commande avec deux bobines, utilisez PREM_BOBINE et DEUX_BOBINE. Si les broches sont 5 et 6:

// Avec QuickStep:
#define PREM_BOBINE 5 // N° de la broche pour la première bobine
#define DEUX_BOBINE 6 // N° de la broche pour la deuxième bobine
//#define TROIS_BOBINE ?? // N° de la broche pour la troisième bobine, ou ordre inverse de la première bobine
//#define QUATRE_BOBINE ?? // N° de la broche pour la quatrième bobine, ou ordre inverse de la deuxième bobine

// Avec Stepper, mais dans le setup():
Stepper(2048, 5, 6);

// Avec AccelStepper, mais dans le setup():
AccelStepper(FULL2WIRE, 5, 6);

Si on utilise 4 bobines branchées comme suit:

Une phase est sur les broches 2 et 4, l'autre sur 3 et 5. Les déclarations seront par exemple:

// Avec QuickStep:
#define PREM_BOBINE 2 // N° de la broche pour la première bobine
#define DEUX_BOBINE 3 // N° de la broche pour la deuxième bobine
#define TROIS_BOBINE 4 // N° de la broche pour la troisième bobine, ou ordre inverse de la première bobine
#define QUATRE_BOBINE 5 // N° de la broche pour la quatrième bobine, ou ordre inverse de la deuxième bobine

// Avec Stepper, mais dans le setup():
Stepper(2048, 2, 4, 3, 5);

// Avec AccelStepper, mais dans le setup():
AccelStepper(FULL4WIRE, 2, 4, 3, 5);

En fait, on peut parfaitement permuter les couples (2, 4) et (3, 5) ou les broches 2 avec 4 ou bien 3 et 5. Suivant le cas le moteur tournera dans un sens ou dans l'autre. Mais ceci peut se changer par programmation. Notez que l'ordre des broches du ULN2003, et de QuickStep est différent de l'ordre de Stepper ou d'AccelStepper.

DEMI_PAS

Si on utilise 4 bobines, on peut avoir accès au demi-pas en décommentant la ligne DEMI_PAS pour avoir:

#define DEMI_PAS // Par défaut, pas entiers. Fonctionne que si les 4 bobines sont définis!

Cette possibilité ne fonctionne pas pour les commandes à deux broches à cause du hard qui ne permet pas le mode demi-pas. Elle est ignorée par la commande STEP/DIR car pour avoir les demi-pas (et les micro-pas), cela se fait généralement en dur sur le driver. Stepper ne permet pas à ma connaissance ce mode, mais il est accessible avec AccelStepper en utilisant HALF4WIRE au lieu de FULL4WIRE.

INVERSION

Si lors des essais le moteur tourne à l'envers de ce qui est souhaité, décommentez la ligne INVERSION pour avoir:

#define INVERSION // Décommentez la ligne si le moteur tourne dans le mauvais sens

NOMBRE_DE_PAS_MAXIMUM_SUR_16_BITS

Par défaut les nombres de pas et la position absolue sont définis sur 32 bits signés. Si ces valeurs peuvent tenir sur 16 bits signés, on peut configurer la bibliothèque en ayant:

#define NOMBRE_DE_PAS_MAXIMUM_SUR_16_BITS // 32767 pas maxi; par défaut sur 32 bits 2'100'000'000 pas maxi

Cela permet d'économiser 2 octets par ordre dans la pile des mouvements (5 octets par ordre au lieu de 7). Avec un moteur 200 pas par tour, on peut demander de faire jusqu'à 32767/200 = 1600 tours, ce qui peut être souvent suffisant. Pour un 28BYJ-48 on peut aller jusqu'à 32767/2048 = 15 tours. Avec un hybride en 16 micro-pas (3200 micro-pas) on peut faire jusqu'à 10 tours par ordre, mémoriser la position entre -10 tours et +10 tours. Mais on peut faire 30 tours en enchaînant au moins 3 ordres.

Attention toutefois, si la position est mémorisée entre MIN_PAS et +MAX_PAS, le déplacement absolu n'est garanti qu'entre MIN_PAS/2 et +MAX_PAS/2.

NB_ORDRES_DANS_LA_PILE

On peut ranger dans la pile 1, 3, 7, 15, 31, 63, 127 ou 255 ordres de rotation dans la pile. Un ordre occupe 6 octets par défaut si les nombres de pas sont définis sur 32 bits, et 4 octets si les nombres de pas sont définis sur 16 bits. Plus la pile est grande, plus on peut stocker d'ordres à l'avance et plus on peut disposer de temps avant de donner d'autres ordres. Si on utilise des accélérations et décélérations sur N paliers, et si il y a au moins 2N+1 places libres dans la pile, l'ordre complet ne sera pas bloquant. Par défaut, il n'y a qu'un ordre dans la pile (celui qui est en cours) et on a un temps d'arrêt si on enchaîne deux mouvements. Pour avoir la pile la plus grande, il faut avoir:

#define NB_ORDRES_DANS_LA_PILE 255 // Valeurs possibles 1 (défaut), 3, 7, 15, 31, 63, 127 ou 255

NB_ORDRES_ACCELERATION

Les accélérations se font par paliers. On peut choisir entre 1 et 255 paliers. Plus le nombre de paliers est grand, plus l'accélération est régulière, mais plus cela prend de la place dans la pile. Pour avoir 10 paliers (vitesse nulle + 10 paliers + vitesse finale) il faut faire:

#define NB_ORDRES_ACCELERATION 10 // Facultatif, valeurs possibles 1..255

Si on ne définit pas ce paramètre, cela diminue la taille du code et demandes d'accélérations et de décélérations sont ignorées.

Fonctionnement   <<     >>   Commentaires