31 março 2015

Controle de motor de passo bipolar com o driver A4988

Controle motores de passo bipolares com o Driver Motor de Passo A4988, utilizando apenas dois pinos para controle e com a possibilidade de movimentar os motores por meio de "micropassos", método utilizado em aplicações que exigem um posicionamento exato do motor. 

Driver motor de passo A4988

Este módulo é controlado pelo chip Allegro A4988 (datasheet), e pode ser alimentado com tensões entre 3 e 5.5V. Para o motor, permite alimentação externa de 8 à 35V. Um potenciômetro na placa permite a regulagem da corrente de saída.

O controle básico de um motor de passo é feito por meio de dois pinos do microcontrolador, ligados aos pinos STEP (passo) e DIR (direção) do módulo, mostrados abaixo :

Driver A4988 - Pinagem

Uma das grandes vantagens desse módulo é a possibilidade de utilizar micropassos, função configurável por meio dos pinos MS1, MS2 e MS3. Acionando esses pinos conforme sequência mostrada na tabela, podemos selecionar os modos full-step, half-step, quarter step (1/4), eight step (1/8 ) e sixteenth step (1/16).

Tabela configuração micropassos

A utilização do modo micropasso reduz o torque do motor, em média, 30% em comparação com o modo de passo completo (full-step).

Controlando driver A4988 com Arduino

Vamos conectar o driver A4988 ao Arduino Uno e utilizar um programa que, controlado pelos caracteres (números) enviados através do serial monitor, move o motor no sentido horário, anti-horário, ou pára o motor.

Além dos pinos STEP e DIR, vamos utilizar também o pino ENABLE, para desligar as saídas do motor quando o programa receber o comando de parada. Também deve ser colocado um jumper entre os pinos SLEEP e RESET do módulo:

Circuito Arduino Uno A4988


Atenção para a ligação da alimentação externa do motor, na qual eu utilizei um capacitor eletrolítico de 100 µF. Segundo o fabricante, a placa é muito sensível à picos de tensão, e é altamente recomendável a utilização de um capacitor entre os pinos VMOT e GND.

Carregue o programa abaixo no Arduino, que utiliza a biblioteca AccelStepper, disponível neste link. Descompacte o arquivo e coloque a pasta AccelStepper dentro da pasta Libraries da IDE do Arduino.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
// Programa : Driver motor de passo A4988
// Autor : Arduino e Cia

#include <AccelStepper.h>

int velocidade_motor = 100; 
int aceleracao_motor = 100;
int sentido_horario = 0;
int sentido_antihorario = 0;
int numero = 0; 

// Definicao pino ENABLE
int pino_enable = 10;

// Definicao pinos STEP e DIR
AccelStepper motor1(1,7,4 );

void setup()
{
  Serial.begin(9600);
  pinMode(pino_enable, OUTPUT);
  // Configuracoes iniciais motor de passo
  motor1.setMaxSpeed(velocidade_motor);
  motor1.setSpeed(velocidade_motor);
  motor1.setAcceleration(aceleracao_motor);
  
  Serial.println("Digite 1, 2 ou 3 e clique em ENVIAR...");
}

void loop()
{
  // Aguarda os caracteres no serial monitor
  if (Serial.available() > 0) 
  {
    numero = Serial.read();
    {
      if (numero == '1')
      {
        Serial.println("Numero 1 recebido - Girando motor sentido horario.");
        digitalWrite(pino_enable, LOW);
        sentido_horario = 1;
        sentido_antihorario = 0;
      } 
      
      if (numero == '2')
      {
        Serial.println("Numero 2 recebido - Girando motor sentido anti-horario.");
        digitalWrite(pino_enable, LOW);
        sentido_horario = 0;
        sentido_antihorario = 1;
      }
     
      if (numero == '3')
      {
        Serial.println("Numero 3 recebido - Parando motor...");
        sentido_horario = 0;
        sentido_antihorario = 0;
        motor1.moveTo(0);
        digitalWrite(pino_enable, HIGH);
      } 
    }
  }
  
  // Move o motor no sentido horario
  if (sentido_horario == 1)
  {
    motor1.moveTo(10000);
  }
  // Move o motor no sentido anti-horario
  if (sentido_antihorario == 1)
  {
    motor1.moveTo(-10000);
  }
  // Comando para acionar o motor no sentido especificado
  motor1.run();
}  

