Bonjour Cavok
Voilà un « Premier jet » de ton application.
Comme ton installation n’est certainement pas la même que la mienne, il y a 2 sections de paramètres qui sont sélectionnées en précompilation par la ligne :
#define programmeur // Si programme pour utilisateur mettre //
Si cette ligne est commentée (//), c’est tes paramètres qui sont compilés, ceux depuis :
#else //=========================== Paramètres propres à l'utilisateur, mettre //#define programmeur
Jusqu’à
#endif
J’espère y avoir mis assez de commentaires pour aider à ta compréhension, mais je suis toujours à ta disposition.
Je ne sait pas quel driver tu as mais, au vu des pin de ton programme, ça se gère comme un A4988.
Dans la section des paramètres tu peux régler l’état des pin et autres comme :
const int mpapDriverTypeDef = 1; // Type de driver 1 = A4988 AccelStepper Arduino Library, connecting Stepper Motors to Teensy
const int mpapDriverEnaOnStat = LOW; // Etat du signal ENA actif
const boolean mpapDriverDirReverse = false; // Pour inverser DIR
const int homeOnStat = LOW; // Etat du signal Home actif LOW = GND
Si tu mets ta console à 115200 tu y verras des informations sur le déroulement du programme.
Par prudence, pour les premiers essais, comme on ne sait pas dans quel sens va tourner ton MPAP, déconnectes la mécanique. Si le MPAP tourne dans le mauvais sens, c’est la variable mpapDriverDirReverse.
La fonction de homing, pour le moment, est commentée. As-tu le matériel, sais-tu comment monter tout ça ? Dans l’idéal, quand ton mobile est « at home » il doit donner un LOW sur homingPin, mais c’est paramétrable.
Pour le premier démarrage, le MPAP doit faire le va-et-vient en fonction de mpapPasAvant.
Pour tester la mémorisation :
Un reset pendant la pause, au redémarrage le mobile bouge « comme si de rien n’était »
Un reset pendant un déplacement, il y a toujours un homing au redémarrage.
Je te laisse essayer tout ça.
Ce ne serait pas mieux s’il y avait un contact pour faire du « hand shaking », à voire plus tard.
Le programme:
/*
Name: ARDFR_Cavok_VisAbilles.ino
Created: 29.11.2021
Author: jpbbricole
*/
#include <AccelStepper.h> // https://www.arduino.cc/reference/en/libraries/accelstepper/
// http://edge.rit.edu/edge/P14215/public/Software/P14215_Nick/Code/Arduino%20Library%20Folder/AccelStepper/doc/classAccelStepper.html
#include <EEPROM.h> // Pour sauvegarde des paramètres en mémoire EEPROM
//#define programmeur // Si programme pour utilisateur mettre //
#ifdef programmeur
const int mpapDriverDirPin = 5; // Pin du signal DIR driver A4988
const int mpapDriverStepPin = 6; // Pin du signal STEP
const int mpapDriverEnaPin = 7; // Pin du signal ENA
const int mpapDriverTypeDef = 1; // Type de driver 1 = A4988 https://www.pjrc.com/teensy/td_libs_AccelStepper.html
const int mpapDriverEnaOnStat = LOW; // Etat du signal ENA actif
const boolean mpapDriverDirReverse = false; // Pour inverser DIR
float mpapMaxSpeed = 800.0; // Vitesse en pas/Sec.
float mpapAcceleration = mpapMaxSpeed*2.0 ; // Accélération
long mpapPasAvant = 3000; // Position avant en pas
long mpapPasArriere = 0; // Position arrière en pas
unsigned long pauseInterMouvement = 5; // Pause en secondes
const int homingPin = 8; // Pin du contact home.
const int homeOnStat = LOW; // Etat du signal Home actif LOW = GND
#else //=========================== Paramètres propres à l'utilisateur, mettre //#define programmeur
const int mpapDriverDirPin = 5; // Pin du signal DIR driver A4988
const int mpapDriverStepPin = 6; // Pin du signal STEP
const int mpapDriverEnaPin = 7; // Pin du signal ENA
const int mpapDriverTypeDef = 1; // Type de driver 1 = A4988 https://www.pjrc.com/teensy/td_libs_AccelStepper.html
const int mpapDriverEnaOnStat = LOW; // Etat du signal ENA actif
const boolean mpapDriverDirReverse = false; // Pour inverser DIR
float mpapMaxSpeed = 800.0; // Vitesse en pas/Sec.
float mpapAcceleration = mpapMaxSpeed*100.0 ; // Accélération
long mpapPasAvant = 3000; // Position avant en pas
long mpapPasArriere = 0; // Position arrière en pas
unsigned long pauseInterMouvement = 5; // Pause en secondes
const int homingPin = 8; // Pin du contact home.
const int homeOnStat = LOW; // Etat du signal Home actif LOW = GND
#endif
//------------------------------------ Moteur pas à pas (mpap)
AccelStepper mpap(mpapDriverTypeDef, mpapDriverStepPin, mpapDriverDirPin); // Initialisation du mpap
//------------------------------------- Sens de déplacement 0 = en mouvement 1 = avant 2 = arrière
enum mpapDirIndex : byte {mpapDirArriere, mpapDirAvant, mpapDirInMove};
byte mpapDirStatus = mpapDirInMove;
void setup()
{
Serial.begin(115200);
//--------------------------------- Initialisation des entrées/sorties
pinMode(mpapDriverEnaPin, OUTPUT); // Pin du signal ENA du driver
digitalWrite(mpapDriverEnaPin, mpapDriverEnaOnStat); // Activer le moteur
pinMode(homingPin, INPUT_PULLUP); // Pour le contact de homing, active avec GND
//--------------------------------- Initialisation mpap
mpap.setMaxSpeed(mpapMaxSpeed);
mpap.setAcceleration(mpapAcceleration);
mpap.setPinsInverted(mpapDriverDirReverse, false, false); // Inverser DIR si nécessaire
mpapDirStatus = EEPROM.read(0); // Lecture du dernier sens de rotation enrtegistré
Serial.print(F("EEPROM = ")); Serial.println(mpapDirStatus);
switch (mpapDirStatus)
{
case mpapDirArriere: // Si dernier mouvement enregistré = arrière
mpapDirStatus = mpapDirAvant; // Donc prochain mouvement en avant
mpap.setCurrentPosition(0);
break;
case mpapDirAvant:
mpapDirStatus = mpapDirArriere; // Donc prochain mouvement en arrière
mpap.setCurrentPosition(mpapPasAvant);
break;
default: // Si crash ou reset de l'Arduino
homingStart();
mpapDirStatus = mpapDirAvant; // Ensuite prochain mouvement en avant
mpap.setCurrentPosition(0);
delay(2000);
break;
}
}
void loop()
{
if (mpapDirStatus == mpapDirAvant) // Si prochain mouvement est en avant
{
mpapGoto(mpapPasAvant);
}
else
{
mpapGoto(mpapPasArriere);
}
Serial.print("Pause "); Serial.println(pauseInterMouvement);
delay(pauseInterMouvement * 1000);
mpapDirStatus = (mpapDirStatus == mpapDirAvant) ? mpapDirArriere : mpapDirAvant; // Alterner les mouvements
}
//===================================== Moteur pas à pas (MPAP)
//------------------------------------- Goto pas
void mpapGoto(long gotoSteps)
{
Serial.print("MPAP Goto\t" + String(gotoSteps));
//digitalWrite(mpapDriverEnaPin, mpapDriverEnaOnStat); // Activer le moteur
mpapDirStatus = mpapDirInMove; EEPROM.update(0, mpapDirStatus); // MPAP en mouvement et enregistrer
mpap.runToNewPosition(gotoSteps);
mpapDirStatus = digitalRead(mpapDriverDirPin); EEPROM.update(0, mpapDirStatus); // Lire sens du mouvement et enregistrer
//digitalWrite(mpapDriverEnaPin, !mpapDriverEnaOnStat); // Désactiver le moteur
Serial.println("\tOK");
}
//------------------------------------- Retour à la position de départ
void homingStart()
{
Serial.println(F("\nHOMING"));
Serial.println(F("DESACTIVE"));
//if (digitalRead(homingPin) != homeOnStat) // Si pas sur contact home
//{
//Serial.println(F("Retour <<"));
//
//mpap.moveTo(-mpapPasAvant);
//
//while (digitalRead(homingPin) != homeOnStat) // Tant que pas home
//{
//mpap.run();
//}
//mpap.stop(); // Stop aussitôt que possible
//}
delay(2000);
}
A+
Cordialement
Jpbbricole