vendredi 7 mars 2025

Push & Go : Code Arduino

Le code Arduino du Push & Go est une simple évolution du code Arduino de suivi stellaire à trois vitesses (pointage, centrage, suivi). Le Push & Go nécessite l’ajout d’un poussoir entre la broche 10 de l’Arduino et une broche GND. Il n’y a pas besoin de résistance car le code utilise la résistance interne virtuelle de l’Arduino par la fonction PULLUP : pinMode(pinPuGo, INPUT_PULLUP). Je reviendrai sur le calcul du nombre de pas à indiquer dans le code afin d’obtenir le déplacement Push & Go souhaité.

/*
 * Motorisation d'une monture équatoriale Contrôlée par joystick avec fonction Push&Go
 * Vitesse de suivi stellaire, de centrage et de pointage, bascule par le bouton poussoir du joystick
 * Voyant LED pour le mode pointage, 1/2 éclairé pour le mode centrage, éteint en suivi stellaire
 * Push&Go par bonton poussoir 
 * Seuil à 100 pour la détection de l'actionnement du joystick (sur 1024)
 * Délai à 100 ms contre l'incertitude du bouton poussoir
 * Motorisation via driver de moteur pas à pas DRV8825
 * Broches Arduino organisées pour le blindage grand format Electrocookie
 * Utilise les bibliothèques Arduino AccelStepper et Bounce2
 * Voir le blog Astronomie par les trois bouts
 * astronomiebbb.blogspot.com/
 */ 

//Inclusion des bibliothèques
#include <AccelStepper.h> // Gestions moteur pas à pas
#include <Bounce2.h> // Gestion bouton poussoir

//Déclaration des broches d'Arduino
const int pinM012 = 4; //Contrôle du mode micropas
//(les broches M0, M1 et M2 des deux DRV8825 sont connectées entre elles)
const int pinLed = 3; // Broche de la LED
const int pinSwJoy = 2; //Broche du bouton du joystick
const int pinPuGo = 10; //Broche du bouton poussoir Push&Go

//Broches pour l'axeA
const int pinJA = A0; //Lecture AxeA du joystick
const int pinDirA = 6; //Contrôle la direction du moteur AxeA
const int pinStepA = 5; //Contrôle la vitesse du moteur AxeA

//Broches pour l'axeD
const int pinJD = A1; //Lecture AxeD du joystick
const int pinDirD = 8; //Contrôle la direction du moteur AxeD 
const int pinStepD = 7; //Contrôle la vitesse du moteur AxeD

//Déclaration des variables
long speedA, valA, mapA, bougeA; //variables de gestion des mouvements moteur AxeA
long speedD, valD, mapD, bougeD; //variables de gestion des mouvements moteur AxeD
boolean micropas; //Contrôle du mode microstepping

boolean actionA, actionD; //Gestion de mise en oeuvre des corrections

unsigned long debounceDelay = 100; //Délai contre l'incertitude du bouton poussoir
int mode; // mode de fonctionnement : suivi ou centrage ou pointage

//Paramètres d'AccelStepper
const int maxSpeed = 1000; //Définit la Vmax du moteur (indispensable)

const int threshold = 100; //Contre la faible fiabilité des potentiomètres
long thresholdUp, thresholdDown; //variables ancillaires à la précédente

//Déclaration des moteurs dans la bibliothèque AccelStepper
AccelStepper AxeA(AccelStepper::DRIVER, pinStepA, pinDirA);
AccelStepper AxeD(AccelStepper::DRIVER, pinStepD, pinDirD);

//Déclaration du bouton poussoir du joystick
Bounce swJoy = Bounce();
//Déclaration du bonton poussoir Push&Go
Bounce PuGo = Bounce();

void setup() {
  mode = 0; //Démarre en mode suivi stellaire
  
  //Définition des modalités des broches
  pinMode(pinM012, OUTPUT);
  pinMode(pinLed, OUTPUT);
  pinMode(pinSwJoy, INPUT_PULLUP);
  pinMode(pinPuGo, INPUT_PULLUP);
  
  analogWrite(pinLed, 0); //LED- puisque mode suivi stellaire

  //Active le microstepping par défaut
  micropas = true;
  digitalWrite(pinM012, micropas);

  //Calcule la plage du joystick devant être considérée comme "Centré"
  thresholdDown = (1024 / 2) - threshold;
  thresholdUp = (1024 / 2) + threshold;

  //Configure les paramètres des moteurs
  AxeA.setMaxSpeed(maxSpeed);
  AxeD.setMaxSpeed(maxSpeed);

  //Configure le bouton poussoir du joystick
  swJoy.attach(pinSwJoy); // Bouton relié à la broche pinSwJoy
  swJoy.interval(debounceDelay); //Délai d'incertitude

  //Configure le bouton poussoir Push&Go
  PuGo.attach(pinPuGo); // Bonton relié à la broche pinPuGo
  PuGo.interval(debounceDelay); //Délai d'incertitude
}

