Le plan de câblage présenté dans le billet précédent permet non seulement
le suivi stellaire mais aussi une vitesse rapide
permettant le pointage. Lors du suivi stellaire, le joystick permet
la correction des erreurs de suivi en ascension droite (axe alpha) et
en déclinaison (axe delta). La pression du joystick bascule dans le
mode pointage et allume la LED témoin de ce mode rapide. Le pointage
peut alors être effectué avec le joystick. La pression du joystick
permet de revenir en mode suivi stellaire.
Ce plan de
câblage est prévu pour le code Arduino ci-dessous. Pour
fonctionner, le code nécessite les bibliothèques de fonctions
accelstepper et bounce2 qui doivent donc être installées sur le
logiciel Arduino comme précédemment expliqué.
La vitesse
de suivi stellaire est fixée ici à 46.924 µpas/s selon la
démultiplication du mécanisme d'entraînement et d'après les calculs précédemment expliqués. Les corrections font varier cette
vitesse de 9.5 µpas/s en plus ou en moins selon l'action sur le
joystick. En mode pointage, la vitesse est alors de 950 pas/s (et
plus µpas/s car le code Arduino désactive le mode micro-pas lors du
pointage).
Il n'est
pas impossible qu'en poursuivant les essais de ce système, je trouve
que l'ajout d'une vitesse de centrage soit bien utile ? Nous
verrons bien.
/*
* Motorisation d'une monture équatoriale Contrôlée par joystick
* Vitesse de suivi stellaire et de pointage, bascule par le bouton poussoir du joystick
* Voyant LED pour le mode pointage
* threshold à 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
* 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éclararion des broches d'Arduino
const int pinM012 = 6; //Contrôle du mode micropas
//(les broches M0, M1 et M2 des deux DRV8825 sont connectées entre elles)
const int pinLed = 7; // Broche de la LED
const int pinSwJoy = 8; //Broche du bouton du joystick
//Broches pour l'axeA
const int pinJA = A0; //Lecture AxeA du joystick
const int pinDirA = 2; //Contrôle la direction du moteur AxeA
const int pinStepA = 3; //Contrôle la vitesse du moteur AxeA
//Broches pour l'axeD
const int pinJD = A1; //Lecture AxeD du joystick
const int pinDirD = 4; //Contrôle la direction du moteur AxeD
const int pinStepD = 5; //Contrôle la vitesse du moteur AxeD
//Déclaration des variables
long speedA, valA, mapA; //variables de gestion des mouvements moteur AxeA
long speedD, valD, mapD; //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
boolean pointage; //true si mode pointage et false pour suivi stellaire
//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();
void setup() {
pointage = false; //Démarre en mode suivi stellaire
//Définition des modalités des broches
pinMode(pinM012, OUTPUT);
pinMode(pinLed, OUTPUT);
pinMode(pinSwJoy, INPUT_PULLUP);
digitalWrite(pinLed, pointage); //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
}
void loop() {
checkSwJoy(); // Lance la void ainsi nommée
digitalWrite(pinLed,pointage); //Allume ou éteind la LED selon le mode
//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;
}
//Fait bouger les moteurs
if (actionA) // Si le joystick est actionné en A
{
if (pointage == false) // Si mode suivi stellaire
{
mapA = (mapA/100)+46.924; // Vitesse de suivi stellaire +/- correction
micropas = true; // Active le microspepping
}
else // Si mode pointage
{
micropas = false; // Désactive le microstepping
// Pas besoin de calculer la vitesse moteur, on utilise mapA
}
digitalWrite(pinM012, micropas);
AxeA.setSpeed(mapA);
AxeA.runSpeed();
}
else // Si pas d'action sur le joystick en A
{
micropas = true;
digitalWrite(pinM012, micropas);
AxeA.setSpeed(46.924); // Vitesse de suivi stellaire de la monture
AxeA.runSpeed();
}
if (actionD) // Si le joystick est actionné en D
{
if (pointage == false) // Si mode suivi stellaire
{
mapD = (mapD/100); // Vitesse proportionnelle à l'axe A
micropas = true; // Active le microstepping
}
else // Si mode pointage
{
micropas = false; // Désactive le microstepping
// Pas besoin de calculer la vitesse du moteur, on utilise mapD
}
digitalWrite(pinM012, micropas);
AxeD.setSpeed(mapD);
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é ?
{
pointage = !pointage; // change le mode
}
}