domingo, 16 de junio de 2019

PLANCHETA ECUATORIAL: El código de arduino


Como ya he comentado en la entrada anterior, mis ideas previas y conocimientos de Arduino eran “CERO”, pero consultando la web de Arduino, y sobre todo el curso de Arduino para principiantes del canal de youtube comentado, ha sido muy sencillo encontrar el código que me hacía falta.

Lo primero que tenéis que hacer es instalar el IDE de Arduino, descargándolo de su web.

Luego en los numerosos tutoriales que encontrareis por la web, entre ellos el curso indicado, aprenderéis a controlar un motor paso a paso bipolar, como es el nema 17, o similar.

El código que yo je utilizado es muy muy sencillo, y debe mejorarse implementado un botón de “marcha paro”, un “interruptor general” del sistema, una protección contra corrientes inversas añadiendo un diodo, y un motor de cambio de giro.

Mi proyecto aún no tiene nada de eso, el motor tan sólo comienza a girar cuando conecto el sistema a la fuente de 12 V, y si el giro no es el adecuado, simplemente cambio el conexionado de los cables del motor; así de rudimentario y escaso, pero mi prisa es poner el sistema en funcionamiento y probarlo y luego si va bien, mejorarlo añadiendo esos elementos comentados.

Así que ni hemos utilizado la librería “stepper” de Arduino ni nada, lo hemos conseguido de la forma más burda posible.

El código es el siguiente, pero antes debo explicaros una cosa:

Para que el motor no pierda par, y puedo levantar el peso de la cámara, dado que es una Nikon D5000 bastante pesada, hemos utilizado un sistema de avance del tornillo basado en un piñón y un engranaje.

El piñón es el que va acoplado al eje directo del motor y con un diámetro pequeño tendremos un buen par de motor.

Luego acoplado al piñón hemos dispuesto un engranaje mayor, en el que hemos embutido una tuerca M6 que al girar solidaria al engranaje, hace que va varilla roscada avance, levantando el conjunto.

Dado que los dientes del piñón son 20 y los del engranaje 40, la relación de velocidades es de 1 a 2, por cada vuelta del engranaje debemos hacer girar dos veces el piñón.

Además, debemos recordar que con los cálculos de nuestro radio y longitud de varilla rocada curvada, necesitábamos dar una vuelta por minuto al engranaje principal. Revisad las entradas anteriores si no os quedó claro.

Así que nuestro código debe ser tal que haga girar el piñón tres vueltas por minuto para tener en el engranaje una vuelta por minuto.

Nuestro motor nema 17 es de 1.8 º por paso (lo hay de 0.9º por paso, hay que fijarse en qué tipo de motor estamos utilizando) así que para dar una vuelta completa necesitamos dar 360 / 1.8 = 200 pasos.

Vamos a explicar algo importante:

Dado que nuestro piñón solidario al motor debe dar dos vueltas por minuto (para que nuestro engranaje gire una vez por minutos) debe dar en un minuto 200+200 pasos.

Si repartimos los 400 pasos en los 60 segundos de un minuto tenemos que 60 / 400 = 150 milisegundos

Y como un paso se consigue con un valor alto y luego un valor bajo del estado del pin step, significa que tenemos que cambiar el estado del pin step cada 75 milisegundos, esto es la mitad del tiempo del paso.

Step es el pin que da la orden de cambio de estado ALTO o BAJO para que el motor avance un paso

Dir es el pin de cambio de dirección si queremos establecer luego un botón para dicho cambio

24000 pasos son 24000/200 = 120 minutos, lo hago así para que por defecto la plataforma gire durante una hora sin parar cuando la ponga en marcha. Luego en campo yo abro o cierro el obturador el tiempo que quiera, pero la plataforma no la paro nunca, siempre está en marcha a una vuelta por minuto.

El código quedaría así:

#define STEP 4                                 // definimos el pin STEP de A4988 al pin 4
#define DIR 5                                   // definimos el pin DIR de A4988 a pin 5
void setup()
{
  pinMode(STEP, OUTPUT);          // definimos el pin 4 como salida
  pinMode(DIR, OUTPUT);            // definimos el pin 5 como salida
}

void loop()
{
  digitalWrite(DIR, LOW);             // giro en un sentido
  for(int i = 0; i < 24000; i++){       // 24000 pasos para motor de 1.8 grados de angulo de pasoes una hora de giro sin parar
    digitalWrite(STEP, LOW);         // nivel alto
    delay(75);                                   // por 75 mseg
    digitalWrite(STEP, HIGH);       // nivel bajo
    delay(75);                                   // por 75 mseg
  }
}

2 comentarios:

  1. Hola Jose Luis, nos encanta tu blog de telesopios y astronomía. Menos mal que no sabes nada de arduino que si no....escribes en otros blogs o revistas? Un saludo

    ResponderEliminar
    Respuestas
    1. Hola buenos días gracias por tu comentario, de verdad que no tenía ni idea antes de escribir esa breve reseña para mi aplicación. No escribo en ningún sitio, mi trabajo es por ahora burdo y defectuoso pero con mucha ilusión :). Si sabéis de otros blogs o webs similares agradecería que me lo comunicaseis. Muchas gracias

      Eliminar