Découverte du moteur Nema 17

_images/lg.jpg _images/logo_moteur-pas-pas.png
Auteur

Gilles Lecorsier

Blog

La technologie dans tous ses états 1

Association

BricoLab Groslay(95)

Entity

VoRoBoTics 2

Page principale

Readme 3

Date de création

07/06/2025

Date dernière maj

28/06/2025

Introduction

Les moteurs pas à pas NEMA 17 sont un type de moteur à courant continu. Les moteurs pas à pas ne tournent pas, ils avancent par pas, et le moteur NEMA17 a un angle de pas de 1,8 degré, ce qui signifie qu’il parcourt 1,8 degré à chaque pas. Les moteurs pas à pas permettent un contrôle précis et peuvent être différenciés en fonction du couple, du nombre de pas par tour et de la tension d’entrée.

_images/pap-fonctionnement.png

Explications

_images/schema-pap.png

Le rotor est généralement un aimant permanent et le stator est entouré de bobines. Lorsque le courant circule des champs magnétiques sont générés dans le stator qui attirent ou repousse le rotor.

En activant les bobines étape l’une après l’autre dans un ordre particulier nous pouvons obtenir un mouvement continu du rotor et l’arrêter à n’importe quelle position.

Repérage

_images/enroulements-nema.png

Comme vous pouvez le voir, ce moteur a un agencement bipolaire à 4 fils. Ces fils sont connectés en deux enroulements séparés.

_images/moteur-bipolaire.jpg

Pour reconnaitre les différentes bobines, utiliser un multimètre en ohmètre et vérifier la valeur entre deux fils. Si vous obtenez un valeur qui approche 3 Ohms, vous avez trouvez une bobine, sinon aucune continuité.

Première manipulation

Matériel

  • Moteur pas à pas Nema 17.

  • Carte Arduino Uno.

  • Pilote DRV8825.

  • Alimentation courant continu 12V.

Plan de câblage

_images/cablage-premier-test.png

ATTENTION Avant de mettre sous tension, il faut régler le courant maximum du driver DRV 8825.

1) Programmation : rotation continue dans un sens

const int stepPin = 2;
const int dirPin = 3;
const int enablePin = 8; // Optionnel : désactivation du moteur
const int stepsPerRev = 200;
int pulseWidthMicros = 100;   // microseconds
int millisBtwnSteps = 2;
void setup() {
   Serial.begin(9600);
   pinMode(stepPin, OUTPUT);
   pinMode(dirPin, OUTPUT);
   pinMode(enablePin, OUTPUT);
   digitalWrite(dirPin, HIGH);
   digitalWrite(enablePin, LOW); // Active le moteur
   Serial.println(F("DRV8825 Initialized"));
}

void loop() {

   digitalWrite(stepPin, HIGH);
   delay(2);
   digitalWrite(stepPin, LOW);
   delay(2);

}

Fonctionnement :

  1. Initialisation (setup()):

    • Configure les broches stepPin, dirPin et enablePin en sortie.

    • Définit la direction du moteur (dirPin sur HIGH).

    • Active le moteur (enablePin sur LOW).

    • Affiche un message de confirmation sur le moniteur série.

  2. Boucle principale (loop()):

    • Envoie une impulsion à la broche stepPin pour avancer d’un pas.

    • Attend 2 millisecondes (delay(2)).

    • Met stepPin à LOW pour compléter l’impulsion.

    • Attend encore 2 millisecondes avant de recommencer.

Résultat : Le moteur pas à pas avance continuellement, avec un délai de 2 ms entre chaque pas. Cela permet un mouvement fluide et régulier du moteur.

Si vous voulez ajuster la vitesse, vous pouvez modifier millisBtwnSteps ou utiliser une bibliothèque comme AccelStepper pour un contrôle plus précis.

2) Programmation : rotation alternative, sens horaire, sens antihoraire

const int stepPin = 2;
const int dirPin = 3;
const int enablePin = 8; // Optionnel : désactivation du moteur
const int stepsPerRev = 200;
int pulseWidthMicros = 100;   // microseconds
int millisBtwnSteps = 2;
void setup() {
   Serial.begin(9600);
   pinMode(stepPin, OUTPUT);
   pinMode(dirPin, OUTPUT);
   pinMode(enablePin, OUTPUT);

   digitalWrite(enablePin, LOW); // Active le moteur
   Serial.println(F("DRV8825 Initialized"));
}
void loop() {
   Serial.println(F("Running clockwise"));
   digitalWrite(dirPin, HIGH); // Enables the motor to move in a particular direction
   // Makes 200 pulses for making one full cycle rotation
   for (int i = 0; i < stepsPerRev; i++) {
      digitalWrite(stepPin, HIGH);
      delay(millisBtwnSteps);
      digitalWrite(stepPin, LOW);
      delay(millisBtwnSteps);
   }
   delay(1000); // One second delay
   Serial.println(F("Running counter-clockwise"));
   digitalWrite(dirPin, LOW); //Changes the rotations direction
   // Makes 400 pulses for making two full cycle rotation
   for (int i = 0; i < 2*stepsPerRev; i++) {
      digitalWrite(stepPin, HIGH);
      delay(millisBtwnSteps);
      digitalWrite(stepPin, LOW);
      delay(millisBtwnSteps);
   }
   delay(1000);
}

Fonctionnement :

  1. Déclaration des constantes et des variables :

    • stepPin : Broche qui envoie les impulsions pour faire avancer le moteur.

    • dirPin : Broche qui définit la direction de rotation.

    • enablePin : Active ou désactive le moteur.

    • Affiche un message de confirmation sur le moniteur série.

    • stepsPerRev : Nombre de pas nécessaires pour une rotation complète (200 pas = 360°).

    • pulseWidthMicros : Durée de l’impulsion envoyée au moteur.

    • millisBtwnSteps : Temps entre chaque pas.

  2. Initialisation (setup()):

    • Configure les broches en sortie.

    • Active le moteur (enablePin sur LOW).

    • Affiche un message de confirmation sur le moniteur série.

  3. Boucle principale (loop()):

    • Première phase : Le moteur tourne dans le sens horaire (dirPin = HIGH) pendant 200 pas (une rotation complète).

    • Pause : Attente d’une seconde.

    • Deuxième phase : Le moteur tourne dans le sens antihoraire (dirPin = LOW) pendant 400 pas (deux rotations complètes).

    • Pause : Attente d’une seconde avant de recommencer.

Résultat : Le moteur tourne alternativement dans les deux sens :

  • Sens horaire → 1 tour → Pause.

  • Sens antihoraire → 2 tours → Pause.

  • Répétition en boucle.

Sites de référence

Tables et index