• Augmented Life…

Un PushTo economico con Arduino e ASCOM
by admin

Gironzolando per la rete mi sono imbattuto in questo sito 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 (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

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

/*
Arduino based Digital Setting Circle

Michael Fulbright 2010-06-06

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. 1) si va su "telescopio" -> "impostazione" e si seleziona ASCOM
  2. 2) "telescopio" -> "pannello di controllo" -> "configura" e si apre la finestra di configurazione dei drivers
  3. 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

    alcuni sono obbligatori e alcuni sono opzionali, quelli obbligatori sono:
    - Mount, nella sezione "telescope info"
    - tutta la sezione "encoder info"

    la sezione "site info" è opzionale ma consigliata

    Il valore della porta seriale (COM) dovrebbe aggiornarsi da solo, se non lo fa è sufficiente andare (dopo aver collegato arduino) nel pannello di controllo -> sistema -> hardware -> Gestione periferiche -> porte (COM e LPT) e vedere a quale è associata la scheda arduino, solitamente è una COM maggiore di 3

  4. 4) a questo punto si connette il telescopio clikkando su "connetti"
  5. 5) ora si deve fare l'allineamento a due stelle clikkando su sync e seguendo la guida che si apre
  6. 6) fatto tutto quanto sopra si è pronti a cercare gli oggetti, click destro sull'oggetto desiderato -> "telescopio" -> "muovi alla posizione del cursore"
  7. 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... 😛

Lascia un commento

Photo

febbraio 1st

12:08
arduino

astronomia