domenica 26 luglio 2015

Secondo passo: si muove !!!

Seconda versione provvisoria del software. Ora i motori si muovono ed effettuano correttamente il puntamento.
Ho sviluppato il software in modo da generare tramite un interrupt temporizzato a 100 us gli step di movimentazione dei motori, questi non devono essere disturbati in nessun modo da altre operazioni per cui la scrittura del display avviene sempre a motori fermi e le operazioni di lettura e scrittura dei port non utilizza le funzioni standard fornite dall'ambiente di sviluppo (digitalRead  e digitalWrite). Queste funzioni infatti per costruire l'interfaccia che utilizza la numerazione dei pin generano un notevole overhead e per alcuni istanti bloccano gli interrupt. Ho utilizzando quindi l'accesso diretto ai registi ( tipo PIOB->PIO_CODR, PIOB->PIO_SODR, PIOC->PIO_ODSR).

Il display l'ho gestito in modo da visualizzare le seguenti informazioni

La prima linea riporta la ascensione retta e un testo che può essere: Pos (posizione corrente), Goto (posizione in corso di puntamento) o Alig (posizione su cui effettuato allineamento).
La seconda linea riporta la declinazione ed una serie di segnalatori:
T se tracking è attivo, spazio se non attivo
F se luce flat accesa, spazio se spenta
C se alimentazione CCD accesa, spazio se spenta
H se telescopio in posizione di homing, spazio se in altra posizione
C se casetta è chiusa, c se in fase di chiusura, O se aperta, o se in fase di apertura.
t se timeout è attivo, spazio se non attivo.

Il software non è definitivo, infatti:

  • La movimentazione è eseguita sempre alla stessa velocità (100hz), senza rampe di accelerazione.
  • Non è utilizzato il cambio di velocità sull'ascensione retta.
  • Il tracking non è ancora implementato.
  • Non è gestita la correzione dell'errore periodico.
  • Non è gestita l'apertura e chiusura della casetta (solo simulata)
  • Non è gestita la posizione di home

Però, connettendo il software Polypus è possibile eseguire un allineamento su di un oggetto


e puntare un'altro oggetto.


I motori si muovono nella gusta direzione fino alla posizione stabilita e sul display appare il relativo messaggio


La parte di generazione del clock di movimentazione, il settaggio della posizione ed i calcoli di trasformazione tra impulsi e ore, minuti, secondi ( o gradi, minuti, secondi) sono correttamente implementati e funzionanti.

Questa versione di software si può scaricare all'indirizzo http://www.osservatoriobassano.org/TCS2015/SoftV02.zip

giovedì 2 luglio 2015

Protocollo LX200 con Arduino

Ormai l'hardware è definitivo, sono quindi passato a sviluppare il software di controllo del telescopio.
Per fare questo ho scaricato l'ultima versione dell'ambiente di sviluppo 1.6.5 ed il package aggiuntivo per compilare per Arduino Due.
Intendo realizzare il software nel modo più modulare possibile, utilizzando ove utile, il C++ in  modo da incapsulare il codice in oggetti con una responsabilità ben definita. Il codice sarà scritto completamente in inglese (nomi di funzioni, variabili e commenti) adottando il CamelCase.
Il software sarà disponibile in forma sorgente con licenza GPL.

Ho realizzato quindi il primo mattone (versione 0.1) di questo software, si tratta del protocollo di comunicazione LX200. In questo modo è possibile connettere il sistema a qualsiasi client che lo supporta e lanciare i comandi.


Il protocollo è completamente incapsulato in un oggetto C++ di nome LX200, che è stato testato in via definitiva. Il test è stato eseguito connettendo il software di gestione dell'osservatorio "Polypus" sviluppato ed in funzione già da tempo presso l'Osservatorio di Bassano Bresciano.


Il software contenuto nel programma principale ha lo scopo di testare LX200.cpp e di mostrare come deve essere usato.
L'inizializzazione prevede:
  • L'attivazione del display utilizzato per visualizzare i comandi ricevuti, 
  • La creazione di un interrupt temporizzato che sarà usato per la generazione degli impulsi per i motori passo passo, ma ora serve a generare un contatore (SysTime) di sistema con la risoluzione del microsecondo.
  • La creazione dell'oggetto LX200 (chiamato LX200Server) ed assegnazione della linea seriale 3 e sua inizializzazione


