j'ai suivie ce tuto pour piloter mon moteur pas à pas NEMA17 (17HS19-2004S1) à l'aide d'un DRV8825 et d'un ESP32 30 broches.
Je souhaite savoir comment je peux faire pour piloter mon moteur de manière précise, c'est à dire de le faire tourner degrés par degrés dans un premier temps.
J'ai lu qu'il fallait mettre les broches M0, M1 et M2 du drv8825 à HIGH afin de le mettre en mode "sixteenth step" et ainsi obtenir une précision de 0.11degrés, en gros il faut mettre +5V sur ces 3 broches pour activer ce mode.
Mais ensuite niveau code je sèche, je trouve pas comment dire que je veux bouger d'un degrés toutes les secondes par exemple. Si vous avez un exemple de code ça m'aidera beaucoup.
En envoyant l'ordre "step" une fois par seconde.
---------------------------------------------------------------------------------------------
J'ai visité le lien que tu indiques et j'ai vu ceci que j'avais déjà vu plusieurs fois :
Le pas ("Step") se déclenche sur le front montant de l'impulsion de commande et pour que l'ordre soit pris en compte le fabricant Texas dit que le temps de "1" comme celui de "0" doit durer au minimum 1,9 µs.
La vitesse maxi que le DRV8825 accepte est de 250 000 ordres "step" par seconde.
Sur l'exemple de ton lien l'auteur fait des poses de 2000 µs sur le temps de "1" et sur le temps de "0".
Je ne sais pas quelle vitesse il croit faire, mais pour moi il fait un pas toutes les 4000 µs.
Il y a ici des grands spécialistes des moteurs pas à pas, ce que je ne suis pas, attendons leur retour.
Résolution, pas précision. Un pas à pas sera toujours précis à environ un pas et demi, soit 2 degré. Ceci a plusieurs conséquences:
− Si on lui demande d'avancer d'un micropas, il se peut qu'il n'avance pas du tout.
− Ce n'est pas la peine d'aller chercher une position à 0,01° près, vu que la précision est de l'ordre de 2°
En conséquence dans l'idéal, pour avancer de 1°, il faudrait dire d'avancer de 8,8888... micros pas (1/0,11°). Pour avancer d'un degré, on peut donc li dire d'avancer des fois de 9 micropas, des fois de 8:
pour 1° idéal 8,89µpas -> 9µpas
pour 2° idéal 17,78µpas -> 18µpas soit 9µpas de plus
pour 3° idéal 26,67µpas -> 27µpas soit 9µpas de plus
pour 4° idéal 35,56µpas -> 36µpas soit 9µpas de plus
pour 5° idéal 44,44µpas -> 44µpas soit 8µpas de plus...
Pas évident ! du fait que le Nema17 a 200 pas pour 360°.
Avec les micro-pas sur 16, ça nous fait 8.8888 pas par degré.
Plusieurs bibliothèques pour steppers proposent des déplacements en degrés, mais elles fonctionnent bien si on fait des stepper.rotate(90), ou 180, … Mais si on fait 360 fois stepper.rotate(1) pour 1 degré, alors on se retrouve avec des erreurs de reports de facilement entre 5 et 10 degrés sur 360.
Je me suis lancé dans l’exercice en utilisant la bibliothèque BasicStepperDriver.h et la fonction map() pour calculer les déplacements.
C’est testé sur un M5 Atom avec interface DRV8825 et Nema17.
Le programme :
/*
Name: ARDFR_PiloterNema17_DRV8825_ESP32.ino
Created: 21.02.2022
Author: jpbbricole
*/
#include <BasicStepperDriver.h> // https://www.arduino.cc/reference/en/libraries/stepperdriver/
//------------------------------------- Moteur param�tres
const int mpapDriverDirPin = 23;
const int mpapDriverStepPin = 19;
const int mpapDriverEnaPin = 22;
struct mpapParametresDef
{
const int pasTour = 200;
const int microPas = 16;
const int rpm = 20;
const int resolution = pasTour * microPas;
int degres = 0;
};
mpapParametresDef mpapPar; // Paramètres du MPAP
BasicStepperDriver mpap(mpapPar.pasTour, mpapDriverDirPin, mpapDriverStepPin, mpapDriverEnaPin);
unsigned long secondeTimer = millis(); // Pour le tempo de 1 seconde
void setup()
{
Serial.begin(115200);
mpap.begin(mpapPar.rpm, mpapPar.microPas);
mpap.setEnableActiveState(LOW);
mpap.enable();
}
void loop()
{
if (millis() - secondeTimer >= 1000) // Si seconde �coul�e
{
mpapPar.degres ++;
mpapMoveDegres(mpapPar.degres);
secondeTimer = millis();
}
if (mpapPar.degres == 360)
{
Serial.println("Fin 360");
delay(2000);
mpapPar.degres = 0;
}
}
//------------------------------------- MPAP tourne de x degr�s
void mpapMoveDegres(int moveDegr)
{
static int mpapPosition; // Mémorisation de la position, en pas du MPAP
int mpapMove = mpapDegresPas(moveDegr) - mpapPosition; // Calcul du d�placement, en pas
Serial.print("Aller a " + String(moveDegr) + " degr.\tdelta: " + String(mpapMove));
mpap.move((long)mpapMove);
mpapPosition += mpapMove;
Serial.println("\tPas " + String(mpapPosition));
}
//------------------------------------- Conversion des degrés en pas
int mpapDegresPas(int degres)
{
return map(degres, 0, 360, 0, mpapPar.resolution);
}
Le programme fait un tour de 360° par pas de 1°, attend 2 secondes et recommence.
Il y a des informations sur le déroulement du programme dans le moniteur série à 19200.
Aller a 74 degr. delta: 9 Pas 658
Aller a 75 degr. delta: 9 Pas 667
Aller a 76 degr. delta: 9 Pas 676
Aller a 77 degr. delta: 8 Pas 684
Aller a 78 degr. delta: 9 Pas 693
Aller a 79 degr. delta: 9 Pas 702
Aller a 80 degr. delta: 9 Pas 711
Aller a 81 degr. delta: 9 Pas 720
Aller a 82 degr. delta: 9 Pas 729
Aller a 83 degr. delta: 9 Pas 738
Aller a 84 degr. delta: 9 Pas 747
Aller a 85 degr. delta: 9 Pas 756
Aller a 86 degr. delta: 8 Pas 764
Ce n’est certainement ce qui se fait de mieux, mais c’est un début !
N'hésites pas à poser des questions !
Merci à tous pour vos réponses, j'y vois un peu plus clair maintenant.
Du coup utiliser des Nema17 pour faire un bras de robot c'est pas terrible vue qu'on à 200 pas pour 360°. Niveau précision de mouvement ça va pas être terrible
Alors je souhaite faire un bras comme celui ci DUMMY ROBOTIC ARM. Pour l'instant j'en suis au tout début, je test surtout la partie électronique, voir ce que je vais utiliser. Après qu'est ce que j'en ferais ... en fait j'en sais rien encore mais j'aimerai quand même être en mesure de prendre des objets disposés sur un plan et ensuite les déposer à un autre endroit du plan avec une certaine précision.
après je sais pas si t'avais vue le schéma du DRV8825, mais si on met les 3 broches M0 M1 et M2 à HIGH (soit +5V) on a un micro step revolution de 1/32 step,
ça ressemble un peu à ce que tu partage pour le TB6600, on a 3 valeurs pour S1 S2 et S3 qui sont à OFF pour un micro step de 32 ... Donc est ce que le driver 8825 ne ferait il pas la même chose ?
Quasiment tous les drivers proposent la même chose, un pilotage par step/dir et des micros-pas. La grosse différence entre eux est les courants et tension maximum disponibles. Mais dans tous les cas avoir beaucoup de micro-pas peut réduire le bruit, mais la précision n'augmentera pas. Tu sera toujours à une précision de plus d'un pas.
Un DRV8825 a un courant maximum par phase de 2,2A (si il était bien refroidi) tandis que le TB6600 peut délivrer 3,5A. Le premier se règle en général avec une résistance, tandis que le deuxième se règle souvent par des interrupteurs.
Tu es certain ?
Les moteurs pap habituels sont à structure hybride c'est-à-dire qu'ils ont des bobinages pour créer un champ magnétique, mais ils ont aussi des aimants permanents.
Je pense qu'il faut distinguer deux cas :
les deux bobinages sont toujours restés alimentés. Je ne vois pas pourquoi il y aurait des sauts de position puisque le vecteur champ magnétique résultant de l'action de chaque bobine n'a pas évolué.
Pour moi la précision dans ce cas est bien d'un micro pas.
les bobinages ne sont pas restés alimentés en permanence, la réluctance va faire que le moteur va chercher à rejoindre un état stable qui correspond à un pas entier.
Ce qui fait que le moteur pourra tourner dans un sens ou dans l'autre pour rejoindre cet état stable.
C'est comme cela que je vois les choses.
PS : il y a des moteurs de format Nema 17 qui ont des pas de 0,9 °.
Non, je ne suis jamais certain, mais j'ai de très fortes présomptions.
Si on coupe les alimentations, le couple est environ divisé par 10, ce qui fait que c'est peu utilisable. En général on ne coupe pas l'alimentation, et les "bons" drivers diminuent le courant par 2, ce qui conserve la moitié du couple. En principe avant de couper ou réduire le courant, le moteur est sur une position stable, et il y restera. Sauf si la charge lui fait perdre des pas.
Cela dépend grandement de la charge. La courbe du couple moteur ressemble à une sinusoïde:
Ce pas entier vient du fait que les pôles sont alignés à 0, à 90° pour 1... En 32 micro pas, les pôles sont alignés pour 0, à 90° pour 32... Ce qui fait que cette courbe est bonne aussi si on est en micro pas. C'est toujours à 1 pas entier que le couple est maximum.
Si on ne demande aucun couple au moteur et que celui-ci n'a pas de frottements, les pôles sont parfaitement alignés (pas 0). Si on demande un couple, le point stable se déplace sur la courbe rouge, et les pôles ne sont plus alignés. Au couple nominal du moteur, il y a un décalage de quasi un pas dans un sens ou dans l'autre. Si on tourne toujours dans le même sens et que l'on a toujours le même couple demandé, toutes les positions seront fausses dans le même sens et un pas fera exactement 1,8°
Mais si on fait par exemple une horloge murale, quand l'aiguille monte, elle est en retard jusqu'à un pas, et quand elle descend, elle est en avance jusqu'à un pas dans l'autre sens. On a alors une imprécision de 2 pas entiers? Que l'on soit en mode pas entiers ou en demi pas.
Il y a aussi un deuxième problème qui se pose, ce sont les frottements secs. Supposons ceux ci très importants genre la moitié du couple nominal (si on va lentement, les frottements visqueux n'interviennent plus). Supposons maintenant que nous soyons alignés sur le pas 0. On est pile poil sur le pas 0 et le couple du moteur est nul. Si on demande d'avancer de quelques micros pas, le moteur ne va pas bouger, et le couple qu'il va fournir augmente mais pas assez pour vaincre les frottements. Avec des frottements de la moitié du couple nominal, tant qu'on a pas demandé d'avancer de quasi 1/3 pas, le moteur ne tournera pas. Comme les frottements secs sont plus importants à l'arrêt, quand le moteur va bouger, il va avancer d'un coup de plusieurs micros pas.
On représente la courbe de couple pour un moteur (avec frottements secs) ainsi:
Si on a des frottements sec importants, on peut même en demandant d'avancer micro pas par micro pas, voir le moteur avancer presque par pas entiers.
Troisième phénomène qui va jouer est que le moteur ne va pas d'une position à l'autre avec une vitesse constante. Si on lui demande d'avancer d'un pas, le couple étant important au début, il va avoir une bonne accélération. Quand il arrive à la bonne position, le couple qu'il fournit est nul et il est peu freiné. Il peut dépasser la position et revenir. On représente souvent la courbe de déplacement par:
C'est ce qui fait que pour certaines vitesse, le moteur peut entrer en résonnance, ne pas faire les pas, voir même aller dans le mauvais sens. Si il y a des frottements secs, le moteur peut dépasser sa position mais ne pas revenir (frottement trop importants alors). En lui demandant d'avancer de 5 micros pas, il peut avancer de plus.
Dernière chose qui intervient peu, A cause des tolérances de fabrication, la position idéale est bonne à 3% (jamais vu un autre chiffre). Cela fait une erreur supplémentaire de 0,03 pas entiers et en mode 32 micro-pas, cela fait 1 micro pas. Si le moteur n'est pas chargé, et qu'il n'y a aucun frottements, on a déjà cette erreur. Si on passe en 128 micro pas, cette imprécision sera alors de 4 micro pas.
Conclusion: Si on n'a pas d'idée exacte du fonctionnement , des frottements... le moteur fait des erreurs qui peuvent être de l'ordre de 1 pas entier. Et comme il y a forcément du frottement sec, si on est en 10000 micro pas, quand on avancera micro pas par micro pas, certains ordres n'auront aucun effet et certains feront plusieurs micro pas. C'est pour cela que passer en 16 ou 32 micro pas est bien, au delà je n'en vois pas encore l'intérêt.
La précision est deux fois meilleure, mais le prix?