Bonjour scarface2012
Voilà un « premier jet » du programme, il nécessite 2 bibliothèques :
Pour les moteurs pas à pas (MPAP), AccelStepper et, pour le bouton poussoir, JC_Button.
Pour le câblage du bouton (BP), il est d’un côté au GND de l’Arduino et de l’autre à la pin const int bpPpin = 3;
Pour le câblage du driver du MPAP :
const int mpapSignDirPin = 5; // Pin du signal DIR
const int mpapSignStepPin = 6; // Pin du signal STEP
const int mpapSignEnaPin = 7; // Pin du signal ENABLE
Il est possible qu’il faille inverser DIR, STEP ou ENABLE, ça se fait ici :
// DIR STEP ENABLE
mpap.setPinsInverted(false, false, true); // Inversion des signaux
Un true à ENABLE signifie que ce signal est actif à LOW.
Les paramètres de fonctionnement sont :
const long mpapStepsMicroNombre = 500; // Nombre de pas en 1/8
float mpapStepsTempo = 6.0; // Un pas toutes les x.x secondes
Le déplacement est de 500 micro-pas avec un pas toutes les 6 secondes, tu peux jouer avec ces valeurs.
Les rôles du bouton ;
Première pression, démarrage, pression suivante, en pause, pression suivante, redémarrage ……
Longue pression (2 secondes)= RAZ du système.
Commande depuis le PC via l’USB, à 115200, commandes terminées par LF (\n) ou LF et CR (\n\r):
START Démarrage du déplacement.
PAUSE Mise en pause du déplacement
CONT Redémarrage suite à pause.
RAZ RAZ du système.
Il y a des informations quant au fonctionnement du système, dans le moniteur (115200), en fonctionnement, les pas restants sont affichés toutes les secondes (displayTempo = 1000;).
Nombre des pas : 500
Tempo des pas : 0.17 sec.
Etat change : Arret
Etat change : Marche
Pas restants: 499
Pas restants: 499
Pas restants: 499
Pas restants: 498
Etat change : Pause
Etat change : Marche
Pas restants: 497
Pas restants: 497
Pas restants: 497
Etat change : Pause
Etat change : Marche
Pas restants: 496
Pas restants: 496
Etat change : Pause
Etat change : Arret
Le programme :
/*
Name: AF_scarface2012_PasApasTresLentement.ino
Created: 20.07.2024
Author: jpbbricole
https://forum.arduino.cc/t/faire-tourner-moteur-pas-a-pas-tres-lentement/1283008/16
20.07.2024 Première version #17
*/
#include <AccelStepper.h> // https://www.pjrc.com/teensy/td_libs_AccelStepper.html
#include <JC_Button.h> // https://github.com/JChristensen/JC_Button Gestion du bouton poussoir
//------------------------------------- Moteur pas à pas (mpap)
const int mpapSignDirPin = 5; // Pin du signal DIR
const int mpapSignStepPin = 6; // Pin du signal STEP
const int mpapSignEnaPin = 7; // Pin du signal ENABLE
AccelStepper mpap(AccelStepper::DRIVER, mpapSignStepPin, mpapSignDirPin); // Driver, STEP, DIR
const unsigned long displayTempo = 1000; // Afficher toutes les secondes
unsigned long displayMillis = millis(); // Afficher toutes les secondes, chrono
const long mpapStepsMicroNombre = 500; // Nombre de pas en 1/8
float mpapStepsTempo = 6.0; // Un pas toutes les x.x secondes
//------------------------------------- Bouton poussoir (bp)
const int bpPpin = 3; // Pin du bouton poussoir, un côté à GND
const boolean buttPullup = true; // PULLUP internes
const boolean buttInvert = true; // Actif à LOW
const int buttDebounce = 20; // Temps anti rebonds
//------------------------------------- Etats du programme
const String prgEtatLabel[] = {"Marche", "Pause", "Arret"};
enum {prgEtatEnMarche, prgEtatEnPause, prgEtatEnArret};
int prgEtat; // Etat du programme
// PULLUP Inverted Anti-rebonds
Button bp(bpPpin, true, true, 20); // Création du bouton
void setup()
{
Serial.begin(115200);
delay(500);
bp.begin();
//--------------------------------- Moteur pas à pas (mpap)
// DIR STEP ENA
mpap.setPinsInverted(false, false, true); // Inversion des signaux
mpap.setEnablePin(mpapSignEnaPin); /// Pin d'activation
mpap.setMaxSpeed(1.0 / mpapStepsTempo); // Toutes les x secondes
mpap.enableOutputs(); // Activer le driver
Serial.println("Nombre des pas :\t" + String(mpapStepsMicroNombre));
Serial.println("Tempo des pas :\t\t" + String(mpap.maxSpeed()) + " sec.");
prgEtatChange(prgEtatEnArret);
mpap.moveTo(500); // Aler à 500 pas
}
void loop()
{
//--------------------------------- Bouton poussoir
bp.read(); // Lecture du bouton poussoir
if (bp.pressedFor(2000)) // Si BP presse 1 seconde
{
if (prgEtat != prgEtatEnArret)
{
mpapReset();
}
}
else if (bp.wasPressed()) // Si BP a été pressé
{
if (prgEtat == prgEtatEnArret)
{
mpapStart();
}
else if (prgEtat == prgEtatEnMarche)
{
mpapPause();
}
else if (prgEtat == prgEtatEnPause)
{
prgEtatChange(prgEtatEnMarche);
}
}
//--------------------------------- Commandes PC
if (Serial.available())
{
//String cmdRx = Serial.readStringUntil('\n');
cmdExecute(Serial.readStringUntil('\n')); // Réception de la commande terminée par Nouvelle ligne
}
//--------------------------------- Affichage
if (millis() - displayMillis >= displayTempo)
{
if (prgEtat == prgEtatEnMarche)
{
Serial.println("Pas restants: " + String(mpap.distanceToGo()));
}
displayMillis = millis();
}
if (prgEtat == prgEtatEnMarche)
{
mpap.run(); // Tant qu'il y a des pas à faire (mpap.distanceToGo() != 0)
}
}
void prgEtatChange(int newEtat) // Changement d'état du programme
{
prgEtat = newEtat;
Serial.println("Etat change : " + prgEtatLabel[prgEtat]);
}
//--------------------------------- Moteur pas à pas
void mpapStart()
{
mpap.moveTo(mpapStepsMicroNombre); // Aller à
prgEtatChange(prgEtatEnMarche);
}
void mpapPause()
{
prgEtatChange(prgEtatEnPause);
}
void mpapReset()
{
mpap.stop();
mpap.setCurrentPosition(0);
prgEtatChange(prgEtatEnArret);
}
void cmdExecute(String cmdRx)
{
cmdRx.trim(); // Pour nettoyer la chaîne reçue
cmdRx.toUpperCase(); // Tout en majuscule
cmdRx.replace(" ", ""); // Supprimer les espaces
Serial.println("Comande recue : " + cmdRx);
if (cmdRx == F("START"))
{
mpapStart();
}
else if (cmdRx == F("PAUSE"))
{
mpapPause();
}
else if (cmdRx == F("CONT"))
{
prgEtatChange(prgEtatEnMarche);
}
else if (cmdRx == F("RAZ"))
{
mpapReset();
}
else
{
Serial.println("Commande inconnue : " + cmdRx);
}
}
A ta disposition pour toutes questions et évolutions de ce programme.
PS: Règles tes switches sur 1600 (1/8 de pas)

Cordialement
jpbbricole