// global variables
LiquidCrystal                 *Lcd;                        // LCD driver
int                           SysTime;                     // sistem time counter in microseconds
LX200                         *LX200Server;                // communication server for LX200 server
LX200::TELESCOPE              CurrentTelescopePosition;    // current telescope position
LX200::TELESCOPE              TargetTelescopePosition;     // goto target telescope position
LX200::STATUS                 Status;                      // telescope and dome status for LX200 server 

......... 

/*---------------------------------------------------------------------------

   Inizialization

---------------------------------------------------------------------------*/

void setup() 
  // display inizialization
  Lcd = new LiquidCrystal( 13, 12, 11, 10, 9, 8);           // lcd driver creation
  Lcd->begin(16, 2);                                        // lcd has 16 columns and 2 lines
  Lcd->setCursor(0, 0);                                     
  Lcd->write("--");
  
  // LX200 server initialization
  Serial3.begin ( 9600 );                                   // open communication line 
  LX200Server = new LX200(&Serial3);                        // LX200 server creation and serial 
  memset( &Status, 0, sizeof(Status) );                     // clear  telescope and dome status

.......
}


Il software che gira ciclicamente provvede a:
  • Fornire all'oggetto LX200Server il contatore SysTime (funzione SetSysTime) con il tempo che scorre, questo è essenziale perché esso possa calcolare correttamente i timeout di comunicazione.
  • Fornire all'oggetto LX200Server la posizione correntemente puntata dal telescopio (funzione SetCurrentPosition). In questo modo quando un applicazione client chiede al sistema TCS2015 la posizione puntata il protocollo LX200 è in grado di fornirla.
  • Fornire all'oggetto LX200Server lo stato di alcuni elementi di telescopio e cupola (telescopio calibrato, tracking abilitato, telescopio in movimento, valore corrente di correzione errore periodico, fase corrente della rotazione vite senza fine, telescopio in posizione di home, stato luci flat, accensione CCD). In questo modo quando un applicazione client chiede al sistema TCS2015 queste informazioni il protocollo LX200 è in grado di fornirle. 
  • Gestire il protocollo (funzione ManageProtocol). In questa funzione si esplica tutta la gestione della comunicazione. La funzione risponde a tutte richieste in ingresso dalla linea di comunicazione e restituire in output il codice dell'eventuale comando arrivato dal client. E' cura del programma gestire l'esecuzione del comando. 
Nell'esempio il comando ricevuto è selezionato della linea switch ( Command ) dopo è possibile capire come procedere. Alcuni comandi hanno bisogno della richiesta al protocollo di ulteriore informazioni per poter essere eseguiti:
  • La funzione GetGotoVelocities permette di conoscere la velocità (1%-100% che è stata selezionata per il puntamento.
  • La funzione GetTargetPosition permette di conoscere la posizione richiesta per un posizionamento o un allineamento. 
  • La funzione GetManualMovement permette di conoscere i parametri per un movimento manuale.
  • La funzione GetPECParams permette di conoscere i parametri per la sinusoide di correzione dell'errore periodico.

Credo che la spiegazione sia esauriente, se ci sono dubbi non esitate a scrivermi 

void loop() 
{
  int                       Int1;
  char                      Message[20];
  char                      Str1[10];
  LX200::COMMAND            Command;
  LX200::GOTOVELOCITIES     GotoVelocities;
  LX200::MANUALMOVEMENT     ManualMovement;
  LX200::PECPARAMETERS      PECParameters;

  LX200Server->SetSysTime( SysTime );  
  
  CurrentTelescopePosition.RAHours = 23;
  CurrentTelescopePosition.RAMinutes = 34;
  CurrentTelescopePosition.RASeconds = 45;
  CurrentTelescopePosition.DecSign = '-';
  CurrentTelescopePosition.DecDegrees = 12;
  CurrentTelescopePosition.DecMinutes = 34;
  CurrentTelescopePosition.DecSeconds = 56;
  LX200Server->SetCurrentPosition( &CurrentTelescopePosition );
  
  Status.PECIndex++;
  if ( Status.PECIndex >= 3200 )
    Status.PECIndex = 0;
  Status.PECValue = Status.PECIndex/10 - 16;  
  LX200Server->SetStatus( &Status );
  
  Command = LX200Server->ManageProtocol();
  
  switch ( Command )
  {
    case LX200::GOTO:

..................