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);
}