Ir para conteúdo
  • Cadastre-se

resolvido a4988 driver com arduino

Avalie este tópico:


baporc

Posts em destaque

boas

int Index;

void setup()
{
pinMode(4, OUTPUT); //Enable
pinMode(2, OUTPUT); //Step
pinMode(3, OUTPUT); //Direction

digitalWrite(4,LOW);
digitalWrite(3,HIGH);

for(Index = 0; Index < 2000; Index++)
{
digitalWrite(2,HIGH);
delayMicroseconds(500);
digitalWrite(2,LOW);
delayMicroseconds(500);
}
delay(1000);

digitalWrite(3,LOW);

for(Index = 0; Index < 2000; Index++)
{
digitalWrite(2,HIGH);
delayMicroseconds(500);
digitalWrite(2,LOW);
delayMicroseconds(500);
}
delay(1000);
}

void loop()
{

}

 

aonde posso controlar a velocidade sem potenciametro

Editado: por INFOART
Link para o comentário
Compartilhar em outros sites

22 horas atrás, nagkiller disse:

Mude o tempo de high/ low de step!!!

 

Pino 2...

 

E este código nem potenciômetro está utilizando!!! Onde está definido input nele???

 

Flw...

boas nagkiller

este código é sem potenciómetro .

correto em mudar o tempo.

Mas agora queria que anda-se mais tempo,que é esta linha:     for(Index = 0; Index < 2000; Index++)

Muda para 30000 tudo ok ,mas se que que ele vai mais muda para 40000 não para pq?

só vai até 30000?

 

Link para o comentário
Compartilhar em outros sites

 Boas 

long Index;
int in1 = 8; //relay
int in2 = 9; //relay
void setup()
{
pinMode(4, OUTPUT); //Enable
pinMode(2, OUTPUT); //Step
pinMode(3, OUTPUT); //Direction
pinMode(8, OUTPUT); //saida do relay
pinMode(9, OUTPUT);

digitalWrite(4,LOW);
digitalWrite(3,HIGH);

digitalWrite(8, LOW); //ativa
digitalWrite(9, LOW);

for(Index = 0; Index < 30000; Index++)
{
digitalWrite(2,HIGH);
delayMicroseconds(50);
digitalWrite(2,LOW);
delayMicroseconds(50);

}

digitalWrite(8,HIGH);
digitalWrite(9,HIGH); //desliga o bico
delay(1000);


digitalWrite(3,LOW);

for(Index = 0; Index < 30000; Index++)
{
digitalWrite(2,HIGH);
delayMicroseconds(50);
digitalWrite(2,LOW);
delayMicroseconds(50);
}
delay(1000);

}

void loop()
{
 
}

 

a minha duvida está como posso temporizar o relay :

digitalWrite(9,HIGH);  desativar mais cedo que que o outro.

 

Como está, liga e desliga os 2 ao mesmo tempo, eu queria desativar 1 mais cedo , de que o outro.

Link para o comentário
Compartilhar em outros sites

Porque você definiu duas variáveis como entradas se relés são saídas???

 

E porque não está usando elas no código???

 

Você pode usar assim na declaração de variáveis 

 

#define rele1    8 // rele no pino 8 Arduino

#define rele2    9 // rele no pino 9 Arduino

 

E no código

 

digitalWrite(rele1,HIGH);

no lugar de 

digitalWrite(8,HIGH);

 

Por exemplo...

 

E ai pra você escolher o tempo de acionamento de reles, você deverá usar o timer ( há um tópico sobre o timer0, dê uma procurada). O timer é incrementado em tempos... Ai terá que ter duas variáveis, uma flag  para indicar que o relé foi acionado e  criar uma variável contador para contar o tempo que ficará acionado.

 

Ou ainda mudar o tempo de desligamento dos pinos inserindo um delay no meio... Assim terá um intervalo entre um e outro relé.

 

Flw...

 

Link para o comentário
Compartilhar em outros sites

Pode utilizar estas práticas para seus códigos:

 

Citar


long index;
#define a4988_step    2 // Pino de step do A4988 ligado no pino 2 Arduino
#define a4988_direcao 3 // Pino de direction do A4988 ligado no pino 3 Arduino
#define a4988_enable  4 // Pino de enable do A4988 ligado no pino 4 Arduino
#define relay1        8 // Relay no pino 8 arduino
#define relay2        9 // Relay no pino 9 arduino

void setup()
{
  pinMode(a4988_step, OUTPUT);      // A4988Step
  pinMode(a4988_direcao, OUTPUT);   // A4988 Direction
  pinMode(a4988_enable, OUTPUT);    // A4988 Enable
  pinMode(relay1, OUTPUT);          // Saida do relay 1
  pinMode(relay2, OUTPUT);          // Saida do relay 2
  digitalWrite(a4988_step, LOW);    // Garante nivel logico Zero neste pino.
  digitalWrite(a4988_direcao, LOW); // Garante nivel logico Zero neste pino.
  digitalWrite(a4988_enable, LOW);  // Garante nivel logico Zero neste pino.
  digitalWrite(relay1, HIGH);       // Garante nivel logico Zero neste pino.
  digitalWrite(relay2, HIGH);       // Garante nivel logico Zero neste pino.
}

