Motorizacion de un Telescopio Dobson casera con motores de impresora EPSON

Hola a todos !!!

Estas navidades le regalé un telescopio Dobson a mi hija. Un tubo de 180 x 1.400 en montura Dobson (que para el que no entienda mucho.. solo se mueve en los ejes "X" y "Z").

No procede poner nada de ingeniería, por lo que no os voy a contar mis penas con la mecánica, pero sí comentaros las ideas, dichas y desdichas de este proyecto que empiezo hoy (en el lado de la electrónica y control).

La filosofía del proyecto es usar materiales de reciclado en lo posible, porque si me pongo a liarla, me sale más cara que una ya hecha.. :smiley:

Me lo estoy planteando por "Fases":

- V1.0 - MOTORIZADO BÁSICO Y FUNCIONAL

Básicamente que se mueva en vertical y horizontal con un joystick.

Materiales:

  • Arduino MEGA: 6,90 Eur (Aliexpress)
  • Dos Stepper MITSUMI sacados de una impresora. Coste 0
  • Driver DRV8825 : 5,95 Eur (Aliexpress 5 unidades)
  • Joystick.: 1,79 Eur (Aliexpress 4 unidades)
  • Bateria 12V recargable y cargador, 3.000 mA; 7.62 Eur (Aliexprss)

Total de coste hasta ahora: 22,26 Euros

- V1.1 - MOTORIZADO BÁSICO Y MULTISTEPPER

Introducir una botonera para controlar las funciones multistepper.

Materiales Adicionales:

  • Conjunto de 4 botones: 0.80 (Aliexpress)

Total de coste hasta ahora: 23,06 Euros

- V2.0 - Sensorización de Orientación e Inclinación

En este paso, le integro un módulo de 9 DOF(MPU 9250) con la intención de lograr saber en cada momento la orientación e inclinación, con la idea de poder integrarlo más adelante con un software de observación (Stellarium, etc...)

Materiales Adicionales:

  • MPU 9250: 8 Euros (Amazon)

Total de coste hasta ahora: 31,06 Euros.

(Seguire actualizando el listado de versiones)

Con cada fase os contaré los problemas que me encuentro y como los voy resolviendo + el código que voy empleando:::

Hasta Mañana !!!!

Debido a que me encuentro el hilo del telescopio en Proyectos y luego miro Hardware y veo una consulta por el mismo tema, debo informarte que eso se llama DOBLE posteo y es una falta a las normas de este foro.
Por favor, no vuelvas a hacerlo. Ahora tu hilo ha quedado fuera de tiempo pero así lo has querido tu. Como tienes la potestad de poder editarlos, bien podrías poner primero el que ahora esta segundo y viceversa, e incluso modificar el texto porque ahora poco tiene que ver ese enlace.

Hola Surbyte:

La intención de poner el Proyecto es describir como va, como se desarrolla e ir aportando el código. Los problemas técnicos, son cuestiones hard y soft que, en algunos casos resuelvo yo (y lo pongo en proyecto). En otras ocasiones, como no me veo capaz de superarlos, por ser temas específicos, por eso lo pongo en HARDWARE o Software, según proceda. No es intención de hacer Dos o varios post de lo mismo, por eso me pareció correcto hacerlo de esa manera. Porque los problemas (como el del DRV 8825) es o puede ser general (no solo relativo a mi proyecto) y observo que no se ha resuelto en el foro de Hardware.

Quitar la duda del setup del DRV 8825 del foro de Hardware me plantea un problema, puesto que el que mire el foro Proyectos, pude que le interese lo del telescopio o no, pero el problema de como hacer un setup del DRV8825 creo que nos interesa a todos y no desearía que se pierda en un hilo, como Proyectos.

El Proyecto es contar una idea de principio a fin... con los retos y las soluciones....una carpeta que recoja todo... no se si te parece correcto...

Por favor, suelo ser muy correcto en los foros y lamento las molestias, pero me gustaría que consideraras lo que te cuento para que la duda del DRV que me tiene atascado no se pierda..

Gracias

Solucionado el “Entuerto” con el Moderador, sigo hoy con lo previsto…

Voy con la V 1.0 !!

Hardware:

PROBLEMAS CON EL SETUP DE LA DRV 8825 !!!

Acabo de recibir mis DRV8825 y me estoy volviendo majara !!
Intento limitar la corriente y no detecta nada (Y ya he probado 3 distintos)
Que instalacion hay que hacer para comprobar la limitaciónr sin una Shield ?.

Que estoy haciendo mal ??

Hasta ahora he intentado varios montajes y al medir entre GND y el Potenciómetro de la DRV 88525 (ese que hay en la placa ) sin que me registre voltaje (Sale siempre cero)!!

Ojo… que como he comprado varios, lo he probado en 3 distintos y siempre igual…!!

1- He conectado GND a GND (Arduino Mega) y 5V a FAULT… Nada…
2- Igual que antes y haciendo pin de ENABLE en High… Nada…
3- GND + 5V en FAULT + (RESET y SLEEP a 5V)… porque creo que es el DRV 8825 V2.0… Tampoco !
4- GND + (RESET y SLEEP a 5V). Dejando libre FAULT… tampoco !!

Y me ha ocurrido algo raro… Con GND + 5V a FAULT, he conectado 12V GND COMUN + 12V a VMOT… y como estaba alimentando arduino por el USB del PC, ha empezado a ponerse la pantalla del PC negra… y a detectar conexion-desconexion del arduino… como si me fuera a cargar el PC.

Que estoy haciendo mal.??

He mirado todos los videos y foros (En este hay varios pero no se clarifica cómo) y la web de Pololu… no sé… me corto las venas y eso que acabo de empezar con el proyecto…!!

El DRV 8825 que uso (aliexpress)

Software:

Ya tengo una primera versión del código que quiero probar.
Es una revisión de éste: stepper-motor-with-joystick-and-limit-switches

Me gusta esta forma, aunque me queda una duda que tengo que mirar cuando lo haga funcionar:

He modificado el código para que mapee la velocidad con el joystick a la vez que lo mueve, pero mirando veo que en su código, hace una “Lectura directa” del puerto analógico… no se si me explico. Me parece normal hacer primero una lectura del A0 y A1 y según el resultado, proceder a sentencia if, pero éste lo hace directo en el if… no se si va a ir bien…

Ya os iré contando…

Telescopio_V1.ino (4.6 KB)

He visto tu link y lo que comentas no cambiará mucho el accionamiento del motor.
Cuando arranca decide que velocidad darle y luego mira los estados de los joystick y al siguiente ciclo hace lo que tu dices asi que cuanto has perdido? algunos milisegundos. No cambia nada.
Justamente cuando arranca si miras lo hace con velocidad 10 que tal como lo indica es la velocidad mas lenta porque usa un delay() algo que no comparto para demorar el funcionamiento del motor.

Cuando lo muevas y la velocidad o el factor velocidad cambia a 1, el delay(1) será menor y entonces se moverá mas rápido.

La pagina de Pololu del DRV8825 dice como fijar la corriente

Mira lo que dice en inglés:

The DRV8825 also features a FAULT output that drives low whenever the H-bridge FETs are disabled as the result of over-current protection or thermal shutdown. The carrier board connects this pin to the SLEEP pin through a 10k resistor that acts as a FAULT pull-up whenever SLEEP is externally held high, so no external pull-up is necessary on the FAULT pin. Note that the carrier includes a 1.5k protection resistor in series with the FAULT pin that makes it is safe to connect this pin directly to a logic voltage supply, as might happen if you use this board in a system designed for the pin-compatible A4988 carrier. In such a system, the 10k resistor between SLEEP and FAULT would then act as a pull-up for SLEEP, making the DRV8825 carrier more of a direct replacement for the A4988 in such systems (the A4988 has an internal pull-up on its SLEEP pin).

El DRV8825 tiene una salida denominada FAULT que se pone en LOW cuando el puente H FET esta desabilitado como resultado de una sobrecorriente o apagado por exceso de temperatura. La placa conecta este pin al pin SLEEP através de un resistor de 10k que actua como un FAULT pull-up cada vez que SLEEP es forzado a HIGH, de modo que no hacen falta resistores externos en el pin FAULT. La placa incluye un resistor de 1.5k en serie con FAULT que lo protege al conectarlo a una fuente de alimentación, que es lo que ocurre si usas esta placa como un sistema diseñado pin compatible con el A4988. En tal sistema, el resistor de 10k entre SLEEP y FAULT actuaría como un pull-up SLEEP, haciendo al DRV8825 mas que un reemplazo directo del A4998 en tales sistemas (el a4988 tiene un pull-up interno en el pin SLEEP).

Aunque ahi esta claro mira este otro esquema para asegurarte que lo entiendes.

Veras que externamente hay un resistor de 1.5k que sale de FAULT, y luego uno de 10k que se une con SLEEP.

Entonces no puedes leer los datos porque no esta bien conectado.

mOjitO:
En este paso, le integro un módulo de 9 DOF(MPU 9250) con la intención de lograr saber en cada momento la orientación e inclinación, con la idea de poder integrarlo más adelante con un software de observación (Stellarium, etc...)

Hola mOjitO, ¿crees que este modulo te va a dar suficiente precision para saber cual es la posicion del telescopio? La verdad es que no los conozco pero en principio (y esto si te va a salir mas economico) yo usaria contar las vueltas del pap que si bien los de una impresora suelen ser de pocos pasos, asumo que estas usando reducciones. Si dichas reducciones estan basadas en engranajes dentados osea que no hay posibilidad que patinen (y la posicion relativa entre engranajes es siempre la misma), sospecho que es mejor que el modulo. Pero bueno, es solo un comentario que queria hacer.

@hypernovat

La verdad es que tienes bastante razón....e incluso se me hace un poco pesado pensarlo, sólo estoy empezando en esto, aunque con el MPU 6050 ya hice un sistema básico de guiado de un cohete. No me fué de mucha utilidad dado que no voló mas de 3 metros antes de explotar ;-D Vuelo de Cohete Arduino

Quizás la única razón, más allá del aprender sea por estos motivos:
1- Son con reducciones, pero de plástico y el servo que controla la Altura, lo tuve que conectar al eje del telescopio por una correa de transmisión por problemas para fijar una rueda dentada al eje del telescopio. Por esto no estoy muy seguro aun sobre la precisión del sistema, tendré que hacer algunas pruebas..
2- A la hora de buscar un objeto, puede ser una buena ayuda para guiar inicialmente el telescopio y para los datos iniciales de calculo de circulos de seguimiento... si bien es cierto, ésto se puede lograr también alineando la montura y tomando una referencia a la polar, confiando en que los servos no patinen o introduciendo los datos del objeto (Alt & Az) en el momento que lo pilles (para seguirlo)...

Realmente es una cuestión que me estoy planteando, porque como dices, quizás no se necesite.. además de que los datos de la MPU pueden bailar y confundir al programa.. aunque los filtre bien por DMP.... no sé .. ya te digo.. tambien tengo dudas de si conviene o no....

Hola a todos !!

Gracias al amigo surbyte he logrado solucionar el problema del setup del DRV8825 !!

Efectivamente lo estaba haciendo mal...!!

Así que..

Para los muy novatos que no lograbamos registrar las medidas en el polímetro del DRV8825.

Guia para novatos para SetUp del DRV8825:

1- Mirar la pagina de Pololu y especialmente el vídeo del SetUp :

2- Haced el SetUp conforme a las conexiones que os pongo en la imagen:

En resumen:

-Conectar la alimentación externa (GND+VMOT)
-Conectar +5V del Arduino a las patillas de RESET & SLEEP
-En mi caso también conecté los pines 8 y 9 a STEP y DIR y mantuve corriendo un código de stepper, pero no se si esto último es necesario.

Después de esto ya podréis medir el voltaje entre la patilla GND (Ojo la que está junto a FAULT) y el potenciómetro del chip.

No olvidar de conectar el Arduino para alimentar con 5V.
No hay GND común entre Arduino y la fuente de alimentación (por lo menos a mi me ha funcionado).

mOjitO:
con el MPU 6050 ya hice un sistema básico de guiado de un cohete. No me fué de mucha utilidad dado que no voló mas de 3 metros antes de explotar ;-D Monky va al espacio - YouTube

Ahh, pero tu eres un "loco lindo" con el que en algun punto me siento identificado. Los que yo hacia (hace unos 40 años atras) salian disparado tan rapido que la unica foto que conservo lo unico que muestra es el humo que quedo atras, jaja, que epocas!!

Ya lei tus preocupaciones y bueno que los engranajes sean de plastico no es el problema, lo ideal seria trabajar con el tipo corona y sinfin que evita que un pequeño golpe te lo saque de posicion porque si eso sucede el conteo de pasos se pierde. Desarmando impresoras que encuentro tiradas por ahi, aprendi que las mas nuevas (y no tan nuevas en realidad)ya no usan motores pap pero para la detecccion de la posicion tienen un circulo de celuloide con pequeños dientes trazados, luego este se inserta en un sensor optico de ranura, tal vez eso sea mejor.

