Arduino - Controlar Motor de Passo usando o Driver L298N
Neste tutorial, vamos aprender:
- Como usar o driver L298N para controlar um motor de passo bipolar
- Como controlar a posição do motor de passo
- Como controlar a velocidade do motor de passo
- Como controlar a direção do motor de passo
O tutorial pode ser aplicado a qualquer tipo de motor de passo bipolar (4 fios). O tutorial usará o motor de passo NEMA 17 como exemplo.

Hardware Necessário
Or you can buy the following kits:
| 1 | × | DIYables STEM V3 Starter Kit (Arduino included) | |
| 1 | × | DIYables Sensor Kit (18 sensors/displays) |
Sobre o Motor de Passo
Existem dois tipos populares de motores de passo:
- bipolar: este tipo de motor tem 4 fios
- unipolar: este tipo de motor tem 5 ou 6 fios.
Para um motor de passo unipolar de 6 fios, podemos usar quatro dos seis fios e controlá-lo como um motor de passo bipolar.
Para o motor de passo unipolar de 5 fios, veja Arduino - controlar o motor de passo 28BYJ-48 usando o driver ULN2003
Este tutorial foca apenas no motor de passo bipolar.
Pinagem do Motor de Passo Bipolar
A pinagem do Motor de Passo bipolar tem 4 pinos. Dependendo do fabricante, os pinos do motor têm vários nomes. A tabela abaixo mostra alguns nomes de pinos amplamente usados:
| Nº DO PINO | Nomenclatura 1 | Nomenclatura 2 | Nomenclatura 3 |
|---|---|---|---|
| 1 | A+ | A | A |
| 2 | A- | A | C |
| 3 | B+ | B | B |
| 4 | B- | B | D |

A ordem dos pinos, os nomes dos fios e as cores dos fios podem variar entre fabricantes. Você precisa ler o datasheet ou o manual para ver a correspondência entre a cor do fio e o nome do pino. A imagem acima também mostra a especificação de dois motores diferentes, com nomes e cores de fios diferentes.
Passos por Revolução
A especificação do motor indica os graus por passo (vamos chamar de DEG_PER_STEP). Dependendo do método de controle, os passos por revolução (vamos chamar de STEP_PER_REVOLUTION) são calculados conforme a tabela a seguir:
| Método de controle | Passos por Revolução | Graus reais por passo |
|---|---|---|
| Passo completo (full-step) | STEP_PER_REVOLUTION = 360 / DEG_PER_STEP | DEG_PER_STEP |
| Meio passo (half-step) | STEP_PER_REVOLUTION = (360 / DEG_PER_STEP) * 2 | DEG_PER_STEP / 2 |
| Micropasso (1/n) | STEP_PER_REVOLUTION = (360 / DEG_PER_STEP) * n | DEG_PER_STEP / n |
Por exemplo, se o datasheet do motor especificar 1.8 grau/passo:
| Método de controle | Passos por Revolução | Graus reais por passo |
|---|---|---|
| Passo completo (full-step) | 200 passos/revolução | 1.8° |
| Meio passo (half-step) | 400 passos/revolução | 0.9° |
| Micropasso (1/n) | (200 * n) passos/revolução | (1.8 / n)° |
Como controlar um motor de passo usando o Arduino
O Arduino pode gerar sinais para controlar o motor de passo. No entanto, os sinais do Arduino não têm a tensão e/ou a corrente suficientes que o motor de passo exige. Por isso, precisamos de um driver de hardware entre o Arduino e o motor de passo. O driver faz duas tarefas:
- Amplificar os sinais de controle do Arduino (corrente e tensão)
- Proteger o Arduino da alta corrente e tensão usadas para alimentar o motor de passo.
Existem muitos tipos de drivers de hardware que podem ser usados para controlar motores de passo. O Driver L298N é um dos drivers de hardware mais usados para controlar motores de passo.
Sobre o Driver L298N
Um único Driver L298N pode ser usado para controlar dois motores DC ou um motor de passo. Neste tutorial, aprendemos a usá-lo para controlar o motor de passo.
Pinagem do Driver L298N

O Driver L298N tem 11 pinos e três jumpers:
- Pino VCC: fornece alimentação para o motor. Pode ser qualquer valor entre 5 e 35V.
- Pino GND: é um pino de terra comum, precisa ser conectado ao GND (0V).
- Pino 5V: fornece alimentação para o módulo L298N. Pode ser alimentado pelo 5V do Arduino.
- Pinos IN1, IN2, IN3, IN4: são conectados aos pinos do Arduino para receber o sinal de controle do motor de passo.
- Pinos OUT1, OUT2, OUT3, OUT4: são conectados ao motor de passo.
- Jumpers ENA, ENB: são usados para habilitar o motor de passo. Você precisa manter os dois jumpers ENA e ENB no lugar.
- Jumper 5V-EN: se mantivermos o jumper 5V-EN no lugar, a alimentação do módulo L298N vem do VCC, e não precisamos conectar nada ao pino 5V. Se removermos o jumper 5V-EN, precisamos alimentar o módulo L298N pelo pino 5V
Como descrito acima, o driver L298N tem duas entradas de alimentação:
- Uma para o motor de passo (pinos VCC e GND): de 5 a 35V.
- Uma para o funcionamento interno do módulo L298N (pinos 5V e GND): de 5 a 7V. Se o jumper 5V-EN for mantido no lugar, não precisamos conectar este pino a nada.
Diagrama de Ligação

