Arduino X Motor de passo 28 BYJ 48 ULN 2003


#1

Ola!

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?


#2

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?

Saudações

Mau Maker


#3

A Biblioteca Stepper_oneRevolution

#include <Stepper.h>

const int stepsPerRevolution = 500;

//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.

Grato, Haidar.


#4

Haidar, boa tarde!

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.

Olha uma foto: Eggbot no facebook


#5

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 .