void loop()
{
  digitalWrite(relay1, LOW);    // ativa
  digitalWrite(relay2, LOW);    // Nivel Logico 0

  // Realiza movimento do motor
  digitalWrite(a4988_enable, LOW);    // nivel Logico 0
  digitalWrite(a4988_direcao, HIGH);  // Nivel Logico 1
  for (index = 0; index < 30000; index++)
  {
    digitalWrite(a4988_step, HIGH);  // Nivel Logico 1
    delayMicroseconds(50);          // delay de 50us
    digitalWrite(a4988_step, LOW);  // Nivel Logico 0
    delayMicroseconds(50);          // delay 50us
  }

  digitalWrite(relay1, HIGH);  // Nivel Logico 1
  delay(1000);
  digitalWrite(relay2, HIGH); //desliga o bico

  // Realiza movimento do motor com direcao oposta
  digitalWrite(a4988_direcao, LOW);  // Nivel Logico 0
  for (index = 0; index < 30000; index++)
  {
    digitalWrite(a4988_step, HIGH);
    delayMicroseconds(50);
    digitalWrite(a4988_step, LOW);
    delayMicroseconds(50);
  }

  // desligar os pinos de controle do A4988
  digitalWrite(a4988_enable, LOW);
  digitalWrite(a4988_enable, LOW);
  digitalWrite(a4988_step, LOW);
  
  // laco infinito
  while (1); // Executa ate aqui e fica parado nesse ponto!!!
  // Fim do programa
}
 

 

Flw...

  • Legal 1
Link para o comentário
Compartilhar em outros sites

Obrigado caro amigo

Mas realmente me ajudou sobre arrumar a casa...

O programa estava um bocado desarrumado...

fiz outra maneira...

Uma pergunta?

É possível criar com o mesmo arduino três programa diferentes?

Exemplo:

Com botao1-faz de x a x

Com botão 2-faz de x a x

com botao 2-faz de x a x 

 

com o mesmo programa, apenas mudando o( for) para mais curto ou longo.

Link para o comentário
Compartilhar em outros sites

As possibilidades são inúmeras!!!

 

Você pode por meio de 1 botão realizar diversas funções... De acordo com o tempo na qual ele foi pressionado, pode fazer um teclado com 4x4 (16 teclas) com apenas um pino AD do microcontrolador, etc... Vai depender da sua lógica de programação.

 

As rotinas de verificar os botões você deixa dentro do método loop.

Recomendo pegar um livro de Arduino para ir estudando.

 

Flw...

 

Editado: por nagkiller
Link para o comentário
Compartilhar em outros sites

Este é um exemplo prático baseado no anterior:

 

Citar

