Galera depois de fazer o Tutorial sobre o Motor de passo 28BYJ-48 com o modulo driver UL2003, 

me empolguei e agora farei um Tutorial de um driver + motor de passo mais complexo.

http://labdegaragem.com/forum/topics/tutorial-arduino-motor-de-pass...

Esse Tutorial será sobre o motor de passo NEMA 17 com o módulo driver baseado no chip A4988.

Escolhi esse motor e esse driver, pois eles são muito usados em fresadoras CNC, impressoras 3D, Plotter, etc. 

Vi que no próprio Lab já tem um tutorial similar, mas pretendo aprofundar no assunto. 

http://labdegaragem.com/profiles/blogs/tutorial-como-utilizar-o-big...


Constatei no fórum do Lab, que inúmeros colegas já tiveram muitas dúvidas sobre esse tipo de montagem com esse motor de passo. 

Favor interagir com o tutorial, somente assuntos relacionados com o mesmo. 

Se deseja esclarecer alguma outra dúvida, favor criar um novo tópico. 

Todos estão convidados a complementar o tutorial. 

Farei o Tutorial em partes, como nos outros que eu já fiz. 

Espero que gostem !

Para facilitar a pesquisa nos tópicos, criei esse índice :

Recomendações importantes antes de usar o Módulo A4988:

http://labdegaragem.com/forum/topics/tutorial-arduino-motor-de-pass...

Tipos de Motores de Passo:
http://labdegaragem.com/forum/topics/tutorial-arduino-motor-de-pass...

Motores de Passo - Unipolar e Bipolar / Tipos de enrolamentos:
http://labdegaragem.com/forum/topics/tutorial-arduino-motor-de-pass...

Driver A4988 + Motor de passo - Contole por Joystick:
http://labdegaragem.com/forum/topics/tutorial-arduino-motor-de-pass...

Especificações do Motor NEMA17 - Minebea:
http://labdegaragem.com/forum/topics/tutorial-arduino-motor-de-pass...

Modulo Driver do Motor - A4988:
http://labdegaragem.com/forum/topics/tutorial-arduino-motor-de-pass...

Micro-Passo (Micro-Stepping):
http://labdegaragem.com/forum/topics/tutorial-arduino-motor-de-pass...

Nema17 + Driver A4988 - Controle através do Arduino:
http://labdegaragem.com/forum/topics/tutorial-arduino-motor-de-pass...

Nema17 + Driver A4988 - Controle através do Arduino (FRITZING):
http://labdegaragem.com/forum/topics/tutorial-arduino-motor-de-pass...

Nema17 + Driver A4988 => Controle de Corrente Máxima:
http://labdegaragem.com/forum/topics/tutorial-arduino-motor-de-pass...

That's one small step for  man, one giant leap for mankind. (Neil_Armstrong)

https://en.wikiquote.org/wiki/Neil_Armstrong

https://commons.wikimedia.org/wiki/File:Frase_de_Neil_Armstrong.ogg

Exibições: 75778

Responder esta

Respostas a este tópico

Nema17 + Driver A4988 - Controle através do Arduino 

Boa tarde Galera, mais um grande passo para o Tutorial !

Montei um circuito do Módulo Driver A4988 conectado ao motor de passo NEMA17 e sendo controlado por um Arduino Nano. Normalmente encontra-se na WEB, inúmeros circuitos desses, mas somente controlando os pinos de sentido de rotação (DIR) e dos pulsos dos passos (STEP). 

Resolvi fazer uma montagem de teste usando todas as portas de controle do Módulo A4988 !  Outra dúvida minha era se eu conseguiria usar o meu Motor NEMA17 Unipolar de seis fios no modo Bipolar, já que o chip A4988 foi projetado para motores Bipolares somente. E tudo funcionou perfeitamente. 

Esse é o diagrama da minha montagem :

 Observações importantes :

- A tensão de alimentação do Motor deve ser entre 8V e 35 V (não pode usar motores com 5V somente).

- A corrente não pode ultrapassar 2A em cada bobina do motor. 

- Use um capacitor (C1)  de no mínimo 100 uF para filtrar ruidos na alimentação do motor. 

- Use um capacitor (C2)  de no mínimo 10 uF para filtrar ruidos na alimentação do chip A4988. 

- Não se esqueça de conectar o terra do Arduino. 

Vejam que eu usei somente quatro fios do motor, já que estou usando a ligação  Bipolar. Os fios dos terminais centrais dos enrolamentos devem ficar isolados do circuito - Fio 2 (branco) e Fio 5 (preto). 

