Stepper NEMA17 ne tourne pas quand j'active le mode SLEEP du driver A4988

Bonjour, je suis novice je n'ai jamais fait de programmation.

Mon projet : Je souhaite alimenter une petite pompe péristaltique pour qu'elle injecte une petite quantité prédéterminée (de l'ordre de quelques cl) de Chlore, 2 fois par jour. J'ai prévu d'alimenter de tout avec une batterie 12V + panneau solaire, car c'est en rase campagne. Le matériel prévu : - une carte Arduino UNO par exemple,

  • 1 pompe entraînée par un moteur NEMA17 ou NEMA23,
  • 1 driver A4988,
  • 1 horloge genre RTC DS1307 ou autre.

J'essaie de omprendre pourquoi mon moteur bipolaire NEMA17 ne fonctionne pas quand j'active le mode SLEEP du driver A4988. Il fonctionne parfaitement quand je reste en mode basique, c'est à dire les sorties SLEEP et RESET reliées entre elles et MS1, MS2, MS3, ENABLE sont non connectés.

Explication : quand je charge le code ci-dessous, le moteur reçoit normalement les impulsions, il vibre mais ne tourne pas. Il fait le même bruit que quand il tourne normalement.

Physiquement, j'ai essayé en laissant le pont entre SLEEP et RESET, puis j'ai essayé en enlevant le pont, puis j'ai ajouté une résistance de 100KOhm entre RESET et +5V, dans tous les cas, même résultat, moteur ne tourne pas.

Je vous joins le code,

Je vous remercie d'avance pour votre aide.
Cordialement.