Esse programa utiliza o serial monitor para controlar o sentido de rotação do motor de passo:

  • Envie 1 para acionar o motor de passo no sentido horário
  • Envie 2 para acionar o motor de passo no sentido anti-horário
  • Envie 3 para parar o motor, o que coloca o pino Enable em nível alto, desligando as saídas do motor

No serial monitor, utilize a parte superior da janela para enviar os comandos de controle do motor, e acompanhe na parte inferior a resposta aos comandos :

A4988 - Serial Monitor


49 comentários:

  1. Uma pergunta a respeito do Capacitor necessário para ligação da entrada de energia externa
    Ele necessita ser de 100 µF mas de no mínimo quantos volts?
    Seria os 12v básicos ou posso usar 16v mesmo entrando com 12v externo?

    Desde já, muito obrigado pela atenção.

    ResponderExcluir
    Respostas
    1. Boa noite Elvis,

      Pode ser o de 16V mesmo, eu também usei um de maior valor aqui nos testes. Funcionou sem problemas. O que eu não recomendo é usar um valor menor.

      abraço !

      Excluir
    2. Um capacitor nunca dever ter tensão de trabalho menor do que a fonte de alimentação. No caso se você sempre alimentar a entrada Vmot com a mesma tensão use um com valor pelo menos 50% maior do que a alimentação principal.

      Excluir
  2. qual motor devo usar para CNC? qual limite

    ResponderExcluir
    Respostas
    1. Izonaldo Borges, como estou montando uma de tamanho reduzido os motores Nema 17 de 1,024kgf acredito que sejam suficiente paguei em média R$ 69,00/cada
      Comprei neste site:
      https://www.robocore.net/modules.php?name=GR_LojaVirtual&prod=567

      Excluir
  3. Elvis, pretendo montar uma CNC e utilizar o GRBL em quais pinos do arduíno devo conectar o A4988?

    ResponderExcluir
    Respostas
    1. Olá amigo, segundo o exemplo aqui do próprio Post ele é conectado da seguinte forma
      arduino/driver

      10 DIR (Direção)
      7 STEP (Passo)
      4 ENA (Enable)

      5v VDD
      GND GND

      Excluir
    2. ola, .. eu sou obrigado a usar o pino Enable se eu controlar com outra programação? ou o driver necessita do enable?

      Excluir
  4. Como faço para que o motor nao pare de girar até que eu mande outro comando?

    ResponderExcluir
  5. Olá! Gostaria de saber como consigo controlar o angulo de rotação do motor nessa programação? Preciso que meu motor rotacione 45 graus.

    ResponderExcluir
  6. Olá! Esse drive pode ser usado para controlar o motor nema 23 9,9kgf?

    ResponderExcluir
    Respostas
    1. Boa tarde Vitor,

      Creio que não, pq o A4988 trabalha com motores de 8 à 35 V, e o nema 23 é de 5,7 volts. Verifique o driver DRV8834.

      Abraço!

      Excluir
  7. Gostaria de uma ajuda, pretendo montar um transelevador, e gostaria de utilizar essa bilioteca, só que to tendo problemas com a ordem de acionamento dos motores, disponho de 2 nema 17 ambos com a4988 e um 28by com seu ULN.
    Gostaria de poder controlar a ordem de acionamento.
    exemplo:
    0 28by avança, depois que executado o nema 17 responsável pelo eixo Y, avança elevando a plataforma, depois o 28by retorna e a após a execução o nema 17 responsável pelo eixo X avança, fazendo a plataforma se deslocar horizontalmente.

    ResponderExcluir
  8. Olá, boa tarde!

    Esse drive funciona para motor de 6V/fase e 1.2A/fase? Obrigado

    ResponderExcluir
    Respostas
    1. Olá Wesley, segundo as especificações do site do fabricante (original)
      ele funciona numa boa sim...

      Pode conferir
      https://www.pololu.com/product/1182/specs

      Atualmente estou utilizando com os A4988 o seguinte motor

      Motor de Passo - NEMA 23 - 4,6 kgf.cm
      Tensão: 7,0 Vdc
      Corrente: 0,7 A

      OBS: Para amperagem a cima de 1A o fabricante recomenda a utilização de heatsink (dissipadores) e/ou um pequeno cooler para resfriar o Driver

      Espero ter ajudado.

      Excluir
  9. Boa tarde,

    Poderia me responder uma curiosidade?
    Tem como com este programa enviar "1,2 e 3" pelo celular?

    Att, Obrigada

    ResponderExcluir
    Respostas
    1. Bom dia,

      você usaria conexão via bluetooth ?

      Abraço!

      Excluir
  10. boa noite, como seria o codigo para rodar 2 motores dc ao inves de um motor de passo com esse drive. tecnicamente seria a mesma coisa pois em outros drives, como exemplo a ponte h l293d, funciona os dois tipos de motores.

    ResponderExcluir
  11. Teria como adaptar/amplificar um driver e motores maiores para serem controlados pelo arduino?

    ResponderExcluir
    Respostas
    1. Oi Marcos,

      Tem sim, existem drives para Arduino para motores bem maiores do que esses.

      Abraço!

      Excluir
  12. Bom dia.
    Como posso saber ao certo do poteciometro de regulagem de corrente que avredito ser para o motor que estara coerente com a especificação do motor que estara sendo usado?
    E se isso também serviria para o caso de se usar um Drive de DVD/CD?
    Graro. Eduardo

    ResponderExcluir
    Respostas
    1. Oi Eduardo,

      Realmente não sei te falar essa questão da regulagem, mas vou pesquisar pra ver se descubro.

      Quanto ao caso de um motor de drive de DVD/CD, geralmente não são motores muito fortes, mas utiliza um multimetro para ver quanto deles estão puxando de corrente da fonte de alimentação.

      Abraço!

      Excluir
  13. Como faço para controlar dois motores por esse programa?

    ResponderExcluir
    Respostas
    1. Boa noite,

      Você vai usar 2 módulos ?

      Abraço!

      Excluir
  14. boa noite amigo, montei uma CNC de drivers de DVD utilizei os driver motores Easydriver V4.4, mas agora quero montar uma CNC de medio porte e consegui alguns moteres de impressora industrial de 3,4V e 4,5V 2A e comprei esses drivers e gostaria de saber se esses drivers suportam uma essa tensão baixa na saida?

    ResponderExcluir
    Respostas
    1. Bom dia Marcelo,

      Creio que não irá funcionar, já que a tensão dos motores nessa placa vai de 8 à 35V.

      Abraço!

      Excluir
  15. Olá, estou tendo problemas com o programa. O motor não gira ele fica vibrando. Não acredito que seja falta de corrente pois quando tento forçar o eixo para girar ele é bem duro. Quando o motor esta desligado o eixo gira livremente. Então não é um problema do eixo travado, não é problema na corrente da placa. Troquei de motor e placa e fonte também =X Eu acredito que possa ser a velocidade com que o comando chegue ao motor. Tem como alterar isso? Obrigado.

    ResponderExcluir
    Respostas
    1. Olá José,
      Estou com o mesmo problema. Você conseguiu solucionar?

      Excluir
    2. Olá amigo, isso é causado quando a combinação do motor esta em ordem errada.
      Tente olhar o datasheet do motor para ver qual a combinação correta

      Excluir
  16. Prezado Marcelo,
    Eu comprei um motor de 7v e 1.2 A,e o A4988 e estou com muita dificuldade de colocar estes motores para funcionar.
    Tente aplicar o seu exemplo sem sucesso.
    Apliquei o exemplo do arduino (steep motorz) direto na placa controladora e é claro que a corrente não deu conta do motor, más ele deu sinal de vida.
    Como não sou técnico as dúvidas são as mais bizarras...eu tenho uma fonte de 12v com os Pinos L, N, Ground, Com e V+...lá vai a pergunta estúpida eu ligo o Vmot no Com e o Ground no V+?

    ResponderExcluir
  17. Perfeito para o meu tcc, mas não consigo usar dois drivers para controlar dois motores.. no mesmo arduino, ... pois não consigo outra conexão tx0 ... o que posso fazer?

    att. obrigado

    ResponderExcluir
    Respostas
    1. Bom dia,

      Você pode usar um outro pino para o "enable" do segundo driver, não ?

      Abraço!

      Excluir
    2. Amigo... Confira esse meu vídeo... Liguei 3 no mesmo Arduino
      https://www.youtube.com/watch?v=8tYy5OBK7t0

      Excluir
  18. A tensão que alimenta o motor funciona com 5v, pois tenho motores de 5v, ou a tensão minima é 8v mesmo?

    ResponderExcluir
    Respostas
    1. Oi Daniel,

      Eu só testei com motores de 12V, mas segundo a especificação, 8V é o mínimo mesmo.

      Abraço!

      Excluir
  19. Posso ligar o motor de passo nema 16 de 2volts de 0.7 ampers no no drive A4988?

    ResponderExcluir
  20. É como faço a ligação dele no Arduíno... se alguém poder me ajudar agradeço!!!

    ResponderExcluir
  21. pretendo usar um clp atos para controlar o motor de passo, se eu mandar 24 volts para dir ou step que é a tensão de saída irá funcionar? Se não funcionar qual driver me recomendaria? Por favor me ajude, desde já agradeço

    ResponderExcluir
  22. Como faço para que o motor gire em graus, ao digitar as entradas ?

    ResponderExcluir
  23. Amigo, não sei o que está dando errado. já montei várias e várias vezes. Já troquei o NEMA 17 por outro, tambem troquei o arduino, o driver 4988, enfim, tenho 2 peças ou mais de tudo. Minha fonte é 12v 2A. Mas não funciona. :/

    ResponderExcluir
    Respostas
    1. Oi Marcelo...

      Q estranho.. mas ele nem mexe ? trava ? O que acontece ?

      Abraço!

      Excluir
  24. Olá, estou controlando um braço robotico, e quando o motor de passo levanta até o ponto desejado, ele começa a "escorregar" quando o motor para devido ao peso, tem algo para fazer pra que isso não aconteça?

    ResponderExcluir
    Respostas
    1. Boa tarde,

      Neste caso, recomendo a troca por um motor mais forte.

      Abraço!

      Excluir
  25. Bom dia,

    Estou com motor de passo Nema16 - tensão referencia 2.0V e Corrente de 0,7A. Fiz este esquema de ligação mostrado neste post. Fonte de alimentação ATX ligada no 12V. O motor fica vibrando e não gira e quando gira somente para o mesmo lado, mas sempre vibrando muito e sem nenhuma precisão. Estou fazendo algo errado certamente.
    Tentei ajustar o trimpot do A4988, mas no máximo ele gira um pouco sem precisão . Alguém poderia me dar uma orientação.

    Caso queiram mais algum detalhe pode perguntar.

    Obrigado.

    ResponderExcluir
  26. Como faço para usar 3 motores com 3 módulos? Como fica no programa?

    ResponderExcluir
  27. Bom dia!
    Excelente Post. Fiz desta forma e funcionou perfeitamente.
    Mas preciso fazer meu motor rodar 45º anti-horario a cada 50 minutos em baixíssima velocidade.meu motor é um NEMA 23 com Driver a4988.
    Poderiam me ajudar?

    ResponderExcluir
  28. Boa tarde, eu consigo fazer o motor rodar e parar por um determinado tempo sem ter que enviar os comandos 1,2 e 3?

    ResponderExcluir
    Respostas
    1. Boa noite,

      Consegue sim. Retire a parte que faz a leitura da porta serial e coloque os valores 1, 2 e 3 antes de cada if, com um pausa, por exemplo, de 2 segundos.

      Abraço!

      Excluir
  29. Fiquei em duvida com as linhas 15 e 16 do programa. Poderia me esclarecer.
    Obrigado!

    ResponderExcluir