SKETCH 5 - prime prove di GOTO
Finalmente ci siamo, abbiamo in questa pagina lo Sketch che permette di simulare il GOTO. Solo simulare? Certamente, non abbiamo ancora collegato encoder e motori. Ci arriveremo con un po' di pazienza.
Partendo dallo Sketch precedente, dove avevamo risolto un po' di problemi, sono state aggiunte delle nuove funzioni:
Finalmente ci siamo, abbiamo in questa pagina lo Sketch che permette di simulare il GOTO. Solo simulare? Certamente, non abbiamo ancora collegato encoder e motori. Ci arriveremo con un po' di pazienza.
Partendo dallo Sketch precedente, dove avevamo risolto un po' di problemi, sono state aggiunte delle nuove funzioni:
- goto_object( ) questa funzione, inserita nel loop, viene invocata solo se la differenza tra le coordinate del telescopio e del target sono diverse da zero. Effettua il confronto tra le coordinate e sceglie la via più breve per raggiungere il target invocando a sua volta la funzione preposta al movimento voluto.
- go_east( ) go_west( ) go_north( ) go_south( ) sono le funzioni che attualmente si occupano di incrementare o decrementare di un secondo alla volta le coordinate in gioco.
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * Created 27 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. * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ #include <stdlib.h> const int buttonAlign = 53; // pin in cui l'interruttore abilita l'allineamento con una stella int buttonState = 0; // variabile in cui arduino andrà a leggere lo stato logico di buttonAlign char input[20]; // array di char in cui verranno memorizzati i dati in ingresso char txAR[10]; // array di char in cui verranno memorizzati i dati in uscita char txDEC[11]; // array di char in cui verranno memorizzati i dati in uscita long ARtel, DECtel; // coordinate del telescopio espresse in secondi long ARtarget, DECtarget; // coordinate del target espresse in secondi long ARdiff, DECdiff; // differenza tra le coordinate del target e del telescopio long arHH, arMM, arSS; // coordinata AR del telescopio da trasmattere a stellarium char SIGNtel; // segno della DEC: 43 = + 45 = - long decDEG, decMM, decSS; // coordinata DEC del telescopio da trasmettere a stellarium void setup() { pinMode(buttonAlign, INPUT); Serial.begin(9600); ARtarget = ARtel = 22300; // coordinata iniziale di AR (in secondi) per visualizzare il reticolo del telescopio DECtarget = DECtel = 35105; // coordinata iniziale di DEC (in secondi) per visualizzare il reticolo del telescopio } void loop() { if(Serial.available()>0){ communication(); } ARdiff = ARtarget - ARtel; DECdiff = DECtarget - DECtel; if(ARdiff != 0 || DECdiff != 0){ goto_object(); } } //-------------------------------------------------------------------------------------------------------------------------------------------------------- void communication(){ int i=0; input[i++] = Serial.read(); delay(5); while((input[i++] = Serial.read()) != '#'){ delay(5); } input[i]='\0'; if(input[1]==':' && input[2]=='G' && input[3]=='R' && input[4]=='#'){ // con il comando #:GR# stellarium chiede l'invio della coordinata di AR transmitAR(); } if(input[1]==':' && input[2]=='G' && input[3]=='D' && input[4]=='#'){ // con il comando #:GD# stellarium chiede l'invio della coordinata di AR transmitDEC(); } if(input[1]==':' && input[2]=='Q' && input[3]=='#'){ // con il comando #:Q# stellarium chiede l'arresto dei motori // inviare l'arresto ai motori } if(input[0]==':' && input[1]=='S' && input[2]=='r'){ // con il comando :Sr stellarium invia la coordinata di AR getAR(); } if(input[0]==':' && input[1]=='S' && input[2]=='d'){ // con il comando :Sd stellarium invia la coordinata di DEC getDEC(); } if(input[0]==':' && input[1]=='M' && input[2]=='S' && input[3]=='#'){ // con il comando :MS# stellarium chiede se la rotazione è possibile Serial.print("0"); buttonState = digitalRead(buttonAlign); // legge se l'interruttore per l'allineamento iniziale è su ON o OFF if (buttonState == HIGH) { // se HIGH aggiorna le coordinate, altrimenti proseguià con il GOTO ARtel = ARtarget; DECtel = DECtarget; } } } //-------------------------------------------------------------------------------------------------------------------------------------------------------- void transmitAR(){ // trasmissione dati nella forma HH:MM:SS# arHH = ARtel/3600; // ricava le ore della coordinata AR del telescopio arMM = (ARtel-arHH*3600)/60; // ricava i minuti della coordinata AR del telescopio arSS = (ARtel-arHH*3600)-arMM*60; // ricava i secondi della coordinata AR del telescopio sprintf(txAR, "%02d:%02d:%02d#", int(arHH), int(arMM), int(arSS)); Serial.print(txAR); } //-------------------------------------------------------------------------------------------------------------------------------------------------------- void transmitDEC(){ // trasmissione dati nella forma sDDßMM:SS# (dove s è il segno + o -) (DECtel < 0) ? SIGNtel = 45: SIGNtel = 43; // controllo del segno della coordinata DEC del telescopio decDEG = abs(DECtel)/3600; // ricava i gradi della coordinata DEC del telescopio decMM = (abs(DECtel) - decDEG*3600)/60; // ricava i minuti della coordinata DEC del telescopio decSS = (abs(DECtel) - decDEG*3600) - decMM*60; // ricava i secondi della coordinata DEC del telescopio sprintf(txDEC, "%c%02d%c%02d:%02d#", SIGNtel, int(decDEG), 223, int(decMM), int(decSS)); Serial.print(txDEC); } //-------------------------------------------------------------------------------------------------------------------------------------------------------- void getAR(){ // riceve la coordinata AR del target nel formato :Sr HH:MM:SS# Serial.print("1"); ARtarget = (atol(input+4))*3600 + (atol(input+7))*60 + atol(input+10); // converte in secondi la coordinata AR del target } //-------------------------------------------------------------------------------------------------------------------------------------------------------- void getDEC(){ // riceve la coordinata AR del target nel formato :Sd +DDßMM:SS# Serial.print("1"); DECtarget = (atol(input+5))*3600 + (atol(input+8))*60 + atol(input+11); // converte in secondi la coordinata DEC del target if (input[4] == '-'){ // per una corretta conversione ha prelevato solo la parte numerale DECtarget *=(-1); // (cioè senza il segno) pertanto se la coordinata DEC è negativa, dopo } // la conversione in secondi viene moltiplica per -1 } //-------------------------------------------------------------------------------------------------------------------------------------------------------- void goto_object(){ if ((ARdiff >0 && ARdiff <= 43200) || (ARdiff <=(-43200))){ //confronta le coordinate di AR e sceglie la via più breve per raggiungere il target go_east(); } if ((ARdiff > 43200) || (ARdiff <0 && ARdiff > (-43200))){ go_west(); } if (DECtarget > DECtel){ //confronta le coordinate di DEC e sceglie la via più breve per raggiungere il target go_north(); } if (DECtarget < DECtel){ go_south(); } } //-------------------------------------------------------------------------------------------------------------------------------------------------------- void go_east(){ ARtel++; // in questo Sketch l'incremento è semplicemente aritmetico, in realtà deve provenire if(ARtel >= 86400){ // da una lettura dei dati dell'encoder, oppure per le montature sprovviste, dal ARtel = ARtel - 86400; // numero dei passi del motore (meno preciso perché non tiene conto del backlash } // dell'eventuale motoriduttore o degli step persi. // inviare comando al motore AR } //-------------------------------------------------------------------------------------------------------------------------------------------------------- void go_west(){ ARtel--; // in questo Sketch il decremento è semplicemente aritmetico, in realtà deve provenire if(ARtel < 0){ // da una lettura dei dati dell'encoder, oppure per le montature sprovviste, dal ARtel = ARtel + 86400; // numero dei passi del motore (meno preciso perché non tiene conto del backlash } // dell'eventuale motoriduttore o degli step persi. // inviare comando al motore AR } //-------------------------------------------------------------------------------------------------------------------------------------------------------- void go_north(){ // in questo Sketch l'incremento è semplicemente aritmetico, in realtà deve provenire DECtel++; // da una lettura dei dati dell'encoder, oppure per le montature sprovviste, dal // inviare comando al motore DEC // numero dei passi del motore (meno preciso perché non tiene conto del backlash // dell'eventuale motoriduttore o degli step persi. } //-------------------------------------------------------------------------------------------------------------------------------------------------------- void go_south(){ // in questo Sketch il decremento è semplicemente aritmetico, in realtà deve provenire DECtel--; // da una lettura dei dati dell'encoder, oppure per le montature sprovviste, dal // inviare comando al motore DEC // numero dei passi del motore (meno preciso perché non tiene conto del backlash // dell'eventuale motoriduttore o degli step persi. } //--------------------------------------------------------------------------------------------------------------------------------------------------------
ATTENZIONE: in data 30/03/2014 mi sono accorto di un bug nello Sketch che provocava un non corretto allineamento degli oggetti posti in prossimità dell'equatore celeste. Se il target si trovava ad una declinazione negativa inferiore al grado, non veniva letto il segno "meno". Il problema è stato risolto modificando leggermente la funzione get_DEC( ). Lo Sketch visibile sopra e il file per il download sotto sono già aggiornati. Mi scuso per il disguido e invito tutti a segnalarmi eventuali altri errori, grazie.
quinto_sketch.ino | |
File Size: | 11 kb |
File Type: | ino |
log_telescopeserver1_5.txt | |
File Size: | 56 kb |
File Type: | txt |
Scaricate lo Sketch e buon divertimento! Il prossimo passo riguarderà alcune modifiche per adattarlo alle montature equatoriali e altazimutali.