O Módulo Driver A4988 tem um potênciomentro (POT) de ajuste de corrente máxima. Se a corrente ultrapassar o limite, o chip é desativado para proteção dos circuitos. Explicarei como isso funciona e como ajustar em outro tópico. (não mexa ainda nesse ajuste) . No meu módulo ele já veio ajustado para corrente máxima de 1,25 ampéres. 

Criei um Sketch para permitir o teste de todos os pinos de controle / funções  do Módulo A4988. Usei oito portas digitais do Arduino. A designação de cada porta foi escolha minha. Nada impede que você utilize outras portas, desde que altere as ligações e o seu sketch de acordo com o novo circuito.

Esse é o Sketch de teste. Fiz ele com propósitos didáticos. Como eu ainda não sei como criar bibliotecas para o Arduino, usei uma programação estruturada com várias funções. Se acharem interessante, poderemos até criar uma biblioteca específica.  O Sketch pemite o uso de todos os modos de passo : Full, Half, Micro-passo de 1/4, Micro-passo de 1/8 e Micro-passo de 1/16. Permite também que configure a frequência dos pulsos (passos), a quantidade de passos,o sentido de rotação, etc. 

Anexei o arquivo do Sketch : A4988a.INO 

// Controle de Motor de Passo NEMA17 com Modulo driver A4988
// http://labdegaragem.com/forum/topics/tutorial-arduino-motor-de-pass...
// Motor Minebea NEMA 17 Unipolar / Modulo A4988 / Arduino Nano / IDE 1.6.7
// OBS: Motor Unipolar 6 fios configurado como Bipolar
// Gustavo Murta 02/abr/2016

// Definições das Portas Digitais do Arduino

int RST = 8; // Porta digital D08 - reset do A4988
int SLP = 9; // Porta digital D09 - dormir (sleep) A4988
int ENA = 7; // Porta digital D07 - ativa (enable) A4988
int MS1 = 4; // Porta digital D04 - MS1 do A4988
int MS2 = 5; // Porta digital D05 - MS2 do A4988
int MS3 = 6; // Porta digital D06 - MS3 do A4988
int DIR = 3; // Porta digital D03 - direção (direction) do A4988
int STP = 2; // Porta digital D02 - passo(step) do A4988
int atraso = 0; // Atraso no pulso em microsegundos
float FREQ = 200; // Frequências dos pulsos (100.7 Hz medido com scope = 100 Hz)
boolean sentido = true; // Variavel de sentido
int CONTADOR = 200; // Número de pulsos (passos por volta)

// FULL = 200 passos / HALF = 400 passos / P1_4 = 800 passos / P1_8 = 1600 passos / P1_16 = 3200 passos

void setup()
{
Serial.begin(9600);

DDRD = DDRD | B11111100; // Configura Portas D02 até D07 como saída
digitalWrite(ENA, HIGH); // Desativa o chip A4988
FULL() ; // Configura modo de avanço do motor FULL, HALF, P1_4, P1_8 ou P1_16

DDRB = 0x0F; // Configura Portas D08,D09,D10 e D11 como saída
digitalWrite(SLP, HIGH); // Desativa sleep do A4988
rst_A4988(); // Reseta o chip A4988
digitalWrite(ENA, LOW); // Ativa o chip A4988

FREQUENCIA(); // Calcula o período do sinal STEP
//Serial.println(atraso) ; // Imprime na Console, o tempo em microsegundos
}

void rst_A4988()
{
digitalWrite(RST, LOW); // Realiza o reset do A4988
delay (10); // Atraso de 10 milisegundos
digitalWrite(RST, HIGH); // Libera o reset do A4988
}

void HOR() // Configura o sentido de rotação do Motor
{
digitalWrite(DIR, HIGH); // Configura o sentido HORÁRIO
}

void AHR() // Configura o sentido de rotação do Motor
{
digitalWrite(DIR, LOW); // Configura o sentido ANTI-HORÁRIO
}

void PASSO() // Pulso do passo do Motor
{
digitalWrite(STP, LOW); // Pulso nível baixo
delayMicroseconds (atraso); // Atraso de X microsegundos
digitalWrite(STP, HIGH); // Pilso nível alto
delayMicroseconds (atraso); // Atraso de X microsegundos
}

void FREQUENCIA() // Configura quantos pulsos por segundo (Hz)
{
atraso = 1000000 / (2*FREQ); // calculo do tempo de atraso (1/2 periodo) em us
}