void loop() {
  checkSwJoy(); // Lance la void ainsi nommée
  if (mode == 0) {
    analogWrite(pinLed,0); //mode suivi, éteind la LED  
  }
  if (mode == 1) {
    analogWrite(pinLed,10); //mode centrage, LED 1/2 allumée
  }
  if (mode == 2) {
    analogWrite(pinLed,255); //mode pointage, LED allumée
  }
  
  //Par défaut, pas d'action sur le joystick 
  actionA = false;
  actionD = false;
   
  //Lecture des potentiomètres du joystick
  valA = analogRead(pinJA);
  valD = analogRead(pinJD);

  //Vérifie si le joystick est actionné en AxeA
  //Si "oui", code la valeur du potentiomètre en pas/s
  if (valA>thresholdUp || valA<thresholdDown)
  {
    mapA = map(valA, 0, 1023, -950, 950);
    actionA = true;
  }
    
  //Vérifie si le joystick est actionné en AxeD
  //Si "oui", code la valeur du potentiomètre en pas/s
  if (valD>thresholdUp || valD<thresholdDown)
  {
    mapD = map(valD, 0, 1023, -950, 950);
    actionD = true;
  }


   //Vérifie si le bouton poussoir Push&Go est actionné
   //Si "oui", autorise la mise en oeuvre du Push&Go
    PuGo.update(); // Mise à jour du bouton
  if (PuGo.fell()) // Actionné ?
    {
      micropas = false; // Désactive le microstepping
      digitalWrite (pinM012, micropas); // Désactive le microstepping
      // Mise en oeuvre du Push&Go sur le moteur alpha
      AxeA.setCurrentPosition(0); // Attribue 0 à la position actuelle
      AxeA.setSpeed(800); // Fixe la vitesse du Push&Go
      AxeA.setAcceleration(200); // Fixe l'accélération du Push&Go
      AxeA.moveTo(AxeA.currentPosition() + 2425);  // Push&Go alpha de 2425 pas vers l'avant (+)
      while(AxeA.distanceToGo() != 0) // Fait tourner le moteur du nombre de pas ci-dessus
        {
          AxeA.run(); // Mise en oeuvre du moteur Alpha
        }
        // Mise en oeuvre du Push&Go sur le moteur delta
      AxeD.setCurrentPosition(0); // Attribue 0 à la position actuelle
      AxeD.setSpeed(800); // Fixe la vitesse du Push&Go
      AxeD.setAcceleration(200); // Fixe l'accélération du Push&Go
      AxeD.moveTo(AxeD.currentPosition() - 817);  // Push&Go delta de 817 pas vers l'arrière (-)
      while(AxeD.distanceToGo() != 0) // Fait tourner le moteur du nombre de pas ci-dessus
        {
          AxeD.run(); // Mise en oeuvre du moteur Delta
        }
      // Reprendre en mode suivi stellaire
      mode = 0; 
      micropas = true;
      digitalWrite(pinM012,micropas);
      AxeA.setSpeed(46.924);// Vitesse alpha de suivi stellaire
      AxeA.runSpeed();
      AxeD.stop(); // Moteur delta à l'arrêt
    } 

 //Fait bouger les moteurs si action sur le joystick
  if (actionA) // Si le joystick est actionné en A
    {  
    if (mode == 0) // Si mode suivi stellaire
      {
        bougeA = (mapA/100)+46.924; // Vitesse de suivi stellaire +/- correction
        micropas = true; // Active le microspepping
      }
     if (mode == 1) // Si mode centrage
      {
        bougeA = (mapA);
        micropas = true; // Active le microspepping
      } 
     if (mode == 2) // Si mode pointage
        {
          bougeA = (mapA);
          micropas = false; // Désactive le microstepping
        }
       
    digitalWrite(pinM012, micropas);
    AxeA.setSpeed(bougeA);
    AxeA.runSpeed();
    mapA = 0;
    }
    else // Si pas d'action sur le joystick en A
      {
        micropas = true;
        digitalWrite(pinM012,micropas);
        AxeA.setSpeed(46.924);// Vitesse de suivi stellaire
        AxeA.runSpeed();
      }
  if (actionD) // Si le joystick est actionné en D
    {
    if (mode == 0) // Si mode suivi stellaire
      {
        bougeD = (mapD/100); // Vitesse proportionnelle à l'axe A 
        micropas = true; // Active le microstepping
      }
     if (mode == 1) // Si mode centrage
        {
          bougeD = (mapD);
          micropas = true; // Désactive le microstepping
        }
     if (mode == 2) // Si mode pointage
        {
          bougeD = (mapD);
          micropas = false; // Désactive le microstepping
          // Pas besoin de calculer la vitesse du moteur, on utilise mapD
        }
    digitalWrite(pinM012, micropas);    
    AxeD.setSpeed(bougeD);
    AxeD.runSpeed();
    }
    else // Si pas d'action sur le joystick en D
      {
        AxeD.stop(); // Moteur à l'arrêt
      }
}

void checkSwJoy() // Bouton poussoir joystick actionné ?
{
  swJoy.update(); // Mise à jour du bouton
  if (swJoy.fell()) // Actionné ?
  {
    ++mode; // incrémente le mode
    if (mode>2) // revient en mode suivi
    {
      mode = 0; // mode suivi
    }    
  }
  
}  

Aucun commentaire:

Enregistrer un commentaire

Newton T200 : Mise au point astrophoto déportée

P lusieurs limites étaient apparues lors du dernier essai d'astrophoto avec le T200 . L'une d'elles était la difficulté de mettr...