Estou com um programa para Arduino UNO que liga dois motores de passo 28 BYJ 48 e dois ULN 2003.Um no sentido horário e outro anti-horário (3 vezes para cada sentido), estão funcionando bem,mas estão alternados. Entram as portas 8,10,9 e 11 para o primeiro motor, depois, entram 4,6,5 e 7 para o segundo. Motor 1 parte e motor 2 só parte depois que motor 1 pára. Gostaria de saber como fazer funcionar os dois motores simultaneamente, já mexi no delay que é Zero e não estou conseguindo. Alguém pode me ajudar?
Olá Haidar!
Recentemente usei uma biblioteca e um shield para estes motores. Pra que eu possa entender melhor, poderia dizer qual biblioteca está usando? ou colocar um código que contenha o mínimo pra demonstrar o problema?
//Inicializa a biblioteca utilizando as portas de 8 a 11 para
//ligacao ao motor
Stepper myStepper(stepsPerRevolution, 8,10,9,11);
Stepper myStepper1(stepsPerRevolution, 4,6,5,7);
void setup()
{
//Determina a velocidade inicial do motor
myStepper.setSpeed(60);
myStepper1.setSpeed(60);
}
void loop()
{
//Gira o motor no sentido horario a 120 graus
for (int i = 0; i<=2; i++)
{
myStepper.step(-600);
myStepper1.step(600);
delay(0);
}
//Gira o motor no sentido anti-horario a 120 graus
for (int i = 0; i<=2; i++)
{
myStepper.step(600);
myStepper1.step(-600);
delay(0);
}
}
Este é o programa que está rodando, mas não sincroniza. O motor 1 (stepper) dá o primeiro giro à 120º, horário, aí entra o motor 2 (Stepper1) anti-horário, o motor 1 dá o segundo giro horário e o motor 2 dá o segundo giro anti-horário…
Não sei porque o Arduino uno não dá o comando para as duas saídas de 8 a11 e 4 a 7 ao mesmo tempo.
Algo saiu meio estranho na sua resposta, mas pelo exemplo, acho que você está usando o seguinte:
#include <Stepper.h>
Nesse caso, a função
myStepper.step(600);
primeiro dá os 600 passos e só depois passa a executar a próxima:
myStepper1.step(600);
as duas não acontecem “em paralelo” e sim em sequência. Primeiro uma faz tudo que tem que fazer, e depois que terminou devolve o controle para a proxima instrução.
O ideal era dar um passo com um motor, outro com o outro motor, esperar um tempo pro movimento se completar e dar mais um passo. Um de cada vez, assim os dois motores se movem.
Uma das formas de fazer o que voce quer é mudar um trecho do programa para algo mais ou menos assim:
// tempo entre cada passo
unsigned int rpm = 60;
unsigned int microssegundos = 1000*1000/(rpm*stepsPerRevolution)
//Gira o motor no sentido horario a 120 graus:
int graus = 120;
int passos = (stepsPerRevolution*graus)/360;
for (int i = 0; i<=passos; i++) {
myStepper.step(-1);
myStepper1.step(1);
delayMicroseconds(microssegundos);
// este valor é muito importante, senão o motor de passo perde o torque por tentar girar muito rapido.
// usei microssegundos para ter mais precisão
}
Pode ser que você precise ajustar alguma coisa, mas não dispense o delay senão o motor pode ficar “fraco”
Quando eu estava inventando uma eggbot eu caí no mesmo problema para desenhar na diagonal, acionando dois motores.
Ah, lembrei uma coisa, não tenho certeza se esse motor faz 60 RPM, por exemplo. se não andar, diminui pra 5 RPM e ve se funciona, depois vai aumentando .