Motor de passo de controle com módulo de driver A4988 e ESP32

Tempo de leitura: 12 minutes

Neste tutorial de introdução, aprenderemos a fazer a interface do módulo de driver de motor de passo A4988 com o ESP32. Este módulo de driver A4988 que é usado para controlar um motor de passo de maneira relativamente simples. Usando apenas dois pinos do módulo de driver ESP32 e A4988, podemos controlar a velocidade de rotação, bem como o sentido de rotação de um motor de passo. Aprenderemos tudo sobre este módulo de driver e como usá-lo com Arduino para controlar um motor de passo NEMA 17 bipolar. Este guia também inclui dois esboços do Arduino que fornecem uma boa compreensão básica de como controlar facilmente a velocidade, direção e aceleração/desaceleração do motor de passo usando este módulo de driver de motor de passo.

Exigiremos os seguintes componentes para este guia do usuário:

Componentes necessários

  • Placa de desenvolvimento ESP32
  • Módulo de driver A4988
  • Motor de passo NEMA 17
  • Fonte de alimentação externa de 12V
  • Fios de conexão

 

Motores de passo

Os motores de passo são motores síncronos e sem escovas CC. Eles giram em etapas discretas de valores predefinidos e são capazes de girar no sentido horário e anti-horário. Ao contrário de outros motores CC, eles fornecem um controle de posição preciso de acordo com o número de passos por revolução para o qual o motor foi projetado. Isso significa que uma revolução completa de um motor de passo é dividida em um número discreto de etapas. Eles são comumente usados em máquinas CNC, robótica, impressoras 2D e 3D.

Para este guia, usaremos um motor de passo NEMA 17 e o controlaremos através do Módulo Driver A4988.

 

Motor de passo NEMA 17

É adequado para impressoras 3d, máquinas CNC, máquinas de gravura, braços robóticos, etc. Em dispositivos de baixa velocidade que exigem movimento rotatório inteligente em uma velocidade específica sem perder nenhuma etapa, pode-se usar o NEMA 17. NEMA 17 torque-velocidade é mutável aplicando as diferentes velocidades de operação. Na verdade, o torque depende de vários fatores, que são a aplicação de corrente, tensões, e o terceiro fator é a indução da bobina dentro do motor. A rotação do motor requer que o campo magnético dê um único passo. O tempo necessário para tornar a bobina totalmente magnética depende da indução da bobina.

No NEMA 17 todos os pinos são conectados internamente com a bobina. Para fazer o movimento precisamos magnetizar a bobina. Internamente para controlar o motor de passo teremos que usar o par verde e preto. O segundo par será de vermelho e azul.

Especificações

  • Sua tensão nominal é 12V
  • A corrente de fase é 2,2A
  • O torque de retenção é igual a 40N.cm
  • Um ângulo de passo será de 1,8 graus.
  • O total de passos para cada resolução será de 200.4 fios e chumbo de 8 polegadas
  • Número de fases são 4
  • A indutância total por cada fase será de 2,8 mH
  • A resistência da bobina é de 1,5 Ohm por bobina.

Para obter mais informações sobre o NEMA 17, consulte o datasheet aqui.

 

Modulo Driver A4988

O Módulo Driver A4988 é usado para controlar a velocidade e direção de motores de passo usados principalmente em robótica, brinquedos, impressoras 3D para controle de movimento. É capaz de operar motores de passo bipolares nos modos de passo completo, meio passo, quarto de passo, oitavo passo e décimo sexto passo. Há um tradutor embutido que permite que apenas dois pinos da placa ESP32 sejam usados para controlar a velocidade e direção do motor de passo.

Este módulo de driver compacto e de pequeno porte possui as seguintes especificações:

  • Tensão Máxima de Operação: 35V
  • Tensão Mínima de Operação: 8V
  • A corrente máxima por fase é 2A para que possa controlar facilmente o NEMA17 que possui uma corrente de saída de 2A por fase.
  • Dimensões: 15,5 × 20,5 mm (0,6″ × 0,8″)
  • Capaz de operar motores de passo bipolares nos modos de passo completo, meio passo, quarto de passo, oitavo passo e décimo sexto passo
  • Em full step, o driver tem 200 passos por revolução que é 1,8 graus por passo.
  • Possui circuito de desligamento térmico

O módulo de driver A4988 vem com um dissipador de calor para resfriar o circuito interno em caso de maior dissipação de energia. Ele permite que o IC esfrie se as temperaturas forem mais altas do que as seguras.

Podemos facilmente conectar o dissipador de calor na parte superior do A4988 IC, conforme mostrado no diagrama acima. Isso protegerá o IC caso a temperatura ultrapasse um valor mais alto. Assim, se você não conectar o dissipador de calor, o módulo do driver permitirá 1A de corrente por fase. No entanto, com o recurso de resfriamento, a corrente máxima permitida por fase será de 2A. Por isso, é sempre aconselhável usar o dissipador de calor.

Pinagem

A figura abaixo mostra os 16 pinos que estão presentes no Módulo de Driver A4988:

O módulo possui um total de 16 pinos que podem ser divididos em quatro categorias: os pinos de saída em azul que serão conectados ao motor, os pinos de controle em verde, os pinos de seleção de tamanho de passo em marrom e os pinos de alimentação em vermelho.

Vamos discuti-los um por um.

Pinos do Motor

Estes são os pinos da bobina do motor conectados a cada uma das quatro bobinas do motor. Esses pinos serão conectados com motores de passo bipolares (8V-35V) onde a corrente máxima de saída é de 2A por bobina. Portanto, cada pino será capaz de fornecer no máximo 2A para cada bobina do motor de passo.

  • 2B: Este é conectado com o pino de 2 segundos da bobina do motor.
  • 2A: Este é conectado com o pino de 1 segundo da bobina do motor.
  • 1A: Este é conectado com o primeiro pino da bobina do motor 1.
  • 1B: Este é conectado com o primeiro pino da bobina do motor 2.

Pinos de controle

Estes são os pinos de controle que são usados para controlar onde EN, SLP e RST controlam os estados de energia e DIR e STEP controlam a entrada.

STEP: Este é o pino que controla os passos de rotação (micropassos) do motor. Ele será conectado com um pino GPIO do ESP32. Quando um sinal alto for passado para este pino, o motor se moverá um passo. A velocidade de rotação do motor mudará de acordo com a rapidez com que o sinal do pino fica alto.

Pinos de seleção de tamanho de etapa

Esses três pinos MS1, MS2 e MS3 são usados para selecionar a resolução de micropassos das cinco opções fornecidas que este módulo de driver suporta. A tabela abaixo mostra os estados necessários para cada um desses três pinos para permitir a resolução de micropassos apropriada.
LSPMS2LSRResolução de micropredotos
BAIXOBAIXOBAIXOPasso completo
ALTOBAIXOBAIXO1/2 Passo
BAIXOALTOBAIXOPasso 1/4
ALTOALTOBAIXO1/8 Passo
ALTOALTOALTOPasso 1/16

Além disso, esses três pinos são conectados internamente com resistores pull-down, então, por padrão, quando desconectado, a resolução de micropasso será definida como passo completo.

Pinos de alimentação

Por fim, falaremos sobre os pinos de alimentação que incluem VMOT,GND e VCC e GND. Como você pode notar, são necessárias duas conexões de energia para este driver. Um para a alimentação do motor de passo e outro para alimentar o módulo de driver A4988.

  • VMOT, GND: Estes são os pinos de alimentação do motor de passo. Conecte a fonte de alimentação externa de 8-35V com VMOT e terra comum.
  • VCC, GND: Estes são os pinos da fonte de alimentação do módulo de driver A4988. Conecte 3-5,5V do microcontrolador com VCC e terra comum com o microcontrolador.

Interface A4988 com motor de passo e ESP32

Para conectar a placa ESP32 com o motor de passo e driver, usaremos todos os pinos do driver, exceto o pino de habilitação e os pinos de seleção de resolução de micro passo.

Siga o diagrama esquemático abaixo para conectar corretamente todos os dispositivos.

Conecte os pinos de saída do driver com os respectivos pinos do motor. Conecte o pino STEP e o pino DIR com qualquer pino GPIO apropriado da placa ESP32. Usamos GPIO12 para conectar com DIR e GPIO14 para conectar com STEP. Como queremos operar nosso modo de passo em modo completo, deixaremos os pinos MS1, MS2 e MS3 como estão. O pino RST será conectado ao SLP para que o driver seja habilitado. Além disso, os pinos VCC e GND serão conectados aos pinos Vin e GND do ESP32, respectivamente. O VMOT será conectado com uma fonte de alimentação externa variando entre 8-35V. Estamos usando fonte de alimentação externa de 12V. Certifique-se de que os pinos GND estejam conectados aos respectivos aterramentos comuns.

Além disso, também podemos adicionar um capacitor (mínimo de 47uF) com a fonte de alimentação externa conectada aos pinos da fonte de alimentação do motor de passo para evitar problemas de pico de tensão.

 

Limite atual

Antes de conectar o motor de passo com o módulo driver, temos que garantir que a corrente que passa pelas bobinas do motor não exceda a corrente nominal máxima do motor. Para isso, usaremos o potenciômetro limitador de corrente apresentado no driver do motor A4988, conforme mostrado abaixo:

Vamos exigir um multímetro. Conecte o terminal positivo do multímetro com o potenciômetro e o terminal negativo do multímetro com o GND do módulo driver. A tensão medida neste ponto será conhecida como Vref. Ajuste o potenciômetro girando-o e os valores de Vref irão variar.

Para definir um limite de corrente, a seguinte fórmula é usada:

Limite de corrente = Vref x 2,5

Agora defina o Vref de acordo com a corrente nominal do seu motor para garantir que a corrente esteja dentro dos limites de corrente do motor.

 

Arduino Sketch Controlando o motor de passo NEMA 17 com driver A9488

Abra seu Arduino IDE e vá em Arquivo > Novo. Um novo arquivo será aberto. Copie o código abaixo nesse arquivo e salve-o.

Este código nos ajudará a controlar o motor de passo usando os pinos DIR e STEP do driver A9488. Mostraremos como girar o motor em ambas as direções em diferentes velocidades.

const int DIR = 12;
const int STEP = 14;
const int  steps_per_rev = 200;

void setup()
{
  Serial.begin(115200);
  pinMode(STEP, OUTPUT);
  pinMode(DIR, OUTPUT);
}
void loop()
{
  digitalWrite(DIR, HIGH);
  Serial.println("Girando no sentido horário...");
  
  for(int i = 0; i<steps_per_rev; i++)
  {
    digitalWrite(STEP, HIGH);
    delayMicroseconds(2000);
    digitalWrite(STEP, LOW);
    delayMicroseconds(2000);
  }
  delay(1000); 
  
  digitalWrite(DIR, LOW);
  Serial.println("Girando no sentido anti-horário...");

  for(int i = 0; i<steps_per_rev; i++)
  {
    digitalWrite(STEP, HIGH);
    delayMicroseconds(1000);
    digitalWrite(STEP, LOW);
    delayMicroseconds(1000);
  }
  delay(1000);
}

 

Como o Código Funciona?

O primeiro passo é definir os pinos GPIO do ESP32 que conectamos com os pinos DIR e STEP do driver. Como você pode ver, usamos GPIO12 e GPIO14 para conectar com DIR e STEP, respectivamente. No entanto, você também pode usar outros pinos ESP32 GPIO adequados.

const int DIR = 12;
const int STEP = 14;

O próximo passo é definir os passos por revolução. Este é o número de passos que nosso motor precisa para dar uma volta completa.

const int  steps_per_rev = 200;

Dentro da função setup(), Serial.begin() é usado para estabelecer a conexão serial entre a placa de desenvolvimento a uma taxa de transmissão de 115200. Usaremos a função pinMode() para configurar os pinos digitais conectados com STEP e DIR como saída alfinetes.

void setup()
{
  Serial.begin(115200);
  pinMode(STEP, OUTPUT);
  pinMode(DIR, OUTPUT);
}

loop()

Dentro da função loop() vamos primeiro girar o motor de passo no sentido horário a uma velocidade mais rápida e depois girá-lo na direção oposta a uma velocidade mais lenta. Isso ocorrerá com um atraso de 1 segundo.

Para controlar a direção do motor usaremos a função digitalWrite() e passaremos o pino DIR como primeiro parâmetro e o estado do pino como segundo parâmetro. Para mover o motor no sentido horário, um sinal alto é passado para o pino DIR. Da mesma forma, para mover o motor no sentido anti-horário, um sinal baixo é passado para o pino DIR. Além disso, o monitor serial exibirá a direção do movimento do motor.

digitalWrite(DIR, HIGH);
 Serial.println("Girando no sentido horário...");

Para controlar a velocidade do motor, usaremos um loop for até os passos por revolução e mudaremos o estado do pino STEP de HIGH para LOW com um atraso entre eles. Quanto mais rápido o estado do pino STEP for definido como HIGH, mais rápido o motor irá girar. Ao aumentar/diminuir o atraso estamos basicamente alterando a frequência do sinal que então altera a velocidade do motor.

void loop()
{
  digitalWrite(DIR, HIGH);
  Serial.println("Girando no sentido horário...");
  
  for(int i = 0; i<steps_per_rev; i++)
  {
    digitalWrite(STEP, HIGH);
    delayMicroseconds(2000);
    digitalWrite(STEP, LOW);
    delayMicroseconds(2000);
  }
  delay(1000); 
  
  digitalWrite(DIR, LOW);
  Serial.println("Girando no sentido anti-horário...");

  for(int i = 0; i<steps_per_rev; i++)
  {
    digitalWrite(STEP, HIGH);
    delayMicroseconds(1000);
    digitalWrite(STEP, LOW);
    delayMicroseconds(1000);
  }
  delay(1000);
}

Demonstração

Certifique-se de escolher a placa e a porta COM corretas antes de enviar seu código para a placa. Vá para Ferramentas > Placa e selecione Módulo de desenvolvimento ESP32. Em seguida, vá para Ferramentas > Porta e selecione a porta apropriada através da qual sua placa está conectada.

Clique no botão de upload para enviar o código para o board.
Depois de ter carregado seu código para a placa de desenvolvimento, pressione o botão ENABLE.

O motor de passo começará a girar no sentido horário e depois no sentido anti-horário repetidamente.

No seu Arduino IDE, abra o monitor serial e você também poderá ver o status da rotação do motor.

 

Instalando a Biblioteca AccelStepper

Exigiremos a biblioteca AccelStepper presente no Arduino Library Manager para controlar mais motores de passo e também incluir aceleração/desaceleração. Esta biblioteca nos fornecerá funções úteis para definir a velocidade máxima, aceleração e passos por revolução para girar o motor em ambas as direções.

Para instalar a biblioteca, usaremos o Arduino Library Manager. Abra o seu Arduino IDE e vá para Sketch > Include Libraries > Manage Libraries. Digite ‘Accelstepper’ na barra de pesquisa e instale a versão mais recente.

 

Motor de passo de controle Arduino Sketch

Abra seu Arduino IDE e vá em Arquivo > Novo. Um novo arquivo será aberto. Copie o código abaixo nesse arquivo e salve-o.

Este código nos ajudará a controlar o motor de passo definindo a velocidade máxima, aceleração e passos por revolução. Mostraremos como girar o motor em ambas as direções.

#include <AccelStepper.h>

const int DIR = 12;
const int STEP = 14;

#define motorInterfaceType 1
AccelStepper motor(motorInterfaceType, STEP, DIR);

void setup() {
  Serial.begin(115200);
  motor.setMaxSpeed(1000);
  motor.setAcceleration(60);
  motor.setSpeed(200);
  motor.moveTo(200);
}

void loop() {
  if (motor.distanceToGo() == 0) {
    motor.moveTo(-motor.currentPosition());
    Serial.println("Rotação do motor na direção oposta...");
  }
  motor.run();
}

Como o Código Funciona?

Primeiramente, vamos incluir a biblioteca AccelStepper.h. Esta biblioteca fornece funções úteis que facilitam o controle do motor de passo usando o Arduino.

#include <AccelStepper.h>

O próximo passo é definir os pinos GPIO do ESP32 que conectamos com os pinos DIR e STEP do driver. Como você pode ver, usamos o GPIO12 e o GPIO14 para conectar com DIR e STEP respectivamente

const int DIR = 12;
const int STEP = 14;

Além disso, definiremos o tipo de interface do motor como ‘1’. Isso significa que estamos usando um driver externo que consiste nos pinos STEP e DIR.

#define motorInterfaceType 1

Agora vamos criar uma instância da biblioteca AccelStepper chamada motor() e passar motorInterfaceType, STEP e DIR como os três parâmetros dentro dela.

AccelStepper motor(motorInterfaceType, STEP, DIR);

Dentro da função setup(), Serial.begin() é usado para estabelecer a conexão serial entre a placa de desenvolvimento a uma taxa de transmissão de 115200. Usaremos o método setMaxSpeed() na instância do motor e passaremos a velocidade do motor como um argumento dentro dele. No nosso caso, estamos configurando a velocidade do motor de passo para 1000. Também definiremos a aceleração do motor usando setAcceleration() e passaremos a aceleração em passos por segundo por segundo. O método moveTo() recebe os passos do argumento por revolução, que é 200, pois estamos usando NEMA 17. Isso será usado para marcar nossa posição de destino.

void setup() {
  Serial.begin(115200);
  motor.setMaxSpeed(1000);
  motor.setAcceleration(60);
  motor.setSpeed(200);
  motor.moveTo(200);
}

loop()

Dentro da função loop(), vamos girar o motor em ambas as direções. Isso será alcançado mantendo o controle da posição alvo. Se a posição alvo for alcançada, outra posição alvo será marcada. Este será o mesmo valor que antes, mas com um sinal negativo. Assim, invertendo o sentido do motor. Além disso, também imprimiremos quando o motor mudar de direção no monitor serial. O método run() será responsável por girar o motor a cada passo de cada vez.

void loop() {
  if (motor.distanceToGo() == 0) {
    motor.moveTo(-motor.currentPosition());
    Serial.println("Rotação do motor na direção oposta...");
  }
  motor.run();
}

Demonstração

Certifique-se de escolher a placa e a porta COM corretas antes de enviar seu código para a placa. Vá para Ferramentas > Placa e selecione Módulo de desenvolvimento ESP32. Em seguida, vá para Ferramentas > Porta e selecione a porta apropriada através da qual sua placa está conectada.

Clique no botão de upload para enviar o código para o board.
Depois de ter carregado seu código para a placa de desenvolvimento, pressione o botão ENABLE

O motor de passo começará a girar no sentido horário enquanto acelera até uma volta e depois se move no sentido anti-horário enquanto desacelera e depois para. Em seguida, o loop será iniciado novamente.

No seu Arduino IDE, abra o monitor serial e você também poderá ver o status da rotação do motor.