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
}
}