This image is created using Fritzing. Click to enlarge image
※ Nota:
- Por favor, mantenha os três jumpers do módulo L298N no lugar (caso a fonte de alimentação do motor seja ≤ 12V)
- A ordem dos pinos nos motores de passo pode variar entre fabricantes. Por favor, verifique a tabela abaixo para fazer a ligação correta.
Tabela de ligação entre o Arduino e o Driver L298N
| Pinos do Arduino | Pinos do L298N |
|---|---|
| 7 | IN1 |
| 6 | IN2 |
| 5 | IN3 |
| 4 | IN4 |
Tabela de ligação entre o Driver L298N e o Motor de Passo
Importante!: Por favor, não se preocupe com a ordem dos fios do motor de passo na imagem do diagrama de ligação acima. É apenas um exemplo. A ordem dos pinos nos motores de passo pode variar entre fabricantes. Certifique-se de que a sua ligação segue a tabela abaixo.
| Pinos do L298N | Pinos do motor de passo | Ou | Ou |
|---|---|---|---|
| OUT1 | A+ | A | A |
| OUT2 | A- | A | C |
| OUT3 | B+ | B | B |
| OUT4 | B- | B | D |
Antes de comprar um motor de passo, recomendamos que você verifique o datasheet, a especificação ou o manual do motor de passo. Certifique-se de que eles informam a correspondência entre a cor e o nome de cada pino. Por exemplo, este motor de passo fornece a correspondência conforme a imagem abaixo:

Com base nessa correspondência, a tabela de ligação fica assim:
| Pinos do L298N | pinos do motor de passo | cor do fio |
|---|---|---|
| OUT1 | A | fio preto |
| OUT2 | C | fio verde |
| OUT3 | B | fio vermelho |
| OUT4 | D | fio azul |
※ Nota:
Em todas as tabelas de ligação acima entre o motor de passo e o Driver L298N, podemos trocar OUT1 com OUT2 e OUT3 com OUT4. Portanto, há mais formas de fazer a ligação. No entanto, se trocarmos, o sentido de rotação do motor pode mudar (de horário para anti-horário, e vice-versa).
Como controlar um Motor de Passo usando um driver L298N.
Controlar um motor de passo não é uma tarefa simples, especialmente quando queremos controlá-lo de forma não bloqueante. Felizmente, graças à biblioteca AccelStepper, controlar o motor de passo se torna muito fácil.
O Arduino IDE também tem uma biblioteca Stepper embutida. No entanto, não recomendamos que você use essa biblioteca porque:
- A biblioteca fornece funções bloqueantes. Isso significa que ela impede o Arduino de fazer outras tarefas enquanto controla o motor de passo.
- Ela não tem funções suficientes.
Em vez disso, recomendamos que você use a biblioteca AccelStepper. Esta biblioteca suporta:
- Aceleração
- Desaceleração.
- Acionamento em passo completo e meio passo.
- Vários motores de passo simultâneos, com passos independentes e concorrentes em cada motor.
- Desvantagem: NÃO suporta acionamento em micropasso
Como Controlar a Posição do Motor de Passo via Driver L298N
Podemos mover o motor de passo para a posição desejada usando:
※ Nota:
A função stepper.moveTo() é não bloqueante. Esse é um ótimo ponto da biblioteca. No entanto, precisamos prestar atenção ao usar esta função:
- Chame 'stepper.run()' com a maior frequência possível. Ela deve ser chamada na função void loop().
- NÃO use a função delay() enquanto o motor estiver se movendo.
- NÃO é recomendável usar as funções Serial.print() e Serial.println() enquanto o motor estiver se movendo. Essas funções fazem o motor de passo se mover mais devagar.
Como Controlar a Velocidade do Motor de Passo via Driver L298N
Podemos controlar não apenas a velocidade, mas também a aceleração e a desaceleração, usando algumas funções simples.
Como Controlar a Direção do Motor de Passo via Driver L298N
Se você fizer a ligação como acima, o motor vai girar no:
- Sentido horário: se controlarmos o motor de uma posição para uma posição maior (incremento da posição)
- Sentido anti-horário: se controlarmos o motor de uma posição para uma posição menor (decremento da posição)
Por exemplo:
- Se a posição atual for 100 e controlarmos o motor para 200, o motor gira no sentido horário
- Se a posição atual for -200 e controlarmos o motor para -100, o motor gira no sentido horário
- Se a posição atual for 200 e controlarmos o motor para 100, o motor gira no sentido anti-horário
- Se a posição atual for -100 e controlarmos o motor para -200, o motor gira no sentido anti-horário
※ Nota:
Como mencionado antes, se você trocar OUT1 com OUT2, ou OUT3 com OUT4, o incremento da posição pode ser no sentido anti-horário e o decremento da posição pode ser no sentido horário.
Como Parar o Motor de Passo
- O motor de passo para automaticamente depois de alcançar a posição desejada.
- O motor de passo pode ser forçado a parar imediatamente a qualquer momento usando a função stepper.stop().
Código Arduino - Código do Motor de Passo
O código abaixo faz o seguinte:
- Gira o motor uma revolução no sentido horário
- Para o motor por 5 segundos
- Gira o motor de volta uma revolução no sentido anti-horário
- Para o motor por 5 segundos
- Esse processo se repete continuamente
Passos Rápidos
- Vá até o ícone Libraries na barra esquerda do Arduino IDE.
- Pesquise “AccelStepper” e encontre a biblioteca AccelStepper de Mike McCauley
- Clique no botão Install para instalar a biblioteca AccelStepper.

- Copie o código acima e abra-o no Arduino IDE
- Clique no botão Upload no Arduino IDE para carregar o código no Arduino
- Você verá:
- O motor de passo gira uma revolução no sentido horário
- O motor de passo para por 5 segundos
- O motor de passo gira de volta uma revolução no sentido anti-horário
- O motor de passo para por 5 segundos
- O processo acima se repete continuamente.
- Veja o resultado no Serial Monitor
Explicação do Código
Leia a explicação linha por linha nas linhas de comentário do código-fonte!