Bonjour Jean_la_boissellerie.
Voilà tel que je vois ton programme d’ouverture et fermeture d’un dressing tel que décrit dans le post#3.
Au départ, le programme va caler le moteur sur le contact vabEndstopHomePin
.
Ceci n’est pas indispensable, si tu veux t’en passer, mets cette ligne en remarque :
//mpapToEndstopHome();
Tu as un outil pour monitorer tes entrées/sorties :
toolMonitor(); // Pour afficher l'état des ports E/S
Si tu décommentes cette ligne et que tu recharges le programme, dans le moniteur, à 115200, tu vois l’état de tes contacts et boutons :
Endstop HOME ON
Endstop TARGET OFF
Bouton SORTIE OFF
Bouton ENTREE ON
Moteur ENABLE OFF
Le programme ne fait que ça.
Pour sortir de ce mode, il faut re commenter la ligne et recharger le programme. Ceci sert surtout au tout début du développement.
Pour ce qui est du programme, j’ai mis un maximum de commentaires et suis à ton entière disposition pour toutes questions.
Le programme :
/*
Name: AF_boissellerie_MoteurVisAbille.ino
Created: 28.08.2024
Author: BUREAU\admin
Remarque: Comande d'un moteur pas à pas et vis à bille pour tiroir.
https://forum.arduino.cc/t/aide-sur-gestion-moteur-pas-a-pas-avec-vis-sans-fin-et-ecrou-a-bille/1295712/11
01.09.2024 Première version #15
*/
#include <AccelStepper.h> // https://www.airspayce.com/mikem/arduino/AccelStepper/classAccelStepper.html
//------------------------------------- Moteur pas à pas (mpap)
// Définir les connexions des moteurs pas à pas
const int mpapDirPin = 2; // Pin qui commande la direction
const int mpapStepPin = 3; // Pin qui commande les pas
const int mpapEnablePin = 10; // Pin d'activation du mpap
AccelStepper mpap(1, mpapStepPin, mpapDirPin); // Créer une nouvelle instance de la classe AccelStepper
const long mpapTargetPosition = 58360; // Définir la position cible
const boolean mpapBitInvertDir = true; // Pour inverser le bit DIR
const boolean mpapBitInvertStep = true; // Pour inverser le bit STEP
const boolean mpapBitInvertEna = true; // Pour inverser le bit ENA
enum {mpapDirToHome, mpapDirToTarget};
int mpapDirTo = mpapDirToTarget;
//------------------------------------- Endstop vis à bille (vab)
// Définir les pins des capteurs de fin de course
const int vabEndstopHomePin = A0; // Contact de départ
const int vabEndstopTargetPin = A1; // Contact d^'arrivée
const int vabEndstopEtatOn = LOW; // Etat quand actif
//------------------------------------- Boutons (btn)
// Définir les pins des interrupteurs biposition
const int btnSortiePin = 11; // 6 // Pin de l'interrupteur Sortie
const int btnEntreePin = 3; // 7 // Pin de l'interrupteur Entrée
const int btnEtatOn = LOW; // Etat quand actif
//------------------------------------- Etats du programme
const String prgEtatLabel[] = {"Initial", "en Marche", "en Pause"};
enum {prgEtatInitial, prgEtatEnMarche, prgEtatEnPause};
int prgEtat; // Etat du programme
void setup()
{
Serial.begin(115200);
delay(500);
Serial.println("\nMoteur pas a pas avec vis a billes");
mpap.setMaxSpeed(1500); // Définir la vitesse maximale
mpap.setAcceleration(200); // Définir l'accélération
mpap.setEnablePin(mpapEnablePin);
// DIR STEP ENA
mpap.setPinsInverted(!mpapBitInvertDir, !mpapBitInvertStep, mpapBitInvertEna);
pinMode(vabEndstopHomePin, INPUT_PULLUP);
pinMode(vabEndstopTargetPin, INPUT_PULLUP);
pinMode(btnSortiePin, INPUT_PULLUP);
pinMode(btnEntreePin, INPUT_PULLUP);
mpap.disableOutputs();
toolMonitor(); // Pour afficher l'état des ports E/S
prgEtatChange(prgEtatEnPause);
mpapDirTo = mpapDirToTarget;
mpapToEndstopHome();
}
void loop()
{
if (prgEtat == prgEtatEnPause)
{
if (digitalRead(btnSortiePin) == btnEtatOn) // Si le bouton sortie est pressé
{
if (digitalRead(vabEndstopTargetPin) == !vabEndstopEtatOn) // Si pas sur contact arrivée
{
Serial.println(F("Bouton SORTIE"));
prgEtatChange(prgEtatEnMarche);
mpap.setPinsInverted(!mpapBitInvertDir, !mpapBitInvertStep, mpapBitInvertEna);
mpapDirTo = mpapDirToTarget;
mpap.moveTo(mpapTargetPosition);
}
}
else if (digitalRead(btnEntreePin) == btnEtatOn) // Si le bouton entrée est pressé
{
if (digitalRead(vabEndstopHomePin) == !vabEndstopEtatOn) // Si pas sur contact départ
{
Serial.println(F("Bouton ENTREE"));
prgEtatChange(prgEtatEnMarche);
mpap.setPinsInverted(mpapBitInvertDir, !mpapBitInvertStep, mpapBitInvertEna);
mpapDirTo = mpapDirToHome;
mpap.moveTo(mpapTargetPosition);
}
}
}
if ((digitalRead(btnSortiePin) != btnEtatOn && digitalRead(btnEntreePin) != btnEtatOn) && prgEtat == prgEtatEnMarche) // Si le bouton sortie et entrée sont relâchés
{
Serial.println(F("Boutons STOP"));
mpapStop(); // Arrêt du moteur
prgEtatChange(prgEtatEnPause);
}
if (prgEtat == prgEtatEnMarche) // Faire tourner le moteur, si nécessaire
{
mpap.run();
}
//--------------------------------- Si moteur en fin de course
if ((digitalRead(vabEndstopHomePin) == vabEndstopEtatOn) && mpapDirTo == mpapDirToHome && prgEtat == prgEtatEnMarche) // Si moteur déjà au départ
{
mpapStop();
}
if ((digitalRead(vabEndstopTargetPin) == vabEndstopEtatOn) && mpapDirTo == mpapDirToTarget && prgEtat == prgEtatEnMarche) // Si moteur déjà aun target
{
mpapStop();
}
}
//------------------------------------- Etats du programme
void prgEtatChange(int etatNew)
{
Serial.println(F("Changement d'etat"));
Serial.println("\tde " + prgEtatLabel[prgEtat]);
Serial.println("\ta " + prgEtatLabel[etatNew]);
prgEtat = etatNew;
if (prgEtat == prgEtatEnPause)
{
mpap.disableOutputs();
}
else if (prgEtat == prgEtatEnMarche)
{
mpap.enableOutputs();
}
}
//------------------------------------ Arrêt du moteur
void mpapStop()
{
mpap.stop();
mpap.setCurrentPosition(0);
}
//------------------------------------ Moteur en position endstopHome
void mpapToEndstopHome()
{
if (digitalRead(vabEndstopHomePin) != vabEndstopEtatOn) // Si moteur pas sur contact.
{
prgEtatChange(prgEtatEnMarche);
Serial.println(F("\tMoteur vers endstopHome "));
mpap.setCurrentPosition(0); // Moteur position 0
mpap.moveTo(-mpapTargetPosition * 2);
while (true)
{
if (digitalRead(vabEndstopHomePin) == vabEndstopEtatOn) // Si moteur sur contact.
{
mpap.setCurrentPosition(0); // Moteur position 0
mpap.stop();
break;
}
mpap.run();
}
prgEtatChange(prgEtatEnPause);
}
mpapDirTo = mpapDirToTarget; // Prochaine direction
Serial.println(F("\tMoteur sur endstopHome "));
}
/*
Moniteur des E/S
Attention, reste dans cette boucle.
Pour arrêter, commenter la ligne:
//toolMonitor(); // Pour afficher l'état des ports E/S
*/
//------------------------------------- Moniteur des E/S
void toolMonitor()
{
while (true)
{
Serial.print(F("\nEndstop HOME\t")); Serial.println((digitalRead(vabEndstopHomePin) == vabEndstopEtatOn) ? "ON" : "OFF");
Serial.print(F("Endstop TARGET\t")); Serial.println((digitalRead(vabEndstopTargetPin) == vabEndstopEtatOn) ? "ON" : "OFF");
Serial.print(F("Bouton SORTIE\t")); Serial.println((digitalRead(btnEntreePin) == btnEtatOn) ? "ON" : "OFF");
Serial.print(F("Bouton ENTREE\t")); Serial.println((digitalRead(btnSortiePin) == btnEtatOn) ? "ON" : "OFF");
Serial.print(F("Moteur ENABLE\t")); Serial.println((digitalRead(mpapEnablePin) == LOW) ? "ON" : "OFF");
delay(1000);
}
}
Dans le moniteur à 115200, tu as des indications quant au fonctionnement du programme :
Bouton SORTIE
Changement d'etat
de en Pause
a en Marche
Boutons STOP
Changement d'etat
de en Marche
a en Pause
Bouton SORTIE
Changement d'etat
de en Pause
a en Marche
Boutons STOP
Changement d'etat
de en Marche
a en Pause
PS : Sur mon installation, je n’ai pas les mêmes ports que sur la tienne, alors attention !! des fois que j’aurai mal corrigé
Bonne journée
jpbbricole