Tu tienes un lindo telescopio que para empezar es bastante bueno el problema es que las monturas dobsonianas se mueven en cordenadas azimutales y la verdad que la mejor montura para posicionar objetos es la montura ecuatorial de todas maneras si le pones circulos en ambos ejes se puede hacer un traspaso rapido de un sistema al otro con aplicaciones que seguramente deben haber por ahi.

@hypernovat

Gracias Hyper !!..

Hace casi 40 años también los hacía, con mi hermano, salvo que entonces podíamos fabricar pólvora y hacer los nuestros. Hoy por hoy, me conformo usando los de feria para estos "Experimentos Locos" como les llamo. A mi hija le gusta la ciencia y estas cosas graciosas la motivan mucho (y si explotan... mejor).

Bueno... Siguiendo con el proyecto, hoy me he encontrado varios problemas que he tenido que solucionar...

Los Malditos Steppers !!

Tengo 3 steppers sacados de un par de impresoras, pero tan sólo uno me viene identificado como un Mitsumi m35sp-11tk LF, que por cierto no iba a usar, pero que me ha dado bastantes quebraderos de cabeza (hasta que me percaté de un mal contacto en un terminar de la bobina).

Con los otros dos he tenido bastantes problemas...

Con el del eje "Z" ha sido más fácil; Hice los cálculos del DRV e hice un ajuste preliminar. Una vez montado, he tenido que aprender a cómo reconocer las dos bobinas y acertar a hacer la conexión con el DRV (una pequeña pesadilla). Pero va bien; levanta y gira el brazo, pero me percato de que debo actuarlo a muy baja velocidad para que no patine la correa (en mi código, el delay debe andar entre 5 y 10). Menos de 5 causa problemas.

El del eje "X" ha sido más complejo. Modelo desconocido, parecido al Mitsumi pero la caja es de 4,2 cm en vez de 3,5. Descubrir la conexión también un poco complicadillo, pero logrado...

Lo más complicado ha sido el ajuste de la corriente en el DRV. Tenía que ser muy fina para evitar perdida de pasos y que se volviera loco...esto lo he hecho a ojo...

Los motores quedan ajustados así:

Mitsumi m35sp-11tk LF: 12v ... DRV a 0.13 (Medido en V2).. Resistencia interna 12 Ohms.. parece raro pero así va...

Eje "Z" Parecido al Mitsumi caja de 35: 12V ...DRV a 0.83 (Medido en V2)... Resistencia 38 Ohms igual de raro...

Eje "X" Parecido a Mitsumi pero caja de 4,2: 12v ... DRV a 0.45 Resistencia 4.5 Ohms.. mas raro...

Los problemas que me quedan:

1- El Servo del eje "X" no tiene bastante fuerza (estando a full steps) y empieza a patinar cuando hay un poco de resistencia (la plataforma mas el tubo pesan unos 12 kilos ). La base está sobre un cojinete de empuje que en algún punto ofrece una pequeña resistencia.... y gira sobre un eje fijo de 6mm sobre la que está fijada una rueda dentada de 50 mm. A esta rueda, ajusto el servo que tiene una reducción de 1/6. Gira bien en entre 45 a 60 grados...
2- Al actuar sobre un eje tan pequeño, la base tiene cierta elasticidad por lo que no empieza a responder al primer giro del servo...tambien debe afectarle el hecho de que sea una rueda dentada plástica y que el par de fuerzas se haga a 50mm del eje...

Posibles soluciones:

1- Servo más potente..
2- Usar el otro servo que tengo de refuerzo (tambien tiene una reducción 1/6). Pero.. Aguantaría una batería Li-Ion de 12V 3.000 MAh los tres servos ???.
3- Servo exterior (que mueva la plataforma entera que es de unos 30cm). Esto se lo puedo hacer fijando una rueda dentada GT2 alrededor y poniendo un nema 17 fijo tangencialmente...

