Voici l'analyse du comportement bizarre du moteur en se basant sur le programme que vous avez posté.
Vous connectez l'EasyDriver comme ceci à l'objet stepper :
dir_pin, MS1, step_pin, MS2
Pour rappel, MS1 et MS2 servent à déterminer le nombre de micro-pas par pas avec les correspondances suivantes :
MS1 MS2 Microstep Resolution
L L Full Step (2 Phase)
H L Half Step
L H Quarter Step
H H Eigth Step
Une fois ceci FIXÉ, dir sert à donner le sens de rotation et des impulsions LOW-HIGH-LOW sur step font progresser le moteur selon (MS1,MS2), l'EasyDriver appliquant la progression sur le front montant de step (donc de LOW à HIGH)
Pour faire tourner le moteur, stepper envoie la séquence suivante :
Step C0 C1 C2 C3
1 1 0 1 0
2 0 1 1 0
3 0 1 0 1
4 1 0 0 1
Ce qui fait progresser le moteur de 4 pas. Pour le faire reculer, la séquence est appliquée à l'envers
Donc, en supposant que tout est L au départ et que dir = H est une rotation à droite et dir = 0 une rotation à gauche on a successivement :
dir = H, MS1=L, step = H, MS2 = L => le moteur va à droite d'un pas
dir = L, MS1=H, step = H, MS2 = L => rien ne se passe
dir = L, MS1=H, step = L, MS2 = H => rien ne se passe
dir = H, MS1=L, step = L, MS2 = H => rien ne se passe
Par ailleurs, stepper ne faisant pas changer les sorties simultanément, rien ne dit que les états intermédiaires ne provoquent pas des step à droite ou à gauche en 1/2, 1/4 ou 1/8 de pas
Conclusion : ça fait n'importe quoi et c'est normal. Stepper n'est PAS DESTINE A PILOTER UN EASYDRIVER et vous n'arriverez à rien en procédant de la sorte.
Donc, enlevez Stepper, la bibliothèque et également stepper.
Ecrivez une fonction qui fait simplement ceci et qui sera appelée au lieu de step :
void avanceMoteur(byte direction, unsigned long nombreDePas, unsigned long delaiInterPas)
{
digitalWrite(dir_pin, direction);
for (unsigned long pas = 0; pas < nombreDePas; pas++) {
digitalWrite(step_pin, HIGH);
digitalWrite(step_pin, LOW);
delayMicroseconds(delaiInterPas);
}
}
direction est la direction de déplacement, il faut tester si c'est HIGH ou LOW qui fait avancer dans le sens désiré. Je vous conseille de définir deux constantes :
const byte EN_AVANT = HIGH;
const byte EN_ARRIERE = LOW;
à changer en fonction de ce que vous observez. Mais ensuite dans le programme ça sera plus clair
nombreDePas, 200 = 1 tour moteur.
delaiInterPas, nombre de microsecondes entre 2 pas. Pour aller à 2mm/s, il faut 2 / 0,7 = 2,85714285714286 tours et donc ~571 pas et donc 1750µs de délai inter pas