28byj-48 telescope EQ1 drive holder

Sidereal monitoring made with Arduino and 28byj-48 stepper motor and joystick shield.

code for arduino.

//Define a pinagem do driver que controla as bobinas
//Você pode utilizar qualquer número de porta digital
//Evite apenas as portas TX e RX, que no Arduino UNO são a 0 e a 1
const int BobinaPino1 = 10;
const int BobinaPino2 = 11;
const int BobinaPino3 = 12;
const int BobinaPino4 = 13;

//Variáveis de Acionamento do Motor
float Acionamentos = 0;
double IntervaloDeAcionamento = 3000;
double TempoResidual = 0;
int fase = 0;
int frente = 0;
int rev = 0;
int zerar = 0;

//Joystick
const int SW = 2;
const int axis_x = A1;
const int axis_y = A0;
int joystick = 0; // controle manual
int joystick_x = 0; // controle manual
int joystick_y = 0; // controle manual
unsigned long onoff = 1; //liga e desliga movimento
int ultimoval = 0; // salva ultimo valor usado antes de desligar no menu on/off

// Constantes Naturais
// Dia Sideral =23h56m4,1s ou 86.164,1 segundos
// Constantes mecânicas da montagem
// uma volta no parafuso sem fim avança 1 dente na coroa
// coroa = 100 dentes
// Redução Total = 100 dentes x 1 volta no eixo x 64 passos x 25792 / 405 redução = 165.068.800 / 405 = 407.577,2840
// Período de acionamento é 86.164,1 x 405 / 165.068.800 = 69792921 / 330137600 = 0,2114 s -> na redução 2:1 valor = metade

void setup() {
// Define os pinos de controle das bobinas como apenas emissores de sinal e não leitores
pinMode(BobinaPino1, OUTPUT);
pinMode(BobinaPino2, OUTPUT);
pinMode(BobinaPino3, OUTPUT);
pinMode(BobinaPino4, OUTPUT);

//botoes d2 esquerda, d3 direita, d4 cima, d5 baixo.
pinMode(SW, INPUT_PULLUP);

IntervaloDeAcionamento = 70468,51676392;

//211405,55029176; (normal)
//105702,775146; (2:1)
//70468,51676392; (3:1)
}

//211405,55029176;
//105702,775146;
// Tempo em microssegundos do intervalo que deve haver entre cada acionamento = (86164,1 x 405) / (64 x 25792 x 100) * 1.000.000

void loop() {

if(digitalRead(SW) == LOW){
if(onoff==1){
onoff = 2;
frente = 1;
rev = 0;
delay(300);
}
else {
onoff = 1;
frente = 0;
rev = 0;
delay(300);
}

}
if(analogRead(axis_y) > 530 && onoff == 2){
joystick_y = analogRead(axis_y);
joystick_y = map(joystick_y, 530, 1023, 1, 50);
frente = 1;
rev = 0;
//IntervaloDeAcionamento = 70468,51676392;
IntervaloDeAcionamento = joystick_y;
IntervaloDeAcionamento = map(IntervaloDeAcionamento, 1, 255, 3000, 1000);
//IntervaloDeAcionamento = IntervaloDeAcionamento / joystick_y;
zerar = 1;
}
if(analogRead(axis_y) < 490 && onoff == 2){
joystick_y = analogRead(axis_y);
joystick_y = map(joystick_y, 490, 1, 1, 50);
frente = 0;
rev = 1;
//IntervaloDeAcionamento = 70468,51676392;
IntervaloDeAcionamento = joystick_y;
IntervaloDeAcionamento = map(IntervaloDeAcionamento, 1, 255, 3000, 1000);
//IntervaloDeAcionamento = IntervaloDeAcionamento / joystick_y;
zerar = 1;
}
if(analogRead(axis_x) > 530 && onoff == 2){
joystick_x = analogRead(axis_x);
joystick_x = map(joystick_x, 530, 1023, 1, 255);
frente = 1;
rev = 0;
//IntervaloDeAcionamento = 70468,51676392;
IntervaloDeAcionamento = joystick_x;
IntervaloDeAcionamento = map(IntervaloDeAcionamento, 1, 255, 30000, 10000);
//IntervaloDeAcionamento = IntervaloDeAcionamento / joystick_x; //teste 1
//IntervaloDeAcionamento = 20000;
zerar = 1;
}
if(analogRead(axis_x) < 490 && onoff == 2){
joystick_x = analogRead(axis_x);
joystick_x = map(joystick_x, 490, 1, 1, 3);
frente = 0;
rev = 1;
//IntervaloDeAcionamento = 70468,51676392;
IntervaloDeAcionamento = joystick_x;
IntervaloDeAcionamento = map(IntervaloDeAcionamento, 1, 255, 30000, 10000);
//IntervaloDeAcionamento = IntervaloDeAcionamento / joystick_x; //teste 1
//IntervaloDeAcionamento = 20000;
zerar = 1;
}

if(analogRead(axis_y) < 530 && analogRead(axis_y) > 490 && analogRead(axis_x) < 530 && analogRead(axis_x) > 490 && zerar == 1){
frente = 1;
rev = 0;
Acionamentos = 0;
TempoResidual = micros();
fase = 0;
IntervaloDeAcionamento = 70468,51676392;
zerar = 0;
}

if (Acionamentos * IntervaloDeAcionamento < micros() - TempoResidual) { //Se passou do intervalo de acionamento, aciona um passo
Acionamentos = Acionamentos + 1; //Conta em que acionamento está para multiplicar pelo tempo de acionamento e arrastar o menor erro possível

if(frente == 1 && rev == 0){ AcionaMotorFrente(); //Gira o Motor para frente}if(frente == 0 && rev == 1){ AcionaMotorRev();}if(frente == 0 && rev == 0){  digitalWrite(BobinaPino1, LOW);  digitalWrite(BobinaPino2, LOW);  digitalWrite(BobinaPino3, LOW);  digitalWrite(BobinaPino4, LOW);}

}

}

void AcionaMotorFrente() {

switch (fase) { //Liga ou desliga uma bobina de acordo com uma das oito fasses possíveis
case 0:
digitalWrite(BobinaPino1, LOW); //Aciona (HIGH) ou Desliga (LOW) a bobina correspondente
fase = 1; //Guarda a fase atual
break;
case 1:
digitalWrite(BobinaPino3, HIGH);
fase = 2;
break;
case 2:
digitalWrite(BobinaPino4, LOW);
fase = 3;
break;
case 3:
digitalWrite(BobinaPino2, HIGH);
fase = 4;
break;
case 4:
digitalWrite(BobinaPino3, LOW);
fase = 5;
break;
case 5:
digitalWrite(BobinaPino1, HIGH);
fase = 6;
break;
case 6:
digitalWrite(BobinaPino2, LOW);
fase = 7;
break;
case 7:
digitalWrite(BobinaPino4, HIGH);
fase = 0;
break;
}
}

void AcionaMotorRev() {

switch (fase) { //Liga ou desliga uma bobina de acordo com uma das oito fasses possíveis
case 0:
digitalWrite(BobinaPino4, HIGH); //Aciona (HIGH) ou Desliga (LOW) a bobina correspondente
fase = 1; //Guarda a fase atual
break;
case 1:
digitalWrite(BobinaPino2, LOW);
fase = 2;
break;
case 2:
digitalWrite(BobinaPino1, HIGH);
fase = 3;
break;
case 3:
digitalWrite(BobinaPino3, LOW);
fase = 4;
break;
case 4:
digitalWrite(BobinaPino2, HIGH);
fase = 5;
break;
case 5:
digitalWrite(BobinaPino4, LOW);
fase = 6;
break;
case 6:
digitalWrite(BobinaPino3, HIGH);
fase = 7;
break;
case 7:
digitalWrite(BobinaPino1, LOW);
fase = 0;
break;
}
}