Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /*
- * ArdEQ MEDIUM TELESCOPE CONTROL
- * Stepper motor control by Timer interrupt
- * by Agócs László
- * 2018-07-29
- * __________________________________________________________________________
- * Ez a teszt a motorvezérlés ellenőrzésére szolgál az alapvető GOTO funkciók
- * nagy részének felhasználásával.
- *
- * SAJÁT PARANCSOK:
- *
- * IN : Mechanika inicializálása
- * S : START, csak óramű megy; Inicializálja a mechanikát
- * O : STOP, mindkét motor áll;
- * IRnnn : RA motor "/lépés beállítása
- * IDnnn : DE motor "/lépés beállítása
- * SRn : RATE beállítása: R0..9;
- * C : Koordináták kiírása soros monitorra;
- * LGn : Léptető motor pozíció lekérdezése (1=Ra,2=De)
- * L0n : Léptető motor pozíció nullázása
- * LFnnn,nnn : Lépj ennyi fokot RA,DE:
- * pl. LF-15.45,+56.33 Ra-ban K-i irányba 15.45 fokot, De-ben É-ra 56.33 fokot
- * EW : EEPROM-ba írás
- * EG : EEPROM olvasása
- * EL ? EEPROM listázása
- * ______________________________________________________________________________
- * Minden szög fokokban; Minden idő: órában; RTC időmérő UT-ben.
- * Az AccelStepper lépései jelzik a HA óraszöget. Induláskor ha meridiánból indulunk (default),
- * akkor a currentPosition-t 0-ra állítjuk. A DE prdig 90 fok, mert a távcső párhuzamos az RA tengellyel.
- * Az óraszög NY-ra pozitív, K-re negatív;
- * Ha szinkronizálunk, akkor kiszámítjuk a csillag óraszögét és átszámítjuk a meridiántól
- * való lépés számmá. Ugyan így járunk el parkolás utáni ébresztéskor.
- * Az aktuális RA,DE koordinátákat az LMST helyi csillagidőből és az óraszögből számítjuk:
- * RA = LMST - RA_SECSTEP*RAMot.currentPosition()/3600;
- * DE = DE_SECSTEP*DEMot.currentPosition()/3600;
- */
- #include <AccelStepper.h>
- #include <TimerOne.h>
- #include "DS3231.h"
- #include "EEPROM.h"
- boolean debug = false;
- // Válassz meghajtót: EASYDRIVER, CNC_V4
- #define CNC_V4 ;
- // PIN DEFINITIONS
- #if defined(CNC_V4)
- //Stepper 1
- #define RA_dirPin 2
- #define RA_stepPin 5
- #define RA_enablePin 8
- //Stepper 2
- #define DE_dirPin 3
- #define DE_stepPin 6
- #define DE_enablePin 8
- #define RTC_SDA 4
- #define RTC_SCL 5
- #endif
- /*
- #if defined(EASYDRIVER)
- //Stepper 1
- #define RA_dirPin 9
- #define RA_stepPin 10
- #define RA_enablePin 2
- //#define RA_MicroStep1Pin 3
- //#define RA_MicroStep2Pin 4
- //#define RA_MicroStep3Pin 3
- //Stepper 2
- #define DE_dirPin 11
- #define DE_stepPin 12
- #define DE_enablePin 13
- //#define DE_MicroStep1Pin 5
- //#define DE_MicroStep2Pin 6
- //#define DE_MicroStep3Pin 7
- // #define RTC_SDA A5
- // #define RTC_SCL A4
- #endif
- */
- // Define a stepper and the pins it will use
- AccelStepper RAMot(AccelStepper::DRIVER, RA_stepPin, RA_dirPin);
- AccelStepper DEMot(AccelStepper::DRIVER, DE_stepPin, DE_dirPin);
- // Init the DS3231 using the hardware interface
- DS3231 rtc(SDA, SCL);
- #define Rad 57.29577951
- // RATES : Ennyiszeres csillagsebesség : 0..9 értékekre
- double RATES[10] = { 0.5, 1.0, 2.0, 4.0, 8.0, 16.0, 32.0, 64.0, 128.0, 256.0 };
- // Távcső aktuális státusza: áll, óramű, pozícionál, kézi mozgatás, home, parkolt
- enum TStatus { none, tracking, moving, sleewing, guiding, parking, homed, parked };
- TStatus Status = tracking;
- enum TDirect { dNone, dN, dS, dE, dW }; // a kézi mozgatás iránya: É,D,K,Ny
- TDirect Direct;
- byte DirectByte = 0; // alsó 4 bit jelzi az irányokat: NSEW pl. 1001 = North és West
- // A követés sebessége
- enum TTrackingMode {tmSideral, tmLunar, tmSolar, tmKing};
- TTrackingMode TrackingMode = tmSideral;
- double TrackingMul[4] = { 1.0, 0.979, 1.0, 1.00246 }; // Sebesség szorzók (1=Sideral)
- // =========== VARIABLES ======================================
- const byte numChars = 40;
- char charBuffer[numChars]; // an array to store the received data
- boolean newData = false;
- double RA_SECSTEP = 24.80; // "/LÉPÉS (- előjel jelzi az ellentétes forgást a követéshez NY-i irányba)
- double DE_SECSTEP = 49.60; // "/LÉPÉS (- előjel jelzi az ellentétes forgást, hogy a De növekedjen)
- double RA_START = 6.5; // 6h30m start pozíció (óra)
- double DE_START = 8.5; // 8.5 fok
- double RA_POS = 30.0; // 30.0 fok = 2h0m aktuális pozíció (a lépésekből kalkulálva) (fok)
- double DE_POS = 90.0; // 45.5 fok
- double RA_TARGET = 120.0; // Ra cél : 8h0m
- double DE_TARGET = 22.0; // De cél : 22 fok
- int RA_MOVERATE = 8; // 16x-os csillag sebesség
- int DE_MOVERATE = 8; // 16x-os csillag sebesség
- int RA_SLEERATE = 8; // 256x-os csillag sebesség
- int DE_SLEERATE = 8; // 256x-os csillag sebesség
- double RA_BASESPEED = 15.04/RA_SECSTEP; // 1 sec alatt az égbolt 15"-et forsul -> 8.3... lépés/sec RA-ban a követéshez
- double DE_BASESPEED = 15.04/DE_SECSTEP; // -> 3.5... lépés/sec DE-ben, a RA-val azonos sebességhez
- double RA_DEFSPEED = RA_BASESPEED; // Mentjük az óramű sebességet
- double RA_SPEED; // RA aktuális sebessége lépés/sec
- double DE_SPEED; // DE aktuális sebessége lépés/sec
- double GUIDING_RATE = 1.5; // 1.5X-es csillagsebességű guiding
- double HOME_AZ = 0;
- double HOME_ALT = 0;
- long PARK_AZ = 0;
- long PARK_ALT = 0;
- boolean PARKED = false;
- Time START_TIME; // Induláskor megjegyezzük az időt
- Time CURRENT_TIME; // aktuális idő
- byte BOUDRATE = 6; // 9600 baud
- String FIRMWARE_NAME = "ArdEQ MEDIUM";
- byte FIRMWARE_VER = 1;
- String FIRMWARE_DATE = "05/20/18";
- String FIRMWARE_TIME = "12:00:00";
- byte TELESCOPE_TYPE = 1; // Euatorial mount
- double LON = 20.2919304371; // Your position to the Earth (West value - sign. My current position in the example, if you not have GPS receiver, Google Maps tell your cordinate's.)
- double LAT = 48.2167524154; // Geographic latitude
- int ZONE_OFFSET = 1; // UTC offset; UT = Zónaidő - ZONE_OFFSET;
- int SUMMER_TIME = 1; // Nyári időszámításnál -1 óra;
- byte DATAFORM = 0; // 0=fok; 1=radian
- double GMST; // Greenwitch Mean Sidereal Time (Greenwitch-i helyi csillagidő) [óra]
- double LMST; // Local Sidereal Time = Helyi csillagidő (óra)
- double LHA; // A távcső óraszöge (fok). A meridiántól NY-ra +, K-re -;
- String ch;
- String Command;
- String Parameter;
- long interval = 200; // 100 mikrosec = 0.0001 sec
- boolean highprecision=true; // high precision
- boolean trackEnable = true; // Óramű engedélyezése
- double cosLat = cos(LAT/Rad);
- double sinLat = sin(LAT/Rad);
- // Config : adatok az EEPROM-ba
- struct CONFIG {
- double longitude;
- double latitude;
- int utcOffset;
- double ra_secperstep;
- double de_secperstep;
- } config;
- #define EE_BOUDRATE 100 // byte : Set baud rate: 1=56.7K, 2=38.4K, 3=28.8K, 4=19.2K, 5=14.4K, 6=9600, 7=4800, 8=2400, 9=1200
- #define EE_DATAFORM 101 // byte : Adat formátum : 0=fok, 1=Radián
- #define EE_TELESCOPE_TYPE 102 // byte : Tipus : 0=Nem definiált, 1=Ekvatoriális, 2=Horizontális, 3=Villás
- #define EE_CLOCK_SPEED 103 // double : Óraműves követés sebessége
- #define EE_HOME_AZ 110 // double : Home pozíció AZIMUT
- #define EE_HOME_ALT 114 // double : Home pozíció ALTITUDE
- #define EE_PARK_AZ 120 // double : Home pozíció AZIMUT
- #define EE_PARK_ALT 124 // double : Home pozíció ALTITUDE
- #define EE_PARKED 128 // byte : Parkolás: 0=Nem, 1=Igen (Le volt parkolva Home pozícióba)
- #define EE_SLEEW_RATE 130 // byte : Sleewing rate
- boolean gRa = false;
- boolean gDe = false;
- // _____________________________________________________________________
- void setup()
- {
- Serial.begin(9600);
- rtc.begin();
- // Pin 13 has an LED : jelzi az óramű léptetéseket
- pinMode( 13, OUTPUT );
- // initEEPROMTable();
- initMount();
- }
- void loop() {
- // SERIAL INPUT
- if (readSerial()) {
- String remainString = "";
- for (int i=0; i<30; i++) {
- if (charBuffer[i]==0)
- { break; }
- else {
- remainString += String(charBuffer[i]);
- }
- }
- remainString.trim();
- boolean stringComplete = false;
- // This cycle is able to separate the sripped commands (LX200 style)
- // Eg.: #:GR01:12:23#:GD12:23:34#:GR01:12:23#:GD12:23:34#
- while (!stringComplete)
- {
- if (String(remainString[0]) == "#") { remainString = remainString.substring(1,100); }
- int n = remainString.indexOf("#");
- Command = remainString.substring(1,3);
- Parameter = remainString.substring(3,n);
- remainString = remainString.substring(n+1,100);
- remainString.trim();
- if (!doCommand(Command,Parameter) || (String(remainString[0]) != ":"))
- {
- stringComplete = true;
- }
- } // while
- }
- // Pozicionálás rutin
- if ((Status==moving) || (Status==parking)) {
- if (gRa) RAMot.runSpeedToPosition();
- else RAMot.runSpeed();
- if (gDe) DEMot.runSpeedToPosition();
- else DEMot.runSpeed();
- if (gRa && (RAMot.distanceToGo() == 0) )
- {
- RA_SPEED = RA_BASESPEED;
- RAMot.setSpeed(RA_SPEED);
- gRa = false;
- }
- if ( gDe && (DEMot.isRunning() == false) )
- {
- gDe = false;
- if (gRa==false) {
- if (Status==parking) {
- Status = parked;
- PARKED = true;
- byte p=1;
- EEPROM.put(EE_PARKED,p);
- trackEnable=false;
- }
- else {
- Status = tracking;
- RA_SPEED = RA_BASESPEED;
- RAMot.setSpeed(RA_SPEED);
- }
- }
- }
- }
- } // End Loop
- boolean readSerial() {
- static byte index;
- while (Serial.available() > 0) { // Does serial1 have characters available?
- char rc = Serial.read(); // Read a character
- if (rc == '\n') { // Is it newline?
- charBuffer[index] = 0; // Yes, so terminate char array with 0
- index = 0; // Reset array index
- newData = true;
- return true; // Return true (we have a full line)
- }
- else {
- charBuffer[index++] = rc; // Yes, so store it and increment index
- if (index > numChars) { // Have we filled the buffer?
- index--; // Yes, so decrement index
- }
- }
- }
- return false; // Return false (we don't have a full line)
- }
- // Alapról inditja a mechanikát
- // Ha volt parkolás, akkor onnan, ha nem akkor alapbeálltással indexektől
- // -----------------------------
- void initMount() {
- getEEPROMTable();
- START_TIME = rtc.getTime();
- LMST = calculateLST();
- RA_SPEED = RA_BASESPEED;
- RA_DEFSPEED = RA_SPEED;
- // Alappontól indul a mechanika
- if (!PARKED) {
- RA_POS = -90.0;
- RAMot.setCurrentPosition(RA_POS*3600/RA_SECSTEP);
- LHA = 0;
- DE_SPEED = 0;
- DE_POS = 90.0;
- DEMot.setCurrentPosition(DE_POS*3600/DE_SECSTEP);
- Status = tracking;
- trackEnable = true;
- }
- else { // Parkolásban van
- Status = parked;
- trackEnable = false;
- aliveFromPark();
- }
- RAMot.setMaxSpeed(1000.0);
- DEMot.setMaxSpeed(1000.0);
- RAMot.setSpeed(RA_SPEED); // Óramű sebesség
- DEMot.setSpeed(DE_SPEED);
- Timer1.initialize(interval); // set a timer of length 100 microseconds (or 0.0001 sec - or 10 KHz
- Timer1.attachInterrupt( timerIsr ); // attach the service routine here
- }
- /// -----------------------------------------------------------------
- /// ISR Timer Routine > MOTOROK HAJTÁSA 1/10 000 sec-onként meghívva
- /// -----------------------------------------------------------------
- void timerIsr()
- {
- switch (Status) {
- case none: break;
- case tracking: {
- if (trackEnable) RAMot.runSpeed();
- break;
- }
- case moving:
- {
- /*
- Timer1.stop();
- if (gRa) {
- RAMot.runToPosition();
- gRa = RAMot.isRunning();
- }
- else {
- RA_SPEED = RA_BASESPEED;
- RAMot.setSpeed(RA_SPEED);
- RAMot.runSpeed();
- }
- if (gDe) {
- DEMot.runToPosition();
- gDe = DEMot.isRunning();
- }
- else {
- DE_SPEED = 0;
- RAMot.setSpeed(DE_SPEED);
- DEMot.runSpeed();
- }
- if (!gRa && !gDe) Status=tracking;
- Timer1.resume();
- break;
- }
- */
- /*
- if ((gRa) && (!gDe)) {
- Timer1.stop();
- Status = tracking;
- Timer1.resume();
- }
- */
- /*
- if (Status==parking) {
- PARKED = true;
- byte p=1;
- EEPROM.put(EE_PARKED,p);
- trackEnable=false;
- Status = parked;
- Serial.println("PARKED");
- }
- else Status = tracking;
- }
- */
- /*
- if (gRa && (RAMot.distanceToGo() == 0) )
- {
- RA_SPEED = RA_BASESPEED;
- RAMot.setSpeed(RA_SPEED);
- gRa = false;
- }
- if ( gDe && (DEMot.isRunning() == false) )
- {
- gDe = false;
- if (gRa==false) {
- RA_SPEED = RA_BASESPEED;
- RAMot.setSpeed(RA_SPEED);
- Status = tracking;
- }
- }
- */
- break;
- }
- case sleewing:
- {
- RAMot.runSpeed();
- DEMot.runSpeed();
- break;
- }
- case guiding:
- {
- if (abs(RAMot.distanceToGo())>0)
- RAMot.run();
- break;
- }
- default:
- {
- }
- }
- }
- // ========= LX200 =================================================================================
- bool doCommand(String Comm, String Par)
- {
- #define label kiki;
- String replay;
- char fmt;
- char c;
- if (Comm[0]=='G')
- {
- if (Comm == "GC") {
- // Get Date
- replay = rtc.getDateStr(FORMAT_SHORT,FORMAT_MIDDLEENDIAN,'/');
- Serial.println(replay+"#");
- goto kiki;
- }
- if (Comm == "GL") {
- // Get Time
- Time t;
- t = rtc.getTime();
- print_SC_GC_TIME(t);
- goto kiki;
- }
- if (Comm == "GS") {
- // Get Sideral Time
- LMST = calculateLST();
- Serial.println(RaToStr(LMST*15)+"#");
- goto kiki;
- }
- if (Comm == "Gg") {
- // Get longitude
- Serial.println(DeToStr(LON)+"#");
- goto kiki;
- }
- if (Comm == "Gt") {
- // Get latitude
- Serial.println(DeToStr(LAT)+"#");
- goto kiki;
- }
- if (Comm == "Gr") {
- // Get target RA
- Serial.println(RaToStr(RA_TARGET)+"#");
- goto kiki;
- }
- if (Comm == "Gd") {
- // Get target De
- Serial.println(DeToStr(DE_TARGET)+"#");
- goto kiki;
- }
- if (Comm == "GR") {
- // Get telescope RA
- getRA();
- Serial.println(RaToStr(RA_POS)+"#");
- goto kiki;
- }
- if (Comm == "GD") {
- // Get telescope DE
- double de_ = getDE();
- Serial.println(DeToStr(de_)+"#");
- goto kiki;
- }
- if (Comm == "GT") {
- // Get sidereal rate RA
- goto kiki;
- }
- // *********** FIRMWARE ************
- if (Comm == "GV") {
- if (Par == "P"){
- // Get firmware name
- Serial.println(FIRMWARE_NAME+String("#")); }
- if (Par == "N") {
- // Get firmware ID
- Serial.println(String(FIRMWARE_VER)+String("#")); }
- if (Par == "D") {
- // Get firmware Date
- Serial.println(FIRMWARE_DATE+String("#")); }
- if (Par == "T") {
- // Get firmware Time
- Serial.println(String(FIRMWARE_TIME)+String("#")); }
- goto kiki;
- }
- } // if G
- if (Comm[0]=='S') {
- if (Comm == "SC") {
- // Set Date
- Time t;
- t = strToDate( Par );
- rtc.setDate( t.date, t.mon, t.year );
- command_ok(true);
- goto kiki;
- }
- if (Comm == "SL") {
- // Set Time
- Time t;
- t = strToTime( Par );
- rtc.setTime( t.hour, t.min, t.sec );
- command_ok(true);
- goto kiki;
- }
- if (Comm == "Sg") {
- // * Set longitude
- LON = StrToDe(Par);
- command_ok(true);
- // Par.toCharArray(rep,Par.length()+1);
- // command_ok( dmsToDouble(&LON,rep,true) );
- goto kiki;
- }
- if (Comm == "St") {
- // *Set latitude
- LAT = StrToDe(Par);
- command_ok(true);
- goto kiki;
- }
- // ********* Telescope control **********
- if (Comm == "Sr") {
- // Set target RA
- RA_TARGET = StrToRa(Par);
- command_ok( true );
- goto kiki;
- }
- if (Comm == "Sd") {
- // Set target De
- DE_TARGET = StrToDe(Par);
- command_ok( true );
- goto kiki;
- }
- } // If S
- if (Comm == "MS") {
- // Move telescope (to current Equ target)
- command_ok( gotoTarget() );
- goto kiki;
- }
- if (Comm == "Q") {
- // Stop telescope
- Status = none;
- goto kiki;
- }
- // ******** Slew commands *********
- if (Comm[0] == 'M')
- {
- c = Comm[1];
- if (c == 'n') Direct = dN;
- if (c == 's') Direct = dS;
- if (c == 'e') Direct = dE;
- if (c == 'w') Direct = dW;
- sleewControl( Direct, true );
- goto kiki;
- }
- if (Comm[0] == 'Q')
- {
- c = Comm[1];
- if (c == 'n') Direct = dN;
- if (c == 's') Direct = dS;
- if (c == 'e') Direct = dE;
- if (c == 'w') Direct = dW;
- if (c == 'o') Direct = dNone;
- sleewControl( Direct, false );
- goto kiki;
- }
- // ******** TRACKING **********
- if (Comm == "ST") {
- // Set sidereal rate RA
- RA_BASESPEED = Par.toFloat();
- goto kiki;
- }
- if (Comm == "TR") {
- // Track sidereal rate RA (default)
- RA_BASESPEED = TrackingMul[0]*RA_DEFSPEED;
- goto kiki;
- }
- if (Comm == "TQ") {
- // Track sidereal rate reset
- RA_BASESPEED = RA_DEFSPEED;
- goto kiki;
- }
- if (Comm == "TL") {
- // Track LUNAR rate RA
- RA_BASESPEED = TrackingMul[1]*RA_DEFSPEED;
- goto kiki;
- }
- if (Comm == "TS") {
- // Track SOLAR rate RA
- RA_BASESPEED = TrackingMul[2]*RA_DEFSPEED;
- goto kiki;
- }
- if (Comm == "TK") {
- // Track KING rate RA
- RA_BASESPEED = TrackingMul[3]*RA_DEFSPEED;
- goto kiki;
- }
- if (Comm == "T+") {
- // Track rate increase 0.02Hz
- if (RA_BASESPEED>0)
- RA_BASESPEED += 0.01;
- else
- RA_BASESPEED -= 0.01;
- RA_SECSTEP = 15.04 / RA_BASESPEED;
- Serial.println(RA_BASESPEED,4);
- goto kiki;
- }
- if (Comm == "T-") {
- // Track rate decrease 0.02Hz
- if (RA_BASESPEED>0)
- RA_BASESPEED -= 0.01;
- else
- RA_BASESPEED += 0.01;
- RA_SECSTEP = 15.04 / RA_BASESPEED;
- Serial.println(RA_BASESPEED,4);
- goto kiki;
- }
- if (Comm == "Te") {
- // Tracking enable
- trackEnable = true;
- goto kiki;
- }
- if (Comm == "Td") {
- // Tracking disable
- trackEnable = false;
- goto kiki;
- }
- // ******** Sync. command **********
- if (Comm == "CS") {
- // Sync. with current target RA/Dec
- synctoTarget();
- goto kiki;
- }
- if (Comm == "CM") {
- // Sync. with current target RA/Dec
- synctoTarget();
- Serial.println("N/A");
- goto kiki;
- }
- // Park Commands ----------------------------------------------
- if (Comm == "hQ") {
- // Set park position
- // A motor poziciókat mentjük
- PARK_AZ = RAMot.currentPosition();
- PARK_ALT = DEMot.currentPosition();
- EEPROM.put(EE_PARK_AZ,(long)PARK_AZ);
- EEPROM.put(EE_PARK_ALT,(long)PARK_ALT);
- command_ok(true);
- goto kiki;
- }
- if (Comm == "hP") {
- // Move to park position
- EEPROM.get(EE_PARK_AZ,PARK_AZ);
- EEPROM.get(EE_PARK_ALT,PARK_ALT);
- long d1 = RAMot.currentPosition() - PARK_AZ;
- long d2 = DEMot.currentPosition() - PARK_ALT;
- stepTo(d1,d2,parking);
- Status = parking;
- trackEnable = false;
- command_ok(true);
- goto kiki;
- }
- if (Comm == "hR") {
- // Restore parked telescope to operation
- aliveFromPark();
- }
- // * SAJÁT PARANCSOK ( * karakterrel kezdődnek pl. *SR8 ) ***************************************
- if ((Comm == "S") || (Comm == "s"))
- { // távcső indítás
- trackEnable = true;
- Status = tracking;
- Timer1.resume();
- digitalWrite( 13, HIGH );
- goto kiki;
- }
- if ((Comm == "O") || (Comm == "o"))
- { // Távcső stop
- Status = none;
- trackEnable = false;
- digitalWrite( 13, LOW );
- goto kiki;
- }
- if ((Comm == "IN") || (Comm == "in")) {
- // Távcső inicializálás alaphelyzetből
- initMount();
- goto kiki;
- }
- if ((Comm == "IR") || (Comm == "ir")) {
- // RA "/lépés megadása
- if (Par != "")
- RA_SECSTEP = Par.toFloat();
- RA_BASESPEED = 15.04/RA_SECSTEP;
- goto kiki;
- }
- if ((Comm == "ID") || (Comm == "id")) {
- // DE "/lépés megadása
- if (Par != "")
- DE_SECSTEP = Par.toFloat();
- goto kiki;
- }
- if ((Comm == "SR") || (Comm == "sr")) {
- // Sleew rate beállítás
- if (Par != "") {
- int rate = Par.toInt();
- if (rate>9) rate=9;
- RA_SLEERATE = rate;
- DE_SLEERATE = rate;
- }
- goto kiki;
- }
- if ((Comm == "LG") || (Comm == "lg")) {
- // Léptető motor pozíció lekérdezése (:LG1#)
- if (Par=="1") Serial.println(RAMot.currentPosition());
- if (Par=="2") Serial.println(DEMot.currentPosition());
- goto kiki;
- }
- if ((Comm == "L0") || (Comm == "l0")) {
- // Léptető motor pozíció nullázáds
- if (Par=="1") RAMot.setCurrentPosition(0);
- if (Par=="2") DEMot.setCurrentPosition(0);
- goto kiki;
- }
- if ((Comm == "LF") || (Comm == "lf")) {
- // Lépj ennyi fokot RA,DE irányokba (:LF12.3,-4.5#)
- double dRa_ = 0;
- double dDe_ = 0;
- String ct;
- int n = Par.indexOf(",");
- if (n>-1) {
- ct = Par.substring(0,n);
- dRa_ = ct.toFloat();
- }
- if (n>-1) {
- ct = Par.substring(n+1);
- dDe_ = ct.toFloat();
- }
- moveDeg(dRa_,dDe_);
- goto kiki;
- }
- if ((Comm == "EW") || (Comm == "ew")) {
- initEEPROMTable();
- }
- if ((Comm == "EG") || (Comm == "eg")) {
- getEEPROMTable();
- }
- if ((Comm == "EL") || (Comm == "el")) {
- listEEPROMTable();
- }
- if (Comm == "C") {
- // Koordináták lekérdezése
- getCoords();
- Serial.print( "RA: " );
- Serial.print( RA_POS );
- Serial.print( " DE: " );
- Serial.println( DE_POS );
- goto kiki;
- }
- if (Comm == "PS") {
- // Státusz kiírás
- printStatus;
- goto kiki;
- }
- kiki:
- statusControl();
- return true;
- }
- // ************************************************************************
- //printf emulator
- void prf(char *fmt, ... ){
- char tmp[128]; // resulting string limited to 128 chars
- va_list args;
- va_start (args, fmt );
- vsnprintf(tmp, 128, fmt, args);
- va_end (args);
- Serial.print(tmp);
- }
- void command_ok(boolean oke){
- if (oke)
- Serial.print("1");
- else
- Serial.print("0");
- }
- void print_SC_GC_DATE(Time t) {
- prf("%02d/%02d/%02d#",t.date, t.mon, t.year);
- }
- void print_SC_GC_TIME(Time t) {
- prf("%02d:%02d:%02d#",t.hour, t.min, t.sec);
- }
- // --------------------------------------------------------------------------------
- // HELYI CSILLAGIDŐ KISZÁMÍTÁSA
- // RTC idő alapján
- // return LST [órában], 15-tel szorozni, ha fokokban akarjuk!
- // --------------------------------------------------------------------------------
- double calculateLST() // Calculate Local Sidereal Time
- {
- Time now = rtc.getTime();
- double LST = getLST(now);
- return LST; // Órában megadva
- }
- // HELYI CSILLAGIDŐ KISZÁMÍTÁSA
- // t idő alapján
- // return LST [órában], 15-tel szorozni, ha fokokban akarjuk!
- // --------------------------------------------------------------------------------
- double getLST( Time t ) {
- double M, Y, D, MN, H, S;
- double A, B, C, E, F;
- M = (int)t.mon;
- Y = (int)t.year;
- D = (int)t.date;
- MN = (int)t.min;
- H = (int)t.hour; //- (TIMEZONE + DST); // Hours must be GMT/UT. The RTC is UT!
- S = (int)t.sec;
- if (M < 3) {
- M += 12;
- Y -= 1;
- }
- A = (long)Y / 100;
- B = (long)A / 4;
- C = (long)2 - A + B;
- E = (long)(365.25 * (Y + 4716));
- F = (long)(30.6001 * (M + 1));
- double LastJDN = C + D + E + F - 1524.5; // Julian day last midnight UT
- double Current_d = LastJDN - 2451545.0; //Days since Year 2000
- long Current_T = Current_d / 36525; // Julian centuries since Year 2000
- long NewJDN = LastJDN + H / 24; // Julian day today
- double Term1 = 6.697374558; // this line must be a double!
- double Term2 = 0.06570982441908 * Current_d;
- H = H + ((double)MN / 60) + ((double)S / 3600);
- // float GMST;
- float Term3;
- Term3 = 0.00273790935 * H;
- Term3 += H;
- GMST = Term1 + Term2 + Term3; // Terms are found at http://aa.usno.navy.mil/faq/docs/GAST.php
- //add on longitude divided by 15 to get LST
- double LST = GMST + (LON / 15); // longitude as hour angle.
- //reduce it to 24 format
- int LSTint;
- LSTint = (int)LST;
- LSTint /= 24;
- LST = LST - (double)LSTint * 24;
- return LST; // Órában megadva
- }
- /*
- // Coordinate conversion
- // --------------------------------------------------------------------------------
- // convert equatorial coordinates to horizon
- // this takes approx. 1.4mS on a 16MHz Mega2560
- // (minden fokokban)
- void EquToHor(double HA, double Dec, double *Alt, double *Azm) {
- while (HA<0.0) HA=HA+360.0;
- while (HA>=360.0) HA=HA-360.0;
- HA =HA/Rad;
- Dec=Dec/Rad;
- double SinAlt = (sin(Dec) * sinLat) + (cos(Dec) * cosLat * cos(HA));
- *Alt = asin(SinAlt);
- double t1=sin(HA);
- double t2=cos(HA)*sinLat-tan(Dec)*cosLat;
- *Azm=atan2(t1,t2)*Rad;
- *Azm=*Azm+180.0;
- *Alt=*Alt*Rad;
- }
- // --------------------------------------------------------------------------------
- // convert horizon coordinates to equatorial
- // this takes approx. 1.4mS
- // (minden fokokban)
- void HorToEqu(double Alt, double Azm, double *HA, double *Dec) {
- while (Azm<0) Azm=Azm+360.0;
- while (Azm>=360.0) Azm=Azm-360.0;
- Alt = Alt/Rad;
- Azm = Azm/Rad;
- double SinDec = (sin(Alt) * sinLat) + (cos(Alt) * cosLat * cos(Azm));
- *Dec = asin(SinDec);
- double t1=sin(Azm);
- double t2=cos(Azm)*sinLat-tan(Alt)*cosLat;
- *HA=atan2(t1,t2)*Rad;
- *HA=*HA+180.0;
- *Dec=*Dec*Rad;
- }
- */
- // String and Conversion routines
- // A MM/DD/YY formátumú dátumot szétszedi numerikus értékekre
- Time strToDate( String dString ) {
- Time t;
- String s;
- s = dString.substring(0,2);
- t.mon = s.toInt();
- s = dString.substring(3,5);
- t.date = s.toInt();
- s = dString.substring(6,8);
- t.year = s.toInt();
- if (t.year < 2000) t.year += 2000;
- return t;
- }
- // strToTime ( Time )
- // A MM/DD/YY formátumú dátumot ad vissza
- String dateToStr( Time t) {
- String s,ds;
- s = String(t.year);
- ds = String(t.mon)+"/"+String(t.date)+"/"+s.substring(2,4);
- return ds;
- }
- Time strToTime(String dString ) {
- Time t;
- String s;
- s = dString.substring(0,2);
- t.hour = s.toInt();
- s = dString.substring(3,5);
- t.min = s.toInt();
- s = dString.substring(6,8);
- t.sec = s.toInt();
- return t;
- }
- // Adatok formattálása : fmtStr("%03d:%02d:%02d",h,abs(m),abs(s));
- // --------------------------------------------------------------------------------
- String fmtStr(char *fmt, ... ) {
- char tmp[128]; // resulting string limited to 128 chars
- String s="";
- va_list args;
- va_start (args, fmt );
- vsnprintf(tmp, 128, fmt, args);
- va_end (args);
- for (int i=0; i<30; i++) {
- if (tmp[i]==0) break;
- else s += String(tmp[i]);
- }
- return s;
- }
- // Fokokban adott Ra-ból HH:MM:SS stringet képez
- // --------------------------------------------------------------------------------
- String RaToStr(float Ra)
- {
- double Ra_ = timeRange(Ra/15);
- int h = (int)Ra_;
- int m = ((Ra_ - h) * 60);
- int s = (((Ra_ - h) * 60) - m) * 60;
- return fmtStr("%02d:%02d:%02d",h,m,abs(s));
- }
- // Fokokban adott De-ból HH:MM:SS stringet képez
- // --------------------------------------------------------------------------------
- String DeToStr(float De)
- {
- String sign="+";
- if (De<0) sign="-";
- int angle = (int)De;
- int h = (int)De;
- int m = ((De - h) * 60);
- int s = (((De - h) * 60) - m) * 60;
- return sign+fmtStr("%02d*%02d:%02d",h,abs(m),abs(s));
- }
- // hh:mm:ss formájú RA-ból fok
- // --------------------------------------------------------------------------------
- double StrToRa(String sRa)
- {
- String c;
- c = sRa.substring(0,2);
- int h = c.toInt();
- c = sRa.substring(3,5);
- double m = c.toFloat();
- c = sRa.substring(6);
- c.trim();
- double s = c.toFloat();
- double d = double(h + (m/60) + (s/3600))*15.0;
- return d;
- }
- // -ff:mm:ss formájú DE-ből fok
- // --------------------------------------------------------------------------------
- double StrToDe(String sDe)
- {
- String c;
- int sign=0;
- c = sDe.charAt(0);
- if ((c=="+") || (c=="-")) sign = 1;
- c = sDe.substring(sign+0,sign+2);
- int h = c.toInt();
- c = sDe.substring(sign+3,sign+5);
- double m = c.toFloat();
- c = sDe.substring(sign+6,sign+8);
- double s = c.toFloat();
- double d = (h + abs(m/60) + abs(s/3600));
- c = sDe.charAt(0);
- if (c=="-") d = -d;
- Serial.println(d);
- return d;
- }
- // Date/Time routines
- // ==============================================================================
- void setRTCDate(String dString)
- {
- Time t;
- t = strToDate( dString );
- rtc.setDate( t.date, t.mon, t.year);
- }
- void setRTCTime(String dString)
- {
- Time t;
- t = strToTime( dString );
- rtc.setTime( t.hour, t.min, t.sec );
- }
- // -----------------------------------------------------------------------------------------------------------------------------
- // Misc. numeric conversion
- double timeRange(double t) {
- while (t>=24.0) t-=24.0;
- while (t< 0.0) t+=24.0;
- return t;
- }
- double haRange(double d) {
- while (d>=180.0) d-=360.0;
- while (d<-180.0) d+=360.0;
- return d;
- }
- double degRange(double d) {
- while (d>=360.0) d-=360.0;
- while (d< 0.0) d+=360.0;
- return d;
- }
- double dist(double a, double b) {
- if (a>b) return a-b; else return b-a;
- }
- double angDist(double h, double d, double h1, double d1) {
- return acos(sin(d/Rad)*sin(d1/Rad)+cos(d/Rad)*cos(d1/Rad)*cos((h1-h)/Rad))*Rad;
- }
- // integer numeric conversion with error checking
- boolean atoi2(char *a, int *i) {
- char *conv_end;
- long l=strtol(a,&conv_end,10);
- if ((l<-32767) || (l>32768) || (&a[0]==conv_end)) return false;
- *i=l;
- return true;
- }
- double frac(double v) {
- return v - ((long)v);
- }
- double cot(double n) {
- return 1.0/tan(n);
- }
- // ============ EEPROM routins ==================================================================
- void EEPROM_WriteString(int address, String st)
- {
- int n = st.length();
- for (int i=1; i<=n; i++)
- {
- EEPROM.put(address++,(char)st[i-1]); // To store data
- }
- EEPROM.put(address++, (byte)0); // To store data
- }
- String EEPROM_ReadString(int address)
- {
- String st = "";
- char ch;
- int i=0;
- do
- {
- EEPROM.get(address++, ch); // To store data
- if (ch != 0) {
- st += ch;
- }
- } while (ch != 0);
- return st;
- }
- // Inicializálja az EEPROM adatait
- void initEEPROMTable()
- {
- config.longitude = LON;
- config.latitude = LAT;
- config.utcOffset = ZONE_OFFSET;
- config.ra_secperstep = RA_SECSTEP;
- config.de_secperstep = DE_SECSTEP;
- EEPROM.put(0,config);
- EEPROM.put(EE_BOUDRATE,(byte)BOUDRATE);
- EEPROM.put(EE_DATAFORM,(byte)0);
- EEPROM.put(EE_TELESCOPE_TYPE,(byte)0);
- EEPROM.put(EE_CLOCK_SPEED,(double)RA_BASESPEED);
- EEPROM.put(EE_HOME_AZ,(double)HOME_AZ);
- EEPROM.put(EE_HOME_ALT,(double)HOME_ALT);
- EEPROM.put(EE_PARK_AZ,(long)PARK_AZ);
- EEPROM.put(EE_PARK_ALT,(long)PARK_ALT);
- if (PARKED)
- EEPROM.put(EE_PARKED,(byte)1);
- else
- EEPROM.put(EE_PARKED,(byte)0);
- }
- // Kiolvassa az EEPROM adatait
- void getEEPROMTable()
- {
- Timer1.stop();
- EEPROM.get(0,config);
- LON = config.longitude;
- LAT = config.latitude;
- ZONE_OFFSET = config.utcOffset;
- RA_SECSTEP = config.ra_secperstep;
- DE_SECSTEP = config.de_secperstep;
- RA_BASESPEED = 15.04 / RA_SECSTEP;
- DE_BASESPEED = 15.04 / DE_SECSTEP;
- EEPROM.get(EE_BOUDRATE, BOUDRATE);
- EEPROM.get(EE_DATAFORM, DATAFORM);
- EEPROM.get(EE_TELESCOPE_TYPE, TELESCOPE_TYPE);
- EEPROM.get(EE_CLOCK_SPEED, RA_BASESPEED);
- EEPROM.get(EE_HOME_AZ, HOME_AZ);
- EEPROM.get(EE_HOME_ALT, HOME_ALT);
- EEPROM.get(EE_PARK_AZ, PARK_AZ);
- EEPROM.get(EE_PARK_ALT, PARK_ALT);
- byte p=0;
- EEPROM.get(EE_PARKED,p);
- if (p==1) PARKED=true; else PARKED=false;
- Status = tracking;
- Timer1.resume();
- }
- void listEEPROMTable()
- {
- getEEPROMTable();
- Serial.println("Product Name :"+FIRMWARE_NAME);
- Serial.println("Ver.: "+FIRMWARE_VER);
- Serial.println("Date: "+FIRMWARE_DATE);
- Serial.println("Time: "+FIRMWARE_TIME);
- Serial.print("Lon: "); Serial.println(LON);
- Serial.print("Lat: "); Serial.println(LAT);
- Serial.print("Zone: "); Serial.println(ZONE_OFFSET);
- Serial.print("Bous: "); Serial.println(BOUDRATE);
- Serial.print("Data: "); Serial.println(DATAFORM);
- Serial.print("STEP_RA :"); Serial.println(RA_SECSTEP);
- Serial.print("STEP_DE :"); Serial.println(DE_SECSTEP);
- Serial.print("CLOCK_SPEED:"); Serial.println(RA_BASESPEED);
- Serial.print("HOME_AZ :"); Serial.println(HOME_AZ);
- Serial.print("HOME_ALT :"); Serial.println(HOME_ALT);
- Serial.print("PARK_AZ :"); Serial.println(PARK_AZ);
- Serial.print("PARK_ALT :"); Serial.println(PARK_ALT);
- Serial.print("Parked :");
- if (PARKED) Serial.println("YES");
- else Serial.println("NO");
- }
- // ------------ UTASÍTÁSOK ---------------------------------------------------------------
- // Kézi mozgatás előkészítése, kontrolja
- void sleewControl(TDirect dir, boolean Enable)
- {
- if (Enable) {
- switch (dir) {
- case dN:
- {
- DirectByte |= 8;
- if ((DirectByte & 4)>0) DirectByte ^= 4;
- break;
- }
- case dS:
- {
- DirectByte |= 4;
- if ((DirectByte & 8)>0) DirectByte ^= 8;
- break;
- }
- case dE:
- {
- DirectByte |= 2;
- if ((DirectByte & 1)>0) DirectByte ^= 1;
- break;
- }
- case dW:
- {
- DirectByte |= 1;
- if ((DirectByte & 2)>0) DirectByte ^= 2;
- break;
- }
- }
- }
- else {
- switch (dir) {
- case dNone:
- {
- DirectByte = 0;
- break;
- }
- case dN:
- {
- if ((DirectByte & 8)>0) DirectByte ^= 8;
- break;
- }
- case dS:
- {
- if ((DirectByte & 4)>0) DirectByte ^= 4;
- break;
- }
- case dE:
- {
- if ((DirectByte & 2)>0) DirectByte ^= 2;
- break;
- }
- case dW:
- {
- if ((DirectByte & 1)>0) DirectByte ^= 1;
- break;
- }
- }
- }
- if (DirectByte>0) Status = sleewing;
- else Status = tracking;
- }
- void statusControl() {
- switch (Status) {
- case none:
- {
- DirectByte = 0;
- RA_SPEED = 0;
- DE_SPEED = 0;
- break;
- }
- case tracking:
- {
- DirectByte = 0;
- RA_SPEED = RA_BASESPEED;
- DE_SPEED = 0;
- break;
- }
- case moving:
- {
- // RA_SPEED = 0; // RATES[RA_MOVERATE] * RA_BASESPEED ;
- // DE_SPEED = 0; // RATES[DE_MOVERATE] * DE_BASESPEED ;
- break;
- }
- case sleewing:
- {
- // Kézi NY-ra
- if ((DirectByte & 1)==1) {
- RA_SPEED = RATES[RA_SLEERATE] * RA_BASESPEED;
- }
- // Kézi K-ra
- if ((DirectByte & 2)==2) {
- RA_SPEED = -RATES[RA_SLEERATE] * RA_BASESPEED;
- }
- // Kézi D-re
- if ((DirectByte & 4)==4) {
- DE_SPEED = -RATES[DE_SLEERATE] * DE_BASESPEED;
- }
- // Kézi É-ra
- if ((DirectByte & 8)==8) {
- DE_SPEED = RATES[DE_SLEERATE] * DE_BASESPEED;
- }
- // Ha nincs K-NY-i mozg+ás, akkor vissza óramű sebességre
- if ( (DirectByte & 3) == 0 ) RA_SPEED = RA_BASESPEED;
- else RA_SPEED = 10*RA_SPEED;
- // Ha nincs É-D-i mozgás, akkor a DE sebesség 0
- if ( (DirectByte & 12) == 0) DE_SPEED = 0;
- else DE_SPEED = 10*DE_SPEED*RA_SECSTEP/DE_SECSTEP;
- }
- } // End switch
- RAMot.setSpeed( RA_SPEED );
- DEMot.setSpeed( DE_SPEED );
- }
- double getRA()
- {
- double fok;
- LMST = calculateLST();
- getDE();
- if (DE_POS > 90.0)
- fok = 15*LMST + RA_SECSTEP*RAMot.currentPosition()/3600;
- else
- fok = 15*LMST - RA_SECSTEP*RAMot.currentPosition()/3600;
- // if (DE_POS > 90.0) fok = fok + 180;
- if (fok>180) fok = fok-360;
- if (fok<-180) fok = fok+360;
- RA_POS = fok;
- return RA_POS;
- }
- double getDE()
- {
- DE_POS = DE_SECSTEP*DEMot.currentPosition()/3600;
- double de_ = DE_POS;
- if (DE_POS > 90.0) de_ = 90.0 - (DE_POS - 90.0);
- return de_;
- }
- void getCoords()
- {
- CURRENT_TIME = rtc.getTime();
- RA_POS = getRA();
- DE_POS = getDE();
- }
- // MoveDeg: RA és DE irányokban lép ennyi fokot
- void moveDeg(double dRa, double dDe)
- {
- // Abszolut lépésekbe átszámtás
- Status = tracking;
- long d1 = dRa * 3600 / RA_SECSTEP;
- long d2 = dDe * 3600 / DE_SECSTEP;
- stepTo(d1,d2,moving);
- }
- // A Ra és De motorok ennyit lépjenek
- void stepTo(long d1, long d2, TStatus sta) {
- Status = none;
- RA_SPEED = RA_BASESPEED;
- if (d1==0) gRa=false;
- else {
- gRa=true;
- RAMot.move(d1);
- RA_SPEED = 6*RATES[RA_MOVERATE] * RA_BASESPEED ;
- }
- if (d2==0) gDe=false;
- else {
- gDe=true;
- DEMot.move(d2);
- DE_SPEED = 6*RATES[DE_MOVERATE] * DE_BASESPEED ;
- }
- RAMot.setSpeed(RA_SPEED);
- DEMot.setSpeed(DE_SPEED);
- Status = sta;
- }
- // --------------------------------------------------------------------------------
- // ÓRASZÖG KISZÁMÍTÁSA:
- // --------------------------------------------------------------------------------
- // lst: csillagidő fokokban; RA: csillag RA-ja fokokban
- // Ha lst az 1. csillag, RA pedig a 2. csillag ra-ja fokokban, akkor a két csillag
- // ra külömbségét kapjuk NY-ra +, K-re - értékkel;
- // lha: óraszög (fok). Ny-i irány pozítív.
- // --------------------------------------------------------------------------------
- double getLHA(double lst, double RA)
- {
- double lha = lst - RA;
- double diff = lha;
- if (abs(diff)>180)
- if (diff<-180) lha = 360 + diff;
- else lha = 360 - diff;
- return lha;
- }
- /*
- boolean aboveHorizon(double ra_, double de_) {
- double AZ;
- double ALT;
- EquToHor( getLHA(LMST,ra_), de_, &AZ, &ALT );
- if (ALT>0) return true;
- return false;
- }
- */
- // A cél koordinátákkal meghatározott pozícióba mozgás
- boolean gotoTarget() {
- // if (aboveHorizon(RA_TARGET,DE_TARGET))
- // {
- getCoords();
- double L = getLHA(RA_POS,RA_TARGET); // Óraszög eltérés
- double D = DE_TARGET - DE_POS;
- moveDeg(L,D);
- return true;
- // }
- // else
- // return false;
- }
- void synctoTarget() {
- getRA();
- double dRA = 3600 * (RA_POS - RA_TARGET) / RA_SECSTEP; // lépés számmá alakítás
- double dDE = 3600 * (DE_TARGET) / DE_SECSTEP;
- RAMot.setCurrentPosition( long(RAMot.currentPosition() + dRA) );
- DEMot.setCurrentPosition( long( dDE) );
- RA_POS = RA_TARGET;
- DE_POS = DE_TARGET;
- }
- // Ébresztés parkolásból
- void aliveFromPark() {
- getEEPROMTable();
- if (PARKED) {
- RAMot.setCurrentPosition( PARK_AZ );
- DEMot.setCurrentPosition( PARK_ALT );
- getCoords();
- PARKED = false;
- byte p=0;
- EEPROM.put(EE_PARKED,p);
- RAMot.setSpeed(RA_BASESPEED);
- DEMot.setSpeed(0);
- Status = tracking;
- }
- }
- void printStatus() {
- Serial.print("Status: ");
- switch (Status) {
- case none: { Serial.println("None"); break;}
- case tracking: { Serial.println("Tracking"); break;}
- case moving: { Serial.println("Moving"); break;}
- case sleewing: { Serial.println("Sleewing"); break;}
- case guiding: { Serial.println("Guiding"); break;}
- default: { Serial.println("Default"); break;}
- }
- }
- /*
- *
- *
- */
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement