Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /*
- * Stepper motor control by Timer interrupt
- * by Agócs László
- * __________________________________________________________________________
- * 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.
- * S : START, csak óramű megy;
- * O : STOP, mindkét motor áll;
- * + és -: Növeli/csökkenti az óramű sebességét 0.02 Hz-el;
- * Rn : RATE beállítása: R0..9;
- * RAnnn : RA cél megadása
- * DEnnn : DE cél megadása
- * C : Koordináták kiírása soros monitorra;
- * G : Goto cél;
- * MN : Mozgatás É;
- * MS : Mozgatás D;
- * ME : Mozgatás K;
- * MW : Mozgatás NY;
- * NN : Mozgatás stop É;
- * NS : Mozgatás stop D;
- * NE : Mozgatás stop K;
- * NW : Mozgatás stop NY;
- */
- #include <AccelStepper.h>
- #include <TimerOne.h>
- #include "DS3231.h"
- AccelStepper RAMot(AccelStepper::DRIVER, 10, 9);
- AccelStepper DEMot(AccelStepper::DRIVER, 12, 11);
- // Init the DS3231 using the hardware interface
- DS3231 rtc(7, 8);
- // Távcső aktuális státusza: áll, óramű, pozícionál, kézi mozgatás, home, parkolt
- enum TStatus { none, tracking, moving, sleewing, homed, parked };
- TStatus Status;
- 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
- double RA_SECSTEP = 1.8; // 1.8"/LÉPÉS
- double DE_SECSTEP = 4.3; // 4.3"/LÉPÉS
- double RA_START = 6.5; // 6h30m start pozíció
- double DE_START = 8.5; // 8.5 fok
- double RA_POS = 6.5; // 6h30m aktuális pozíció (a lépésekből kalkulálva)
- double DE_POS = 8.5; // 8.5 fok
- double RA_TARGET = 8.0; // Ra cél : 8h0m
- double DE_TARGET = 22.0; // De cél : 22 fok
- // 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, 128.0, 512.0, 2048.0 };
- int RA_MOVERATE = 5; // 16x-os csillag sebesség
- int DE_MOVERATE = 5; // 16x-os csillag sebesség
- int RA_SLEERATE = 5; // 256x-os csillag sebesség
- int DE_SLEERATE = 8; // 256x-os csillag sebesség
- double RA_BASESPEED = 5/RA_SECSTEP; // 1 sec alatt az égbolt 5"-et forsul -> 2.777... lépés/sec RA-ban a követéshez
- double DE_BASESPEED = 5/DE_SECSTEP; // -> 1.162... lépés/sec DE-ben, a RA-val azonos sebességhez
- double RA_SPEED; // RA aktuális sebessége lépés/sec
- double DE_SPEED; // DE aktuális sebessége lépés/sec
- Time START_TIME; // Induláskor megjegyezzük az időt
- Time CURRENT_TIME; // aktuális idő
- String myString;
- String ch;
- long interval = 100; // 100 mikrosec = 0.0001 sec
- boolean debug = true;
- // _____________________________________________________________________
- void setup()
- {
- Serial.begin(9600);
- // Pin 13 has an LED : jelzi az óramű léptetéseket
- pinMode( 13, OUTPUT );
- RA_SPEED = RA_BASESPEED;
- DE_SPEED = 0;
- RAMot.setMaxSpeed(10000.0);
- RAMot.setSpeed(RA_BASESPEED); // Óramű sebesség
- RAMot.setCurrentPosition(0);
- DEMot.setMaxSpeed(10000.0);
- DEMot.setSpeed(DE_BASESPEED);
- DEMot.setCurrentPosition(0);
- rtc.begin();
- START_TIME = rtc.getTime();
- 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
- if (debug) Serial.println("S = Start");
- }
- void loop()
- {
- String c;
- if (Serial.available() > 0)
- {
- myString = "";
- // Soros porti karakteres parancs neolvasása és értelmazése
- myString = Serial.readString();
- ch = myString.charAt(0);
- if ((ch == "S") || (ch == "s"))
- {
- Status = tracking;
- Timer1.resume();
- digitalWrite( 13, HIGH );
- if (debug) Serial.println("* Start");
- }
- if ((ch == "O") || (ch == "o"))
- {
- Status = none;
- Timer1.stop();
- digitalWrite( 13, LOW );
- Serial.println("* Stop");
- }
- if (ch == "+")
- {
- interval -= 10000;
- RA_BASESPEED -= 0.02;
- }
- if (ch == "-")
- {
- interval += 10000;
- RA_BASESPEED += 0.02;
- }
- if ((ch == "R") || (ch == "r"))
- {
- myString = myString.substring(1);
- int rate = myString.toInt();
- RA_SLEERATE = rate;
- DE_SLEERATE = rate;
- Serial.print("* RATE = "); Serial.println(rate,DEC);
- }
- // Innn : sebesség állítás usec
- if ((myString[0] == 73) || (myString[0] == 105))
- {
- myString = myString.substring(1);
- interval = myString.toInt();
- }
- if (ch == "C")
- {
- RA_POS += 15*RA_SECSTEP/3600;
- DE_POS += DE_SECSTEP/3600;
- }
- if (ch == "M")
- {
- c = myString.charAt(1);
- if (c == "N") {
- Direct = dN;
- DirectByte |= 8;
- if ((DirectByte & 4)>0) DirectByte ^= 4;
- Serial.println("North");
- }
- if (c == "S") {
- Direct = dS;
- DirectByte |= 4;
- if ((DirectByte & 8)>0) DirectByte ^= 8;
- Serial.println("South");
- }
- if (c == "E") {
- Direct = dE;
- DirectByte |= 2;
- if ((DirectByte & 1)>0) DirectByte ^= 1;
- Serial.println("East");
- }
- if (c == "W") {
- Direct = dW;
- DirectByte |= 1;
- if ((DirectByte & 2)>0) DirectByte ^= 2;
- Serial.println("West");
- }
- if (DirectByte>0) Status = sleewing;
- else Status = tracking;
- }
- if (ch == "N")
- {
- c = myString.charAt(1);
- if (c == "N") {
- Direct = dN;
- if ((DirectByte & 8)>0) DirectByte ^= 8;
- }
- if (c == "S") {
- Direct = dS;
- if ((DirectByte & 4)>0) DirectByte ^= 4;
- }
- if (c == "E") {
- Direct = dE;
- if ((DirectByte & 2)>0) DirectByte ^= 2;
- }
- if (c == "W") {
- Direct = dW;
- if ((DirectByte & 1)>0) DirectByte ^= 1;
- }
- if (DirectByte>0) Status = sleewing;
- else Status = tracking;
- }
- switch (Status) {
- case none:
- {
- DirectByte = 0;
- RAMot.setSpeed(0);
- DEMot.setSpeed(0);
- Serial.println("Status : NONE");
- break;
- }
- case tracking:
- {
- DirectByte = 0;
- RAMot.setSpeed(RA_BASESPEED);
- DEMot.setSpeed(0);
- Serial.println("Status : TRACKING");
- break;
- }
- case moving:
- {
- RAMot.setSpeed( RATES[RA_MOVERATE] * RA_BASESPEED );
- DEMot.setSpeed( RATES[DE_MOVERATE] * DE_BASESPEED );
- Serial.println("Status : MOVING");
- break;
- }
- case sleewing:
- {
- Serial.println("Status : 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[RA_SLEERATE] * RA_BASESPEED;
- }
- // Kézi É-ra
- if ((DirectByte & 8)==8) {
- DE_SPEED = RATES[RA_SLEERATE] * RA_BASESPEED;
- }
- // Ha nincs É-D-i mozg+ás, akkor vissza óramű sebességre
- if ( (DirectByte & 3) == 0 ) RA_SPEED = RA_BASESPEED;
- // Ha nincs K-NY-i mozgás, akkor a DE sebesség 0
- if ( (DirectByte & 12) == 0) DE_SPEED = 0;
- RAMot.setSpeed( RA_SPEED );
- DEMot.setSpeed( DE_SPEED );
- }
- } // End switch
- RA_SPEED = RAMot.speed();
- DE_SPEED = DEMot.speed();
- }
- if ((millis() % 10000)==0) {
- Serial.print(RAMot.currentPosition());
- Serial.print(" - ");
- Serial.println(DEMot.currentPosition());
- delay(10);
- getCoords();
- // RA_POS = RA_START + RA_SECSTEP*RAMot.currentPosition()/3600;
- // DE_POS = DE_START + DE_SECSTEP*DEMot.currentPosition()/3600;
- Serial.print("RA: "); Serial.print(RA_POS);
- Serial.print(" DE: "); Serial.println(DE_POS);
- }
- } // End LOOP
- /// --------------------------
- /// Custom ISR Timer Routine
- /// --------------------------
- void timerIsr()
- {
- RAMot.runSpeed();
- DEMot.runSpeed();
- }
- double getRA()
- {
- RA_POS = RA_START + RA_SECSTEP*RAMot.currentPosition()/3600;
- return RA_POS;
- }
- double getDE()
- {
- DE_POS = DE_START + DE_SECSTEP*DEMot.currentPosition()/3600;
- return DE_POS;
- }
- void getCoords()
- {
- CURRENT_TIME = rtc.getTime();
- RA_POS = RA_START + RA_SECSTEP*RAMot.currentPosition()/3600;
- DE_POS = DE_START + DE_SECSTEP*DEMot.currentPosition()/3600;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement