Motorizacion de un Telescopio Dobson casera con motores de impresora EPSON

Ya...ese es el problema amigo...!!

La pregunta me vino a la cabeza considerando emplear un Mega.

Realmente, creo que debería usar un Mega. Hay proyectos para los que me servirían muy bien (ONSTEP, BOIANA, etc..) usar el Mega y dejarme de comerme el coco...pero debo ser masoquista...

Una duda me surge respecto al uso de la Wiichuck.... entiendo que ésta se conecta por i2c ..no?

Exactamente, fue lo que te puse antes.
Si necesitas varios Seriales, no pierdas el tiempo y usas un MEGA. SI necesitas mas potencia un DUE.

Hola amigos...

Cuarentena día...ni me acuerdo.....Voy avanzando con el código y me encuentro un error al compilar..
Cuando compilaba el código, antes iba todo bien,, pero nada más que tenía esto completado

void setmStepsMode(char* P, int mod)

Pero cuando añadí otro void

void ChangeStepMode () {

Me aparece el siguiente error al compilar..

E:\Proyectos Arduino\Telescopio__V3\Telescopio__V3.ino:259:23: warning: ISO C++ forbids converting a string constant to 'char*' [-Wwrite-strings]

  setmStepsMode ("X",1);

Os copio el código...Que estoy haciendo mal ????

void ChangeStepMode () {
  
  Stm = (Stm + 1) % 4;

  switch (Stm){
    case 0:
          setmStepsMode ("X",1);
          setmStepsMode ("Y",1);
          break;
    case 1:
          setmStepsMode ("X",4);
          setmStepsMode ("Y",4);
          break;
    case 2:
          setmStepsMode ("X",16);
          setmStepsMode ("Y",16);
          break;
    case 3:
          setmStepsMode ("X",32);
          setmStepsMode ("Y",32);
          break;                  
  }
}


void setmStepsMode(char* P, int mod){    
// P means the axis: RA or DEC; mod means MicroSteppping mode: x32, x16, x8....
// setmStepsMode(R,2) - means RA with 1/2 steps; setmStepsMode(R,4) - means RA with 1/4 steps
/* Configure type of Steps 
DRV8825   MODE1   MODE2   MODE3
Full       Low      Low    Low ===== M1
1/2        High     Low    Low   ==> not poss with my pin config
1/4 step   Low      High   Low ===== M4
1/8 step   High     High   Low   ==> not poss with my pin config 
1/16 step  Low      Low    High ==== M16
1/32 step  Low      High   High ==== M32
*/

  if (P=="X"){  // Set RA modes
    if (mod == 1){                      // Full Step

        digitalWrite(XMS2, LOW);
        digitalWrite(XMS3, LOW);
    }

    if (mod == 4){                      // 1/4 Step
  
        digitalWrite(XMS2, HIGH);
        digitalWrite(XMS3, LOW);

    }

    if (mod == 16){                      // 1/16 Step

        digitalWrite(XMS2, LOW);
        digitalWrite(XMS3, HIGH);
     }
    if (mod == 32){                      // 1/32 Step
        
        digitalWrite(XMS2, HIGH);
        digitalWrite(XMS3, HIGH);

    }
    RA_mode_steps = MICROSteps/mod;
  }
  if (P=="Y"){  // Set RA modes
    if (mod == 1){                      // Full Step

        digitalWrite(YMS2, LOW);
        digitalWrite(YMS3, LOW);

    }

    if (mod == 4){                      // 1/4 Step

        digitalWrite(YMS2, HIGH);
        digitalWrite(YMS3, LOW);

    }

    if (mod == 16){                      // 1/16 Step

        digitalWrite(YMS2, LOW);
        digitalWrite(YMS3, HIGH);

    }
    if (mod == 32){                      // 1/32 Step

        digitalWrite(YMS2, HIGH);
        digitalWrite(YMS3, HIGH);

    }
    DEC_mode_steps = MICROSteps/mod;
  }
  delayMicroseconds(5);   // Makes sure the DRV8825 can follow
}

Solucionado... yo mismo !!

Cambiar char* P por const char* P.....

Necesito una ayuda !!

Os pego el código antes de probarlo con la nueva placa.
He hecho una pequeña versión adaptando ésta a una protoboard y veo que al conectarla a Stellarium, no coge la posición del telescopio.

No se que estoy haciendo mal… Las comunicaciones estan en una pestaña aparte y los cálculos en la pestaña principal…

Adjunto el manual del protocolo LX200 en el que me baso…

En principio, no es muy difícil…

Por el Serial me requiere:
GR# (Obtener Ascensión recta)
GD# (Declinación)

Se le responde por el mismo serial en el formato y debería coger la información… pero no lo hace…

Telescopio__V3.zip (7.03 KB)

Hola a todos !!

Problema !!!

Cuando uso funciones trigonométricas complejas (Seno, Coseno, etc…) que impliquen operaciones con estos operadores, me salen errores del orden de grados a veces…

Normalmente las almaceno como double o float… pero si hago las mismas operaciones con excel o calculadora me salen errores…

Uso siempre angulos en Radianes…

Por ejemplo…
====== EN esta Operacion======
sinδ = sina * sinφ +cosa * cosφ * cosA * sinδ = 0.394 254
Take inverse sin to find δ . δ = 23.219 444 degrees

======Este Codigo me devuelve

     float Float_AZ = 283.2710277;            
     float Float_ALT =  19.051011   ;    
     double cosAzm = cos (Float_AZ/Rad);
     double Sin_DEC = sin ((  sin (Float_ALT/Rad) * Sin_Lat )  +  ( cos (Float_ALT/Rad) * Cos_Lat * 
      cosAzm ) ) ;
     Serial.print ("Sin_DEC=");
     Serial.println (Sin_DEC);
     double Actual_DEC = ( asin ( Sin_DEC) )* Rad ; // Actual Declination in degrees

==============

Me devuelve
Sin_DEC=0.38 ========> en vez de 0.394
Sin_DEC degrees=22.39====> en vez de 23.219 (1 Grado de Error !!!)

Esto en operaciones acumuladas me mete unos errores bastante grandes !!!

Por qué ocurre ???

Como Evitarlo ???

Que tal mOjitO? supongo que a estas alturas ya habras resuelto el probrema de las funciones.
Sino es asi, te comento que estuve probando que tanta diferencia hay entre arduino y las calculadas en visual studio y de los 4 ejemplos de coordenadas que les puse las 4 declinaciones obtenidas tenian un error no mayor a 0.04 seg de arco esto es 0.04/3600 grados.
Dicho esto, no se como te pudo dar 1 grado de error.
Saludos.

Estoy desesperado…
Busco y no encuentro la respuesta, pero me parece recordar alguna vez algo en alguna parte que no encuentro…

Problema Nuevo !!!

A la placa antigua le he intentado conectar el wiichuck (I2c) (A4,A5,+3.3v y GND). La controla un Nano y tb lleva conectado un Joystick en A6 y A7. los DRV van conectados a los pines 9,10,11 y 12 (Step y DIR) más los digitales 3y4 para microstep.

Pues bien… cuando activo los comandos de la wiichuck (en el void loop), los steppers empiezan a hacer un silbido y casi que no funcionan.

OJO ! El problema NO está relacionado con el hardware (ocurre lo mismo si está enchufado el wiichuck o desconectado). Tampoco influye que estén cargadas las librerías “Wire” y “wiichuck”…

En cuanto desactivo el código de control del wiichuck del Void Loop se acaba el problema !!.

Pregunto…

Es posible que al recibir por I2C esté interfiriendo con pines digitales de los DRV´s ??

El ruido es como si el Nano no acertara a controlar los pines Step o Dir…es parecido a cuando conectas mal los steppers al driver…

Puede afectar el recibir señal I2C a algún reloj interno en los digitales ???

Es lo único que se me ocurre…

//ACORDE A LA PLACA  Telescopecontrol 1


#include <Wire.h>
#include <Wiichuck.h>
#define Xdir_pin 9   // Pin 9 connected to Direction pin on DRV-X
#define Xstep_pin 10  // Pin 10 connected to Steps pin on DRV-X
#define Ydir_pin 11   // Pin 11 connected to Direction pin on DRV-Y
#define Ystep_pin 12  // Pin 12 connected to Steps pin on on DRV-Y

#define X_pin A7    // Pin A2 connected to joystick X axis
#define Y_pin A6    // Pin A1 connected to joystick Y axis

Wiichuck chuck;
boolean WiiChuckPresent;

int X; 
int Y; 
int PosStepX=0; // Facing North
int PosStepY=DEC_90; // Facing Up (+90Deg)
// Posicion inicial Destino en Pasos
int TargetX=0;
int TargetY=0;
bool Move_e,Move_w,Move_u,Move_d;
bool TelescopeisTracking=false;
bool TelescopeisSlewing=false;
bool SilentMode = false ;
int errX = 0 ; // To measure align errors
int errY = 0 ;
unsigned int OrigenX = 0 ;
unsigned int OrigenY = 0 ;
bool GD_Request=false ;
bool GR_Request=false ;
bool JoyStickPresent=true;

void setup() {

Serial.begin(9600);
SinLat = sin (OBSERVATION_LATTITUDE/Rad);
CosLat = cos (OBSERVATION_LATTITUDE/Rad);     
// CONTROL DE DRV´S  
   pinMode(2, OUTPUT);
   pinMode(3, OUTPUT);
   pinMode(Xdir_pin, OUTPUT);
   pinMode(Xstep_pin, OUTPUT);  
   pinMode(Ydir_pin, OUTPUT);
   pinMode(Ystep_pin, OUTPUT);
   
   digitalWrite(2,LOW );   // STEPMODE 1/4 MICROSTEPS AT START UP
   digitalWrite(3,HIGH );
//Wiichuck
     chuck.init();
     delay(5); 
     chuck.calibrate();
     delay(10);
     WiiChuckPresent=true;        

//joystick
//   pinMode(X_pin, INPUT);  
//   pinMode(Y_pin, INPUT);
JoyStickPresent=true;
// Ponemos a false todos los Movimientos
Move_e = false;
Move_w = false;
Move_u = false;
Move_d = false;   
}

// ============================================= LOOP==========================

void loop() {
// COMANDOS DE STELLARIUM
  if (Serial.available()>0){
  BT_COMMAND_STR = Serial.readStringUntil('#');
 Comunicaciones();
  }
// MOVIMIENTO MANUAL
  if ((JoyStickPresent==true)  ) {
          JoyControl();
          JoyStick();
          MoverTelescopio();
          
        }
//============== PROBLEMA AL ACTIVAR ESTE CODIGO ===============
/* if (chuck.poll()){
      if ((chuck.joyX()<90) || (chuck.joyX()>180) || (chuck.joyY()<90) || (chuck.joyY()>180)) { // If Wiichuck is Moved
        WiiChuck();
        MoverTelescopio();
      }
//      if ((chuck.buttonC() != 0) ) {
  //       TelescopeisTracking = false;
    //     }
     }*/
// MOVIMIENTO AUTOMATICO POR STELLARIUM
  
 if ( (TelescopeisTracking==true) && (((PosStepX + errX) != TargetX) || ((PosStepY + errY) != TargetY))  )  {
    MoverTelescopio();
  }
// ENCUENTRA OBJETIVO
  
  if ((TelescopeisTracking == true) && ((PosStepX + errX) == TargetX) && ((PosStepY + errY) == TargetY)) {
     SilentMode = true;
     OrigenX = 0 ;
     OrigenY = 0 ;
     TelescopeisTracking == false;
     JoyControl();
     MoverTelescopio();
     }
}
//================================ END LOOP ====================================

void JoyControl () {
      X=analogRead (X_pin);
      delay(5);
      Y=analogRead(Y_pin);
      delay(5);
      if ((X > 900) || (X < 200) || (Y > 900) || (Y < 200)){  //  If joystick is moved 
          
        }

}

void JoyStick(){
  if (X > 900) {   //  If joystick is moved Left    
        Move_e=true;    
        }
  if (X < 200) {  // If joystick is moved right
        Move_w=true;  
        }
  if (Y > 900) {  //  If joystick is moved DOWN
        Move_d=true;   
        }
  if (Y < 200) {  // If joystick is moved UP
        Move_u=true;  
        }
       
return; 
}

void WiiChuck(){
  if (chuck.joyX()<90) {   //  If joystick is moved Left    
        Move_e=true;    
        }
  if (chuck.joyX()>180) {  // If joystick is moved right
        Move_w=true;  
        }
  if (chuck.joyY()>180) {  //  If joystick is moved DOWN
        Move_d=true;   
        }
  if (chuck.joyY()<90) {  // If joystick is moved UP
        Move_u=true;  
        }
  return;  
}

void MoverTelescopio(){
        if (Move_e==true) {   //  If Target is Left ( Target < Pos)    
        digitalWrite(Xdir_pin, HIGH);  // (HIGH = anti-clockwise / LOW = clockwise)
        digitalWrite(Xstep_pin, HIGH);
        digitalWrite(Xstep_pin, LOW);
        Move_e=false;
        SilentMode ? errX-- : PosStepX = PosStepX - ( 1* RA_mode_steps );
        delay(10);
        
        }
  
        if (Move_w==true) {  // If Target is right (Target>Pos)
        digitalWrite(Xdir_pin, LOW);  // (HIGH = anti-clockwise / LOW = clockwise)PORQUE TIENE 1 REDUCCION iso 2
        digitalWrite(Xstep_pin, HIGH);       
        digitalWrite(Xstep_pin, LOW);
        Move_w=false;
        SilentMode ? errX++ : PosStepX = PosStepX + ( 1 * RA_mode_steps );
        delay(10);
       
        }

    if (Move_d==true) {  //  If Target is DOWN (Target<Pos)
        digitalWrite(Ydir_pin, LOW);  // (HIGH = anti-clockwise / LOW = clockwise)
        digitalWrite(Ystep_pin, HIGH);
        digitalWrite(Ystep_pin, LOW);
        SilentMode ? errY-- :  PosStepY = PosStepY - ( 1* DEC_mode_steps );
        Move_d=false;
        delay(10);
        
        }
  
    if (Move_u==true)  {  // If Target is UP (Target>Pos)
        digitalWrite(Ydir_pin, HIGH);  // (HIGH = anti-clockwise / LOW = clockwise)
        digitalWrite(Ystep_pin, HIGH);
        digitalWrite(Ystep_pin, LOW);
        SilentMode ? errY++ :  PosStepY = PosStepY + ( 1* DEC_mode_steps );
        Move_u=false;
        delay(10); 
        
        }
    return;    
}

Como Juan Palomo…yo me lo guiso yo me lo como…

He logrado solucionar las interferencias del I2c con los DRV´s…

Estaba usando la librería #include <Wiichuck.h>… de coopermaa (https://github.com/coopermaa/Wiichuck. Por algún motivo que desconozco, esta librería me interfería con los steppers, como ya os comentaba antes…
El por qué ??.. ni idea…

Solución:

Tan sencillo como usar la librería de todbot . Esta librería trabaja el I2c como se debe… es sencilla y funciona perfectamente !!!. Además asigna dirección I2c y espero que me permita conectar mas cosas por I2c al Nano…(el RTC…que es lo que me falta !!).

Update de ultima hora… A ratos me volvía a fallar… así que le he soldado dos resistencias de 1K en Pull-Up a Data y Clock (a +3.3V)… y ahora va fino… pudiera ser que el fallo anterior se debiera a este pequeño detalle (el cable que llevaba al conector donde conecto el wiichuck es largo)… aunque tb me daba fallos con el chuck desconectado …pero lo veo probable tambien que esto influyera…pero no pienso cambiar el código… el del amigo todbot va genial…

Un paso más cerca …!!!

Bueno, no hay nada como estar motivado por hacer funcionar un proyecto para sorprenderse de un mismo por las cosas que lograr solucionar.
Te felicito!!

Eso si, el amigo lleva 2 paginas escritas...y yo aun no veo ni una sola foto del telescopio, ni la montura o su motorizacion :confused:

Bueno.... atendiendo a la petición del amigo hypernovat !!

Alguna fotos !

(Con la nueva placa... esto cambia !!.. pero este es el inicio)

La Montura: Un BSO 180*1400 sobre una montura artesana.

La placa, batería 4.000Mah y wiichuck (funcionando!!)...

La placa es artesanal hasta que me llegue la que hice con EasyDa y que me han fabricado en JLCPCB

Este es el Servo de la Impresora Epson que controla la Altura. Uso la correa de control de la impresora y como cierre una pieza de un soporte de disco duro de un PC !

Ahora el motor del Azimut... también uso los rodamientos dentados de la impresora..

Todo esto me ha servido para el diseño final del proyecto, que va a diferir en poco con lo que véis. El control de Azimut (eje X) con las ruedas dentadas no es muy preciso y lo voy a reemplazar por una correar a la base del telescopio.

Los motores de la Epson, no van mal, pero los voy a acabar sustituyendo por dos Nema 17 y correas GT2. Cuando me lleguen de China (que ya llevo dos meses con toda esta historia del virus).

Una buena manera de pasar el periodo de cuarentena !!

Un saludo !!

Funciona!!!!!!!!!!!!!

Primera versión funcional y sencilla......

He eliminado el Joystick y lo opero directamente con el Wiichuck. Es mucho más cómodo y dispones de dos botones para varias funciones (por ahora centrado y cambio de velocidades).

La comunicación con Stellarium funciona, tanto para operación manual como para GO-TO automático.

Queda por ver si realiza el seguimiento, pero me cuesta trabajo saber las comunicaciones PC-Telescopio sin un programa de monitoreo de puertos adecuado... ya veré cómo lo hago...

Lo acabo de bautizar como "Star-Mate"...

Un pequeño vídeo....

Star Mate

Me acaba de llegar la nueva placa de JLCPCB que me va a permitir muchas mejoras.....

Listado de componentes previsto:
-Arduino Nano.
-DRV8825 x 2
-Buzzer.
-HC05 Bluettoh.
-RTC.
-Pantalla LCD 16x2
-Wiichuck.
-Nema 17x2.
-Bateria 12v recargable 4000Mah.

la nueva Placa....

Amigos !!!

Mirando la placa nueva se me acaba de venir a la cabeza una duda Gordísima !!!

Como veis al pin de 5V tengo conectado:

  • 2 x DRV 8825 ...... Consumo ?? Lo estoy mirando y no me aclaro...
  • 1 x RTC DS 3231...Cosumo 0,2 mA (eso creo haber sacado en claro)..
  • 1x LCD 16x2 con el adaptador hd44780 para I2c..... unos 35mA
  • 1x HC05........que consume la friolera de 50mA...

Total (por favor revisad las cantidades que no me fio)...86mA + los dos DRV.s....

El Nano lo alimento por Vin a +12 V... que creo que tb afecta al tema....

Que pensáis ???

Aguantará todo conectado al pin de 5V del Nano ?????

Bueno Amigos!!

La version del STARMATE-2 está lista y funciona.

-Control por Wiichuck (al final quité el control de Joystick, pero sigue siendo posible hacerlo)
-Conectado a Stellarium (refleja movimientos manuales y efectúa GOTO).
-Placa lista para descargar de EasyEDA.

Código y placa freeware !!

Espero que os guste !!!

-Placa : https://easyeda.com/mOjitO/telescope-control-1


Código… adjunto !!

Vídeo de la placa anterior…https://youtu.be/aazW2h9rZqU

NOTA:
Aún falta por montar y probar la placa junto con el software (a ver si me llegan las piezas !). En principio funciona bien con Stellarium y con la placa antigua, el código funciona…
El software es mejorable… y faltan por ahora muchos detalles y pruebas… pero es lo que tiene ser la primera versión !!
El diseño de la placa tenía dos problemas que ya están corregidos en easyEDA. El primera era una conexión errónea del botón del joystick (conectado a un analógico en vez de digital A2). El segundo era conectar Vcc del módulo BT con un Jumper para poder desconectar y cargar programas en el Nano.

Telescopio__V4.zip (9.04 KB)

Hola Amigos.
Estoy revisando el diseño de la placa y observo un problema de Hardware del que no estoy seguro.

Veréis....por I2c tengo conectado.
-1xRTC.
-1xLCD 16x2 con adaptador I2c.
-1xWiichuck... está conectado al final de la línea I2c.

Todos estos dispositivos comparten los pines I2c (A4 y A5).

El problema que no sé solucionar es el siguiente:

El RTC y el LCD se alimentan a 5V... mientras que el Wiichuck debería ser a 3,3V...
Para evitar interferencia, debo conectar dos resistencias de 1K en pullup a +5V. En las líneas A4 y A5...
Eso significa que el SDA y el SCL del Wiichuck estaría conectado en pullup a +5V....
Eso afecta en algo ?????
Como veis estoy pez en electrónica....

La solución es simple
Necesitas un adaptador de nivel que puedes fabricarte tu o comprar. En el foro hay muchos esquemas y se ha debatido el tema varias veces.

Un ejemplo es este

Como verás es bidireccional y permite comunicar dispositivos 5V con dispositivos 3.3V del bus I2C.
Coloca eso respetando las tensiones y 0 problemas, olvida las resistencias que has mencionado porque esto ya las tiene.

Gracias amigo !!

Gracias por el aporte, no sabía que existía ese aparato !!

Aunque no pude evitar el impulso y lo conecté... y funciona ... !!..... le pregunté a mi hermano que algo sabe de esto y pensaba que funcionaría.. y así lo hice...

Ahora que sé que existe ese cacharro, mirando en la red, acabo de encontrarme lo siguiente:

Si conecto el dispositivo de 3.3v a la linea de 5v funciona, porque el nivel lógico de la linea de 5v entiende el pulso de 3.3 como High. Y como en la placa, resulta que (por suerte) puse el dispositivo de 3.3 al final de la cola de los dispositivos de 5v no hay problema...!!. Si las conexiones hubieran sido al revés, hubiera necesitado el adaptador de nivel.

Bueno:

He estado haciendo pruebas a falta de conectar la placa a los motores y el Bluetooth que está por llegar.

Acabo de sacar la Version 2.1 (descargable aqui)
Notas de la Vesion 2.1--
-Bug en lectura del RTC corregido.
-Operaciones en automático (Goto o Slew) con objetivo/origen en primer y cuarto cuadrante, ahora mueven por menor distancia, permitiendo cruzar la línea de 0º.

Estoy encontrando un bug en algunas zonas de movimiento que no veo claro la causa...

En movimiento horizontal, a veces en algunas zonas del cielo cambia la altura en 1 grado en stellarium... no veo por qué... lo tengo que mirar...

Lo has hecho bien, se me pasó por alto ese detalle, tal que obviamente tus sensores/dispositivos de 3.3V tienen que estar de un lado y los sensores/dispositivos de 5V del otro de lo contrario estas otra vez mezclando cosas.

He visto tu video y muy buen trabajo has hecho mOjitO. Esto es un proyecto!! como siempre menciono algo que lleva tiempo resolver, que presenta problemas y se va resolviendo con la ayuda del foro o con tu propia astucia.