Dobsoniani

Un PushTo economico con arduino

« Older   Newer »
  Share  
view post Posted on 15/1/2014, 20:51
Avatar

The Dark Side of the Sky

Group:
Administrator
Posts:
3,114
Location:
Jesolo (Ve)

Status:


Gironzolando per la rete mi sono imbattuto in questo sito http://msfastro.net/articles/arduinodsc/ dove si descrive la costruzione di un sistema push to basato su arduino... i componenti necessari sono:

- scheda arduino
- encoders
- pc windows con cartes du ciel e piattaforma ascom 6
- drivers ascom appositi

avendo già i primi tre mi sono dovuto scaricare e installare i drivers ascom scritti da David Ek presenti in questa pagina http://eksfiles.net/digital-setting-circle...etting-circles/ (c'è anche una guida passo passo alla configurazione di cartes du ciel che può tornare utile più avanti)

Il passo successivo è stato quello di realizzare il collegamento tra arduino e i due encoders, cosa molto semplice come si capisce dal disegno
encoders

Poi sono passato al caricamento del codice sulla scheda, sul sito mfastro c'è già il sorgente pronto purtroppo il codice è un po' datato quindi ho dovuto fare una piccola modifica per renderlo compatibile con la versione attuale di arduino
CODICE
/*
 Arduino based Digital Setting Circle

Michael Fulbright 2010-06-06

<mike.fulbright at pobox.com>

Feel free to modify and share - please let me know if you make any changes so I can keep my version up to date

2010-06-06:  Initial relase - supports 2X encoding

*/

// constants won't change. They're used here to
// set pin numbers:

const int AZ_enc_A = 6;  // digital pin 6 = PD6
const int AZ_enc_B = 7;  // digital pin 7 = PD7

const int ALT_enc_A = 9;   // digital pin 9 = PB1
const int ALT_enc_B = 10;  // digital pin 10 = PB2

const int RES = 4000;  // resolution of encoders

byte beenAligned = 0;  

long ALT_pos = RES/2;  // initial position of encoders is
long AZ_pos = RES/2;   // half their resolution

void setup() {

 // initialize the encoder inputs
 pinMode(ALT_enc_A, INPUT);
 pinMode(ALT_enc_B, INPUT);
 pinMode(AZ_enc_A, INPUT);
 pinMode(AZ_enc_B, INPUT);

 Serial.begin(9600);

 // Pin change interrupt control register - enables interrupt vectors
 // Bit 2 = enable PC vector 2 (PCINT23..16)
 // Bit 1 = enable PC vector 1 (PCINT14..8)
 // Bit 0 = enable PC vector 0 (PCINT7..0)
 PCICR |= (1 << PCIE2);
 PCICR |= (1 << PCIE0);

 // Pin change mask registers decide which pins are enabled as triggers
 PCMSK2 |= (1 << PCINT23);  // arduino pin 7 = PD7 = az encoder A
 PCMSK0 |= (1 << PCINT1);   // arduino pin 9 = PB1 = alt encoder A

 // enable interrupts
 interrupts();
}

