Mon souhait, lancer avec l'appui d'un bouton le moteur (pas à pas), indéfiniment.
Puis, avec un nouvel appui sur ce bouton, stopper immediatement ce moteur.
J'ai écris plusieurs version de codes, rien ne se passe comme j'aimerai, au mieux le moteur va s'arrêter à la sortie de sa procédure de lancement.
Merci par avance pour vos retours.
Cordialement
Bonjour jpbbricole,
merci pour ton intérressement,
Voici le code :
// definitions ports et bouton
int outPorts[] = {21, 20, 19, 18};
int buttonPin = 13;
int timeDelay = 500;
bool buttonState = false;
void setup() {
// set pins to output
for (int i = 0; i < 4; i++) {
pinMode(outPorts[i], OUTPUT);
}
pinMode(buttonPin, INPUT);
}
void loop()
{
if (digitalRead(buttonPin) == HIGH && !buttonState)
{
buttonState = !buttonState;
for (int i = 0; i < 4; i++) {
digitalWrite(outPorts[i], HIGH);
}
rotation();
}
else
{
for (int i = 0; i < 4; i++) {
digitalWrite(outPorts[i], LOW);
}
rotation();
}
}
void rotation()
{
// Rotation complete
moveSteps(true, 32 * 32, 3);
delay(50);
}
void moveSteps(bool dir, int steps, byte ms) {
for (unsigned long i = 0; i < steps; i++) {
moveOneStep(dir); // Rotate a step
delay(constrain(ms,3,20)); // Control de la vitesse
}
}
void moveOneStep(bool dir) {
static byte out = 0x01;
if (dir) { // ring shift left
out != 0x08 ? out = out << 1 : out = 0x01;
}
else { // ring shift right
out != 0x01 ? out = out >> 1 : out = 0x08;
}
// Output singal to each port
for (int i = 0; i < 4; i++) {
digitalWrite(outPorts[i], (out & (0x01 << i)) ? HIGH : LOW);
}
}
loop, répète indéfiniment
si le bouton est pressé et l'état du bouton est vrai fait
rotation
sinon (si le bouton n'est pas pressé ou l'état du bouton est faux ) fait
stop rotation
fin loop
Il faut que tu change tes conditions.
en gros tu veux que la rotation se fasse si le bouton est pressé ou si l'état sauvegardé est vrai
une autre manière serait de différencier les choses, l'appuis sur le bouton change uniquement l'état sauvegardé et ta rotation ou stop ne prend en compte que l'état sauvegardé.
J'ai essayé ton code, c'est difficile à utiliser.
Si j'ai bien compris, tu presses le bouton, le moteur démarre et tu represses, il stoppe immédiatement?
Ta façon de faire tourner ton moteur est bloquante, c'est à dire, que pendant qu'il tourne, tu ne peut rien faire d'autre donc pas lire le bouton. Tu dois presser le bouton jusqu'à ce que le moteur a cessé de tourner pour qu'il soit lu, pas le pied!
Il est mieux de ne pas s'occuper de faire tourner le moteur et de confier cette tâche à une bibliothèque, en général j'aime bien AccelStepper, ainsi, le moteur tourne "tout seul" et tu peux lire le bouton à tout moment. Regardes, aussi, ici.
Quel est le type de ton moteur, as tu un lien sur celui-ci et sur l'électronique de commande?
Hello ,
Je vais préciser l'utilisation future, ça servira à faire tourner un plateau pour du scan 3D,
donc démarrage, arrêt, variation de la vitesse et éventuellement minuterie.
Pour ce tout petit projet je vais utiliser un 28BYJ-48 - http://www.datasheetcafe.com/28byj-48-datasheet-5v-stepper-motor/
Encore un petit complément d'information concernant le On/Off du moteur, tu as utilisé le else pour le 2ème condition alors qu'il faut une nouvelle condition if().
Voilà un petit exemple, mets la console à 115200 pour voire les actions.
if (digitalRead(buttonPin) == HIGH && !buttonState)
{
Serial.println("Moteur ON");
buttonState = true;
while(digitalRead(buttonPin) == HIGH) {} // Tant que le bouton est pressé
delay(200); // Delais pour les rebonds
}
if (digitalRead(buttonPin) == HIGH && buttonState)
{
Serial.println("Moteur OFF");
buttonState = false;
while(digitalRead(buttonPin) == HIGH) {} // Tant que le bouton est pressé
delay(200); // Delais pour les rebonds
}
Là, aussi, il est préférable de confier le gestion des boutons à une bibliothèque comme Button, regardes dans les exemples.
Re bonjour,
J'ai posté une réponse à ton précédent message, mais comme elle contient un lien HTTP... Il faut attendre la validation par la modération.
Je vais tester ton dernier message.
Ton dernier message m'approche de la solution finale, mais, il faut que j'utilise une bibliothèque comme AccelStepper, pour avoir le fonctionnement du moteur en tâche de fond, mais pas certain que je puisse l'utiliser avec le 28BYJ-48.
Regardes cet article, je suis "tombé" dessus par hasard, mais pas essayé, si ça peut te rendre service, il y a un exemple de rotation continue avec AccelStepper et ton hardware.