Jump to content

GOTO


gotoronyto2

Publicaciones recomendadas

Estimados, arme una montura Dobson con un GOTO basado en Arduino UNO a escala de modelo para luego llevarlo a cualquier tamaño.

El sistema funciona perfectamente para el hemisferio Norte, arrancando desde Andromeda, pero para usarlo en Bueno Aires, al colocarle la referencia de la CRUX, no funciona,

Ya probe las aproximaciones hasta 0° y esta todo bien, pero cuando se pasa a valores negativos (sur)., es cuando aparecen los problemas. Usado con Stellarium.

Muchas gracias. 

 

//ArduGoTo por David Vidal

#include <AFMotor.h>  //Incluye libreria externa
#include <stdlib.h>   //Incluye libreria externa

AF_Stepper motor_AR(48, 1);  // era 48 Pasos por vuelta, puede ser 64
AF_Stepper motor_DEC(48, 2); // era 48 Pasos por vuelta, puede ser 64

char datos[30];  //Datos leidos por el puerto serie

//Coordenadas del telescopio y del objetivo
char RA_telescopio[9];   //Convierte los datos leidos
char DEC_telescopio[10];
char RA_objetivo[9];
char DEC_objetivo[10];

long DEC_dd, DEC_mm, DEC_ss;   //Define el nombre de las variables
long RA_hh, RA_mm, RA_ss;

long RA_tel, DEC_tel, RA_obj, DEC_obj;

//Inicializamos los datos Espera una informacion
void setup() {
  Serial.begin(9600);                                     // Puerto Serie a 9600 bps Establece velocidad de transmision
  Serial.println("ArduGoTo v0.1");                        //Publicidad xD
  motor_AR.setSpeed(400);                                 //Creamos los motores de AR y DEC  antes 100       
  motor_DEC.setSpeed(400);  //antes 100
  //Esto hay que modificarlo, las coordenadas iniciales tienen que venir dadas
  
  RA_obj=RA_tel= long(42)*long(60)+long(42);          // antes original  (long(42)*long(60))+long(42) (hay que ajustar para la gcrux o la mimosa)hoy 
 
   
  DEC_obj=DEC_tel= long(41)*long(3600)+long(16)*long(60); //antes original long(41)*long(3600)+long(16)*long(60) se posiciona en Crux, arranca gira y para. y se puso signo -
}

void loop() {
  if(Serial.available()>0){
    leer_datos_serie();
  }
  comparar_coordenadas();
}

void incrementar_ra(){
  RA_tel++;
  if(RA_tel>=long(86400)){
    RA_tel=RA_tel-long(86400);
  }
  motor_AR.step(1, FORWARD, SINGLE);           //    
}

void decrementar_ra(){
  RA_tel--;
  if(RA_tel<long(0)){
    RA_tel=long(86400)+RA_tel;
  }
  motor_AR.step(1, BACKWARD, SINGLE);                 //
}

void incrementar_dec(){
  DEC_tel++;
  if(DEC_tel>long(324000)){ 
    DEC_tel=long(324000);   //antes 324000
  }
  motor_DEC.step(1, FORWARD,SINGLE ); // original DOUBLE y 1    
}

void decrementar_dec(){
  DEC_tel--;
  if(DEC_tel<long(-324000)){
    DEC_tel=long(-324000);         //antes -324000
  }
  motor_DEC.step(1, BACKWARD,SINGLE ); // original DOUBLE y 1  
}

void comparar_coordenadas(){
    if(RA_tel<RA_obj){
      incrementar_ra();  
    }
    if(RA_tel>RA_obj){
      decrementar_ra();
    }
    if(DEC_tel<DEC_obj){
      incrementar_dec();
    }
    if(DEC_tel>DEC_obj){
       decrementar_dec();
    } 
}

//Recoge los datos que haya en el puerto serie
void leer_datos_serie(){
  int i=0;
  datos[i++]=Serial.read();
  delay(5);
  while((datos[i++]=Serial.read())!='#'){       //Leo hasta el final del comando, que es un simbolo #
    delay(5);                                   //Espero 5ms por si aun no esta disponbile el siguiente dato
  }
  datos='\0';                                //Completo la cadena con el simbolo de fin de cadena, cosas del C
  parsear_datos();                              //Llamo a la funcion que interpreta los datos recibidos
}