void loop(){


 // see if command sent and reply if appropriate
 //

 byte inchar;
 while (!Serial.available())
 {
   delay(50);
 }
 inchar = Serial.read();

 // throw away rest of command - we don't need it
 Serial.flush();

 if (inchar == 'Q')
 {
   printEncoderValue(AZ_pos);
   Serial.print("\t");
   printEncoderValue(ALT_pos);
   Serial.print("\r");
 }
 else if (inchar == 'R' || inchar == 'Z' || inchar == 'I' || inchar == 'z')
 {
   // ignore command - just return proper code
   if (inchar == 'R' || inchar == 'I')  
     Serial.print("R");
   else if (inchar == 'Z')
     Serial.print("*");
   else if (inchar == 'z')
     Serial.print("r");
 }
 else if (inchar == 'r')
 {
   // print out resolution - hardcoded to 4000 tics/rev
   Serial.print("04000\t04000\r");
 }
 else if (inchar == 'V')
 {
   //version
   Serial.print("V1.0.0\r");
 }
 else if (inchar == 'T')
 {
   // test mode - output resolutions and error count
   Serial.print("04000,04000,00000\r");
 }
 else if (inchar == 'q')
 {
   // error count
   Serial.print("00000\r");
 }
 else if (inchar == 'P')
 {
   // encoder power up
   Serial.print("P");
 }
 else if (inchar == 'p')
 {
   //
   // dave eks error command
   Serial.print("00");
 }
 else if (inchar == 'h')
 {
   // report resolution in Dave Eks format
   Serial.write(0xA0);
   Serial.write(0x0F);
   Serial.write(0xA0);
   Serial.write(0x0F);
 }
 else if (inchar == 'y')
 {
   // report encoders in Dave Eks format
   printHexEncoderValue(ALT_pos);
   printHexEncoderValue(AZ_pos);
 }  
 else if (inchar == 'a')
 {
   if (beenAligned)
     Serial.print("Y");
   else
     Serial.print("N");
 }
 else if (inchar == 'A')
 {
   beenAligned = 1;
 }

#ifdef DEBUG
 Serial.print(digitalRead(AZ_enc_A));
 Serial.print(" ");
 Serial.print(digitalRead(AZ_enc_B));
 Serial.print(" ");
 Serial.print(digitalRead(ALT_enc_A));
 Serial.print(" ");
 wi
   Serial.print(digitalRead(ALT_enc_B));
 Serial.print("\r");

 //return;

 Serial.print(AZ_pos);
 Serial.print(" ");
 Serial.print(ALT_pos);
 Serial.print("\r");

 delay(500);
#endif


}


// print encoder value with leading zeros
void printEncoderValue(long val)
{
 unsigned long aval;

 if (val < 0)
   Serial.print("-");
 else
   Serial.print("+");

 aval = abs(val);

 if (aval < 10)
   Serial.print("0000");
 else if (aval < 100)
   Serial.print("000");
 else if (aval < 1000)
   Serial.print("00");
 else if (aval < 10000)
   Serial.print("0");

 Serial.print(aval);  
}

void printHexEncoderValue(long val)
{
 byte low, high;

 high = val / 256;

 low = val - high*256;

 Serial.write(low);
 Serial.write(high);

 return;
}


// we have to write our own interrupt vector handler..
ISR(PCINT2_vect){

 if (digitalRead(AZ_enc_A) == digitalRead(AZ_enc_B))
 {
   AZ_pos++;
   if (AZ_pos >= RES)
     AZ_pos = 0;
 }
 else
 {
   AZ_pos--;

   if (AZ_pos < 0)
     AZ_pos = RES - 1;
 }
}


ISR(PCINT0_vect){

 if (digitalRead(ALT_enc_A) == digitalRead(ALT_enc_B))
 {
   ALT_pos++;

   if (ALT_pos >= RES)
     ALT_pos = 0;
 }
 else
 {
   ALT_pos--;

   if (ALT_pos < 0)
     ALT_pos = RES - 1;
 }

}

una volta caricato il codice si può verificare il suo funzionamento aprendo il serial monitor, muovendo a mano gli encoders e premendo il tasto Q si dovrebbe vedere variare i valori sullo schermo
Appurato che tutto funziona si tratta di configurare cartes du ciel (ma dovrebbe funzionare con qualsiasi software ascom-compatibile) quindi:
1) si va su "telescopio" -> "impostazione" e si seleziona ASCOM
2) "telescopio" -> "pannello di controllo" -> "configura" e si apre la finestra di configurazione dei drivers
3) in "Interface type" si seleziona "Dave Ek's DSC" e si compilano gli altri campi come Mount, Ticks/Rev, Serial Port e site info con i relativi valori
setup
4) a questo punto si connette il telescopio clikkando su "connetti"
5) ora si deve fare l'allineamento a due stelle clikkando su sync e seguendo la guida che si apre
6) fatto tutto quanto sopra si è pronti a cercare gli oggetti, click destro sull'oggetto desiderato -> "telescopio" -> "muovi alla posizione del cursore"
7) si aprirà adesso una finestra con due valori az e alt, dovremo muovere il telescopio a mano fino ad azzerare i due numeri... fatto questo saremo sopra l'oggetto ricercato...

La procedura l'ho verificata personalmente e funziona, o quanto meno funziona indoor dato che non l'ho ancora provata sul cielo... :P
 
