• home
  • main gallery
  • articles
  • macro
  • astronomy
  • arduino
  • me
  • contact
epsilonphoto
Immagine
 


Controllo del telescopio con stellarium

 
Immagine
Immagine
Immagine
SKETCH  5  -  prime prove di GOTO

Finalmente ci siamo, abbiamo in questa pagina lo Sketch che permette di simulare il GOTO. Solo simulare? Certamente, non abbiamo ancora collegato encoder e motori. Ci arriveremo con un po' di pazienza.
Partendo dallo Sketch precedente, dove avevamo risolto un po' di problemi, sono state aggiunte delle nuove funzioni:
  • goto_object( )    questa funzione, inserita nel loop, viene invocata solo se la differenza tra le coordinate del telescopio e del target sono diverse da zero. Effettua il confronto tra le coordinate e sceglie la via più breve per raggiungere il target invocando a sua volta la funzione preposta al movimento voluto.
  • go_east( )    go_west( )    go_north( )    go_south( )    sono le funzioni che attualmente si occupano di incrementare o decrementare di un secondo alla volta le coordinate in gioco.
Ho evidenziato la parola "attualmente" perché in realtà l'incremento o il decremento deve avvenire mediante la lettura dei dati provenienti degli encoder, o se non presenti nella montatura, valutando il numero dei passi che il motore compie per far ruotare l'asse di un secondo d'arco. Per i suddetti motivi queste ultime quattro funzioni dovranno essere totalmente riscritte quando si tratterà di collegare i dispositivi sopra citati. Per il momento accontentiamoci di un GOTO virtuale.


/*
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
*                                 Created 27 March 2014                                   *
*                                       by EDC                                            *
*                           http://epsilonphoto.weebly.com/                               *
*                                                                                         *
*      This program is free software, you can redistribute it and/or modify.              *
*      Is in the public domain, it only has a didactic purpose and you can modify it      *
*      to your liking. I do not provide any guarantee for any damage it may cause         *
*      to property or persons.                                                            *
*                                                                                         *
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
*/


#include <stdlib.h>


const int buttonAlign = 53;         // pin in cui l'interruttore abilita l'allineamento con una stella
int buttonState = 0;                // variabile in cui arduino andrà a leggere lo stato logico di buttonAlign
char input[20];                     // array di char in cui verranno memorizzati i dati in ingresso
char txAR[10];                      // array di char in cui verranno memorizzati i dati in uscita
char txDEC[11];                     // array di char in cui verranno memorizzati i dati in uscita
long ARtel, DECtel;                 // coordinate del telescopio espresse in secondi
long ARtarget, DECtarget;           // coordinate del target espresse in secondi
long ARdiff, DECdiff;               // differenza tra le coordinate del target e del telescopio
long arHH, arMM, arSS;              // coordinata AR del telescopio da trasmattere a stellarium
char SIGNtel;                       // segno della DEC: 43 = +   45 = -
long decDEG, decMM, decSS;          // coordinata DEC del telescopio da trasmettere a stellarium




void setup() {
  
  pinMode(buttonAlign, INPUT);
  Serial.begin(9600);
  ARtarget = ARtel = 22300;             // coordinata iniziale di AR (in secondi) per visualizzare il reticolo del telescopio
  DECtarget = DECtel = 35105;           // coordinata iniziale di DEC (in secondi) per visualizzare il reticolo del telescopio
}


void loop() {
  
  if(Serial.available()>0){
    communication();
  }
  
  ARdiff = ARtarget - ARtel;
  DECdiff = DECtarget - DECtel;
  if(ARdiff != 0 || DECdiff != 0){
    goto_object();
  }
  
}
      

//--------------------------------------------------------------------------------------------------------------------------------------------------------   

