Comment piloter le moteur pas à pas 28BYJ-48 5VDC

Louis.D
lun, 01/17/2022 - 12:20
Comme la library stepper.h est complètement fausse, je l'affirme ici et je le maintient !
Je vous donne une solution sans library beacoup plus performante et précise sous la forme d'un exemple commenté qui a pour but de faire tourner d'un demi tour dans le sens des aiguilles d'une montre le moteur à la vitesse de 4 tours minutes. Puis dans le sens inverse à 16 tours par minutes sur 1 tout et 1/6. puis à vitesse très lente 1 tour par minute retour de 1/6 de tour. et en fin de ce cycle passage en manuel ou vous pouvez demander au moteur un nomble de tour à votre guise dans le sens qui vous plaira par la console série.
J'espère avoir été clair, dans le cas contraire posez vos questions ci-après.
C'est le sujet créer par pablol1000 qui m'a donné l'idée de ce tuto. quand j'aurai 5 mn je ferais une vidéo sur cette exemple.
Tout d'abord le moteur ne comporte que 64 pas, le réducteur divise la rotation pas 64 et mon code créer 8 pas supplémentaire d'ou 64x8*8 = 4096 pas pour que le moteur fasse 1 tour complet. Et non 3072 comme l'annonce Alex dans sa vidéo.
// Raccorder la pin 8 à IN1, la pin 9 à IN2, la pin 10 à IN3, la pin 11 à IN4
int IN1 = 8, IN2 = 9, IN3 = 10, IN4 = 11; // Attribution des variables
int Const = 971, Tempo; // Const est la valeur théorique de la vitesse maxi
long xPas, N, Debut, Fin;
float Vitesse, NbrTour;
byte pin[] = {1, 3, 2, 6, 4, 12, 8, 9}; /* 1 pout B00000001, 3 pour B00000011 etc...
Cela représente l'etat des sorties 8,9,10 et 11 pour chaque pas exeple pour le pas 6
pin[6] est égal 12 en binaire c'est B00001100 (8+4 = 12)* attention le premier pas c'est pin[0] !
et le 8 ème c'est pin[7] */
String Valeur = "";void setup() {
Serial.begin(1000000);
DDRB = B00001111; // attribution des entrées / sorties des pins 8,9,10,11,12,et 13 1 pour OUTPUT, 0 pour INPUT
PORTB = 0; // toutes les pins de 8 à 13 à l'état LOW.
delay(500);
}void loop() {
/*/C'est ici dans le loop que vous pouvez donner des instructions de vitesse,
tours avec ou sans décimal exemple: -1.75 = 1 tour 3/4 en arrière */
Vitesse = 4; Moteur(0.5); // ici Vitesse 4 tours minute sur un demi tour
delay(1000);
Vitesse = 16; Moteur(-1.6); // ici une autre commande en sens inverse
Vitesse = 1; Moteur(0.1); // idem
PORTB = 0; // Cette ligne de code pour libérer le moteur de toute tension
Serial.println("Passage en manuel"); // Comme le texte l'indique
Manuel();
}void Moteur(float Tours) { // Voilà ce qui remplace la library Stepper.h
/* Vous pouvez reconnaitre que c'est très conci par rapport à la library
et on voit ce qui se passe, le code se limite au texte en gras */
xPas = 4096 * Tours; // Conversion du nombre de tours en pas 1 tour = 4096 pas et non 3072 !!!
Tempo = Const * 16 / (Vitesse); // Calcul de la vitesse de roation
if (Tempo < Const * .8) Tempo = Const; // Autorisation de dépasser de 20% la maxi vitesse admissible par quelques moteurs
if (xPas < 0) { Debut = xPas; Fin = 0;} // Attribution des variables de la boucle "for (N = Debut ; N < Fin; N++)" selon le sens
else { Debut = 0; Fin = xPas;}
for (N = Debut ; N < Fin; N++) // Mise en mouvement du moteur
{ PORTB = pin[abs(N % 8)]; delayMicroseconds(Tempo); /* Attribution des valeurs de chaque pin pour chaque pas
la fonction % (modulo) le resultat est de 0 à 7 cela tombe bien pour selectionner l'un des 8 pin[x] */
}
}void Manuel(){
while ( Valeur == "") { Valeur = Serial.readString();} // Attente d'une commande sur le port série
Serial.println(Valeur);
Serial.println(Valeur.toFloat());
Vitesse = 16; Moteur(Valeur.toFloat()); // Transformation de la chaine saisie en réel
Valeur = ""; PORTB = 0; // Remise en attente
Manuel();
}
J'ai complété les commentaires et corrigé un bug car Debut et Fin étaient des entiers que j'ai passé en long pour permettre un nombre de rotation plus important.Avec ces valeurs en entier (int) on à 32767 / 4095 = 8 tours maxi dans les deux sens, par contre en long (long) on obtien 2147483647 / 4096 = 524288 tours dans les deux sens ce qui est plus confortable et largement suffisant. Si vous en voulez plus il suffit multiplier les commandes "Moteur(xxx)". Voilà pour le moment.