Bonsoir nekcorp
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 !
Cordialement
jpbbricole