Top
view post Posted on 16/1/2014, 20:35

Spiral galaxy

Group:
Member
Posts:
2,664
Location:
Piemonte astigiano

Status:


Questo è un argomento mooolto interessante!

Io ho già un push-to NGC-micro-Max montato sul dob 360F5, ma nel disegnare il 300F6 ho già predisposto il montaggio di due nuovi encoders della serie US-Digital S2 (o S5, vedrò).

Ero orientato all'acquisto di due soli encoders uguali agli attuali intallati, per condividere il computerino NGC (più piccolo di un pacchetto di sigarette).
Ma il fatto che l'Arduino-uno costerebbe meno di 30 euro (RS-Components quì in Italia, lo spedisce a poco prezzo, e in due giorni si riceve la roba a casa ), costituisce per me una notevole tentazione a seguire la tua strada.

Anche se purtroppo la coppia di encoders continuerebbe a costituire la spesa maggiore di tutto l'ambaradàn, e sembra che quelli da 4000 impulsi siano sufficienti e consumino anche quasi la metà dei miei S5 montati sull'NGC (che arrivano a 8193 ticks al giro).

Non ho ancora letto l'allegato del tuo link (l'ho solo stampato) , e ti chiedo lumi su due cose che sicuramente troverebbero risposta leggendo.

DOMANDA: I tuoi encoders da quanti impulsi giro sono?. Penso che saranno probabilmente a due o più canali, per sfruttare il raddoppio o più, della risoluzione.

Hai idea che Arduino gestisca quella risoluzione artificiosamente moltiplicata ?.

Grazie
Giulio

P.S. il mio attuale NGC "legge" 8192 impulsi al giro dai miei encoders S5, e la pila da 9 volt duracell, mi dura 8 ore, tenendo la luminosità del display a led rossi,al minimo.


P.S.2°: Ho letto il listato e ho visto la costante RES =4000, e se non sbaglio, (non conosco ancora il linguaggio di arduino) gli ingressi accettano un segnale che è RES/2, quindi mi sembra di capire che la risoluzione propria degli encoders sia di 2000 Ticks/giro, ovviamente su due canali.
( Questi dati sono importanti perchè sono quelli necessari ad ordinare i due encoders).

Edited by GiulioTi - 17/1/2014, 09:19
 
Web  Top
view post Posted on 17/1/2014, 09:15
Avatar

The Dark Side of the Sky

Group:
Administrator
Posts:
3,114
Location:
Jesolo (Ve)

Status:


prove "reali" non ne ho fatte se non quella di muovere gli encoders a mano e verificare che in effetti il cursore a schermo si muova verso l'oggetto selezionato... io ho due encoders da 10000 impulsi e arduino non sembra dare problemi però come detto non ho verificato sul campo
 
Top
view post Posted on 8/2/2014, 23:37

Spiral galaxy

Group:
Member
Posts:
2,664
Location:
Piemonte astigiano

Status:


