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:

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




sabato 27 giugno 2015

Ultime modifiche hardware


Alcune modifiche sono state aggiunte all'ultimo minuto:
Il display da 16 caratteri per 2 linee è stato montato sullo chassis in modo da essere visibile frontalmente.
L'ingresso per un ulteriore forcella ottica che permette di rilavare una posizione fissa nella rotazione della vite in modo da poter fasare un segnale di correzione dell'errore periodico.

Nella foto si può vedere il display e motori connessi per iniziare la fase di test e di sviluppo software.

Le modifiche hanno richiesto la modifica dello schema elettrico che ora assumo questo aspetto.

La morsettiera frontale fornisce tutte le connessioni elettriche di segnale e di potenza:
Sulla pagina "Documenti progetto TCS2015" è possibile trovare tutti i documenti e schemi aggiornati


mercoledì 29 aprile 2015

montaggio finale


Tutti gli elementi hanno trovato posto nello chassis e sono stati cablati. Le connessioni verso l'esterno terminano sulla morsettiera dove possono essere collegati i motori passo passo, le forcelle ottiche, i pulsanti ed i dispositivi comandati dai relè.

La fase di sviluppo del software si avvicina !!!

sabato 18 aprile 2015

Test scheda di controllo

Ho realizzato dei test per la scheda di controllo al fine di verificare se funziona correttamente

Il primo test riguarda il display, sono visualizzate due stringhe di testo su tutti i caratteri

Il secondo test riguarda i 4 segnali di ingresso presenti sul connettore 3, sono visualizzati tutti gli stati 0/1 sulla seconda linea mentre la prima funziona da legenda



Il teszo test riguarda le uscite presenti si connettori 2 e 3. Sono attivate cicilicamente una alla volta per 2 secondi lasciando il tempo di verificarle con il tester. é visualizzata l'uscita attiva


Il quarto test riguarda la linea seriale, ogni carattere ricevuto è visualizzato su display e rispedito incrementato di uno. Nell'esempio è stato ricevuto ABC e spedito BDE.

Il quinto test è relativo alle uscite a rele sul conettore 6. Sono accese in sequenza le uscite.

Tutti i test possono essere trovati sulla pagina "Documenti di progetto"


venerdì 17 aprile 2015

Cavo display


Questo è il cablaggio per connettere il display alla scheda di controllo (CN6). Il display è comandato utilizzando l'interfaccia a 4 bit e rinunciando alla possibilità di rileggere i caratteri scritti (segnale R/W fisso a livello basso).

Per poter realizzare un cavo che non intrecciasse alcun filo ho fatto una piccola modifica allo schema della scheda di controllo in modo da invertire i segnali 0V e +5V sul connettore CN6.


martedì 7 aprile 2015

Scheda di controllo


Ho realizzato la scheda di controllo del telescopio secondo le specifiche definite in precedenza. La scheda è pensata per montare nella parte centrale il modulo Arduino2. Tutto intorno i connettori per tutti i segnali ed i componenti aggiuntivi di condizionamento dei segnali. Sulla foto sono riportate le sigle dei componenti così come definiti sullo schema. Trattandosi di una scheda in unico esemplare, la scheda è stata realizzata su una basetta mille fori formato 10x16 cm e connessioni a filo.

Una volta montato Arduino la scheda si presenta così:



Durante il  montaggio del modulo si sono resi necessari alcuni aggiustamenti nello schema elettrico, questa è la nuova versione.



L'alimentatore è risultato fornire una tensione di alimentazione dell' Arduino vicina al limite superiore consentito. Ho inserito 4 diodi per provocare una caduta di un paio di volt.


mercoledì 11 marzo 2015

Schema della scheda di controllo con Arduino

Ho preparato lo schema della scheda di controllo dotata di Arduino 2 che permette di realizzare quanto definito dal documento documento di progetto.

Anche in questo caso mi sono servito del software LTSpiceIV.


Allo schema è stato aggiunta la possibilità di pilotare in display LCD da 2 righe da 16 caratteri



In questo modo sarà possibile visualizzare alcune informazioni di debug durante lo sviluppo del software e le coordinate puntate durante il funzionamento effettivo del sistema

Inoltre ho acquistato un driver basato su L298 per il pilotaggio di motori passo-passo di piccole dimensioni. Questo dovrà muovere il focheggiatore del telescopio.



Lo schema può essere scaricato dalla pagina "Documenti di progetto TCS2015"