Pero.... Se puede empalmar una correa GT2 ??? ( es una pregunta retórica, porque no lo necesitaría por requerimientos del proyecto... pero se podría empalmar una GT2 para que gire por una polea...??

Otro problema que me queda es la velocidad... no me termina de convencer el uso de delay... pero cómo afectaría usar el multistepper en modos de 1/4, 1/16, etc.... perdería fuerza ??

Naufragando en un mar de dudas.... :stuck_out_tongue_closed_eyes:

Buenas noches a todos !!

Posteo algunas ideas sueltas (no se si pueda contestar tus dudas especificas)

-Los pap siempre los he movido con el modulo que incluye el L298N que en principio respondia bien los requerimientos. Eran steppers justamente de viejas impresoras.

-El uso de servos, a ojo no me suena bien, tienen, eso si, una ventaja saben recuperar la posicion en caso que por accidente se salga de posicion.

-En cuanto a la mecanica, el consejo general es siempre sobredimensionar lo que uno hace (mas vale que sobre...) y ya que en tu caso, en un principio la motorizacion te sirve para ubicar "manulmente" el telescopio te aconsejo que tengas un movimiento rapido para llevar el telescopio a la zona deseada y un movimiento lento para luego usar en el relativamente pequeño campo de observacion que te da el ocular.

Si se me ocurre algo mas, seguire aportando.

Tercer día:

A falta de pedir un nuevo servo o ver qué hago con la falta de fuerza en el eje “X”, voy a instalar el tercer servo de refuerzo, a ver qué pasa.

En el campo de “soft”, surbyte tiene razón, a mi tampoco me gusta el tema del delay para manejar la velocidad de los servos, además el Joystick no responde uniformemente. Es decir, aumenta los valores al máximo muy cerca del eje, por lo que deja poco recorrido para que el mapeo sea eficaz. Por esto, he introducido el tema de los pasos intermedios en el código, asociado a un boton (con debounce por software).

Noto que me molesta el cable del Joystick y empiezo a pensar en meterle un control BT por el móvil, pero esa complicación la voy a hacer esperar un poco, hasta que vea como funciona en la vida real el telescopio.

PROBLEMA DE ULTIMA HORA: Al conectar el segundo driver del segundo estepper, de repente deja de funcionar los motores. Me percato que al desconectar el Boton de cambio a microstepping vuelve a funcionar…(está conectado a GND y al pin D4 en PULL_UP). Por qué ocurre esto ??

El código a día de hoy queda así:

// V 1.0 MUEVE DOS EJES ACORDE VELOCIDAD OPTIMA DE MOVIMIENTO DE MI CONFIGURACION
// BOTON INSTALADO PARA CONTROLAR LOS MICROSTEPS (full;1/2,1/4)

// ¡¡ OJO NO CONECTAR/DESCONECTAR MOTORES CON POWER ON !!!!!!!  


// Eje X conectado a Azimut Mov Horizontal = Servo X
#define X_pin A0    // Pin A0 connected to joystick Y axis
#define Xdir_pin 8   // Pin 8 connected to Direction pin
#define Xstep_pin 9  // Pin 9 connected to Steps pin on EasyDriver
#define XMS1 10       // Pin 10 connected to MS1 pin
#define XMS2 11       // Pin 11 connected to MS2 pin
#define XSLEEP 12     // Pin 12 connected to SLEEP pin del Motor X

// Eje Y conectado a Altura Mov vertical = Servo Y
#define Y_pin A1    // Pin A1 connected to joystick Y axis
#define Ydir_pin 3   // Pin 3 connected to Direction pin
#define Ystep_pin 4  // Pin 4 connected to Steps pin on EasyDriver
#define YMS1 5       // Pin 5 connected to MS1 pin
#define YMS2 6       // Pin 6 connected to MS2 pin
#define YSLEEP 7     // Pin 7 connected to SLEEP pin del Motor Y

#define multistep 4  // Pin 4 connected to joystick switch Sin Uso por ahora



int Xstep_speed;  // Speed of Stepper X  (higher = slower)
int Ystep_speed;  // Speed of Stepper Y  (higher = slower)
int step_speed=1; // Cambia a multistepper

void setup() {
   pinMode(XMS1, OUTPUT);
   pinMode(XMS2, OUTPUT);
   pinMode(Xdir_pin, OUTPUT);
   pinMode(Xstep_pin, OUTPUT);
   pinMode(XSLEEP, OUTPUT);
   pinMode(YMS1, OUTPUT);
   pinMode(YMS2, OUTPUT);
   pinMode(Ydir_pin, OUTPUT);
   pinMode(Ystep_pin, OUTPUT);
   pinMode(YSLEEP, OUTPUT);
  
   Serial.begin(9600);
   
   pinMode(multistep, INPUT_PULLUP); 
   
   digitalWrite(XSLEEP, HIGH);  // Wake up Motor X
   delay(5);  // Wait for  wake up
   digitalWrite(YSLEEP, HIGH);  // Wake up Motor Y
   delay(5);  // Wait for  wake up

 

/* Configure type of Steps 
// MS1 MS2
//
// LOW LOW = Full Step //
// HIGH LOW = Half Step //
// LOW HIGH = A quarter of Step //
// HIGH HIGH = An eighth of Step //
*/

// POR AHORA CONFIGURAMOS STEPPERS A FULL STEP

   digitalWrite(XMS1,LOW);      // Configures to Full Steps
   digitalWrite(XMS2, LOW);    // Configures to Full Steps
   digitalWrite(YMS1, LOW);      // Configures to Full Steps
   digitalWrite(YMS2, LOW);    // Configures to Full Steps
}

void loop() {
  if (!digitalRead(multistep)) {  //  If BUTTON is clicked
    delay(500);  // delay for deboucing
    Serial.println(step_speed);
    switch (step_speed) {  // check current value of step_speed and change it
      case 1:
           digitalWrite(XMS1,LOW);      // Configures to 1/4
           digitalWrite(XMS2, HIGH);    // Configures to 1/4
           digitalWrite(YMS1, LOW);      // Configures to 1/4
           digitalWrite(YMS2, HIGH);    // Configures to 1/4
           step_speed=10;  // cambia a slow speed el contador para proxima lectura
        break;
      case 3://                                SIN USO HASTA ACTIVAR BOTON 
           digitalWrite(XMS1,LOW);      // Configures to Full Steps
           digitalWrite(XMS2, LOW);    // Configures to Full Steps
           digitalWrite(YMS1, LOW);      // Configures to Full Steps
           digitalWrite(YMS2, LOW);    // Configures to Full Steps
           step_speed=1;  // cambia a fast speed el contador para proxima lectura
        break;
      case 10:
            digitalWrite(XMS1,HIGH);      // Configures to 1/2
           digitalWrite(XMS2, LOW);    // Configures to 1/2
           digitalWrite(YMS1, HIGH);      // Configures 1/2
           digitalWrite(YMS2, LOW);    // Configures to 1/2
           step_speed=3;  // cambia a medium speed el contador para proxima lectura
            break;
    }
  }    
    
  if (analogRead(X_pin) > 712) {  //  If joystick is moved Left

//      int Xval = analogRead(X_pin);
//      Xstep_speed = map(Xval, 712, 1023, 5, 10);// MAPEA EL MOVIMIENTO PARA OBTENER VELOCIDAD 
                                        
        digitalWrite(Xdir_pin, LOW);  // (HIGH = anti-clockwise / LOW = clockwise)
        digitalWrite(Xstep_pin, HIGH);
        delay(5);
        digitalWrite(Xstep_pin, LOW);
        delay(5);
      
  }
  
    if (analogRead(X_pin) < 312) {  // If joystick is moved right

 //     int Xval = analogRead(X_pin);
 //     Xstep_speed = map(Xval, 312, 0, 5, 10);// MAPEA EL MOVIMIENTO PARA OBTENER VELOCIDAD 
       
        digitalWrite(Xdir_pin, HIGH);  // (HIGH = anti-clockwise / LOW = clockwise)
        digitalWrite(Xstep_pin, HIGH);
        delay(5);
        digitalWrite(Xstep_pin, LOW);
        delay(5);
          
  }

    if (analogRead(Y_pin) > 712) {  //  If joystick is moved DOWN

//      int Yval = analogRead(Y_pin);
//      Ystep_speed = map(Yval, 712, 1023, 5, 10);// MAPEA EL MOVIMIENTO PARA OBTENER VELOCIDAD 
                                        
        digitalWrite(Ydir_pin, LOW);  // (HIGH = anti-clockwise / LOW = clockwise)
        digitalWrite(Ystep_pin, HIGH);
        delay(5);
        digitalWrite(Ystep_pin, LOW);
        delay(5);
      
  }
  
    if (analogRead(Y_pin) < 312) {  // If joystick is moved UP

//      int Yval = analogRead(Y_pin);
//      Ystep_speed = map(Yval, 312, 0, 5, 10);// MAPEA EL MOVIMIENTO PARA OBTENER VELOCIDAD 
       
        digitalWrite(Ydir_pin, HIGH);  // (HIGH = anti-clockwise / LOW = clockwise)
        digitalWrite(Ystep_pin, HIGH);
        delay(5);
        digitalWrite(Ystep_pin, LOW);
        delay(5); 
          
  } 
}

Bueno amigos:

Tras unas pruebas de concepto, ver cómo giran los pap etc... me percato de que el programa me está creando problemas con los pap. Aunque les bajara la velocidad (poniendo un delay en el código), los motores pierden pasos , se calientan y funcionan mal. Tras darle muchas vueltas concluyo que (a mi entender): si el código se ejecuta, los ciclos de loop van a la frecuencia del reloj del micro, pero la velocidad del pap es la que es... si me paso en ciclos se salta pasos...en fin... que he tenido que mirar más y concluyo..

1- El código que hice es demasiado simple y no sirve..
2- Usaré la librería de Accelstepper. La he probado y los pap van como la seda...

Me pongo en marcha... :slight_smile:

Hola mOjitO:
Muchas gracias por compartir tu proyecto.

Acabo de empezar a entender cómo manejar los pap, así que seguramente no voy a aportar nada pero por si acaso lo comento.
Me he dado cuenta en mis pruebas que una configuración lenta de la velocidad del puerto serie afecta mucho al control de los motores pap. Te sugeriría que aumentases la velocidad a Serial.begin(115200) al menos.
Comparto contigo que Accelstepper es una buena librería, de hecho de las que he probado para mí es la mejor.

Un saludo y aquí me quedo esperando la evolución de tu proyecto.

Hola Compañeros !!

Tengo un par de problemas con la librería “Accelstepper”.

Primero: Alguien me puede explicar cómo se usa la instrucción DIRECTION_CCW

◆ Direction
enum AccelStepper::Direction
protected
Direction indicator Symbolic names for the direction the motor is turning.

Enumerator
DIRECTION_CCW
Counter-Clockwise.

DIRECTION_CW
Clockwise.

El problema me surge al no poder cambiar la dirección de giro del pap de un modo normal (sin usar el “Analog.write” ni las instrucciones de “move”.

Segundo: en el código que os pego, no logro que el pap modere la velocidad de giro conforme muevo el Joystick.

Gracias !!!

#include <AccelStepper.h>

// Definir Stepper

#define Xdir_pin 11  // Pin 13 connected to Direction pin
#define Xstep_pin 12 // Pin 12 connected to Step pin
#define Zdir_pin 7  // Pin 13 connected to Direction pin
#define Zstep_pin 8 // Pin 12 connected to Step pin

AccelStepper stepperX(1,Xstep_pin,Xdir_pin);
AccelStepper stepperZ(1,Zstep_pin,Zdir_pin);

// VARIABLES PARA VELOCIDADES MOVIMIENTO

#define  MAX_SPEED 48.0
#define  MIN_SPEED 0.1

unsigned int VelocidadX, VelocidadZ;

// Definir PINS Microsteps

#define MS1 5
#define MS2 6

//Joystick

#define JoyX A0
#define JoyZ A2

// VARIABLES PARA ALMACENAR MOVIMIENTO JOYSTICK

unsigned int ActualX, ActualZ;
unsigned int AnteriorX, AnteriorZ;


void setup()
{  
    // STEPPERS
   
   pinMode(MS1, OUTPUT);
   pinMode(MS2, OUTPUT);
   pinMode(Xdir_pin, OUTPUT);
   pinMode(Xstep_pin, OUTPUT);
   pinMode(Zdir_pin, OUTPUT);
   pinMode(Zstep_pin, OUTPUT);
    

    //VELOCIDADES Y Aceleraciones 
    stepperX.setMaxSpeed(MAX_SPEED);
    stepperX.setAcceleration(100.0);
    stepperX.setSpeed(0);
    
    stepperZ.setMaxSpeed(MAX_SPEED);
    stepperZ.setAcceleration(100.0);
    stepperZ.setSpeed(0);

  
}

void loop()
{
  // LECTURA DEL JOYSTICK Y MOVIMIENTO
    
    if ( (analogRead(JoyX) < 200) || (analogRead(JoyX) > 900) || (analogRead(JoyZ) < 200) ||  (analogRead(JoyZ) > 900) ) {
      ActualX = analogRead(JoyX);
      ActualZ = analogRead(JoyZ);
        if (ActualX =! AnteriorX) {
            float VelocidadX = map(ActualX, 0, 1023, 5, MAX_SPEED);
            stepperX.setSpeed(0);
        }
          
        if (ActualZ =! AnteriorZ) {
            float VelocidadZ = map(ActualZ, 0, 1023, 5, MAX_SPEED);
            stepperZ.setSpeed(5);         
        }

  AnteriorX = ActualX;
  AnteriorZ = ActualZ;
  stepperX.runSpeed();
  stepperZ.runSpeed();
  
}

    
    }

Buenos días amigos !!!

Sigo con el proyecto....

He encontrado varios programas similares, pero ninguno se termina de adaptar a mis necesidades.

Estoy tratando de ver en este momento cómo conectar el Arduino con Stellarium.

En principio, lo voy a tratar de hacer con el Meade LX200 protocol , pero me surgen algunas dudas con los comandos que quiero emplear y sobre todo me gustaría ver cómo van las comunicaciones entre ambos extremos.

El problema que estoy teniendo en estos momentos es - Cómo puedo ver los comandos que envía Stellarium por serial?. He conectado un arduino y programado Stellarium para crear un telescopio, pero a la hora de tratar de abrir el puerto serial, para ver las comunicaciones, me sale que el puerto (COM11) está ocupado, por lo que no puedo ver qué está pasando allí.

Cómo podría ver las comunicaciones y los comandos que envía estellarium para ver cómo funciona ??

Gracias por vuestra paciencia !!!

Sigo Avanzando....

He encontrado otros proyectos muy interesantes de los que estoy tratando de aprender y aplicarlos al mío, pero hoy que lo tengo un poco más claro, empiezo con los problemas de programación...

Tengo una consulta para vosotros !!!

Lo que trato de hacer es recibir y enviar comandos por un Serial (COM3); básicamente este canal recogería datos de Stellarium y enviaría códigos de respuesta que son necesarios para que funcione.

El problema que se me plantea es que voy a necesitar otro canal para enviar comandos por serial al programa para algunas otras cuestiones (Alineamientos, sincronización, etc...)....

Sé que puedo abrir varias comunicaciones Serial (Serial.begin.... Serial1.begin)... lo que no tengo nada claro es cómo puedo asignar un canal (asignado a un COM determinado.. p.e. COM5) para comunicaciones in-out con Stellarium) y el Serial1. para otras comunicaciones (comandos de línea que emito yo y otras lecturas)..

Me podéis dar ideas o ejemplos para ir abriendo camino ???

Gracias a todos una vez más !!!!

Con un MEGA no tendras problema. Tiene 4 Seriales.

A la espera de que me lleguen todos los componentes...

Aquí os dejo la PCB del proyecto.

Materiales (PCB):

  • Arduino Nano: Sólo tiene un puerto serial... lo que no ayuda, pero es lo que tenía disponible...
  • RTC. Conectado por i2C
  • HC05 Bluetooht. Conectado por i2C.
  • Controladora de pantalla LCD por i2C
  • Pantalla LCD.
  • Buzzer.
  • 2x DRV8825.
  • Conector para enchufar una Wiichuck (por i2C).
  • Conector alternativo para joystick.
  • 2 conexiones listas para usar botones de interrupciones con debouncing por hardware.
  • Condensadores C1 y C2 6V 1uF.... Condensadores C3 y C4 25V 100uF.
  • 3 pines analógicos libres...

A la placa se conectan dos Steppers Nema17 de 12v y 1.3A por fase y una batería externa de12v y 3000mA.

Las conexiones por i2C van con dos resistencias de 1k a +5v para incrementar la velocidad.

Espero que no se me olvide nada...

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

No entiendo este comentario

Sé que puedo abrir varias comunicaciones Serial (Serial.begin.... Serial1.begin)... lo que no tengo nada claro es cómo puedo asignar un canal (asignado a un COM determinado.. p.e. COM5) para comunicaciones in-out con Stellarium) y el Serial1. para otras comunicaciones (comandos de línea que emito yo y otras lecturas)..

De que Seriales hablas si usas un NANO?