28byj-48 telescope EQ1 drive holder

28byj-48 telescope EQ1 drive holder

Description

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

Statistics

Likes

0

Downloads

0