void communication(){
  
  int i=0;
  input[i++] = Serial.read();
  delay(5);
  while((input[i++] = Serial.read()) != '#'){
    delay(5);
  }
  input[i]='\0';
  
    
  if(input[1]==':' && input[2]=='G' && input[3]=='R' && input[4]=='#'){             // con il comando #:GR# stellarium chiede l'invio della coordinata di AR
    transmitAR();
  }


  if(input[1]==':' && input[2]=='G' && input[3]=='D' && input[4]=='#'){             // con il comando #:GD# stellarium chiede l'invio della coordinata di AR
    transmitDEC();
  }


  if(input[1]==':' && input[2]=='Q' && input[3]=='#'){                              // con il comando #:Q# stellarium chiede l'arresto dei motori
  // inviare l'arresto ai motori
  }


  if(input[0]==':' && input[1]=='S' && input[2]=='r'){                              // con il comando :Sr stellarium invia la coordinata di AR
    getAR();
  }
  
    
  if(input[0]==':' && input[1]=='S' && input[2]=='d'){                              // con il comando :Sd stellarium invia la coordinata di DEC
    getDEC();
  }
  
  
  if(input[0]==':' && input[1]=='M' && input[2]=='S' && input[3]=='#'){             // con il comando :MS# stellarium chiede se la rotazione è possibile
    Serial.print("0");
    buttonState = digitalRead(buttonAlign);                                         // legge se l'interruttore per l'allineamento iniziale è su ON o OFF
    if (buttonState == HIGH) {                                                      // se HIGH aggiorna le coordinate, altrimenti proseguià con il GOTO
      ARtel = ARtarget;
      DECtel = DECtarget;
    }
  }
}
   
  
//--------------------------------------------------------------------------------------------------------------------------------------------------------   

void transmitAR(){                                                              // trasmissione dati nella forma   HH:MM:SS#
  
     arHH = ARtel/3600;                                                         // ricava le ore della coordinata AR del telescopio
     arMM = (ARtel-arHH*3600)/60;                                               // ricava i minuti della coordinata AR del telescopio
     arSS = (ARtel-arHH*3600)-arMM*60;                                          // ricava i secondi della coordinata AR del telescopio
     sprintf(txAR, "%02d:%02d:%02d#", int(arHH), int(arMM), int(arSS));
     Serial.print(txAR);
      
    }
    
//--------------------------------------------------------------------------------------------------------------------------------------------------------   

void transmitDEC(){                                                             // trasmissione dati nella forma  sDDßMM:SS#  (dove s è il segno + o -)
    
     (DECtel < 0) ? SIGNtel = 45: SIGNtel = 43;                                 // controllo del segno della coordinata DEC del telescopio
     decDEG = abs(DECtel)/3600;                                                 // ricava i gradi della coordinata DEC del telescopio
     decMM = (abs(DECtel) - decDEG*3600)/60;                                    // ricava i minuti della coordinata DEC del telescopio
     decSS = (abs(DECtel) - decDEG*3600) - decMM*60;                            // ricava i secondi della coordinata DEC del telescopio
     sprintf(txDEC, "%c%02d%c%02d:%02d#", SIGNtel, int(decDEG), 223, int(decMM), int(decSS));
     Serial.print(txDEC);
  
    }
    
//--------------------------------------------------------------------------------------------------------------------------------------------------------   
      
void getAR(){                                                                   // riceve la coordinata AR del target nel formato :Sr HH:MM:SS#
     
     Serial.print("1");
     ARtarget = (atol(input+4))*3600 + (atol(input+7))*60 + atol(input+10);     // converte in secondi la coordinata AR del target
    }
 
 
//--------------------------------------------------------------------------------------------------------------------------------------------------------   
    
void getDEC(){                                                                  // riceve la coordinata AR del target nel formato :Sd +DDßMM:SS#
     
    Serial.print("1");
    DECtarget = (atol(input+5))*3600 + (atol(input+8))*60 + atol(input+11);     // converte in secondi la coordinata DEC del target
    if (input[4] == '-'){                                                       // per una corretta conversione ha prelevato solo la parte numerale
      DECtarget *=(-1);                                                         // (cioè senza il segno) pertanto se la coordinata DEC è negativa, dopo
    }                                                                           // la conversione in secondi viene moltiplica per -1
   }
  
  