/* Projeto Motor step com A4988

   Autor:     nagkiller
   Data:      03/03/2018
   Objetivo:  Realizar os movimentos com motor utilizando botões do tipo push bottom.
              Os pinos dos botões devem ter resistores de pullup.
*/
//******************************************************************************
long index;
long debounce = 150;  // tempo de debounce de teclas
int botaoLEDAgora;
int estadoBotao = LOW;
int botaoLEDAntes = HIGH;
long tempoPressionado = 0;
//******************************************************************************
#define a4988_step    2 // Pino de step do A4988 ligado no pino 2 Arduino
#define a4988_direcao 3 // Pino de direction do A4988 ligado no pino 3 Arduino
#define a4988_enable  4 // Pino de enable do A4988 ligado no pino 4 Arduino
#define botaoFrente   5 // Botão no pino 5 Anda pra frente
#define botaoRe       6 // Botão no pino 6 Anda pra traz
#define botaoLED      7 // Botão no pino 7 muda estado do LED
#define relay1        8 // Relay no pino 8 arduino
#define relay2        9 // Relay no pino 9 arduino
//******************************************************************************
void setup()
{
  pinMode(a4988_step, LED_BUILTIN); // LED_BUILTIN é o PINO13 NO UNO E NANO
  pinMode(a4988_step, OUTPUT);      // A4988Step
  pinMode(a4988_direcao, OUTPUT);   // A4988 Direction
  pinMode(a4988_enable, OUTPUT);    // A4988 Enable
  pinMode(relay1, OUTPUT);          // Saida do relay 1
  pinMode(relay2, OUTPUT);          // Saida do relay 2
  pinMode(botaoFrente, INPUT);      // Entrada Botao
  pinMode(botaoRe, INPUT);          // Entrada Botao
  pinMode(botaoLED, INPUT);         // Entrada Botao

  digitalWrite(a4988_step, LOW);    // Garante nivel logico Zero neste pino.
  digitalWrite(a4988_direcao, LOW); // Garante nivel logico Zero neste pino.
  digitalWrite(a4988_enable, LOW);  // Garante nivel logico Zero neste pino.
  digitalWrite(relay1, LOW);       // Garante nivel logico Zero neste pino.
  digitalWrite(relay2, LOW);       // Garante nivel logico Zero neste pino.
}
//******************************************************************************
void desligaControle()
{
  // desligar os pinos de controle do A4988
  digitalWrite(a4988_enable, LOW);
  digitalWrite(a4988_enable, LOW);
  digitalWrite(a4988_step, LOW);
}
//******************************************************************************
void motorFrente()
{
  // Realiza o metodo de andar pra frente
  digitalWrite(relay1, LOW);    // ativa
  digitalWrite(relay2, LOW);    // Nivel Logico 0

  digitalWrite(a4988_enable, LOW);    // nivel Logico 0
  digitalWrite(a4988_direcao, HIGH);  // Nivel Logico 1
  for (index = 0; index < 30000; index++)
  {
    digitalWrite(a4988_step, HIGH);  // Nivel Logico 1
    delayMicroseconds(50);          // delay de 50us
    digitalWrite(a4988_step, LOW);  // Nivel Logico 0
    delayMicroseconds(50);          // delay 50us
  }
  desligaControle(); // Metodo ou funcao que realiza o desligamento dos botoes.
}
//******************************************************************************
void motorRe()
{
  digitalWrite(relay1, LOW);    // ativa
  digitalWrite(relay2, LOW);    // Nivel Logico 0
  // Realiza movimento do motor com direcao oposta
  digitalWrite(a4988_direcao, LOW);  // Nivel Logico 0
  for (index = 0; index < 30000; index++)
  {
    digitalWrite(a4988_step, HIGH);
    delayMicroseconds(50);
    digitalWrite(a4988_step, LOW);
    delayMicroseconds(50);
  }
  desligaControle(); // Metodo ou funcao que realiza o desligamento dos botoes.
}
//******************************************************************************
void loop()
{
  //******************************************************************************
  // Realiza o metodo de inverter o estado do LED
  botaoLEDAgora = digitalRead(botaoLED);
  if (botaoLEDAgora == LOW && botaoLEDAntes == HIGH && millis() - tempoPressionado > debounce)
  {
    if (estadoBotao == HIGH)
      estadoBotao = LOW;
    else
      estadoBotao = HIGH;
    tempoPressionado = millis();
  }
  digitalWrite(LED_BUILTIN, estadoBotao); // LED no PINO 13
  botaoLEDAntes = botaoLEDAgora;  
  //******************************************************************************
  // Botao foi pressionado, passou o tempo de debounce e ainda está pressionado???
  if (!digitalRead(botaoFrente))
  {
    delay(debounce);
    if (!digitalRead(botaoFrente))
    {
      motorFrente();
    }
  }
  //******************************************************************************
  // Botao foi pressionado, passou o tempo de debounce e ainda está pressionado???
  if (!digitalRead(botaoRe))
  {
    delay(debounce); // tempo de delay debounce
    if (!digitalRead(botaoRe))
    {
      motorRe();
    }
  }
  //******************************************************************************
}
//******************************************************************************
 

 

Está faltando a implantação dos relays, porém você pode definir hora que eles serão usados ou não... por exemplo na hora que o motor for para um lado, aciona relay1, quando for executado um certo tempo, ele desliga... e assim com o outro relay.

 

Os comandos para o controle do A4988 não foram verificados por mim, então você terá que ler o datasheet dele e realizar as correções se houverem!!!

 

Flw...

Editado: por nagkiller
  • Legal 1
Link para o comentário
Compartilhar em outros sites

  • 2 semanas depois...

Participe agora da conversa!

Você pode postar agora e se cadastrar mais tarde. Se você tiver uma conta, faça login para postar com sua conta.

Visitante
Responder

×   Você colou conteúdo com formatação.   Restaurar formatação

  Apenas 75 emoticons máximos são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir apenas como um link

×   Seu conteúdo anterior foi restaurado.   Limpar o editor

×   Você não pode colar imagens diretamente. Envie ou insira imagens do URL.

SOBRE O ELETRÔNICABR

EletrônicaBR é o melhor fórum técnico online, temos o maior e mais atualizado acervo de Esquemas, Bios e Firmwares da internet. Através de nosso sistema de créditos, usuários participativos têm acesso totalmente gratuito. Os melhores técnicos do mundo estão aqui!
Técnico sem o EletrônicaBR não é um técnico completo! Leia Mais...
×
×
  • Criar Novo...