Fabricada pela empresa Allegro, o Driver A4988 é um suporte direcional completo designado a motores de passo bipolar, dispondo de funções como microstepping, Translação, proteção contra Sobrecorrente e cinco resoluções de controle distintas. Além disso, possui duas pontes H integradas no próprio chip, suportando uma alimentação de 8 á 35 V, e possibilita a aplicação de até 2A por bobina.

             Podemos dizer que algumas das principais qualidades desse componente encontram-se no controle de corrente ajustável, visto que tal função possibilita definir manualmente a corrente máxima de saída, permitindo a aplicação de tensões acima do valor nominal do motor. O regulador de tensão apresenta um sistema inteligente com a habilidade operacional de selecionar automaticamente o modo de decaimento mais adequado (sendo eles lento ou misto), desligamento térmico para excessos na temperatura, e proteção contra correntes cruzadas. Isso irá gerar uma dissipação reduzida na potência, possibilitando uma precisão mais apurada.

Aplicado no controle de motores de passo bipolar.


Passos por Resolução

            Motores de passo, como o próprio nome sugere, apresentam uma movimentação em passos discretos ou fracionados, e na maioria dos casos possui um ângulo de rotação equivalente a 1,8º. Como uma volta completa corresponde a 360º, quantos passos seriam necessários para concluir cada ciclo? Esse tipo de valor é conhecido como PPR (Passos por revolução ou Pulsos por revolução), e poderá ser obtido através do seguinte calculo:

PPR= 360º/ângulo de rotação 

PPR= 360º/1,8º = 200 passos

            O tamanho do pulso irá influenciar diretamente na precisão do controle, e no torque do motor. Por exemplo, quanto mais lento for à rotação, maior será o tamanho do pulso, resultando em pouca suavidade no movimento. A resolução dessa questão encontra-se na redução do tamanho do pulso, que será obtida por um controle em MicroSteeping (ou Micropassos), dividindo ciclos completos em etapas menores, suavizando a movimentação do motor, afinal, quanto menor o passo, maior será a precisão. Aplicando esse modo de controle ao caso apresentado anteriormente, o ângulo de 1,8º poderá dividir-se até 256 vezes, obtendo passos de até 0,007 graus (1,8 x 0,007) ou 51200 Micropassos.Esse tipo de aplicação auxilia principalmente em casos que envolvam velocidades baixas, resultando em uma redução no torque do motor, que pode alcançar uma média de até 30% em Full-Step.

            Para atribuir uma das cinco resoluções de passo a movimentação de um motor, será necessário aplicar os seguintes níveis lógicos apresentados abaixo aos terminais MS1, MS2 e MS3 da placa A4988.

A resolução atribuída aos passos de um motor irão influenciar diretamente em sua velocidade e torque.


                 Se aplicarmos o cálculo PPR ao modo Sisteenth-Step, por exemplo, iremos obter um valor 3200 passos por revolução.  

1,8º* 1/16 = 0,1125º

PPR= 360º/0,1125º = 3200 passos



Pinos de Conexão

            O Drive A4988 será capaz de controlar apenas motores bipolares com quatro, seis e oito fios, desde que estejam conectados corretamente, outros modelos como Unipolar se mostraram incompatíveis para este tipo de componentes, a única exceção será dada aos modelos com capacidade de operar em modo bipolar.

            Se observar atentamente os terminais do Drive, verá que a distribuição divide-se perfeitamente em duas seções, uma para os pinos de controle, e outra com os pinos de conexão do motor e monitoramento de corrente.

Este driver demonstra um layout bem divido, separando as entradas de controle lógico, dos pinos de alimentação.



