How to control a stepper motor with A4988 driver and Arduino
this article includes everything you need to know about controlling a stepper motor with the A4988 stepper motor driver and Arduino. Eu incluí um diagrama de fiação, um tutorial sobre como definir o limite atual e muitos códigos de exemplo.
embora você possa usar este driver sem uma biblioteca Arduino, eu recomendo que você também dê uma olhada no código de exemplo para a Biblioteca AccelStepper no final deste tutorial. Esta Biblioteca é bastante fácil de usar e pode melhorar muito o desempenho do seu hardware.
Após cada exemplo, eu quebro e explico como o código funciona, então você não deve ter problemas modificando-o para atender às suas necessidades.se você gostaria de saber mais sobre outros motoristas de estepe, então os artigos abaixo podem ser úteis:
- How to control a stepper motor with DRV8825 driver and Arduino
- 28BYJ-48 Stepper Motor with ULN2003 Driver and Arduino Tutorial
- How to control a Stepper Motor with Arduino Motor Shield Rev3
- TB6600 Stepper Motor Driver with Arduino Tutorial
Supplies
Hardware components
A4988 stepper motor driver | × 1 | Amazon AliExpress |
|
NEMA 17 stepper motor | × 1 | Amazon | |
Arduino Uno Rev3 | × 1 | Amazon | |
Power supply (8-35 V) | × 1 | Amazon AliExpress |
|
Breadboard | × 1 | Amazon | |
Capacitor (100 µF) | × 1 | Amazon | |
Jumper wires | ~ 10 | Amazon AliExpress |
|
USB cable type A/B | × 1 | Amazon |
gosto de usar este driver em combinação com um escudo-CNC ou placa de expansão. Tal Escudo já inclui capacitores e oferece uma maneira fácil de selecionar a resolução de microstepping. Ele torna a fiação muito mais fácil e é uma ótima opção se você precisa de uma solução mais permanente do que uma panela.
Tools
Small screwdriver | Amazon | ||
Multimeter | Amazon | ||
Alligator test leads (optional) | Amazon |
Software
Arduino IDE |
Makerguides.com é um participante no Services LLC Amazon Associates Program, um programa de publicidade da filial projetado para fornecer um meio para sites para ganhar as taxas de publicidade pela publicidade e links para produtos Amazon.com.
Sobre o driver
No coração da A4988 driver, você vai encontrar um chip feito por Allegro MicroSystems: o A4988 DMOS micro-passo Motorista com Tradutor e Proteção de Sobrecorrente. Este driver integrado faz a interface com um microcontrolador super fácil, uma vez que você só precisa de dois pinos para controlar tanto a velocidade ea direção do motor de estepe.
o condutor tem uma capacidade máxima de saída de 35 V e ± 2 A, O que é ótimo para a condução de motores estepadores de pequeno a médio porte, como um motor estepador bipolar nema 17.se você precisa controlar motores maiores como NEMA 23, dê uma olhada no motor TB6600 stepper driver. Este driver pode ser usado com o mesmo código que o A4988 e tem uma classificação atual de 3.5 A.
- TB6600 motor Driver Stepper com Tutorial Arduino
o chip de driver A4988 tem várias funções de segurança embutidas, tais como sobreinturrent, curto-circuito, bloqueio sob tensão e protecção sobre-temperatura. Você pode encontrar mais especificações na tabela abaixo.
A4988 Specifications
Minimum operating voltage | 8 V |
Maximum operating voltage | 35 V |
Continuous current per phase | 1 A |
Maximum current per phase | 2 A |
Minimum logic voltage | 3 V |
Maximum logic voltage | 5.5 V |
Microstep resolution | full, 1/2, 1/4, 1/8 and 1/16 |
Reverse voltage protection? | Não |
Dimensões | de 15,5 × 20,5 mm (0.6″ x 0.8″) |
Custo | preço |
Para mais informações você pode conferir a ficha técnica aqui.
as Diferenças entre o A4988 e DRV8825
O DRV8825 é bastante semelhante ao A4988 mas existem algumas diferenças chave:
- O DRV8825 oferece 1/32 micro-passo, considerando que o A4988 só vai até 1/16-passo. Micro-stepping superior resulta em operações mais suaves e mais silenciosas, mas nem sempre é necessário.a relação entre a tensão de referência e o limite de corrente é diferente.
- O DRV8825 requer uma duração mínima de impulso em patamar de 1,9 µs; o A4988 requer um mínimo de 1µs.o DRV8825 pode ser utilizado com uma fonte de alimentação motora de maior tensão (45 V vs 35 V). Isto significa que é menos suscetível a danos de picos de voltagem LC.
- O DRV8825 pode fornecer um pouco mais de corrente do que o A4988 sem qualquer arrefecimento adicional.
Note que o pinout do DRV8825 é exatamente o mesmo que para o A4988, então ele pode ser usado como um substituto drop-in!
Microstep definições
os motores de Passo têm normalmente um passo de tamanho de 1.8° ou 200 passos por revolução, esta refere-se a etapas completas. Um driver de micro-stepping, como o A4988, permite resoluções mais elevadas, permitindo localizações de etapas intermediárias. Isto é conseguido energizando as bobinas com níveis de corrente intermediária.
por exemplo, conduzir um motor em Modo de quarto passo dará ao motor de 200 passos por revolução 800 passos por revolução usando quatro níveis diferentes da corrente.
A resolução (tamanho do passo) pinos seletores (MS1, MS2 e MS3) permite que você selecione uma das cinco etapas resoluções de acordo com a tabela abaixo.
MS1 | MS2 | MS3 | Microstep resolution |
---|---|---|---|
Low | Low | Low | Full step |
High | Low | Low | 1/2 step |
Low | High | Low | 1/4 step |
High | High | Low | 1/8 step |
High | High | High | 1/16 step |
Todas as três entradas têm resistências de tracção internas de 100 kΩ, deixando assim os três pinos de selecção de microstep desligados os resultados no modo de passo completo.
muitas vezes Uso Um Escudo-CNC ou placa de expansão em combinação com estes drivers. A placa de expansão tem 3 interruptores para configurar MS1-MS3 alto ou baixo e no CNC-shield você pode instalar jumpers. Se você estiver usando o motorista com uma placa de pão, você pode apenas usar fios jumper para conectar os pinos de seletor a 5 V (ou seja, torná-los altos).
Fiação – Ligar A4988 para o Arduino e o motor de passo
o diagrama de cablagem/esquema acima mostra-lhe como ligar o controlador A4899 a um motor estepador e ao Arduino.
As ligações também são dadas na tabela seguinte:
A4988 Connections
A4988 | Connection |
---|---|
VMOT | 8-35V |
GND | Motor ground |
SLP | RESET |
RST | SLP |
VDD | 5V |
GND | Logic ground |
STP | Pin 3 |
DIR | Pin 2 |
1A, 1B, 2A, 2B | Stepper motor |
- a fonte de alimentação do motor está ligada ao GND e ao VMOT (à direita).as duas bobinas do motor do estepador estão ligadas a 1A, 1B e 2A, 2B (ver abaixo).
- O pino GND (inferior direito) Está ligado ao pino do microcontrolador e o pino VDD Está ligado ao 5V.
- o pin STP (passo) e DIR (direção) estão conectados ao pin digital 3 e 2, respectivamente. Você pode escolher um pin digital diferente se quiser, mas estes são os que eu usei para este tutorial e o código de exemplo.
- o pin SLP é uma entrada baixa activa. Ou seja, puxar este pino para baixo coloca o condutor em Modo de latência, minimizando o consumo de energia. RST também é uma entrada baixa ativa. Quando puxado para baixo, todas as entradas de passo são ignoradas até que você puxá-lo para cima. Se não estiver a usar o pin, pode ligá-lo ao pin SLP/SLEEP adjacente para o elevar e activar o condutor.
- o pin EN (activar) pode ser deixado desligado, sendo puxado para baixo por omissão. Quando este pin é colocado alto, o driver é desativado.
no resto deste tutorial deixei o MS1, o MS2 e o MS3 desligados, por isso o controlador funciona em Modo de passo completo. Isso torna a explicação do código um pouco mais fácil. Normalmente eu usaria 1/8 ou 1/16 microestepping e conectaria os pinos apropriados A 5V (veja a tabela na introdução).
Aviso
a placa portadora de A4988 utiliza condensadores cerâmicos de baixa ESR, o que a torna suscetível a picos de tensão destrutivos de LC, especialmente quando usando condutores de potência mais longos do que alguns centímetros.para proteger o condutor, pode ligar um condensador electrolítico entre o VMOT e o GND. Pololu sugere um condensador de 47 µF ou mais (I usou um condensador de 100 µF). Eu gosto destas caixas de sortimento da Amazon, desta forma eu sempre tenho alguns capacitores do tamanho certo na mão.como determinar a cablagem correcta do Motor stepper?
Se você não consegue encontrar a ficha do seu motor de estepe, pode ser difícil descobrir como conectar o seu motor corretamente. Eu uso o seguinte truque para determinar como conectar 4 motores estepadores bipolares de FIO:
A única coisa que você precisa identificar é os dois pares de fios que estão conectados às duas bobinas do motor. Os fios de uma bobina se conectam a 1A e 1B e a outra A 2A e 2B, a polaridade não importa.para encontrar os dois fios de uma bobina, faça o seguinte com o motor desconectado:
- tente girar o eixo do motor estepador à mão e observe como é difícil de rodar.escolha agora um par aleatório de fios do motor e toque as pontas nuas juntas.em seguida, tente girar o eixo do motor estepador novamente.se sentir muita resistência, terá encontrado um par de fios da mesma bobina. Se você pode girar o eixo livremente, tente outro par de fios. Agora conecte as duas bobinas aos pinos mostrados no diagrama de cablagem acima.
(se ainda não estiver claro, por favor deixe um comentário abaixo, mais informações também podem ser encontradas no RepRap.org wiki)
como definir o limite actual?
Antes de começar a programar o seu Arduino e começar a usar o driver, há uma coisa muito importante que precisa de fazer que muitas pessoas se esquecem: defina o limite actual!este passo não é muito complicado, mas é absolutamente necessário para proteger o seu motor de estepe e o condutor. Se você não definir um limite atual apropriado, o seu motor pode desenhar Mais Corrente do que ele ou o seu motorista pode lidar, isso é provável que danifique um ou ambos.
para definir o limite de corrente, é necessário medir uma tensão de referência e ajustar o potenciómetro de bordo em conformidade. Você vai precisar de uma pequena chave de fenda, um multimeter para medir a tensão de referência, e Alligator teste leads (opcional, mas muito útil).
para medir a tensão de referência, o condutor precisa de ser alimentado. O A4988 só precisa de energia via VDD (5V) e você precisa conectar RST e SLP juntos, caso contrário o motorista não vai ligar. É melhor desligar o motor enquanto fazes isto.
Se você já conectou o driver, você pode deixar tudo menos o motor de estepe conectado. Você pode aplicar a energia através da porta USB do Arduino.
A4988 Connection VDD 5V RST SLP SLP RESET GND Ground Required connections to set the current limit Current limit formula
The next step is to calculate the current limit with the following fórmula:
limite actual = Vref ÷ (8 × Rcs)
O Rcs é a resistência sensorial actual. Se você comprou um piloto A4988 da Pololu antes de janeiro de 2017, o Rcs será 0,050 Ω. Os Drivers vendidos depois disso têm 0,068 Ω resistências sensoriais atuais.
então isso significa que para um limite atual de 1A para uma placa com 0.068 Ω resistências de sentido atual, o Vref deve ser 540 mV.
para seleccionar o limite actual direito, dê uma vista de olhos na ficha do seu motor estepador. Se você não pode encontrar a classificação atual do seu motor, eu recomendo começar com um limite atual de 1A. você pode sempre aumentá-lo mais tarde se o seu motor/motorista está faltando passos.
informação de bónus: ao usar o controlador em Modo de passo completo, a corrente através de cada bobina é limitada a aproximadamente 70% do limite de corrente definido. Isto significa que você precisa definir o limite atual 40% mais alto ou 1,4 A em Modo de passo completo. Ao usar o micro-stepping, aplica-se a fórmula acima.Note que precisa de voltar a calibrar o limite de corrente se mudar a tensão de alimentação do motor. Se o seu motor está a fazer muito barulho, tente baixar o limite actual. É melhor definir o limite atual apenas alto o suficiente para que o motor não perca degraus.agora terá de medir a tensão de referência (Vref) entre os dois pontos marcados na imagem abaixo (GND e o potenciómetro) e ajustá-la ao valor que calculou.
eu recomendo o uso de Aligator test leads presos à chave de fenda para definir o limite atual. Isso permite ajustar o potenciômetro e medir a tensão de referência ao mesmo tempo.
Nota: existe outra forma de medir o limite actual e que é medir directamente o desenho actual do motor de estepe. Pessoalmente, acho o método acima muito mais fácil.
Pololu menciona o seguinte no seu sítio Web:
Nota: A corrente da bobina pode ser muito diferente da Corrente de alimentação, por isso não deve usar a corrente medida na fonte de alimentação para definir o limite de corrente. O lugar apropriado para colocar o seu medidor atual está em série com uma das suas bobinas de motor estepador.
Pololu
FAQ limite de corrente
será necessário que o motor estepador esteja LIGADO ou não?
Não, você não precisa conectar o motor de estepe ao motorista ao definir o limite atual. Estar do lado seguro, desligar o motor, por vezes interfere na medição da tensão do Vref.preciso de virar o motor rodando o Sketch do Arduino motor?não, veja a pergunta acima.preciso de rodar o potenciómetro no Sentido DOS ponteiros do relógio ou no sentido contrário ao dos ponteiros do relógio para aumentar o Vref?Isto depende do fabricante do condutor. Se tiver um tabuleiro de fuga Polulu genuíno do DRV8825 ou A4988, rode o potenciómetro no Sentido DOS ponteiros do relógio para aumentar o Vref e no sentido contrário ao dos ponteiros do relógio para o baixar.Arrefecimento o condutor
o condutor A4988 tem uma corrente máxima de 2 A por bobina, mas sem um dissipador de calor só pode fornecer cerca de 1 A por bobina antes de começar a sobreaquecer.
o motorista geralmente vem com um pequeno dissipador de calor com suporte adesivo, que eu recomendo que você instale imediatamente. Você também pode comprar um monte de pequenos dissipadores de calor da Amazon por muito barato.
Basic Arduino example code to control a stepper motor
Now that you have wired up the driver and set the current limit, it is time to connect the Arduino to the computer and upload some code. Você pode enviar o seguinte código de exemplo para o seu Arduino usando o Arduino IDE. Para este exemplo específico, você não precisa instalar nenhuma biblioteca.
Este esboço controla tanto a velocidade, o número de rotações, e a direção de fiação do motor estepador.
pode copiar o código clicando no botão no canto superior direito do campo de código.
como funciona o código:
o esboço começa com a definição do passo e dos pinos de direcção. Liguei-os ao Arduino pin 3 e 2.
a declaração
#define
é usada para dar um nome a um valor constante. O compilador irá substituir todas as referências a esta constante com o valor definido quando o programa é compilado. Assim, em todos os lugares que você mencionardirPin
, o compilador irá substituí-lo pelo valor 2 quando o programa for compilado.I also defined a
stepsPerRevolution
constant. Porque ajustei o condutor para o modo de passo completo, ajustei-o para 200 passos por revolução. Altere este valor se a sua configuração for diferente.// Define stepper motor connections and steps per revolution:#define dirPin 2#define stepPin 3#define stepsPerRevolution 200
In The
setup()
section of the code, all the motor control pins are declared as digital OUTPUT with the functionpinMode()
.void setup() { // Declare pins as output: pinMode(stepPin, OUTPUT); pinMode(dirPin, OUTPUT);}
In The
loop()
section of the code, we let the motor spin one revolution slowly in the CW direction and one revolution quickly in the CCW direction. Em seguida, deixamos o motor girar 5 rotações em cada direção com uma alta velocidade. Então, como você controla a velocidade, direção giratória, e número de revoluções?Direcção de fiação de controlo:
para controlar a direcção de fiação do motor do estepador, ajustamos o pino de DIR (direcção) alto ou baixo. Para isso usamos a função
digitalWrite()
. Dependendo de como você conectou o motor stepper, configurar o DIR pin alto vai deixar o motor virar CW ou CCW.número de etapas ou rotações:
neste esboço de exemplo, o para loops controlar o número de passos que o motor de estepe vai tomar. O código dentro do laço for resulta em 1 passo do motor estepador. Como o código no loop é executado 200 vezes (stepspervolution), isto resulta em 1 revolução. Nos dois últimos loops, o código dentro do loop for é executado 1000 vezes, o que resulta em 1000 passos ou 5 rotações.
Note que você pode mudar o segundo termo no laço for para qualquer número de passos que você quiser.
for(int i = 0; i < 100; i++)
resultaria em 100 passos, ou metade de uma revolução.velocidade de controlo:
a velocidade do motor a vapor é determinada pela frequência dos impulsos que enviamos para o pino do degrau. Quanto maior a frequência, mais rápido o motor corre. Você pode controlar a frequência dos pulsos alterando
delayMicroseconds()
no código. Quanto mais curto o atraso, maior a frequência, mais rápido o motor corre.AccelStepper library tutorial
The AccelStepper library written by Mike McCauley is an awesome library to use for your project. Uma das vantagens é que ele suporta aceleração e desaceleração, mas tem um monte de outras funções nice também.
pode transferir a última versão desta biblioteca aqui ou carregar no botão abaixo.
Você pode instalar a biblioteca indo para Sketch > Include Library> Add .Biblioteca ZIP … no Arduino IDE.
outra opção é navegar para as ferramentas > gerir as bibliotecas… ou escrever Ctrl + Shift + i no Windows. O Gestor de Bibliotecas abrirá e atualizará a lista de bibliotecas instaladas.
Você pode procurar por ‘accelstepper’ e procure a biblioteca de Mike McCauley. Selecione a versão mais recente e, em seguida, clique em Instalar.
rotação Contínua de código de exemplo
O seguinte esboço pode ser usado para executar um ou mais motores de passo continuamente a uma velocidade constante. (Não se utiliza qualquer aceleração ou desaceleração).
como funciona o código:
o primeiro passo é incluir a biblioteca com
#include <AccelStepper.h>
.// Include the AccelStepper library:#include <AccelStepper.h>
o próximo passo é definir as conexões A4988 para Arduino e o tipo de interface motor. O tipo de interface do motor deve ser regulado para 1 quando se utiliza um passo e um condutor de direcção. Você pode encontrar os outros tipos de interface aqui.
a declaração
#define
é usada para dar um nome a um valor constante. O compilador irá substituir todas as referências a esta constante com o valor definido quando o programa é compilado. Assim, em todos os lugares que você mencionardirPin
, o compilador irá substituí-lo pelo valor 2 quando o programa for compilado.// Define stepper motor connections and motor interface type. Motor interface type must be set to 1 when using a driver:#define dirPin 2#define stepPin 3#define motorInterfaceType 1
em seguida, você precisa criar uma nova instância da classe AccelStepper com o tipo de interface motor apropriado e Conexões.
neste caso, eu liguei o motor de passo ‘passo’, mas você pode usar outros nomes, tais como, ‘z_motor’ ou ‘liftmotor’ etc.
AccelStepper liftmotor = AccelStepper(motorInterfaceType, stepPin, dirPin);
. O nome que você dá ao motor estepador será usado mais tarde para definir a velocidade, posição e aceleração para esse motor em particular. Você pode criar várias instâncias da classe AccelStepper com diferentes nomes e pinos. Isso permite que você controle facilmente 2 ou mais motores estepadores ao mesmo tempo.// Create a new instance of the AccelStepper class:AccelStepper stepper = AccelStepper(motorInterfaceType, stepPin, dirPin);
In The
setup()
section of the code we defined the maximum speed in steps / second. Velocidades de mais de 1000 passos por Segundo podem ser confiáveis, então eu definir isso como o máximo. Note que eu especifiquei o nome do motor de estepe (‘estepe’), para o qual eu quero definir a velocidade máxima. Se você tiver vários motores de passo conectado, você pode especificar uma velocidade diferente para cada motor:void setup() { // Set the maximum speed in steps per second: stepper.setMaxSpeed(1000); stepper2.setMaxSpeed(500);}
loop()
vamos primeiro definir a velocidade que nós queremos que o motor funcione em. Para isso, usamos a funçãosetSpeed()
. (você também pode colocar isso na seção de configuração do Código).stepper.runSpeed()
vota no motor e quando um passo é devido, executa 1 passo. Isso depende da velocidade definida e do tempo desde o último passo. Se você quiser mudar a direção do motor, você pode definir uma velocidade negativa:stepper.setSpeed(-400);
vira o motor para o outro lado.código de exemplo para controlar o número de passos ou rotações
para deixar o motor rodar um número específico de passos que prefiro usar um laço while em combinação com
stepper.currentPosition()
. Você pode usar o seguinte código de exemplo, para deixar o motor correr para trás e para a frente.explicação do Código:
a primeira parte do Código até à secção loop() é exactamente a mesma que no exemplo anterior.
In The loop I make use of a while loop in combination with the
currentPosition()
function. Primeiro, eu ajustei a posição atual do motor estepador para zero comstepper.setCurrentPosition(0)
.// Set the current position to 0: stepper.setCurrentPosition(0);
em seguida fazemos uso do laço while. A while loop will loop continuously, and infinitely, until the expression inside the parentesis, () becomes false. Então, neste caso, eu verifico se a posição atual do motor estepador não é igual a 400 passos (!= meios: não é igual a). Enquanto isso não é o caso, nós executamos o motor de estepe a uma velocidade constante como definido por
setSpeed()
.no resto do ciclo, fazemos exatamente o mesmo, apenas com uma velocidade e posição de alvo diferentes.
aceleração e desaceleração código de exemplo
com o seguinte esboço, pode adicionar aceleração e desaceleração aos movimentos do motor de estepe, sem qualquer codificação complicada. No exemplo seguinte, o motor vai correr para trás e para a frente com uma velocidade de 200 passos por segundo e uma aceleração de 30 passos por segundo por segundo.explicação de código:
na configuração (), além da velocidade máxima, precisamos definir a aceleração/desaceleração. Para isso, usamos a função
setAcceleration()
.void setup() { // Set the maximum speed and acceleration: stepper.setMaxSpeed(200); stepper.setAcceleration(30);}
na secção de loop do código, eu usei uma maneira diferente de deixar o motor rodar um número predefinido de passos. A função
stepper.moveTo()
é usada para definir a posição-alvo. A funçãostepper.runToPostion()
move o motor (com aceleração/desaceleração) para a posição-alvo e bloqueia até estar na posição-alvo. Porque esta função está bloqueando, você não deve usar isso quando você precisa controlar outras coisas ao mesmo tempo.conclusão
neste artigo eu mostrei-lhe como controlar um motor de estepe com o condutor de motor A4988 estepador e Arduino. Espero que tenha achado útil e informativo. Se você fez, por favor, compartilhá-lo com um amigo que também gosta de eletrônica e fazer coisas!
eu usei pessoalmente este driver muito para um monte de impressoras 3D e outros projetos relacionados com CNC, mas eu gostaria de saber que projetos você planeja construir (ou já construiu) com este driver. Se você tiver alguma dúvida, sugestão, ou se você acha que as coisas estão faltando neste tutorial, por favor deixe um comentário abaixo.
Leave a Reply