//--------------------------------------------------------------------------------------------------------------------------------------------------------

void goto_object(){   
  
  if ((ARdiff >0 && ARdiff <= 43200) || (ARdiff <=(-43200))){      //confronta le coordinate di AR e sceglie la via più breve per raggiungere il target
    go_east();   
  }
     
  if ((ARdiff > 43200) ||  (ARdiff <0 && ARdiff > (-43200))){
    go_west();
  }
 
  
  
  if (DECtarget > DECtel){                                         //confronta le coordinate di DEC e sceglie la via più breve per raggiungere il target
    go_north();
  }
   
  if (DECtarget < DECtel){
    go_south();
  }
   
}


//--------------------------------------------------------------------------------------------------------------------------------------------------------

void go_east(){
  ARtel++;                                // in questo Sketch l'incremento è semplicemente aritmetico, in realtà deve provenire
  if(ARtel >= 86400){                     // da una lettura dei dati dell'encoder, oppure per le montature sprovviste, dal
    ARtel = ARtel - 86400;                // numero dei passi del motore (meno preciso perché non tiene conto del backlash
  }                                       // dell'eventuale motoriduttore o degli step persi.
  // inviare comando al motore AR
   
}

//--------------------------------------------------------------------------------------------------------------------------------------------------------

void go_west(){
  ARtel--;                                // in questo Sketch il decremento è semplicemente aritmetico, in realtà deve provenire
  if(ARtel < 0){                          // da una lettura dei dati dell'encoder, oppure per le montature sprovviste, dal
    ARtel = ARtel + 86400;                // numero dei passi del motore (meno preciso perché non tiene conto del backlash
  }                                       // dell'eventuale motoriduttore o degli step persi.
  // inviare comando al motore AR
    
}

//--------------------------------------------------------------------------------------------------------------------------------------------------------

void go_north(){                          // in questo Sketch l'incremento è semplicemente aritmetico, in realtà deve provenire
  DECtel++;                               // da una lettura dei dati dell'encoder, oppure per le montature sprovviste, dal
  // inviare comando al motore DEC        // numero dei passi del motore (meno preciso perché non tiene conto del backlash
                                          // dell'eventuale motoriduttore o degli step persi.
}

//--------------------------------------------------------------------------------------------------------------------------------------------------------

void go_south(){                          // in questo Sketch il decremento è semplicemente aritmetico, in realtà deve provenire
  DECtel--;                               // da una lettura dei dati dell'encoder, oppure per le montature sprovviste, dal
  // inviare comando al motore DEC        // numero dei passi del motore (meno preciso perché non tiene conto del backlash 
                                          // dell'eventuale motoriduttore o degli step persi.
}

//--------------------------------------------------------------------------------------------------------------------------------------------------------


ATTENZIONE: in data 30/03/2014 mi sono accorto di un bug nello Sketch che provocava un non corretto allineamento degli oggetti posti in prossimità dell'equatore celeste. Se il target si trovava ad una declinazione negativa inferiore al grado, non veniva letto il segno "meno". Il problema è stato risolto modificando leggermente la funzione get_DEC( ). Lo Sketch visibile sopra e il file per il download sotto sono già aggiornati. Mi scuso per il disguido e invito tutti a segnalarmi eventuali altri errori, grazie.


quinto_sketch.ino
File Size: 11 kb
File Type: ino
Download File

log_telescopeserver1_5.txt
File Size: 56 kb
File Type: txt
Download File

Scaricate lo Sketch e buon divertimento! Il prossimo passo riguarderà alcune modifiche per adattarlo alle montature equatoriali e altazimutali.
indice
indietro
avanti
Powered by Create your own unique website with customizable templates.