Entradas de Controle

            Nas entradas de controle, o pino STEP corresponde avanço do passo, de acordo com o nível lógico aplicado sob ele, enquanto DIR controla o sentido de rotação. Se desejar acionar a rotação em um único sentido, basta conectar o STEP diretamente no GND ou VCC. Os terminais RST, ENABLE e SLP, serão utilizados para controlar os estados de energia aplicados ao chip, reagindo ao receberem níveis lógicos baixos.

            ENABLE será utilizado para ativar os drivers do motor, e, como se encontra conectado a um resistor de pull-down (GND), permanecerá sempre ativo mesmo que esteja sem qualquer conexão, a única forma de desabilita-lo será atribuindo um nível lógico alto.

            RESET reinicia o chip desativando os drivers de saída, enquanto o pino SLP possui a função de criar um “descanso” (Sleep) para a placa, desabilitando algumas funções internas com o intuito de economizar energia. Caso estejam em desuso, e não haja intensões de controla-los através de alguma programação, a melhor opção será interliga-los, desabilitando as funções de ambos os terminais.  

            MS1, MS2 e MS3 possuem resistores de pull-down, com o valor de 50 KΩ para o MS2, 100 KΩ aos demais. Portanto, se desejar controlar o motor em Full-Step, basta manter os pinos desconectados.

Entradas de Alimentação

            O funcionamento do Driver requer uma conexão com a alimentação lógica do microcontrolador (3,3V á 5V) nos pinos VDD e GND, e  outra com a fonte de energia atribuída ao motor (8V á 35V) nos terminais VMOT e GND.

            Entre as entradas de alimentação, será necessário adicionar dois capacitores eletrolíticos para filtrar possíveis ruídos na alimentação, em motores 12 V normalmente são aplicados valores de 47 á 100 uF,  para o microcontrolador 10 uF. A própria placa em si utiliza alguns capacitores de cerâmica Low-ESR, o que a torna meio suscetível a picos de tensão, especialmente ao utilizar cabos de força um pouco mais grosso que o normal, e em determinadas condições esses picos poderão resultar em danos permanentes a placa, mesmo quando a tensão encontra-se abaixo de 12 V. E por fim, os terminais 2B, 2A,1A e 1B serão aplicados a conexão das bobinas do motor .

            A comunicação entre o microcontrolador e o motor bipolar será similar a ilustração demonstrada a seguir.

O driver servirá como uma ponte na comunicação entre o microcontrolador e o motor de passo.


            O drive possui um sistema de segurança inteligente, protegendo o funcionamento do componente através do desligamento de algumas funções caso haja excesso de corrente, temperaturas elevadas ou curto circuitos. Porém, essa proteção baseia-se nos valores de limitação do componente, que serão definidos de acordo com a corrente máxima do motor, disponível no datasheet do produto.

            O limite poderá ser definido através de um potenciômetro localizado no próprio drive, aplicando o valor de corrente que passa por uma única bobina do motor no seguinte calculo:

VREF = IMAX * (8×RS)

Onde:

VREF à Tensão de referência do driver

IMAX à Corrente máxima do motor

RS à Resistência no resistor de detecção (RS1 e RS2)

             Os resistores de detecção de corrente possuem um valor de 0,05Ω, e encontram-se em série no circuito da placa, portanto, o valor de RS será 0,10Ω. Suponha que a corrente máxima do motor corresponde a 1,4 A, aplicando ao calculo iremos descobrir que a tensão deverá ser ajustada em 1,12 V.

VREF = 1,4* (8×0,1)

VREF = 1,12V

            Para medir o valor de referência atual presente no A4988, deixe o drive em modo Full-Step, e toque as pontas de prova de um Voltímetro entre o pino GND e a chave rotativa do potenciômetro. Procure realizar as leituras e ajustes do drive sem o auxilio de uma fonte de alimentação, isso evitará possíveis danos à placa.

O ajuste de VREF será realizado por meio de um pequeno potenciômetro.



Controlando um Motor bipolar de passo com Arduino

            Neste tópico faremos um teste de controle para Motores de passo Nema 17 com o Driver A4988, acionando as cinco resoluções de passo disponíveis e o sentido da rotação através da placa Microcontroladora Arduino. Para concluir as atividades desse post, tenha em mãos os seguintes componentes:

1 - Driver Motor de Passo – A4988;
1 - Arduino Uno R3;
1 - Kit Jumper Macho Macho;
1 - Protoboard 400 Pontos;
1 - Capacitor Eletrolítico 100 uF/50V;
1 - Capacitor Eletrolítico 10 uF/50V;
1 – Motor de Passo NEMA 17 – 6,5 Kgf.cm/1,2A;
1 - Conversor AC/DC 90~240 VAC – 9,0VDC/1A - JP4;

           Você pode compra-los clicando nos links acima ou visitando nosso site: www.curtocircuito.com.br.

Circuito Elétrico

            Primeiramente, iremos configurar a tensão de referência do A4988, para isso, será necessário descobrir a corrente máxima atribuída a cada bobina do motor, e aplica-lo ao calculo VREF = IMAX * (8×RS). No caso do motor NEMA 17, o valor máximo será de 1,2 A, resultando em 0,96 V.

             Para ajustar o VREF utilize um voltímetro, tocando com as pontas de prova no pino GND e no potenciômetro, verificando se o valor obtido estará próximo de 0,96 V, caso contrário, procure girar a chave rotativa com delicadeza até atingir o limite desejado.

Com o auxilio de um multímetro, verifique se a tensão ajustada corresponde ao necessário, caso contrário, aplique uma chave de fenda, e gire lentamente até atingir o valor desejado.


           Nesta atividade iremos controlar todos os pinos de comunicação do Drive, portanto, conecte o A4988 a um Protoboard distribuindo jumpers macho-macho entre os pinos ENABLE, MS1, MS2, MS3, RST, SLP, STEP, DIR, e as portas digitais 6 ao 13 do Arduino. 


O controle do drive será realizado através dos pinos digitais do Arduino.


             O Motor NEMA 17 utilizado neste exemplo era um modelo composto por seis fios, e para conecta-lo ao A4988 foi necessário deixar os fios Amarelo (YEL) e Branco (Wht) isolados do circuito, enquanto os demais terminais foram coinectados ao driver como mostra a imagem a seguir.


Modelos com mais do que quatro fios serão obrigados isolar alguns terminais, no caso do exemplo na imagem, os terminais isolados serão os pinos centrais.


             O circuito poderá enfrentar alguns problemas com picos de tensão, então como forma de protegê-lo distribua os capacitores eletrolíticos entre as duas fileiras de alimentação do Protoboard, deixando uma com 10 uF e a outra com 100 uF. Verifique atentamente a polaridade dos componentes antes de encaixa-los no Protoboard. 


A polaridade de capacitores eletrolíticos poderá ser observada através do tamanho de seus terminais, ou pela própria embalagem, que indicará o polo negativo.


            A fileira com 100 uF será responsável por proteger o motor, portanto, conecte-o aos pinos GND e VMOT, enquanto a de 10 uF deverá conectar-se aos terminais GND e VDD do A4988, e 5V e GND do Arduino, para proteger a alimentação lógica do microcontrolador. 


O circuito elétrico do driver será protegido pelos capacitores eletrolíticos, evitando problemas ocasionados por picos de energia.



Programação

            Na programação a seguir iremos ativar as cinco resoluções de passo, controlar o sentido da rotação, e até mesmo, proporcionar um descanso a algumas funções.

// Projeto Curto Circuito - A4988 & Arduino: Controle para motores Bipolar
//---- Pinos de controle A4988--- 
#define ENA 13 // Enable ativa os drivers do motor
#define MS1 12 // Seleciona a resolução do passo
#define MS2 11 // Seleciona a resolução do passo
#define MS3 10 // Seleciona a resolução do passo 
#define RST 9 // Desativa os drivers de saída
#define SLP 8 // Inicia um descanso para algumas funções do drive
#define STP 7 // Avanço do passo
#define DIR 6 // Direção do passo
//---- Variáveis de controle ----
int PPR = 0;      // pulsos por resolução
int passo = 0;    // passos
int temp = 1000;  // tempo entre os passos 
void setup()
{
  pinMode(ENA, OUTPUT);
  pinMode(MS1, OUTPUT);
  pinMode(MS2, OUTPUT);
  pinMode(MS3, OUTPUT);
  pinMode(STP, OUTPUT);
  pinMode(DIR, OUTPUT);
  digitalWrite(SLP, LOW);   // Sleep desabilitado 
  digitalWrite(DIR, HIGH);  // Sentido Horário habilitado
  digitalWrite(RST, HIGH);  // RST habilitado 
  Serial.begin(9600);
  Serial.println("Pressione: r- para resetar // s - para iniciar Sleep // o - para desativar Sleep");
  delay(100);
  Serial.println("1 para FULL - STEP // 2 para HALF - STEP // 3 para Quarter - STEP // 4 para Eighth - STEP // 5 para Sixteenth - STEP");
}

void loop()
{
  char choice = Serial.read(); // Lê os caracteres escritos no monitor serial

  if (choice == '1')
  {                           // Se receber 1
    Serial.println("Full");   
    full();                  // Inicia o void full
    volta();                 // Inicia o void volta 
  }
  if (choice == '2')
  {                           // Se receber 2
    Serial.println("Half");
    half();                   // Inicia o void half
    volta();
  }
  if (choice == '3')
  {                           // Se receber 3
    Serial.println("1 / 4");
    quarter();                // Inicia o void quarter
    volta();
  }
  if (choice == '4')
  {                          // Se receber 4
    Serial.println("1 / 8");
    eighth();                // Inicia o void eighth
    volta();
  }
  if (choice == '5')
  {                          // Se receber 5
    Serial.println("1 / 16");
    sixteenth();             // Inicia o void sixteenth
    volta();
  }
  if (choice == 'r')
  {                           // Se receber r
    Serial.println("Iniciar Reset");
    rst();                    // Inicia o void rst
  }
  if (choice == 's')
  {                           // Se receber s
    Serial.println("Iniciar Sleep");
    Sleepon();                // Inicia o void Sleepon
  }
  if (choice == 'o')
  {                            // Se receber o
    Serial.println("Desligar Sleep");
    Sleepoff();               // Inicia o void Sleepoff
  }

}
void full()
{
  PPR = 200;               // Em Full - 200 passos
  Serial.println("Modo Passo Completo (Full - Step)");
  digitalWrite(MS1, LOW);  
  digitalWrite(MS2, LOW);
  digitalWrite(MS3, LOW);
}
void half()
{
  PPR = 400;               // Em half - 400 passos
  Serial.println("Modo Meio Passo(Half - Step)");
  digitalWrite(MS1, HIGH);
  digitalWrite(MS2, LOW);
  digitalWrite(MS3, LOW);
}
void quarter()
{
  PPR = 800;               // Em quarter - 800 passos
  Serial.println("Modo Quarter - STEP (1 / 4)");
  digitalWrite(MS1, LOW);
  digitalWrite(MS2, HIGH);
  digitalWrite(MS3, LOW);
}
void eighth()
{
  PPR = 1600;             // Em eighth - 1600 passos
  Serial.println("Modo Eighth - STEP (1 / 8)");
  digitalWrite(MS1, HIGH);
  digitalWrite(MS2, HIGH);
  digitalWrite(MS3, LOW);
}
void sixteenth()
{                      // Em sixteenth - 3200 passos
  PPR = 3200;
  Serial.println("Modo Sixteenth - STEP (1 / 16)");
  digitalWrite(MS1, HIGH);
  digitalWrite(MS2, HIGH);
  digitalWrite(MS3, HIGH);
}
void volta() {
  HR();  // Inicia o sentido horário
  while (PPR > passo)
  {      // Enquanto PPR for maior que passo
     // Avança o passo
    digitalWrite(STP, LOW);
    delayMicroseconds(temp); //Tempo em Microseconds
    digitalWrite(STP, HIGH);
    delayMicroseconds(temp);
    passo++; // Aumenta em 1 o valor de passo
  }
  passo = 0; // valor de passso muda pra 0 
  ena2();    
  delay(1000);
  ena();
  AH();      // Inicia o Sentido Anti-horário
  while (PPR > passo) 
  {      // Enquanto PPR for maior que passo
         // Avança o passo
    digitalWrite(STP, LOW);
    delayMicroseconds(temp);
    digitalWrite(STP, HIGH);
    delayMicroseconds(temp);
    passo++;
  }
  passo = 0;
  ena2();
  delay(1000);
  ena();

}
void ena2() {
  digitalWrite(ENA, HIGH);  // Ativa o A4988
  delay(10);
}
void ena() {
  digitalWrite(ENA, LOW);   // Desativa o A4988
  delay(10);
}
void HR() {                // Sentido Horário
  passo = 0;     
  Serial.println("Sentido - Horario");
  digitalWrite(DIR, HIGH);
}
void AH()  {               // Sentido Anti-Horário 
  passo = 0;
  Serial.println("Sentido - Anti-horario");
  digitalWrite(DIR, LOW);
}
void rst()  {      // Reseta os drivers 
  digitalWrite(RST, LOW);
  delay(10);
  digitalWrite(RST, HIGH);
  delay(10);
  Serial.println("Reset OK");
}
void Sleepoff()  {   // Desativa o modo Sleep
  Serial.println("Sleep off");
  digitalWrite(SLP, LOW);
  delay(10);
}
void Sleepon()  {   // Ativa o modo Sleep
  Serial.println("Sleep on");
  digitalWrite(SLP, HIGH);
  delay(10);
}

           Os pinos de controle do A4988 serão operados como saídas digitais comuns, com exceção de RST (reset) e SLP (Sleep). Todos os comandos serão ativados através de caracteres no monitor serial, sendo os números de 1 á 5 aplicados aos modos Full, Half, 1/4, 1/8 e 1/16 respectivamente, e as letras “r” no reiniciar dos drivers do chip, “s” e “o” para ativar ou desativar o modo Sleep.

A programação permitira um acionamento das funções via caracteres no monitor serial do Arduino IDE.


           Como o motor possui um ângulo de movimentação de 1,8º, serão necessários 200 passos para atingir um ciclo completo de 360º em modo Full-Step. Cada modo de passo irá concluir dois ciclos, um em sentido horário e outro em anti-horário,ao atingir a quantidade determinada na variável “PPR”.

           A função while (PPR > passo) fará uma comparação, e, enquanto o valor de PPR for maior que a variável “passo”, o motor irá avançar.   O tempo entre cada avanço estará armazenado em “temp”, e será interpretado em microssegundos.

            O modo Sleep minimiza o consumo de energia, normalmente aplicado quando o motor encontra-se em desuso, pois desativa algumas funções do circuito interno como os FETs de saída, regulador de tensão e o charge pump (bomba de carga), que nesse caso servirá na estabilização do componente. Ao enviar o caractere “s” ao monitor serial, o pino SLP receberá nível lógico baixo, mantendo o A4988 em suspensão, enviando “o”, mudará a lógica para alta, retornando as atividades normais do chip. Enquanto a letra "r" irá resetar o funcionamento do driver. 

Considerações Finais

            O driver A4988 será uma das melhores opções para o acinamento de motores até 2A por bobina, visto que dispõe de um sistema inteligente completo com diversas opções de proteção para o circuito, e um controle de movimentação totalmente ajustável. Até mesmo componente como o CNC Shield V3 utilizam deste tipo de tecnologia integrada, simplificando a construção de projetos como impressoras 3D, cortadoras a laser, etc. Desenvolver sua própria CNC nunca foi tão simples.  

Um acionamento de motores bipolar simples e de fácil acesso.