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
}
}
}