Bonjour à tous j'aurais besoin de votre aide.
je souhaite temporisé un moteur pas a pas l'or d'un appuie sur un bouton poussoir mon code que j'ai fait fonctionne mais seulement quelque seconde.
Pourriez vous m'aider. merci ci-dessous mon code
int latchPin = 5; //pin 12 on the 595
int dataPin = 6; //pin 14 on the 595
int clockPin = 7; //pin 11 on the 595
const int bp = 8;
int stepper1val;
int Steps1 = 0;
boolean Direction1 = true;// gre
unsigned long last_time;
unsigned long currentMillis;
int steps_left1 = 4095;
long time;
void setup()
{
//Serial.begin(115200);
pinMode(latchPin, OUTPUT);
pinMode(dataPin, OUTPUT);
pinMode(clockPin, OUTPUT);
pinMode(bp, INPUT_PULLUP);
}
void loop()
{
int readLeft = digitalRead(bp);
if (readLeft == 0) {
steps_left1;
while (steps_left1 > 0) {
currentMillis = micros();
if (currentMillis - last_time >= 1000) {
stepper1(1);
digitalWrite(latchPin, LOW);
shiftOut(dataPin, clockPin, MSBFIRST, stepper1val);
digitalWrite(latchPin, HIGH);
time = time + micros() - last_time;
last_time = micros();
steps_left1--;
}
}
}
}
// motor 1 is 1 2 4 8
void stepper1(int xw) {
for (int x = 0; x < xw; x++) {
switch (Steps1) {
case 0:
stepper1val = 8;
break;
case 1:
stepper1val = 12;
break;
case 2:
stepper1val = 4;
break;
case 3:
stepper1val = 6;
break;
case 4:
stepper1val = 2;
break;
case 5:
stepper1val = 3;
break;
case 6:
stepper1val = 1;
break;
case 7:
stepper1val = 9;
break;
default:
stepper1val = 0;
break;
}
SetDirection1();
}
}
void SetDirection1() {
if (Direction1 == 1) {
Steps1++;
}
if (Direction1 == 0) {
Steps1--;
}
if (Steps1 > 7) {
Steps1 = 0;
}
if (Steps1 < 0) {
Steps1 = 7;
}
}
J-M-L
April 27, 2020, 1:12pm
2
votre while est dans votre if, donc une fois parti dans le while, il termine son exécution avec de revenir tester le bouton lors de la prochaine loop
corrigez votre post ci dessus et rajoutez les code tags autour du code:
[code]`` [color=blue]// votre code ici[/color] ``[/code]
.
ça doit ressembler à cela:// votre code ici
(faites aussi ctrl-T (PC) or cmd-T (Mac) dans l'IDE avant de copier le code pour qu'il soit indenté correctement)
lisez comment utiliser le forum (les posts épinglés en haut du forum comme "Bien éditer son post pour les nuls " , "Faire un Nouveau Sujet ou le corriger avec les Balises... " et "Règles du forum francophone "), et faites un post "propre"
J-M-L
April 27, 2020, 3:52pm
4
merci - mais comme dit ci dessus
votre while est dans votre if, donc une fois parti dans le while, il termine son exécution avec de revenir tester le bouton lors de la prochaine loop
Merci
J'ai modifié le code mais lorsque je sort le while du if le moteur démarre 4 seconde des le début du programme sans appui sur le BP.
J-M-L
April 27, 2020, 4:56pm
6
comment avez vous câblé le bouton ? quel type ? (s'il a 4 pins prenez 2 pins opposée, une va à GND, l'autre à l'Arduino)
c'est quoi ce steps_left1;
tout seul ?
c'est pour quoi faire le time = time + micros() - last_time;
?
pas génial comme nom de variable... currentMillis = micros();
pour le bouton c'est bon j'ai un fil sur le bouton et un sur le GND.
programme modifié sans time et steps_left1
pour info j'utilise un registre 75HC595 et un moteur pas a pas 28BYJ-48 avec interface ULN2003.
int latchPin = 5; //pin 12 on the 595
int dataPin = 6; //pin 14 on the 595
int clockPin = 7; //pin 11 on the 595
const int bp = 8;
int stepper1val;
int Steps1 = 0;
boolean Direction1 = true;// gre
unsigned long last_time;
unsigned long currentMillis;
int steps_left1 = 4095;
long time;
void setup()
{
//Serial.begin(115200);
pinMode(latchPin, OUTPUT);
pinMode(dataPin, OUTPUT);
pinMode(clockPin, OUTPUT);
pinMode(bp, INPUT_PULLUP);
}
void loop()
{
int readLeft = digitalRead(bp);
if (readLeft == 0) {
while (steps_left1 > 0) {
currentMillis = micros();
if (currentMillis - last_time >= 1000) {
stepper1(1);
digitalWrite(latchPin, LOW);
shiftOut(dataPin, clockPin, MSBFIRST, stepper1val);
digitalWrite(latchPin, HIGH);
last_time = micros();
steps_left1--;
}
}
}
}
// motor 1 is 1 2 4 8
void stepper1(int xw) {
for (int x = 0; x < xw; x++) {
switch (Steps1) {
case 0:
stepper1val = 8;
break;
case 1:
stepper1val = 12;
break;
case 2:
stepper1val = 4;
break;
case 3:
stepper1val = 6;
break;
case 4:
stepper1val = 2;
break;
case 5:
stepper1val = 3;
break;
case 6:
stepper1val = 1;
break;
case 7:
stepper1val = 9;
break;
default:
stepper1val = 0;
break;
}
SetDirection1();
}
}
void SetDirection1() {
if (Direction1 == 1) {
Steps1++;
}
if (Direction1 == 0) {
Steps1--;
}
if (Steps1 > 7) {
Steps1 = 0;
}
if (Steps1 < 0) {
Steps1 = 7;
}
}
J-M-L
April 27, 2020, 6:05pm
8
combien vaut steps_left1 au début de while (steps_left1 > 0) {...}
maintenant ?
int steps_left1 = 4095;
suppression de la ligne
while (steps_left1 > 0)
maintenant le moteur tourne seulement bp appuyer.
J-M-L
April 27, 2020, 7:15pm
10
Et donc ?
Que voulez vous faire exactement ?
Je voudrais que mon moteur continue de tourner un temp définit après l'appuie sur le bouton.