void FULL()
{
digitalWrite(MS1, LOW); // Configura modo Passo completo (Full step)
digitalWrite(MS2, LOW);
digitalWrite(MS3, LOW);
}

void HALF()
{
digitalWrite(MS1, HIGH); // Configura modo Meio Passo (Half step)
digitalWrite(MS2, LOW);
digitalWrite(MS3, LOW);
}

void P1_4()
{
digitalWrite(MS1, LOW); // Configura modo Micro Passo 1/4
digitalWrite(MS2, HIGH);
digitalWrite(MS3, LOW);
}

void P1_8()
{
digitalWrite(MS1, HIGH); // Configura modo Micro Passo 1/8
digitalWrite(MS2, HIGH);
digitalWrite(MS3, LOW);
}

void P1_16()
{
digitalWrite(MS1, HIGH); // Configura modo Micro Passo 1/16
digitalWrite(MS2, HIGH);
digitalWrite(MS3, HIGH);
}

void TesteMotor()
{
HOR();
for(int i=0; i <= CONTADOR; i++) // Incrementa o Contador
{
PASSO(); // Avança um passo no Motor
}
delay (750) ; // Atraso de 500 mseg
AHR();
for(int i=0; i <= CONTADOR; i++) // Incrementa o Contador
{
PASSO(); // Avança um passo no Motor
}
delay (1500) ; // Atraso de 500 mseg
}

void loop()
{
FULL();
FREQ = 200;
FREQUENCIA();
CONTADOR = 200;
Serial.print(atraso);
Serial.println(" us Full, 200 passos, 200 Hz");
Serial.println();
TesteMotor();

HALF();
FREQ = 600;
FREQUENCIA();
CONTADOR = 400;
Serial.print(atraso);
Serial.println(" us Half, 200 passos, 600 Hz");
Serial.println();
TesteMotor();

P1_4();
FREQ = 1600;
FREQUENCIA();
CONTADOR = 800;
Serial.print(atraso);
Serial.println(" us Micro 1/4, 800 passos, 1600 Hz");
Serial.println();
TesteMotor();

P1_8();
FREQ = 3600;
FREQUENCIA();
CONTADOR = 1600;
Serial.print(atraso);
Serial.println(" us Micro 1/8, 1600 passos, 3600 Hz");
Serial.println();
TesteMotor();

P1_16();
FREQ = 6600;
FREQUENCIA();
CONTADOR = 3200;
Serial.print(atraso);
Serial.println(" us Micro 1/16, 3200 passos, 6600 Hz");
Serial.println();
TesteMotor();
}

Para que possam ver como o teste é realizado estou divulgando esse video , onde estou rodando o mesmo Sketch.

Motor NEMA17 + Driver A4988 - teste do Motor 

Anexos

Nema17 + Driver A4988 - Controle através do Arduino (FRITZING) 

Galera, fiz o meu primeiro diagrama de Protoboard no Fritzing !

A montagem é a mesma - circuito do Módulo Driver A4988 conectado ao motor de passo NEMA17 e sendo controlado por um Arduino Nano.

Obs: não consegui alterar as cores dos fios do motor. 

Faltou o arquivo em Anexo do Fritzing = A4988 Arduino Nano.fzz

Anexos

Boa noite José Gustavo. Muito bom o post.

Será que poderia me explicar sobre essas duas partes do código ?

DDRD = DDRD | B11111100; // Configura Portas D02 até D07 como saída 

DDRB = 0x0F; // Configura Portas D08,D09,D10 e D11 como saída 

Nunca vi esse código; não sei como se trabalha com ele ?

DDRx (Data Direction Register) é um registrador (de 8bits) do microcontrolador, que é utilizado para definir um pino como entrada ou saída. Se escrever 0 (zero) o pino é definido como entrada, se for 1 (um) é definido como  saída.

Quando se utiliza a função pinMode(pin, mode), basicamente o registrador DDRx é modificado, mas apresenta o incoveniente de permitir que apenas um pino seja modificado de cada vez. Nesse caso você precisaria chamar 6 vezes pinMode(pin, mode), para configurar os pinos D2 a D7 como saída, por exemplo.

O 'x' indica o PORT que o programador está trabalhando, que pode ser A, B, C ..., por exemplo PORTB (porta B), PORTC (porta C), DDRB (registrador de direção do PORTB).

Obrigado Flávio ! Muito bem explicado. 

Veja os registradores do ATmega 328 :

  • B (digital pin 8 to 13)
  • C (analog input pins)
  • D (digital pins 0 to 7)

Bit = 1  (saída) 

Bit = 0 (entrada) 

