Bonjour,
J'utilise un moteur pas a pas de la marque Creality de référence 42-34 je le pilote avec un module L298n avec pour tension d'alimentation 12V CC et 2A hors le couple de fonctionnement est très faible, il se bloque pour un rien.
Ayant une imprimante 3D Ender 3 avec les mêmes moteur je me rends compte que le moteur n'est pas forcement la source de mon problème.
Est ce que passer sur un driver du type TMC2208 ou autre (j'attends vos conseil) augmenterais le couple du moteur ? le soucis vient-il de ma tension d'alimentation ? est ce que je dois changer de moteur ?
![]()
Post mis dans la mauvaise section, on parle anglais dans les forums généraux. ➜ déplacé vers le forum francophone.
Merci de prendre en compte les recommandations listées dans "Les bonnes pratiques du Forum Francophone”
votre L298n mange 3V donc votre moteur ne reçoit que 9V et 2A c'est vraiment l'extrême max que le L298n peut délivrer.. Un driver plus récent type ce qu'offre Polulu serait sans doute mieux
Bonjour nathan_gtr
Ou le A4988 qui est universellement utilisé pour ce type de moteurs (NEMA17).

Cordialement
jpbbricole
Merci beaucoup, vos infos sont super utiles !
Je commande le module A4988, je testerais ça quand je l'aurais reçu.
Est-ce que ça vaut le coup de changer mon alim pour passer sur du plus gros du type 20-24V pour être sur d'avoir une puissance optimal sur mon moteur ?
Bonsoir nathan_gtr
Dépendant de ce qu'entraîne ton moteur, mais dans un premier temps, ça devrait suffire.
Cordialement
jpbbricole
Pour donner une réponse adaptée et expliquer le manque de couple, il faut savoir ce qui a été fait. Sans aucune information que deux références, on ne peut donner aucun conseil valable. C'est un peu comme si l'embrayage de ta voiture ne fonctionnait plus et que tu ne donnes que la marque de ta voiture. On ne pourrait te conseiller que de tout changer.
Un module L298N utilise deux résistances pour fixer le couple. On n'a pas cette info. Quel est le câblage réalisé? ...
Si en plus on a les caractéristiques du moteur sous un lien, cela peut aider. Je peux avoir besoin du courant nominal (0,8A par phase), mais il faut aussi la résistance des enroulements. Celui qui t'aide le fera plus volontiers qu'il n'a pas besoin de passer 10mn à chercher cette info.
Non, le couple statique nominal du moteur ne dépend pas du driver. Tout changer peut résoudre le problème, mais je ne trouve pas que ce soit une idée économique. Pour donner une comparaison, tu as une voiture dont le cendrier est plein, et après avoir changé les 4 roues, cela ne règle pas le problème cigarette. Acheter une voiture neuve résout effectivement le problème.
A priori le moteur demande moins de 9V, (il serait bon que quelqu'un fasse une recherche sur les caractéristiques du moteur aussi). Le problème ne vient pas à priori de là.
Le moteur est un 0,8A/phase soit 1,6A par moteur. On a de la marge.
Le couple statique ne dépend pas de la tension. Augmenter la tension n'est utile que pour les vitesses de rotations importantes.
Ce n'est pas forcément idiot de chercher pourquoi cela ne fonctionne pas avant de tout jeter. Le manque de couple est par ailleurs souvent la cause d'un mauvais branchement entre le moteur et le driver (branchement que l'on a pas encore). Commence par changer de place les 4 fils du moteur pour voir si ce n'est pas l'origine du disfonctionnement.
Une autre chose qui est très instructive est de faire tourner le moteur à la vitesse d'un pas par seconde. On voit alors plus facilement certaines choses. Par exemple:
− si il manque un fil ou si un fil est coupé, le moteur a du couple la moitié du temps seulement. mais il peut tourner si on va vite avec un couple faible.
− si il y a une inversion de phases ou une inversion dans le soft, le moteur peut faire des pas en avant et des pas en arrière alternativement
− ...
J'ai reçu le driver A4988, j'ai isolé mon moteur de mon câblage global pour effectuer des test, j'ai réalisé ce câblage :
À noter que, j'ai réglé le potentiomètre du A4988 sur 0,32V une première fois et 0,64V la seconde fois, le premier essais n'était pas concluant... Je m'interoge sur le fait de devoir prendre en compte dans ma formule, l'ampérage max d'une bobine (0,8A dans mon cas) ou des deux bobine (1,6A en tout) ?
ps : La résistance de mes enroulements est de 6Ω
J'ai tester par continuité que mes câble étaient bien branchés au bon endroit en repérant les bornes de mes bobines, le problème ne vient donc pas de là. Ma question est la suivante, pourquoi mon moteur possède 6 pin à quoi servent les deux restants ?
Voici une photo de mon système, il s'agit d'une roue immergée à moitié dans un contenant remplis de graine. Mon projet global est un distributeur automatique de graine..
J'ai donc besoin d'un gros couple au démarrage pour que ma roue arrive à se frayer un chemin et emporter des graine avec elle.
Mon programme est le suivant j'ai essayé de jouer avec mes deux variables (pulseWidthMicros et millisBtwnSteps) pour obtenir un résultat quelconque. Mise à part des grésillement et moteur qui "patine" au démarrage je n'ai rien tiré de ma petite expérience.
Si l'on peut me donner plus de précisions sur l'utilité de ces variables je suis preneur !
const int stepPin = 2 ;
const int dirPin = 3 ;
const int stepsPerRev=200;
int pulseWidthMicros = 100;
int millisBtwnSteps = 1000;
void setup() {
pinMode(stepPin,OUTPUT);
pinMode(stepPin,OUTPUT);
}
void loop() {
digitalWrite(stepPin, HIGH);
digitalWrite(stepPin, HIGH);
delayMicroseconds(pulseWidthMicros);
digitalWrite(stepPin, LOW);
delayMicroseconds(millisBtwnSteps);
}
Je commence sérieusement à remettre les capacité de mon moteur en cause quand je le voit galérer à faire tourner une roue de 17cm de diamètre et de moins de 250gramme ...
Mais par ailleurs j'ai le même sur mon imprimante 3D et après avoir fais quelque test il a bien plus de couple sur l'imprimante. C'est donc sûrement à moi de me remettre en question ^^
J'espère avoir donné autant de données que nécéssaire pour que quelqu'un puisse me venir en aide, je serais toujours la pour donner les infos manquantes dans le pire des cas...
Ceci m'indique que tu maitrises bien le sujet.
Ceci m'indique le contraire.
Les moteurs pas a pas peuvent avoir un nombre variable de pins suivant comment le bobinage interne est câblé
Je viens de lire l'article, il dit clairement que brancher les 6 pins de façon judicieuse est favorable pour un système nécessitant beaucoup de couple et une faible vitesse, ce qui est mon cas !
Il faut bien passer par une phase d'apprentissage ![]()
Mais pour le coup ça ne répond pas à ma question, j'ai vu que ça pouvait endommager mon driver et mon moteur si c'était mal fait ...
Prendre en compte l'ampérage max d'une seule bobine me parait plus logique...
Bonjour nathan_gtr
Je doute que dans le cas de ton moteur, les 6 pins soient câblées. Une bobine est sur 1 et 4 et l'autre sur 6 et3.
Ton câblage est en ordre, mais je viens de voir un problème dans ton programme, tu as oublié d'initialiser la pin du driver A4988 DIR (dirPin)
Voilà ton programme corrigé:
const int stepPin = 2 ;
const int dirPin = 3 ;
const int stepsPerRev=200;
int pulseWidthMicros = 100;
int millisBtwnSteps = 1000;
void setup()
{
pinMode(stepPin,OUTPUT);
pinMode(dirPin,OUTPUT);
digitalWrite(dirPin, HIGH);
}
void loop()
{
digitalWrite(stepPin, HIGH);
digitalWrite(stepPin, HIGH);
delayMicroseconds(pulseWidthMicros);
digitalWrite(stepPin, LOW);
delayMicroseconds(millisBtwnSteps);
}
Je suppose que, comme cette pin n'était pas initialisée, celà faisait fonctionner le driver de façon "bancale"
PS: C'est essayé avec une alimentation 9V 2A.
Cordialement
jpbbricole
J'ai fais les essais en modifiant le programme, ce n'est toujours pas concluant.
j'ai essayer de raccorder les deux pin restant au 12V comme l'indique ce schéma :

Le moteur n'a pas fonctionné ...
Je ne vois vraiment pas ce qui empêche mon moteur de fonctionner convenablement. Au démarrage, le moteur part très vite et en meca j'ai toujours entendu que plus la vitesse de rotation est élevé moins il y a de couple et inversement. Comment réduire la vitesse ??
Après m'être renseigné un un peu plus j'ai fixé la Vref de mon A4988 sur 0,64V
J'ai fait mes essais, avec ton programme modifié, avec un Nema17 de type 42shd0217-24b et une alimentation 9V. 2A.
Pour régler le courant, j'ai fait un programme qui fait faire des mouvements de va et vient au moteur, tout en pinçant l'axe du moteur, je tourne le potentiomètre du A4988 jusqu'à avoir le couple optimum.
Je te passe le programme que j'utilise, il se commande depuis le moniteur de l'IDE Arduino à 119200, au moyen de commandes dont la liste se trouve sous:
/*------------------------------------- Commandes reconnues
Il suffit de renseigner les broches STEP, DIR et ENABLE (facultative)
#else // Autre montage paramètres personnels
const int driverDirPin = 5; // A4988 pin DIR
const int driverStepPin = 6; // A4988 pin STEP
const int driverEnaPin = 7; // A4988 pin ENABLE
Sauf si ton shield est compatible GRBL, cette ligne
//#define shieldGRBL
doit être en remarque et c'est la 2ème section des paramètres qui est active. depuis #else.
/*
Name: Tool_ReglageMpapA4988.ino
Created: 07.04.2022
Author: jpbbricole
Pour tester les paramètres d'un moteur pas à pas (MPAP)
*/
#include <AccelStepper.h> // https://www.pjrc.com/teensy/td_libs_AccelStepper.html
// https://github.com/waspinator/AccelStepper
//#define shieldGRBL
#ifdef shieldGRBL
const int driverDirPin = 5; // X = 5, Y = 6, Z = 7 Shield Nano X = 2, Y = 3, Z = 4
const int driverStepPin = 2; // X = 2, Y = 3, Z = 4 Shield Nano X = 5, Y = 6, Z = 7
const int driverEnaPin = 8; // A4988 pin ENABLE GRBL commun à X, Y et Z
const boolean driverReverseDirPin = false;
const boolean driverReverseStepPin = false;
const boolean driverReverseEnaPin = true;
const int driverEnableOn = LOW; // Niveau du signal ENABLE actif
#else // Autre montage paramètres personnels
const int driverDirPin = 5; // A4988 pin DIR
const int driverStepPin = 6; // A4988 pin STEP
const int driverEnaPin = 7; // A4988 pin ENABLE
const int driverEnableOn = LOW; // Niveau du signal ENABLE actif
const boolean driverReverseDirPin = false;
const boolean driverReverseStepPin = false;
const boolean driverReverseEnaPin = (driverEnableOn == LOW) ? true : false;
#endif
struct mpapParamDef
{
boolean isOn = true;
float maxSpeed = 800.0;
float acceleration = 5000.0;
long stepsNbr = 200;
int microSteps = 1;
boolean driverIsEnabled = true;
};
mpapParamDef mpapParam;
AccelStepper mpap(1, driverStepPin, driverDirPin);
//------------------------------------- Bouton (btn)
const int btnOnOffPin = 11; // Pour démarrer/arrêter le va et vient (ON OFF)
const int btnOnOffEtatOn = LOW; // Etat du bouton pressé (LOW = PULL_UP)
//------------------------------------- Ligne de commandes
bool cmdNouvelle = false; // Si une nouvelle commande a été reçue
String cmdTexte = ""; // Texte de la commande
#define messageDeveloppement Serial.println(F("!!!! Commande a developper !!!!\n"));
void setup()
{
Serial.begin(115200);
Serial.setTimeout(50); // Pour fin des commandes depuis le moniteur
delay(500);
pinMode(btnOnOffPin, INPUT_PULLUP);
mpapRestart();
mpap.enableOutputs();
cmdExecute(F("OFF")); // MPAP arrêté
Serial.println(F("Tapez la commande ON pour activer le va et vient"));
}
void loop()
{
if (mpapParam.isOn)
{
if (mpap.distanceToGo() == 0) // Si mouvement terminé
mpap.moveTo(-mpap.currentPosition()); // Va et vient, 2*PAS
}
mpap.run();
//--------------------------------- Test bouton Start/Stop
if (digitalRead(btnOnOffPin) == btnOnOffEtatOn) // Si bouton pressé
{
if (!mpapParam.isOn) // Si pas encore ON
{
cmdExecute(F("ON")); // MPAP démarrage va et vient
}
else
{
cmdExecute(F("OFF")); // MPAP arrêt va et vient
}
while (digitalRead(btnOnOffPin) == btnOnOffEtatOn) {} // Tant que le bouton est pressé
}
//--------------------------------- Ecoute du port serie
serialEvent(); // Lecture du port
if (cmdNouvelle) // Si une nouvelle commande depuis le moniteur
{
cmdExecute(cmdTexte);
cmdTexte = "";
cmdNouvelle = false;
}
}
/*------------------------------------- Commandes reconnues
? Liste des paramètres
ON Va et vient ON
OFF Va et vient OFF
PAS=200 Nombre de pas au tour et
Nombre de pas du va et vient à 200
MPAS=16 Nombre de micro-pas à 16
VIT=800 Vitesse moteur pas à pas à 800 pas/seconde
ACC=8000 Acceleration moteur pas à pas à 8000 pas/seconde
DRVENA Driver MPAP activé (driverEnaPin)
DRVDIS Driver MPAP désactivé (driverEnaPin)
MOVE=-500 Se déplace de -500 pas
GOTO=175 Se déplace à la position 175 pas
TOUR=3 Fait 3 tours
Une fois la commande ON, l'effet des autres commandes est immédiat.
Ces commandes ne sont pas sensibles à la casse.
'*
*/
//------------------------------------- Commandes execution
void cmdExecute(String commande)
{
String commandeNom = "";
commande.toUpperCase(); // Tout en majuscules
commande.replace(" ", ""); // Supprimer les espaces
Serial.println("Execution de : " + commande);
String cmdParam = commande.substring(commande.indexOf("=")+1); // Extraction du paramètre
commande = commande.substring(0, commande.indexOf("=")); // Extraction de la commande
int cmdParamInt = cmdParam.toInt();
if (commande.startsWith(F("?")))
{
paramList();
}
else if (commande.startsWith(F("ON")))
{
commandeNom = F("MPAP On");
mpap.moveTo(mpapParam.stepsNbr);
mpapParam.isOn = true;
}
else if (commande.startsWith(F("OFF")))
{
commandeNom = F("MPAP Off");
mpapParam.isOn = false;
}
else if (commande.startsWith(F("VIT")))
{
commandeNom = F("Vitesse");
mpapParam.maxSpeed = (float)cmdParamInt;
mpapRestart();
}
else if (commande.startsWith(F("ACC")))
{
commandeNom = F("Acceleration");
mpapParam.acceleration = (float)cmdParamInt;
mpapRestart();
}
else if (commande.startsWith(F("PAS")))
{
commandeNom = F("Pas");
mpapParam.stepsNbr = (long)cmdParamInt;
mpapRestart();
}
else if (commande.startsWith(F("MPAS")))
{
commandeNom = F("Micro-pas");
mpapParam.microSteps = cmdParamInt;
}
else if (commande.startsWith(F("DRVENA")))
{
commandeNom = F("Driver ENABLE");
mpap.enableOutputs();
}
else if (commande.startsWith(F("DRVDIS")))
{
commandeNom = F("Driver DISABLE");
mpap.disableOutputs();
}
else if (commande.startsWith(F("MOVE")))
{
commandeNom = F("MOVE");
mpap.move(cmdParamInt * mpapParam.microSteps);
}
else if (commande.startsWith(F("GOTO")))
{
commandeNom = F("Goto");
mpap.moveTo(cmdParamInt * mpapParam.microSteps);
}
else if (commande.startsWith(F("TOUR")))
{
commandeNom = F("Tour");
mpap.move(mpapParam.stepsNbr * cmdParamInt * mpapParam.microSteps);
}
//else if (commande.startsWith(F("INIT")))
//{
//commandeNom = F("Init");
//messageDeveloppement;
//}
else
{
Serial.print(F("Commande inconnue!!! ")); Serial.println(commande);
}
if (commandeNom != "")
{
Serial.println(commandeNom + " " + String(cmdParamInt));
if(commande != F("?"))
{
cmdExecute(F("?"));
}
}
}
//------------------------------------- Moteur pas à pas (mpap)
void mpapRestart()
{
mpap.stop();
mpap.setCurrentPosition(0);
mpap.setMaxSpeed(mpapParam.maxSpeed);
mpap.setAcceleration(mpapParam.acceleration);
mpap.setEnablePin(driverEnaPin);
// DIR STEP ENA
mpap.setPinsInverted(driverReverseDirPin, driverReverseStepPin, driverReverseEnaPin);
}
//------------------------------------- Paramètres (param)
void paramList()
{
Serial.println(F("\nListe des parametres"));
Serial.print(F("On/Off\t")); Serial.println((mpapParam.isOn) ? "ON" : "OFF");
Serial.print(F("Pas\t")); Serial.println(mpapParam.stepsNbr);
Serial.print(F("MicroP\t")); Serial.println(mpapParam.microSteps);
Serial.print(F("Vitesse\t")); Serial.println(mpapParam.maxSpeed);
Serial.print(F("Accel.\t")); Serial.println(mpapParam.acceleration);
Serial.print(F("Driver\t")); Serial.println((digitalRead(driverEnaPin) == driverEnableOn) ? "ENABLE" : "DISABLE");
Serial.println("");
}
/*-----------------------------------------------------------------------
Réception de commandes depuis le moniteur
'*------------------------------------------------------------------------
*/
void serialEvent()
{
if (Serial.available())
{
cmdTexte = Serial.readString();
// Nettoyage des caractères indésirables, CR, LF, TAB... et les espace de début et de fin
cmdTexte.trim();
cmdNouvelle = true;
}
}
Cordialement
jpbbricole
On pourrait aussi corriger ce qui est au dessus! On pourrait croire que "millisBtwnSteps" vient de "milliseconds between steeps", (millisecondes entre pas), mais c'est le nombre de microsecondes et pas de millisecondes. microBtwnSteps serait nettement mieux! Mais cela ne nuit pas au fonctionnement.
Je viens de faire un petit test, j'ai testé le courant qui passait dans mes bobines pendant le fonctionnement du moteur, j'ai à peine eu 0,5 ampères. De même en sortie de transformateur.
Le problème viendrait-il pas de mon alimentation ?
On ne sait pas quel câblage est réalisé (le dernier indiqué? post à12), on ne sait pas avec quel appareil, on ne sait pas si le moteur tourne ou pas et quel est son alimentation, on ne sait pas si il s'agit d'un courant crête, moyen ou efficace...
A priori, tu n'a pas de transformateur. Si il y en a un, le problème peut venir du redresseur ou du filtrage qui est derrière.
Je vais regarder ma boule de cristal ce soir, je te dirai d'où vient le problème. ![]()
Bonsoir nathan_gtr
C'est possible, tu as mesuré le courant avec le moteur bloqué (dont tu ne peut tourner l'axe à la main ou difficilement)?
Tout les test que j'ai réalisés ci-dessus ont été faits, alimentés avec un adapteur secteur de ce type, 9V 2A et j'arrive à avoir un couple largement suffisant.

A+
Cordialement
jpbbriucole