```cpp
/* 
Moteur pas à pas NEMA17 + A4988 gérés sans bibliothèque, mis en service à heures fixes sur alarmes depuis DS1307.
Inspiré de :
- Dejan, https://howtomechatronics.com pour le moteur pas à pas,
- http://randomnerdtutorials.com pour l’utilisation du RTC DS1307
- Michel Margolis qui a créé la bibliothèque TimeAlarms.h
*/

#include <TimeLib.h>
#include <TimeAlarms.h>
#include <Wire.h>
#include <DS1307RTC.h>

#define stepPin 2
#define dirPin 5

//                    #define enablePin 8
//                    #define resetPin 9
#define sleepPin 10

/* 
  +================+
  + CODE PRINCIPAL +
  +================+
*/

void setup() {
  pinMode(stepPin, OUTPUT);
  pinMode(dirPin, OUTPUT);
  digitalWrite(dirPin, LOW);  // LOW/HIGH en fonction du sens de rotation souhaité

  //                    pinMode(enablePin,OUTPUT);
  //                    pinMode(resetPin,OUTPUT);
  pinMode(sleepPin, OUTPUT);
  //                    digitalWrite(enablePin,HIGH);       // LOW les ponts en H sont actifs - HIGH les ponts en H ne sont plus alimentés.
  //                    digitalWrite(resetPin,LOW);         // LOW coupe toutes les sorties, les entrées sont toujours actives mais ignorées - HIGH le module est alimenté normalement.
  digitalWrite(sleepPin, LOW); /* LOW minimise la consommation, désactive une grande partie des circuits internes, y compris les sorties, le régulateur de courant et la pompe de charge.
                                                              les sorties STEP, DIR et Msx restent actives
                                                              HIGH permet un fonctionnement normal,  En sortant du mode veille, délai de 1ms necessaire afin de permettre à la pompe de charge de se stabiliser.
                                                           */

  Serial.begin(9600);
  while (!Serial)
    ;  // En attente du moniteur série Arduino

  setSyncProvider(RTC.get);  // Réception et réglage de l’heure depuis le RTC
  if (timeStatus() != timeSet)
    Serial.println("Synchronisation avec RTC impossible");
  else Serial.println("Synchronisation avec RTC terminée");

  /* Si on veut régler l'heure manuellement, utiliser la commande ci-dessous
  setTime( 8, 29, 0, 1, 1, 11);           // Réglage : samedi 8h29 le 1er janvier 2011 */

  Alarm.alarmRepeat(16, 50, 0, Alarme01);  // Création d'une alarme avec déclenchement chaque jour à 08h00
  Alarm.alarmRepeat(16, 51, 0, Alarme02);  // Création d'une alarme avec déclenchement chaque jour à 18h00
}

void loop() {
  /* Commenté par Anne
  digitalClockDisplay();
  Alarm.delay(1000);            // Attendre 1 seconde entre chaque affichage de l'heure dans le moniteur série
  for(int x = 0; x < 250; x++)  // 200 impulsions par tour
  */
  // Bloc précédent remplacé par :
  //for(int x = 0; x < 250; x++)  // Commenté par Did //Le moteur ne demarre pas, il faut deplacer cette ligne sous "void Alarm01" et "void Alarm02" pour que ça fonctionne
  {
    digitalClockDisplay();
    Alarm.delay(1000);  // Attendre 1 seconde entre chaque affichage de l'heure dans le moniteur série
  }
}


/*
  +===========================+
  + DECLARATION DES FONCTIONS +
  +===========================+
*/

// Fonctions appelées au déclenchement de l'alarme
void Alarme01() {
  for (int x = 0; x < 200; x++)  // 200 impulsions par tour // ajouté par Did ici ==> le moteur tourne !!!!!!!!!!!
  {
    //                              digitalWrite(enablePin,LOW);
    //                              digitalWrite(resetPin,HIGH);
    digitalWrite(sleepPin, HIGH);
    delay(10);
    Serial.println("1ère injection de chlore");
    digitalWrite(stepPin, HIGH);
    delay(70);  // Influe sur la vitese de rotation
    digitalWrite(stepPin, LOW);
    delay(10);
    //                             digitalWrite(enablePin,HIGH);
    //                             digitalWrite(resetPin,LOW);
    digitalWrite(sleepPin, LOW);
    delay(10);
  }
}

void Alarme02() {
  for (int x = 0; x < 200; x++)  // 200 impulsions par tour // ajouté par Did ici ==> le moteur tourne aussi!!!!!!!!!!!
  {
    //                             digitalWrite(enablePin,LOW);
    //                             digitalWrite(resetPin,HIGH);
    digitalWrite(sleepPin, HIGH);
    delay(10);
    Serial.println("2ème injection de chlore, wakatépé Baboon !");
    digitalWrite(stepPin, HIGH);
    delay(80);  // Influe sur la vitese de rotation
    digitalWrite(stepPin, LOW);
    delay(10);
    //                             digitalWrite(enablePin,HIGH);
    //                             digitalWrite(resetPin,LOW);
    digitalWrite(sleepPin, LOW);
    delay(10);
  }
}
// delay(10000);  Commenté par Anne

// Ajouté par Anne (récupéré dans Test_008[...])
// Affichage de l'heure par l'horloge numérique
void digitalClockDisplay() {
  Serial.print(hour());
  printDigits(minute());
  printDigits(second());
  Serial.println();
}

void printDigits(int digits) {
  Serial.print(":");
  if (digits < 10)
    Serial.print('0');
  Serial.print(digits);
}

hello
un lien utile ICI

reflechis à ton code:
pour faire 200 pas,
tu demandes un réveil, un pas par un pulse de 70millis puis tu passes en sleep pour 30millis
et tu recommences 200 fois

est ce bien logique toutes ces mises en sommeil et ces réveils entre chaque pas ?

Bonjour dfgh,

je te remercie pour le lien, il m'a permis d'y voir plus clair, surtout en ce qui concerne le réglage du Vref sur le driver, c'était nécessaire.

tu demandes un réveil, un pas par un pulse de 70millis puis tu passes en sleep pour 30millis
et tu recommences 200 fois

J'avoue que je n'ai pas vraiment saisi, il me semblait que 70ms correspondait au délai que j'impose au moteur entre 2 steps et je ne comprends pas d'où viennent les 30ms en mode sleep dont tu parles.

void Alarme01() {
  digitalWrite(sleepPin, HIGH);  //Alimente le driver A4988
  delay(10);
  for (int x = 0; x < 200; x++)  // 200 impulsions par tour>
  {
    Serial.println("1ère injection de chlore");
    digitalWrite(stepPin, HIGH);
    delay(70);  // Influe sur la vitesse de rotation
    digitalWrite(stepPin, LOW);
    delay(10);
  }
  digitalWrite(sleepPin, LOW);  //Coupe l'alimentation du driver A4988
  delay(10);
}

Dans mon code, j'ai sorti les lignes de la broche SLEEP du deuxième niveau d'accolades pour les placer entre le premier et le deuxième niveau d'accolades.

Maintenant mon moteur tourne normalement.
Je précise que je n'ai pas de pont entre SLEEP et RESET du A4988 et j'ai branché RESET au +5V en passant par une résistance de 100kOhms.

Un grand merci pour ton aide.
Cordialement.

1 Like

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.