Arduino - Controlar Motor de Passo usando o Driver L298N

Neste tutorial, vamos aprender:

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.

Motor de passo com Arduino e Driver L298N

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
Pinagem do Motor de Passo Bipolar

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

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

Diagrama de Ligação do Arduino com Motor de Passo e Driver L298N

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:

Correspondência de cores das bobinas do Motor de Passo

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:

stepper.moveTo(desiredPosition); // move motor one revolution

※ 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.

stepper.setAcceleration(50.0); // set acceleration/deceleration stepper.setSpeed(200); // set desired speed

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
/* * Este código de Arduino foi desenvolvido por pt.newbiely.com * Este código de Arduino é disponibilizado ao público sem nenhuma restrição. * Para tutoriais completos e diagramas de ligação, visite: * https://pt.newbiely.com/tutorials/arduino/arduino-stepper-motor */ #include <AccelStepper.h> #define DEG_PER_STEP 1.8 #define STEP_PER_REVOLUTION (360 / DEG_PER_STEP) AccelStepper stepper(AccelStepper::FULL4WIRE, 7, 6, 5, 4); long moveToPosition = STEP_PER_REVOLUTION; void setup() { Serial.begin(9600); stepper.setAcceleration(200.0); // set acceleration stepper.setSpeed(200); // set initial speed stepper.setCurrentPosition(0); // set position to 0 stepper.moveTo(STEP_PER_REVOLUTION); // move motor one revolution, in clockwise direction Serial.println("Motor moving in clockwise direction"); } void loop() { if (stepper.distanceToGo() == 0) { Serial.println("Motor is stopped"); delay(5000); // stop 5 seconds stepper.setCurrentPosition(0); // reset position to 0 moveToPosition = -1 * moveToPosition; // reverse direction stepper.moveTo(moveToPosition); // move motor one revolution if (stepper.distanceToGo() > 0) Serial.println("Motor moving in clockwise direction"); else if (stepper.distanceToGo() < 0) Serial.println("Motor moving in anticlockwise direction"); } // Serial.print(F("position: ")); // Serial.println(stepper.currentPosition()); stepper.run(); // MUST be called as frequently as possible }

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.
Biblioteca AccelStepper no Arduino
  • 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
∞
Newbiely | Arduino IDE 2.3.8
──
☐
✕
File
Edit
Sketch
Tools
Help
Arduino Uno
Newbiely.ino
···
8 Serial.println("Hello World!");
Output
Serial Monitor
Message (Enter to send message to 'Arduino Uno' on 'COM15')
New Line
9600 baud
Motor moving in clockwise direction Motor is stopped Motor moving in anticlockwise direction Motor is stopped Motor moving in clockwise direction Motor is stopped Motor moving in anticlockwise direction Motor is stopped Motor moving in clockwise direction Motor is stopped Motor moving in anticlockwise direction Motor is stopped
Ln 11, Col 1
Arduino Uno on COM15
2

Explicação do Código

Leia a explicação linha por linha nas linhas de comentário do código-fonte!

Vídeo

※ NOSSAS MENSAGENS

  • Fique à vontade para compartilhar o link deste tutorial. Porém, por favor, não use nosso conteúdo em outros sites. Investimos muito esforço e tempo para criar este conteúdo, por favor respeite nosso trabalho!