SKETCH 3 - allineamento con stellarium
Questa volta ho modificato lo sketch per poter aggiornare le coordinate del telescopio a cui inizialmente è puntato, cioè per allineare il telescopio con stellarium.
Dopo la messa in stazione del telescopio potevamo inserire le coordinate iniziali attraverso una tastiera, puntando ad esempio una stella nota e inserendo i suoi valori di AR e DEC, ma perché non farlo attraverso stellarium evitando così l'uso della tastiera?
Non mi sembra esista un comando specifico in stellarium, quindi, ho sfruttato la funzione GOTO con i tasti ctrl 1. In questo modo stellarium invia ad arduino le coordinate della stella che abbiamo evidenziato cliccandoci sopra con il mouse. Per evitare che arduino acquisisca questi dati come un target da raggiungere con il GOTO (dato che il comando è lo stesso), ho collegato ad un ingresso digitale di arduino (il numero 53) un piccolo deviatore. Alla ricezione delle coordinate, se l'ingesso digitale è a livello logico HIGH, arduino provvederà ad aggiornare i suoi valori di AR e DEC allineandosi con stellarium, altrimenti proseguirà con il GOTO. ATTENZIONE: quest'ultima funzione (il GOTO) non è ancora presente in questo Sketch.
Prima di analizzare lo Sketch vediamo il materiale occorrente e i collegamenti da effettuare su arduino. Sono banali, ma questa vuole essere una guida chiara per tutti. Come vedete è necessario collegare a massa l'ingresso 53 di arduino attraverso una resistenza di pull-down. Va benissimo la solita resistenza da 10kΩ 1/4W vista nelle varie esperienze di arduino. Non usate resistenze di valore inferiore, perché aumenterebbe la corrente circolante nei terminali di arduino.
Quando il deviatore chiude il circuito, ci sarà una corrente che circolerà attraverso la resistenza e l'ingresso 53 si troverà a +5V, quindi a livello logico 1, cioè HIGH.
Aprendo il circuito, non vi sarà alcuna circolazione di corrente e l'ingresso 53 si troverà forzato a massa attraverso la resistenza di pull-down, quindi avremo il livello logico 0, cioè LOW.
Dopo la messa in stazione del telescopio potevamo inserire le coordinate iniziali attraverso una tastiera, puntando ad esempio una stella nota e inserendo i suoi valori di AR e DEC, ma perché non farlo attraverso stellarium evitando così l'uso della tastiera?
Non mi sembra esista un comando specifico in stellarium, quindi, ho sfruttato la funzione GOTO con i tasti ctrl 1. In questo modo stellarium invia ad arduino le coordinate della stella che abbiamo evidenziato cliccandoci sopra con il mouse. Per evitare che arduino acquisisca questi dati come un target da raggiungere con il GOTO (dato che il comando è lo stesso), ho collegato ad un ingresso digitale di arduino (il numero 53) un piccolo deviatore. Alla ricezione delle coordinate, se l'ingesso digitale è a livello logico HIGH, arduino provvederà ad aggiornare i suoi valori di AR e DEC allineandosi con stellarium, altrimenti proseguirà con il GOTO. ATTENZIONE: quest'ultima funzione (il GOTO) non è ancora presente in questo Sketch.
Prima di analizzare lo Sketch vediamo il materiale occorrente e i collegamenti da effettuare su arduino. Sono banali, ma questa vuole essere una guida chiara per tutti. Come vedete è necessario collegare a massa l'ingresso 53 di arduino attraverso una resistenza di pull-down. Va benissimo la solita resistenza da 10kΩ 1/4W vista nelle varie esperienze di arduino. Non usate resistenze di valore inferiore, perché aumenterebbe la corrente circolante nei terminali di arduino.
Quando il deviatore chiude il circuito, ci sarà una corrente che circolerà attraverso la resistenza e l'ingresso 53 si troverà a +5V, quindi a livello logico 1, cioè HIGH.
Aprendo il circuito, non vi sarà alcuna circolazione di corrente e l'ingresso 53 si troverà forzato a massa attraverso la resistenza di pull-down, quindi avremo il livello logico 0, cioè LOW.
Passiamo ad analizzare lo Sketch.
All'inizio vengono dichiarate delle variabili e una costante: buttonAlign. Le variabili che iniziano con "rx" sono quelle adibite alla ricezione delle coordinate in arrivo da stellarium che serviranno sia per il GOTO, sia per l'allineamento del telescopio.
All'avvio del programma, stellarium, come già visto in precedenza, chiede le coordinate di AR e DEC ad arduino e rende visibile il reticolo del telescopio nei pressi del braccio di Orione, ovvero alle coordinate AR = 06h 11m 40s e DEC = + 9° 45' 05'', perché impostate di default nello Sketch.
Supponiamo, però, che il telescopio sia puntato in realtà verso un'altra stella presa come riferimento, Sirio ad esempio. Per procedere all'allineamento con stellarium, spostiamo il deviatore in modo da portare a livello logico HIGH l'ingresso 53 di arduino.
A questo punto selezioniamo con il mouse la stella Sirio su stellarium, appariranno in alto a sinistra sullo schermo le sue coordinate.
Premiamo ctrl 1 e stellarium invierà nella seriale il seguente codice #:Q#:Sr 06:45:08# dove con la prima parte, cioè #:Q# ordina ai motori del telescopio di fermarsi, mentre la seconda parte :Sr 06:45:08# corrisponde alla coordinata di AR della stella presa come riferimento, cioè del target (in questo esempio Sirio).
ATTENZIONE: anche lo spazio compreso tra la "r" e "0" è un carattere, quindi bisogna tenerne conto! Questo probabilmente è un bug della versione attuale di stellarium (attualmente uso la 0.12.4) perché nel protocollo LX200 lo spazio non c'è :SrHH:MM:SS#r e questo mi ha creato qualche problema prima di capire dov'era l'errore. Stellarium si aspetta in risposta il numero "1" come conferma di avvenuta ricezione. Senza questo segnale stellarium non invierà il valore della coordinata di DEC.
A segnale ricevuto stellarium invia la coordinata di DEC della stella Sirio con il codice :Sd -16ß43:16# (attenzione anche qui allo spazio tra la "d" e il segno "-", sempre lo stesso problema di prima, nel protocollo LX200 non c'è lo spazio). Come già accennato, questi bug, compreso quello relativo al simbolo ß al posto di * per la declinazione, sono già stati segnalati, pertanto se nelle prossime versioni del programma verranno corretti, bisognerà modificare gli Sketch per arduino.
Anche in questo caso dobbiamo programmare arduino a rispondere con un "1" per confermare la ricezione della coordinata.
Arduino non può già aggiornare le coordinate perché stellarium invia subito un altro codice :MS# con il quale ordina al telescopio di ruotare verso le nuove coordinate.
Dopo l'invio di questo codice stellarium si aspetta una risposta da arduino, più precisamente il numero "0" se la rotazione è possibile, oppure i numeri "1" o "2" seguiti da una stringa di testo, se la rotazione non è possibile perché l'oggetto si trova sotto l'orizzonte. Tale stringa di testo sarà scritta nel file di log e potrà casomai essere inviata anche a un pannello LCD di arduino.
Come già detto in precedenza in questo Sketch non è presente alcun codice per la funzione GOTO, pertanto arduino risponderà a questa domanda sempre "0" (infatti penso che nessuno effettui l'allineamento del telescopio con una stella sotto l'orizzonte...) e provvederà ad aggiornare le coordinate di AR e DEC perché leggendo l'ingresso digitale 53 troverà il livello logico HIGH.
NOTA: in questa parte dello Sketch non ho inserito un sistema di antirimbalzo finalizzato, durante la lettura dello stato logico dell'ingresso 53, a non considerare gli impulsi spurii generati nella commutazione del deviatore. Questa scelta è motivata dalla lenta sequenza delle operazioni di allineamento che permette di trascurare tali disturbi.
A questo punto stellarium inizia nuovamente a chiedere ad arduino le coordinate di AR prima e di DEC poi, con il solito ciclo che già conosciamo.
Le coordinate questa volta sono aggiornate e dopo qualche secondo (la cosa non è istantanea) stellarium posizionerà il reticolo del telescopio sul target voluto, in questo caso la stella Sirio.
Allineamento effettuato! Ora possiamo spostare il deviatore per portare a livello logico LOW l'ingresso digitale 53.
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * Created 22 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. * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ const int buttonAlign = 53; // pin in cui l'interruttore abilita l'allineamento con una stella int buttonState = 0; int arHH = 6; // AR ore int arMM = 11; // AR minuti int arSS = 40; // AR secondi char decSIGN = 43; // segno della DEC: 43 = + 45 = - int decDEG = 9; // DEC gradi int decMM = 45; // DEC minuti int decSS = 5; // DEC secondi int rxarHH; // AR ore del target int rxarMM; // AR minuti del target int rxarSS; // AR secondi del target char rxdecSIGN; // segno della DEC del target int rxdecDEG; // DEC gradi del target int rxdecMM; // DEC minuti di grado del target int rxdecSS; // DEC secondi di grado del target String inputString = ""; //dichiaro una stringa vuota per memorizzare i dati in entrata void setup() { pinMode(buttonAlign, INPUT); Serial.begin(9600); } void loop() { while (Serial.available()>0){ // ottiene byte in entrata char inChar = Serial.read(); // legge il byte e lo memorizza nella variabile inChar inputString += String(inChar); // aggiunge il byte corrente a inputString delay(5); } if (inputString == "#:GR#"){ // se il comando ricevuto da stellarium è #:GR# (coordinata di AR) if (arHH < 10){ // se ARHH < 10 invia uno zero perché LX200 vuole il formato HH:MM:SS Serial.print ("0"); } Serial.print (arHH); // invia a stellarium il valore delle ore della coordinata AR Serial.print (":"); if (arMM < 10){ // se ARMM < 10 invia uno zero perché LX200 vuole il formato HH:MM:SS Serial.print ("0"); } Serial.print (arMM); // invia a stellarium il valore dei minuti della coordinata AR Serial.print (":"); if (arSS < 10){ // se ARSS < 10 invia uno zero perché LX200 vuole il formato HH:MM:SS Serial.print ("0"); } Serial.print (arSS); // invia a stellarium il valore dei secondi della coordinata AR Serial.print ("#"); inputString = ""; // cancella la stringa } if (inputString == "#:GD#"){ // se il comando ricevuto da stellarium è #:GD# (coordinata di DEC) Serial.print ((char)decSIGN); // invia a stellarium il segno della coordinata DEC if (decDEG < 10){ // se DECDEG < 10 invia uno zero perché LX200 vuole il formato + - DEG:MM:SS Serial.print ("0"); } Serial.print (decDEG); // invia a stellarium il valore dei gradi della coordinata DEC Serial.print ((char)223); // char(223) si usa al posto di * per indicare il grado ° altrimenti ci sarà un errore nel file di log. if (decMM < 10){ // se DECMM < 10 invia uno zero perché LX200 vuole il formato + - DEG:MM:SS Serial.print ("0"); } Serial.print (decMM); // invia a stellarium il valore dei minuti di grado della coordinata DEC Serial.print (":"); if (decSS < 10){ // se DECSS < 10 invia uno zero perché LX200 vuole il formato + - DEG:MM:SS Serial.print ("0"); } Serial.print (decSS); // invia a stellarium il valore dei secondi di grado della coordinata DEC Serial.print ("#"); inputString = ""; // cancella la stringa } /* questa parte del programma serve per ricevere le coordinate di una una stella presa come riferimento premendo su stellarium i tasti ctrl-1 ATTENZIONE: questa funzione serve in realtà per il GOTO, però con um accorgimento la sfruttiamo per impostare le coordinate del telescopio durannte la messa in stazione */ // ricezione della coordiata di AR if (inputString.substring(0,4) == "#:Q#"){ // con il comando #:Q# stellarium chiede l'arresto dei motori // inviare l'arresto ai motori } if (inputString.substring(4,7) == ":Sr"){ rxarHH = inputString.substring(8,10).toInt(); // preleva solo HH dalla stringa (il comando .toInt() converte il valore in un intero) rxarMM = inputString.substring(11,13).toInt(); // preleva solo MM dalla stringa (il comando .toInt() converte il valore in un intero) rxarSS = inputString.substring(14,16).toInt(); // preleva solo SS dalla stringa (il comando .toInt() converte il valore in un intero) inputString = ""; // cancella la stringa Serial.print ("1"); // invia "1" per avvisare stellarium di aver ricevuto le coordiate } // ricezione della coordiata di DEC if (inputString.substring(0,3) == ":Sd"){ (inputString.substring(4,5)=="+") ? rxdecSIGN = 43 : rxdecSIGN = 45; //if else in versione contratta: (espressione) ? se vero : se falso rxdecDEG = inputString.substring(5,7).toInt(); // preleva solo i gradi dalla stringa (il comando .toInt() converte il valore in un intero) rxdecMM = inputString.substring(8,10).toInt(); // preleva solo minuti dalla stringa (il comando .toInt() converte il valore in un intero) rxdecSS = inputString.substring(11,13).toInt(); // preleva solo secondi dalla stringa (il comando .toInt() converte il valore in un intero) inputString = ""; // cancella la stringa Serial.print ("1"); // invia "1" per avvisare stellarium di aver ricevuto le coordiate } if (inputString == ":MS#"){ Serial.print ("O"); buttonState = digitalRead(buttonAlign); // legge se l'interruttore per l'allineamento iniziale è su ON o OFF if (buttonState == HIGH) { // se ON aggiorna le coordinate, altrimenti proseguià con il GOTO (non ancora presente in questo Sketch) decSIGN = rxdecSIGN; arHH = rxarHH; // aggiorna le variabili arMM = rxarMM; // aggiorna le variabili arSS = rxarSS; // aggiorna le variabili decDEG = rxdecDEG; // aggiorna le variabili decMM = rxdecMM; // aggiorna le variabili decSS = rxdecSS; // aggiorna le variabili } inputString = ""; // cancella la stringa } }
terzo_sketch.ino | |
File Size: | 7 kb |
File Type: | ino |
log_telescopeserver1_3.txt | |
File Size: | 13 kb |
File Type: | txt |
Qui sotto potete vedere la sequenza di foto dell'aggiornamento delle coordinate per l'allineamento del telescopio (cliccate sulle immagini per ingrandirle)
Dopo l'avvio di stellarium è visibile il reticolo del telescopio nel punto previsto dalle coordinate di default scritte nello Sketch
Supponendo che il telescopio sia in realtà puntato verso la stella Sirio, clicchiamo su di essa e azioniamo il deviatore su arduino
|
Cliccando sul reticolo del telescopio, appare in alto a sinistra il riquadro con le sue coordinate di AR e DEC
Premendo ctrl 1 arduino aggiornerà le coordinate e dopo alcuni secondi stellarium sposterà il reticolo del telescopio sulla stella Sirio.
Allineamento completato! |
Siamo ora pronti per evolvere un'altra volta lo Sketch...