//Interpreta los datos que se han recibido en el puerto serie
void parsear_datos(){

  // #:GR#  -> Obtener posicion RA del telecopio
  if(datos[1]==':' && datos[2]=='G' && datos[3]=='R' && datos[4]=='#'){
    RA_hh=RA_tel/long(3600);
    RA_mm=(RA_tel-(RA_hh*long(3600)))/long(60);
    RA_ss=RA_tel-(RA_hh*long(3600))-(RA_mm*long(60))  ; // original  RA_ss=RA_tel-(RA_hh*long(3600))-(RA_mm*long(60));
    sprintf(RA_telescopio, "%02d:%02d:%02d", int(RA_hh), int(RA_mm), int(RA_ss));
    Serial.print(RA_telescopio);
    Serial.print("#");
  }

  // #:GD#  -> Obtener posicion DEC del telescopio
  if(datos[1]==':' && datos[2]=='G' && datos[3]=='D' && datos[4]=='#'){
    DEC_dd=DEC_tel/long(3600);   //148560 -> 41 16
    DEC_mm=(DEC_tel-(DEC_dd*long(3600)))/long(60);
    DEC_ss=DEC_tel-(DEC_dd*long(3600))-(DEC_mm*long(60));
    sprintf(DEC_telescopio, "%+03d:%02d:%02d", int(DEC_dd), int(DEC_mm), int(DEC_ss));
    Serial.print(DEC_telescopio);
    Serial.print("#");  
  }

  // #:Q#   -> Detener el telescopio
  if(datos[1]==':' && datos[2]=='Q' && datos[3]=='#'){
  }                                                                        // <<<---- Esto hay que dejarlo bien

  // :Sr HH:MM:SS#  -> Direccion RA del objetivo
  if(datos[0]==':' && datos[1]=='S' && datos[2]=='r'){
    for(int i=0;i<8;i++)
      RA_objetivo=datos[i+4];                                    
    Serial.print("1");
    RA_obj=long(atoi(datos+4))*long(3600)+long(atoi(datos+7))*long(60)+long(atoi(datos+10));
  }
  
  // :Sd sDD*MM:SS# ->Direccion DEC del objetivo
  if(datos[0]==':' && datos[1]=='S' && datos[2]=='d'){
    for(int i=0;i<9;i++)
      DEC_objetivo=datos[i+4];                                        
    Serial.print("1");
    DEC_obj=long(atoi(datos+4))*long(3600)+long(atoi(datos+8))*long(60)+long(atoi(datos+11));
  }
  
  // :MS# -> Comenzar slew
  if(datos[0]==':' && datos[1]=='M' && datos[2]=='S' && datos[3]=='#'){
    Serial.print("0");                                                     // <<<---- Esto hay que dejarlo bien
  }

Enlace al comentario

Hola, seguramente el firmware no sea soportado para este hemisferio. Conozco el proyecto y se llama ARDUGOTO y es un proyecto español.

Si tenes ya todo montado lo que se refiere a motorización puedes echarle un ojo al picgoto de Angel que esta probado en su versión azimutal y funciona muy bien en ambos hemisferios.

Enlace al comentario

OK, ya vi ese y otros GOTO, lamentablemente voy a tener que implementar lo sugerido por vos. 

Ahora estoy con un nuevo problema, en el Stellarium, con Win7, no puedo accesar la solapa "control de telescopio" o otras mas. coca que no pasaba. Esto a pesar de haber reiinstalado tanto el Win como el Stellarium.

Abrazo y gracias.

Enlace al comentario
hace 10 minutos, gotoronyto2 dijo:

el Stellarium, con Win7

 

probaste lanzar el binario con "compatibilidad para" y probar con las versiones que surjan del menu?

 

otra alternativa es instalar virtualbox o el software de virtualizacion que mas te guste , e instalar una maquina virtual con win XP , linux , o el OS que sea con el que te funcione , y listo , lo controlas desde la virtual. Total, una virtual con esa unica funcion (controlar el tele con stelarium) , no va a requerir mas de 512 MB de ram y 10 GB de disco , como mucho 1 gb de ram si se arrastra.

 

 

 

Editado por clear
Enlace al comentario

Justamente los otros dias había visto que hay un proyecto que se llama OnStep, pero usa un Arduino Mega 2560: http://stellarjourney.com/index.php?r=site/equipment_onstep

Aparentemente ese proyecto tiene muchas funciones, y hasta tiene soporte bluetooth para usarlo con el celu. Simula ser un telescopio Meade. Creo que soporta altazimutales, pero investigá bien.

 

Ahí el codigo parece algo verde por el momento. Donde dice:

 

RA_obj=RA_tel= long(42)*long(60)+long(42);
DEC_obj=DEC_tel= long(41)*long(3600)+long(16)*long(60);

 

Pareciera ser para ponerle estimo las coordenadas del objeto al que vas a estar apuntando cuando prendas el goto, pero no me cierran esos valores. En qué se supone que tiene que estar? En segundos de arco? Si es así, RA tendría que ser algo como SEG + MIN*60 + GRADOS*3600, tanto para RA como para DEC. De hecho, en la rutina donde le pasan las coordenadas para ir, ese pareciera ser el caso (aunque igual dice ":Sr HH:MM:SS#", y si HH fueran horas, no va a ser lo mismo que grados, aunque en el codigo el calculo lo hace como si fueran grados).

 

En fin, si es en grados, la RA de mimosa es 12h 48m 47.87s y la DEC es -59 grados 47m 10.9s

RA = 12*3600 + 48*60 + 48 = 46128

DEC = -1 * (59*3600 + 47*60 + 11) = -215231

 

No sé si me convence como veo la conversión hecha en el codigo, en la parte que dice "// :Sd sDD*MM:SS# ->Direccion DEC del objetivo". Tal vez eso no funcione bien con ningun objeto con DEC negativa, aunque me parece un poco guaso que sea así. Tampoco veo ningún codigo de (des)aceleración (los motores no pueden arrancar y parar en seco, si el objetivo es lograr velocidades decentes). Qué tan probado está este proyecto?

EDIT: olvidate, ahí veo que dice "ArduGoTo v0.1", eso es recontra-alfa, mejor echale un vistazo al proyecto OnStep ese que te pasé mas arriba. No solo eso, sino que está recontra-abandonado, mirá el ToDo: https://sites.google.com/site/ardugoto/todo

 

Pensaste en hacer "Digital Setting Circles" (Push-To) en vez de un GOTO? Para un dobson debe ir perfecto ese tipo de sistema. Además es muy simple, por ejemplo SkySafari soporta un tipo de telescopio que es "Basic Encoder System", que solo le pregunta al telescopio cuanto es el maximo de cada encoder, y cual es el valor actual de cada uno. Eso debe ser hiper-simple de implementar en arduino. Creo que en la pagina de SkySafari estaban los detalles. Habría que ver si Stellarium soporta lo mismo, tal vez sea algo bastante usual.

 

Saludos

Editado por fsr

Fernando

Enlace al comentario

Estimados, ya he solucionado el problema para que pueda dar inicio al Stellarium desde CRUX, sin problemas, con un proyecto de Ezio de Cian (de.zeta@gmail.com), al que le he incorporado las funciones de Go to objeto.

Ahora que todo funciona, mi nueva cuestion es que poseo 2 motores con paso de aproximadamente 5º para AR y DEC, y ese valor es muy grande para mi mecanica, no teniendo en el momento posibilidad de alterar las relaciones de reduccion. Como es posible "hacerle comprender "  desde el Arduino que en lugar de por ejemplo 64 pasos para una revolucion, este envia a la salida para los motores algo asi como 100/200 o 300 pasos, con lo que lograria que los desplazamientos finales sean menores a los 5º ?

Muchas gracias

Angel

Enlace al comentario

Te agradezco la pronta respuesta, pero no se si fui lo suficientemente claro, mi lenguaje es de ingenieria y no de informatica.

El sistema me funciona y hasta sin encoders, pero tan solo quiero saber por donde entra y/o sale la informacion acerca de la cantidad de pasos que se le mandan al motor, y como alterar el sketch para que convierta los pasos de datasheet del motor a un valor mayor.

Muchas gracias desde ya por tu paciencia.

Angel

 

Enlace al comentario

Bancá, vos habías dicho que eso era para un dobson? Ese codigo dice RA y DEC por todos lados. Es un proyecto para monturas ecuatoriales, no te va a servir. Necesitás un proyecto que sea para altazimutales.

Con que está harcodeado me refiero a que en vez de estar hecho para ser razonablemente configurado, están todos los valores metidos ahí en el código. Por ejemplo, se vé que el numero de pasos maximos en RA era de 86400 y en DEC parece que va entre 324000 y -324000.

Ese software está hecho para algún tipo de telescopio específico, con una reducción y pasos del motor específicos, montura Ecuatorial y no es mas que una versión muy inicial de un goto y lo abandonaron al toque, o sea: está hiper-incompleto. Incluso no veo ni que tenga seguimiento, o sea que no se mueve para que los objetos se queden quietos a medida que la tierra rota.

Tampoco tiene aceleración. Que te parece que va a pasar si querés que el motor vaya a 300 RPM y después pare de golpe? Nunca va a poder parar en el lugar que se supone, y lo mismo para acelerar. No puede ir de 0 a 300 RPM instantáneamente.

Ese proyecto no te sirve, necesitás algo para altazimutal, y que esté terminado.

Fernando

Enlace al comentario

Bueno, de cualquier manera te agradezco tu colaboracion, pero yo no necesito 300RPM, sino 200 o 300 "pasos" para no tener que entrar un otra reduccion mecanica.

En resumen, quiero llegar a la siguiente solucion:

Si el Stellarium le envia los datos para que el  Arduino precese por ejemplo 200 pasos, que le reenvie al motor con AFMotor 100 pasos, o algo parecido, de ese modo se lograria un desplazamiento en vueltas o grados en un valor menor, y no una velocidad menor. 

Como comentario quiero usar este engendro para iniciar a mis nietos tan solo la posicion de elementos en el cielo.

Si no soy lo suficientemente claro, lamento profundamente, tendre que hacer algo "con la uña", como se decia en mis tiempos de Facultad.

Un abrazo

Enlace al comentario

Ese codigo emula un telescopio meade. El software de la compu sólo le envia las coordenadas de RA y DEC, que las reconoce con el siguiente codigo:

 

// :Sr HH:MM:SS#  -> Direccion RA del objetivo
  if(datos[0]==':' && datos[1]=='S' && datos[2]=='r'){
    for(int i=0;i<8;i++)
      RA_objetivo=datos[i+4];                                    
    Serial.print("1");
    RA_obj=long(atoi(datos+4))*long(3600)+long(atoi(datos+7))*long(60)+long(atoi(datos+10));
  }
  
  // :Sd sDD*MM:SS# ->Direccion DEC del objetivo
  if(datos[0]==':' && datos[1]=='S' && datos[2]=='d'){
    for(int i=0;i<9;i++)
      DEC_objetivo=datos[i+4];                                        
    Serial.print("1");
    DEC_obj=long(atoi(datos+4))*long(3600)+long(atoi(datos+8))*long(60)+long(atoi(datos+11));
  }

 

Cuando le preguntan en qué posición está el telescopio, la calcula con el siguiente codigo:

 

// #:GR#  -> Obtener posicion RA del telecopio
  if(datos[1]==':' && datos[2]=='G' && datos[3]=='R' && datos[4]=='#'){
    RA_hh=RA_tel/long(3600);
    RA_mm=(RA_tel-(RA_hh*long(3600)))/long(60);
    RA_ss=RA_tel-(RA_hh*long(3600))-(RA_mm*long(60))  ; // original  RA_ss=RA_tel-(RA_hh*long(3600))-(RA_mm*long(60));
    sprintf(RA_telescopio, "%02d:%02d:%02d", int(RA_hh), int(RA_mm), int(RA_ss));
    Serial.print(RA_telescopio);
    Serial.print("#");
  }

  // #:GD#  -> Obtener posicion DEC del telescopio
  if(datos[1]==':' && datos[2]=='G' && datos[3]=='D' && datos[4]=='#'){
    DEC_dd=DEC_tel/long(3600);   //148560 -> 41 16
    DEC_mm=(DEC_tel-(DEC_dd*long(3600)))/long(60);
    DEC_ss=DEC_tel-(DEC_dd*long(3600))-(DEC_mm*long(60));
    sprintf(DEC_telescopio, "%+03d:%02d:%02d", int(DEC_dd), int(DEC_mm), int(DEC_ss));
    Serial.print(DEC_telescopio);
    Serial.print("#");  
  }

 

Y por lo que veo, siempre que la posición del telescopio es distinta a la del objeto, incrementa o decrementa RA y DEC de a 1 (función comparar_coordenadas)

 

También tiene unas funciones incrementar y decrementar ra y dec, que se fijan que los valores de RA y DEC no se pasen de los limites. Por ejemplo, se vé que en el telescopio que lo iban a usar, una vuelta entera en RA eran 86400 pasos.

 

Pero no sé si leiste la parte donde te comento que esto obviamente es para monturas ecuatoriales, y vos lo querés usar con un Dobson, que es una altazimutal? Se entiende que por lo tanto no es posible que esto funcione?

 

Mejor buscate un proyecto de "digital setting circles" (ponerle encoders al dobson para que el software sepa a donde está apuntando). Recuerdo que con Sky Safari, por ejemplo, había un modo muy simple, que se llamaba creo que "simple encoder", o algo así, que sólo le preguntaba al principio a tu micro cuantos "pasos" de encoder daba en una vuelta de RA y de DEC, y después se la pasaba preguntándote en que valores estaban actualmente los encoders y Sky Safari después se encargaba de todo lo demás, calcular donde estaba apuntando, el tema de la alineación, etc. Supongo que para stellarium habrá algo similar, vas a tener que investigarlo un poco.

 

Saludos

  • Like 1

Fernando

Enlace al comentario

No es exactamente lo mismo pero.... no estaria mal que le eches un ojo al proyecto y su codigo.

http://www.simonbox.info/index.php/astronomy

 

Saludos

Editado por Lucho2000

Luis

SkyWatcher 130/650 - Oculares: SP 25mm, BST 18mm, BST 12mm, BST 8mm, BST 5mm - Barlow: SW 2x acromático

Enlace al comentario

Crear una cuenta o conéctate para comentar

Tienes que ser miembro para dejar un comentario

Crear una cuenta

Regístrese para obtener una cuenta nueva en nuestra comunidad. ¡Es fácil!

Registrar una nueva cuenta

Conectar

¿Ya tienes una cuenta? Conéctate aquí.

Conectar ahora
×
×
  • Crear nuevo...