Referência para estudo:

https://www.arduino.cc/en/Reference/PortManipulation

Obrigado José Gustavo. Seus posts são bem úteis pra mim. Obrigado pela referência de estudo. Vou Estudar isso aí.

Obrigado Flavio. Muito bem esclarecido. Irá ajudar muito.

Nema17 + Driver A4988  => Controle de Corrente Máxima

Como eu já havia dito, o chip A4988 tem recursos de proteção contra excesso de temperatura ( temperatura de Shutdown é de 165 graus Celsius), proteção contra excesso de corrente nos FETs internos de potência e ainda proteção contra curto-circuitos dos pinos conectados nas bobinas. 

A verificação das correntes nas bobinas do motor é realizada através da  medição das tensões sobre os resistores RS1 e RS2 do módulo. Essas tensões são comparadas com a tensão de referência (V REF) .

Essa tensão de referência é ajustada através do trimpot (POT). Marquei com uma seta vermelha. 

O cálculo da corrente máxima é esse :

             I max = V REF / ( 8 x RS ) 

No meu módulo RS = 0,1 ohm e a tensão Vref = 1,25 V ( veio ajustado com essa tensão) 

Portanto :

             I max = 1,25 / ( 8 x 0,1 )  =  1,56 Ampéres 

Assim, se as correntes nas bobinas ultrapassarem o valor  de 1,56 A, o chip é desativado para proteção.

Como sabemos que a corrente máxima suportada pelo chip é de 2A, um ajuste pode ser feito no Trimpot. 

Mas aconselho a fazer esse ajuste antes de alimentar a tensão do motor e com muita precisão. 

Não é simples esse ajuste, já que terá que medir tensão no pino 17 (V REF) do chip smd. 

Mais um dica para ajustar a corrente do Driver A4988 :

Para fazer o ajuste de corrente, é necessário girar delicadamente o potenciometro do módulo ( como já informado no tópico anterior) . 

Como medir as tensões nos resistores RS1 e RS2 (SMDs) do módulo é muito difícil pelo reduzido tamanho, sugiro que  instale um resistor de potência  ( com valor baixo como 0,1 ohm ou até 1 ohm)  em série com a fonte. Desse modo medindo a tensão sobre esse resistor, poderá calcular a corrente consumida pelo motor. Use o modo passo completo com velocidade muito baixa, para aumentar a precisão no ajuste da corrente. 

Corrente máxima do A4988 = 2 A !

    I = V / R 

 

Por exemplo :

Para R1 = 0,1 ohm =>  I = V / R = 0,15 V / 0,1 = 1,5 A

Para R1 = 1 ohm =>  I = V / R = 1,5 V / 1 = 1,5 A

Boa tarde!

Primeiramente parabéns pelas suas postagens.

Gostaria de saber se tem alguma ideia para um problema que estou enfrentando

Estou montando uma CNC para produzir PCB, possuo 3 motores NEMA16 com tensão de referencia de 2.0V e corrente de 0.7amp. Driver A4988 e Shield V3. Arduino UNO.

O problema é que os motores não giram só vibram ou giram de forma irregular.

Regulei o TrimPOT do driver A4988 no vref para 0.28v. (0.7/2.5).

Outra informação importante, alimentei a Shield V3 com fonte de PC 12v, também tentei com uma fonte 12V 2A, esta na protoboard e com 1 motor.

Estou usando o GRBL Controler.

Fiz o esquema de ligação na protoboard do A4988 com o Arduino e 1 motor, mas também não girou.

Quando coloco para o motor girar uma volta no GRBL era fica vibrando e girando irregular. quando coloco várias voltas ele começa vibrar, pára e começa a fazer barulho agudo e depois volta a vibrar antes de parar novamente.

Não sei se é algum problema com a alimentação, configuração do passo, enfim estou meio perdido.

Agradeço de pudesse me indicar um possível problema.

Meça a corrente no driver para saber se ajustou corretamente . Veja o tópico acima sobre a inserção de um resistor em série na alimentação do driver A4988 (método mais fácil). Pode ser que a corrente não esteja sendo suficiente. 

Sugiro que faça essa montagem do meu tópico, pois assim conseguirá testar seus módulos e seus motores. Use o meu sketch !

Nema17 + Driver A4988 - Controle através do Arduino:
http://labdegaragem.com/forum/topics/tutorial-arduino-motor-de-pass...

RSS

© 2024   Criado por Marcelo Rodrigues.   Ativado por

Badges  |  Relatar um incidente  |  Termos de serviço