Bonjour à tous. J'ai besoin d'aide pour faire tourner un moteur pas à pas (un remontoir de montre). Pour l'instant le programme fonctionne parfaitement en continue.
15 tours à droite, puis 15 tours à gauche, puis pause 1 heure.
Mais je voudrais faire en sorte qu'il marche 12 heures puis une pause de12 heures et qu'il recommence son cycle, Peu importe l'heure à laquelle il s’arrête.
Voici le code:
//Include the Arduino Stepper Library
#include <Stepper.h>
// Number of steps per internal motor revolution
const float STEPS_PER_REV = 32;
// Number of Steps Required
int StepsRequired;
// The pins used are 8,9,10,11
// Connected to ULN2003 Motor Driver In1, In2, In3, In4
// Pins entered in sequence 1-3-2-4 for proper step sequencing
Stepper steppermotor(STEPS_PER_REV, 8, 10, 9, 11);
void setup()
{
// Nothing (Stepper Library sets pins as outputs)
}
void loop()
{
\
// About 15 rotations Clockwise (1 full rotation is 2050 steps)
steppermotor.setSpeed(500);
StepsRequired = 30750;
steppermotor.step(StepsRequired);
delay(2000);
// About 15 rotations Counterclockwise
steppermotor.setSpeed(500);
StepsRequired = - 30750;
steppermotor.step(StepsRequired);
// Wait 1 hour before rotation again
delay(3600000);
}
je ne connais absolument pas le fonctionnement de la bibliothèque que tu utilises, et n'ai aucune envie de me pencher sur le détail des arguments à lui fournir.
je vais donc partir sur des supputations, basées sur le peu que j’ai compris de ton code et de ta demande.
ton code me dit : 15 tours dans un sens, pause de 2s, puis à nouveau 15 tours dans l’autre sens, et enfin pause d’1h.
ça correspond bien à ton énoncé de début.
si j’ai bien compris, ta demande est :
pendant 12h :
15 tours dans un sens
pause de 2s
15 tours à l’envers
pause de 2s (j’extrapole !)
à la fin des 12h : pause de 12h, puis retour au début
tu te moques de la « précision » du timing : tu ne recherches qu’un « régularité »
Salut 5_cylindres,
Exact, c'est tout à fait çà, mon code fait cela à l'infini, tu as oublié la pause d'une heure (en réalité j'ai mis 1/2 heure) entre les aller/retours.
La pause 1h c'est pour éviter que le ressort de la montre soit remonté au maximum pendant les 12h de marche et la pause de 12h pour reposer le mouvement et détendre le ressort. Et oui la précision n'a pas d'importance et oui pour la régularité.
Bien cordialement.
Bruno
Voilà une façon de procéder, tout d'abord une boucle de 12 pour faire les 12 heures: for (int l = 0; l < 12; l ++) // Pour 12 heures
et une variable booléenne remontoirEnMarche qui est inversée à chaque fin de boucle de 12: remontoirEnMarche = !remontoirEnMarche; // Inverser la variable
Et ça donne ça, j'ai diminué les temps ainsi que les pas afin d'accélérer le démonstration, il y a des indications quand au fonctionnement du programme dans la console à 115200:
Remonter 6
Remonter 7
Remonter 8
Remonter 9
Remonter 10
Remonter 11
PAS Remonter 0
PAS Remonter 1
PAS Remonter 2
PAS Remonter 3
PAS Remonter 4
PAS Remonter 5
Le programme:
//Include the Arduino Stepper Library
#include <Stepper.h>
// Number of steps per internal motor revolution
const float STEPS_PER_REV = 32;
// Number of Steps Required
int StepsRequired;
// The pins used are 8,9,10,11
// Connected to ULN2003 Motor Driver In1, In2, In3, In4
// Pins entered in sequence 1-3-2-4 for proper step sequencing
Stepper steppermotor(STEPS_PER_REV, 8, 10, 9, 11);
boolean remontoirEnMarche = true;
void setup()
{
Serial.begin(115200);
// Nothing (Stepper Library sets pins as outputs)
}
void loop()
{
for (int l = 0; l < 12; l ++) // Pour 12 heures
{
if (remontoirEnMarche)
{
Serial.print("Remonter ");
// About 15 rotations Clockwise (1 full rotation is 2050 steps)
steppermotor.setSpeed(500);
StepsRequired = 200;//30750;
steppermotor.step(StepsRequired);
delay(2000);
// About 15 rotations Counterclockwise
steppermotor.setSpeed(500);
StepsRequired = - 200; //- 30750;
steppermotor.step(StepsRequired);
}
else
{
Serial.print("PAS Remonter ");
}
Serial.println(l +1);
delay(1000); // 3600000
}
remontoirEnMarche = !remontoirEnMarche; // Inverser la variable
}
A ta disposition pour toutes questions.
PS: On pourrais faire plus "fin" en remplaçant le delay par des millis, mais vu que ton programme ne fait que ça, ce n'est pas nécessaire.
Salut jpbbricole, Trop fort !! ca marche nickel, j'avais essayé le "for" mais il me manquait la booléenne, j'avais aussi millis en tête mais comme le "for" je ne savais pas le mettre en forme. Bon sur mon échelle perso t'es juste en dessous de Dieu (mais d'une tête ! bien que lui ne m'ait jamais répondu...). Juste une question, si j’augmente les "delay" et le nombre de rotation cela change t'il les 12h ? qu'est ce qui fait les 12h ? uniquement le 12 dans For ?
Amicalement
Bruno
En mettant delay(3600000), cela signifie une attente de 3600 secondes (delay étant en milisecondes), donc le nombre de secondes dans une heure.
Dans for (int l = 0; l < 12; l ++), si tu modifies le 12, tu modifies le nombre de fois 1 heure du processus.
Ne pas oublier, durant un delay, le programme ne fait absolument rien d'autre qu'attendre. Si tu as la nécessité de faire des trucs pendant cette attente, il faut passer aux millis.