Andreafra ha lanciato l'esca.. e io ho abboccato :wacko:
...Questo significa che nel frattempo mi sono documentato, ho valutato i pro e i contro, e poi (ti pareva che non fosse così?......) il vecchio elettronico che è in me (ebbene si...in me "siamo in tanti" e ci stiamo stretti.....e c'è anche quello, oltre al vecchio dobsoniano, camperista, flicornista, corista, bibliotecario, grattavetrista :wacko: :wacko: ) ....ha accettato la sfida di costruire il collegamento con Arduino, fra il PC portatile con cartes du ciel, e i miei due dobson 360F5 e 300F6.

Il mio 360F5 dispone già di un push-to NGCmicroMax, il cui computerino (più piccolo di un pacchetto di sigarette) è collegato a due encoders digitali (US Digital tipo S2) a due canali sfasati di 90° fra loro, ciascun canale fornisce 2048 impulsi (“tics”) al giro.

Io di preferenza non uso il push-to che per terminare una ricerca (sistematica di oggetti nuovi e difficili) in star hopping, andata infruttuosa.
Ma lo sfizio di usare cartes du ciel con i dob, specie negli star party pubblici, non mi è indifferente.

Gli encoders digitali miniatura sono costruiti con due dischetti di mylar trasparente, ciascuno dei quali porta stampata una corona diametro 5 cm, fatta (nel mio caso) di 2048 linee radiali nere, spesse 2 decimi di mm, intervallate da spazi trasparenti altrettanto larghi.
Le due corone sono fissate sull’asse sfasate fra loro di mezza linea, per cui i due appositi led potranno leggere i chiaro-scuri come fronti di salita dell’onda quadra generata da una corona sola (ottenendo la risoluzione di soli 2048 tics al giro) oppure di due corone (risoluzione di 4096 tics al giro) oppure ancora potranno leggere tutti i fronti sia di salita che di discesa delle onde quadre, fornendo una risoluzione quadrupla rispetto al numero di impulsi giro nominale.


Quello stesso mio push-to NGCmicroMax funziona così, ed è compatibile con encoders da 8192 o da 10000 impulsi/giro, quindi montando un tipo o l’altro sui miei due telescopi, li posso utilizzare alternativamente con lo stesso computer NGC, oppure con il PC portatile è cartes dui ciel

Gli encoders US Dgital sembra siano gli unici al mondo così piccoli, così performanti e a “buon” mercato (ma il “buon” è del tutto relativo).

In Italia li ha FranzOttica di Cagliari a 150 euro cad, ma biosogna vedere risoluzione e disponibilità.

La Us Digital me li ha offerti a un prezzo che alla fine arriva a poco meno di 300 euro (….come evidentemente sa bene Ottica Franz….)

Per caso ho però un’amico che il mese prossimo passerà da Denver ,dove quindi li ho ordinati (presso Jim’s Mobile inc. che produce i push-to NGC).e mi arriveranno al costo di poco meno di 200 euro la coppia.

Il passo seguente sarà l’acquisto di ArduinoUNO (25 euro) e la sua programmazione, che come è noto si fa con programmi gratuiti open source.

Vedremo quel che ne esce.
 
Web  Top
view post Posted on 9/2/2014, 09:55
Avatar

The Dark Side of the Sky

Group:
Administrator
Posts:
3,114
Location:
Jesolo (Ve)

Status:


scusa giulio ma perchè questi non vanno bene? http://www.teleskop-express.de/shop/produc...ohne-Kabel.html
 
Top
view post Posted on 9/2/2014, 10:27

Spiral galaxy

Group:
Member
Posts:
2,664
Location:
Piemonte astigiano

Status:


Sono proprio gli stessi, per 176 euro la coppia, mentre nei miei 207 euro di spesa sono compresi i loro due cavetti con terminali RJ11, più il cavo che collega gli encoders al mio NGCmicroMAX.

Questi non li avevo visti, se no magari li avrei presi, fabbricandomi poi i cavetti e connettori Rj11 a parte, con una spesa equivalente ma una consegna più pratica.
 
Web  Top
view post Posted on 9/2/2014, 13:24
Avatar

The Dark Side of the Sky

Group:
Administrator
Posts:
3,114
Location:
Jesolo (Ve)

Status:


ah ok nel prezzo ci stanno pure i cavetti...
 
Top
view post Posted on 11/2/2014, 08:47
Avatar

The Dark Side of the Sky

Group:
Administrator
Posts:
3,114
Location:
Jesolo (Ve)

Status:


In questo thread continuiamo a parlare del progetto di push-to, per il goto ho invece aperto una discussione apposita che trovate qui LINK

Edited by AndreaFra - 11/2/2014, 10:04
 
Top
view post Posted on 15/2/2014, 08:23

Spiral galaxy

Group:
Member
Posts:
2,664
Location:
Piemonte astigiano

Status:


@AndreaFra: devo chiederti lumi sulla dualità della porta COM / USB, cioè per la parte che riguarda il settaggio della porta COM, che non ho ben capito, e che sul mio recente portatile non c'è proprio ed è sostituita dalla USB (io ho Windows7):

Non ho ancora Arduino e non posso fare degli esperimenti in quel senso, ma ho già il portatile con Cartes du Ciel, ed ho scaricato il driver ASCOM, che appunto, seguendo la guida per il settaggio, chiede di indicare una porta COM per comunicare col telescopio

La domanda è: Si deve configurare ad esempio una COM1, impostando i soliti Baudrate, numero bit, parità, stop, ecc, attraverso qualcosa che non so, ma che su Windows 7 equivale al vecchio TERMINAL presente sui pc dotati di porte COM?.

Tutte le istruzioni in merito sono gradite.
Grazie - Giulio.
 
Web  Top
view post Posted on 15/2/2014, 11:30
Avatar

The Dark Side of the Sky

Group:
Administrator
Posts:
3,114
Location:
Jesolo (Ve)

Status:


non devi impostare niente a parte in ascom il numero della porta che però ottieni solo dopo aver installato arduino e i suoi drivers in quanto sono questi che si occupano di convertire l'USB in seriale... il numero esatto ( COM4 - COM5 eccetera) lo trovi in windows XP in "gestione periferiche" sezione porte e vedi qual'è quella associata ad arduino (c'è proprio scritto), con windows seven non ti so dire perchè non lo uso ma immagino ci sia una cosa simile...
 
Top
view post Posted on 15/2/2014, 11:35

Spiral galaxy

Group:
Member
Posts:
2,664
Location:
Piemonte astigiano

Status:


Grazie Andrea !! Tra qualche giorno mi arriverà Arduino UNO e proverò.
 
Web  Top
view post Posted on 11/3/2014, 09:23

Spiral galaxy

Group:
Member
Posts:
2,664
Location:
Piemonte astigiano

Status:


@AndreaFra. Domanda:
Ma il listato di codice che hai postato, è quello definitivo che hai caricato, dopo averlo dotato della piccola modifica per renderlo compatibile con la versione attuale di Arduino?

Dalla prova che ho fatto si direbbe di si,.... ma il debug per il mio nuovo Arduino UNO, mi da ancora errori (che io, non conoscendo il linguaggio che da due settimane, ho difficoltà a correggere).

La prova che ho fatto è stata di scaricare il listato del codice dal link, e sottoporlo a Debug, col risultato che sono stato invitato a sostituire alcune istruzioni SerialPrint, mettendo al loro posto le SerialWrite ed eliminando il comando "BYTE" dalla loro parentesi, come ho notato essere nel listato che hai postato.

Ho corretto quindi le 8 differenze esistenti in tutto fra i due listati, adeguandole al tuo; ma il debug mi dà un nuovo errore, dicendo che "la variabile PrintEncodevalue (AZ_pos) non è stata dichiarata in questo scopo". ( e quindi immagino sarà così anche per la riga successiva in cui compare la stessa variabile per l'asse ALT).

Che versione hai di Arduino e come te la sei cavata tu?

Grazie Giulio
 
Web  Top
view post Posted on 11/3/2014, 09:52
Avatar

The Dark Side of the Sky

Group:
Administrator
Posts:
3,114
Location:
Jesolo (Ve)

Status:


si, il codice postato è quello che ho usato per il test... io ho arduino UNO e non mi ha mai dato quell'errore, in quale riga si blocca? noto che hai scritto PrintEncodevalue anzichè printEncoderValue, non ricordo se il linguaggio sia case sensitive ma in ogni caso manca la r di encoder
 
Top
view post Posted on 11/3/2014, 10:03

Spiral galaxy

Group:
Member
Posts:
2,664
Location:
Piemonte astigiano

Status:


CITAZIONE (AndreaFra @ 11/3/2014, 09:52) 
si, il codice postato è quello che ho usato per il test... io ho arduino UNO e non mi ha mai dato quell'errore, in quale riga si blocca? noto che hai scritto PrintEncodevalue anzichè printEncoderValue, non ricordo se il linguaggio sia case sensitive ma in ogni caso manca la r di encoder

si blocca sulla riga che contiene quel comando che fra l'altro non è da me stato toccato per nulla, quindi no c'è pericolo di errore di sintassi.

Ma il tuo Arduino che versione R è?
 
Web  Top
view post Posted on 11/3/2014, 10:11
Avatar

The Dark Side of the Sky

Group:
Administrator
Posts:
3,114
Location:
Jesolo (Ve)

Status:


boh dovrei vedere, quando rientro ti faccio sapere
 
Top
35 replies since 15/1/2014, 20:51   2223 views
  Share