// put your main code here, to run repeatedly:
//***************************************************************************
//telescope_tracker v.2.1
//allows to drive 2 stepper motor from a remote joystick and apply a sideral
//tracking speed to one of the motor for astrophotography
//created 2021 may 9th
//by Clovis ONOFRI
//This program is licenced under GPL v.3
//***************************************************************************
//pin output driver AD
#define dirAD A1
#define stepAD A0
#define MS1AD 6
#define MS2AD 5
#define MS3AD 4
#define enableAD A2
//pin output driver Dec
#define dirDec A7
#define stepDec A6
#define MS1Dec 12
#define MS2Dec 11
#define MS3Dec 10
#define enableDec A8
//pin input
#define joystickXPin A11 //D15
#define joystickYPin A5 //D16
#define reverseSwitchPin A9 //D17
#define TrackerSwitchPin A4 //D18
//var remote
int consigneDec = 0;
int consigneAD = 0;
int joystickX = 512;
int joystickY = 512;
int reverse = 0;
//input initialisation
bool TrackerState = false; //
bool TrackerHold = false; //Hold tracker pour utilisation joystick AD
bool TrackerReading = false; //état bouton tracker
bool PreviousTrackerReading = false; //état précédent bouton tracker
bool reverseADState = false;
bool reverseDecState = false;
//horloge tracking initialisation
unsigned long horloge = 0;
unsigned long intervalle = 38955842; //ns, voir Note de calcul
unsigned long StepTimeNS = 0; //ns
unsigned long StepTimeMS = 0; //ms
unsigned long StepTimeS = 0; //s
void setup() {
// Declare pins as output:
pinMode(dirAD, OUTPUT);
pinMode(stepAD, OUTPUT);
pinMode(MS1AD, OUTPUT);
pinMode(MS2AD, OUTPUT);
pinMode(MS3AD, OUTPUT);
pinMode(enableAD, OUTPUT);
pinMode(dirDec, OUTPUT);
pinMode(stepDec, OUTPUT);
pinMode(MS1Dec, OUTPUT);
pinMode(MS2Dec, OUTPUT);
pinMode(MS3Dec, OUTPUT);
pinMode(enableDec, OUTPUT);
// Declare pins as input:
pinMode(TrackerSwitchPin, INPUT_PULLUP); //Switch connecte masse, push=0
pinMode(reverseSwitchPin, INPUT);
pinMode(joystickXPin, INPUT);
pinMode(joystickYPin, INPUT);
// initialize the serial port:
Serial.begin(57600);
}
void loop() {
//blabla
// Serial.print("TrackerState = ");
// Serial.println(TrackerState);
// Serial.print("TrackerHold = ");
// Serial.println(TrackerHold);
// Serial.print("reverse AD = ");
// Serial.println(reverseADState);
// Serial.print("reverse Dec = ");
// Serial.println(reverseDecState);
//1/16 step mode
digitalWrite(MS1AD, HIGH);
digitalWrite(MS2AD, HIGH);
digitalWrite(MS3AD, HIGH);
digitalWrite(MS1Dec, HIGH);
digitalWrite(MS2Dec, HIGH);
digitalWrite(MS3Dec, HIGH);
//Tracking param + flip/flop switch tracker
horloge = millis(); //quelle heure est-il madame persil?
TrackerReading = !digitalRead(TrackerSwitchPin);
if (TrackerReading == HIGH && PreviousTrackerReading == LOW) {
TrackerState = !TrackerState;
StepTimeS = horloge / 1000;
StepTimeMS = horloge % 1000;
StepTimeMS -= 1;
StepTimeNS = 0;
}
PreviousTrackerReading = TrackerReading;
if (TrackerState == true && TrackerHold == true) {
TrackerHold = false;
StepTimeS = horloge / 1000;
StepTimeMS = horloge % 1000;
StepTimeMS -= 1;
StepTimeNS = 0;
}
//Joystick
//lecture des switch reverse X & reverse Y
reverse = analogRead(reverseSwitchPin);
if (reverse <= 256) {
reverseADState = false;
reverseDecState = true;
} else if (reverse > 256 && reverse <= 512) {
reverseADState = true;
reverseDecState = true;
} else if (reverse > 512 && reverse <= 768) {
reverseADState = true;
reverseDecState = false;
} else { // 768 < reverse < 1023
reverseADState = false;
reverseDecState = false;
}
//lecture du Joystick Y => application sur Dec
joystickY = analogRead(joystickYPin);
// Serial.print(" JoyY=");
// Serial.print(joystickY);
if (joystickY > 527) {
consigneDec = map(joystickY, 528, 1024, 50, 15000);
digitalWrite(dirDec, reverseDecState);
digitalWrite(enableDec, LOW);
tone(stepDec, consigneDec);
}
else if (joystickY < 497) {
consigneDec = map(joystickY, 496, 0, 50, 15000);
digitalWrite(dirDec, !reverseDecState);
digitalWrite(enableDec, LOW);
tone(stepDec, consigneDec);
}
else {
digitalWrite(enableDec, HIGH); //désactive moteur Dec si pas de consigne
noTone(stepDec);
consigneDec = 0; //pour affichage de données cohérentes
digitalWrite(stepDec, LOW);
}
// Serial.print(" Consigne Dec=");
// Serial.println(consigneDec);
//lecture du Joystick X => application sur AD
joystickX = analogRead(joystickXPin);
// Serial.print(" JoyX=");
// Serial.print(joystickX);
if (joystickX > 527) {
consigneAD = map(joystickX, 528, 1024, 100, 15000);
digitalWrite(dirAD, reverseADState);
digitalWrite(enableAD, LOW);
tone(stepAD, consigneAD);
TrackerHold = true;
} else if (joystickX < 497) {
consigneAD = map(joystickX, 496, 0, 100, 15000);
digitalWrite(dirAD, !reverseADState);
digitalWrite(enableAD, LOW);
tone(stepAD, consigneAD);
TrackerHold = true;
} else {
consigneAD = 0; //pour affichage de données cohérentes
noTone(stepAD);
if (TrackerState == true) {
digitalWrite(dirAD, HIGH);
digitalWrite(enableAD, LOW);
for ( ; horloge > StepTimeS * 1000 + StepTimeMS ; StepTimeNS += intervalle) {
digitalWrite(stepAD, HIGH);
delay(2);
digitalWrite(stepAD, LOW);
Serial.print(" StepTime=");
Serial.print(StepTimeS);
Serial.print(" ");
Serial.println(StepTimeMS);
if (StepTimeNS > 1000000000) {
StepTimeNS -= 1000000000;
StepTimeS++;
}
StepTimeMS = StepTimeNS / 1000000;
}
} else {
digitalWrite(stepAD, LOW);
digitalWrite(enableAD, HIGH); //désactive driver AD si pas de tracking
}
}
// Serial.print(" Consigne AD=");
// Serial.println(consigneAD);
}
// NOTE DE CALCUL
// jour sidéral= 86164,09s
// tour complet axe AD= 144 tour manivelle
//
// NEMA 17HM15 0904S= 400 step / tour
//
// moteur pignon 20 dents
// manivelle 48 dents
// full step 623.293479ms
// 1/2 step 311.646740ms
// 1/4 step 155.823370ms
// 1/8 step 77.911685ms
// 1/16 step 38.955842ms
//
// moteur pignon 20 dents
// manivelle 60 dents
// 1/16 step 31.164674ms