Exemple: BlinkWithDelay
Programme bien connu des amateurs d'Arduino, ici est rajouté un moteur qui n'est nullement gêné pour tourner malgré
le delay(1000);
Liens
Pour faire fonctionner cet exemple, il faut soit télécharger QuickStepExemples.zip
contenant tous les fichiers d'exemples, soit télécharger BlinkWithDelay.zip
contenant cet exemple, soit créer un répertoire du nom de l'exemple et mettre dedans:
- le fichier BlinkWithDelay.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 500 RPM #define STEP 2 #define DIR 5 #define ENABLE 8 #define NOMBRE_DE_PAS_MAXIMUM_SUR_16_BITS #define NB_ORDRES_DANS_LA_PILE 255 #define NB_ORDRES_ACCELERATION 50
BlinkWithDelay.ino (extrait)
# $menu = ":QS"; include "QuickStep.h" void setup() { quickStepInit(); // Obligatoire pour utiliser QuickStep pinMode(LED_BUILTIN, OUTPUT); } int sensDeRotation = -1; void loop() { // Les lignes ci-dessous prennent un temps nettement inférieur à 4s while (quickStepLibre() > 100) // Si on a la place de mettre un ordre complet 50 paliers d'accélérations + 50 paliers // de décélération + 1 palier à vitesse constante soit 101 ordres élémentaires. Sinon, on le fera plus tard. { sensDeRotation = -sensDeRotation; // Alterne +1, -1, +1, -1... si on commence avec +1 ou -1 quickStepRotation(sensDeRotation * 10 * UN_TOUR, VITESSE_MAXI, acceleration_sur 4 * UN_TOUR, deceleration_sur 4 * UN_TOUR); } delay(1000); digitalWrite(LED_BUILTIN, !digitalRead(LED_BUILTIN)); // Change d'état la led }
Un mouvement complet du moteur utilise 101 ordres élémentaires (50 paliers d'accélérations, 1 palier à vitesse maximal et 50 paliers de décélération) dans la pile de 255 ordres. On peut donc y loger on peu plus de 2 mouvements complets. Le clignotement de la led utilise un delay(1000);, il faut donc pour que la temporisation ne bloque pas le moteur qu'un mouvement complet dure au moins 500ms. Ainsi la pile des ordre ne sera jamais vide.
Pour que quickStepRotation(...) ne soit pas bloquante, il faut qu'elle puisse mettre les 101 ordres élémentaires dans la pile en une fois. On va donc tester avant d'appeler cette fonction que le nombre de places libres est d'au moins 101. quickStepRotation(...) dure environ 15ms (voir Performances de QuickStep), cela ne va pas trop ralentir le clignotement.