Componentes · 6 min de leitura

O que é motor de passo? Rotação precisa com o 28BYJ-48 e o ULN2003 no Arduino

Como funciona um motor de passo? Ligação do 28BYJ-48 com o driver ULN2003, passos por volta (2048), as bibliotecas Stepper e AccelStepper, girar até um ângulo, o NEMA 17 com um A4988 e uso no ESP32 e no Pico.

Um motor de passo é um motor que divide a rotação em passos pequenos e iguais. Ele gira um ângulo fixo a cada comando, então você sabe exatamente onde o motor parou sem nenhum sensor extra. Impressoras 3D, máquinas CNC, sliders de câmera e cortinas automáticas usam motores de passo por causa dessa precisão. O jeito mais barato de começar a aprender com o Arduino é o motor 28BYJ-48 e a placa driver ULN2003 vendida com ele.

Motor de passo 28BYJ-48 e placa driver ULN2003
Motor de passo 28BYJ-48 e driver ULN2003: o conector de 5 fios do motor encaixa no soquete da placa; os quatro LEDs da placa mostram qual bobina está ativa.

Como funciona um motor de passo?

Dentro de um motor de passo há várias bobinas dispostas em volta de um rotor magnético dentado. Quando as bobinas são energizadas em uma determinada ordem, o rotor é puxado a cada vez para a bobina mais próxima e avança um passo. Execute a sequência rápido e o motor gira rápido; execute devagar e ele gira devagar; inverta a sequência e ele gira para o outro lado. Como o motor conta cada passo, a posição é conhecida, mas, se ele for sobrecarregado, pode pular passos sem perceber.

Motor de passo, servo ou motor CC?

CaracterísticaMotor CCServo motorMotor de passo
MovimentoGira continuamenteVai até um ângulo definido (normalmente 0–180°)Voltas ilimitadas, passo a passo
Informação de posiçãoNenhumaSim (realimentação embutida)Conhecida pela contagem de passos
VelocidadeMuito rápidaMédiaBaixa a média
Torque em baixa velocidadeBaixoMédioAlto
Uso típicoRodas, ventiladores, bombasBraços robóticos, travas, direçãoImpressoras 3D, CNC, sliders, relógios

Se basta ir até um ângulo e ficar parado nele, um servo é mais simples; os detalhes estão em O que é servo motor? Se você precisa de rotação rápida e contínua, um motor CC com um driver de motor L298N é mais adequado. Para tarefas que pedem várias voltas e uma posição conhecida ao mesmo tempo, o motor de passo é imbatível.

Especificações do 28BYJ-48

CaracterísticaValor
TipoMotor de passo unipolar de 4 fases
Tensão de operação5 V CC
Redução internaCerca de 1:64
Passos por volta2048 (passo completo), 4096 (meio passo)
Ângulo do passoCerca de 0,18° (passo completo)
Consumo de correnteCerca de 200–250 mA
Velocidade máximaCerca de 10–15 RPM
Fios5 (o vermelho é o comum)

Ligação do driver ULN2003

O conector de 5 fios do motor só encaixa no soquete da placa ULN2003 em um sentido, então não tem como errar. Ligue os pinos IN1–IN4 da placa nos pinos 8–11 do Arduino, e os terminais + e – em uma fonte de 5 V. O ULN2003 é um conjunto de transistores Darlington que eleva o pequeno sinal do pino do Arduino até a corrente de que a bobina precisa, e os quatro LEDs da placa mostram as bobinas ligando em sequência.

Pino do ULN2003Arduino Uno
IN1D8
IN2D9
IN3D10
IN4D11
+ (5–12 V)5 V externo (o pino 5V do Uno serve para um motor)
– (GND)GND (em comum com o Arduino)
O 28BYJ-48 puxa cerca de 240 mA. Um Uno alimentado pela USB aguenta um motor, mas com dois motores ou outras cargas use uma fonte externa de 5 V e ligue os terras entre si. A corrente passa pelas bobinas mesmo com o motor parado, então ele esquenta; quando ele ficar muito tempo esperando, solte as bobinas colocando os quatro pinos em LOW.

Primeira rotação com a biblioteca Stepper

A biblioteca Stepper, que vem com a Arduino IDE, não precisa de instalação. O único cuidado é a ordem dos pinos: para o 28BYJ-48, o objeto precisa ser declarado na ordem 8, 10, 9, 11 (IN1, IN3, IN2, IN4). Se você escrever 8, 9, 10, 11, o motor vibra no lugar em vez de girar; esse é o erro mais comum.

C++ (Arduino IDE)
1#include <Stepper.h>
2
3const int STEPS_PER_REV = 2048;                  // 28BYJ-48 tam tur / full revolution
4Stepper motor(STEPS_PER_REV, 8, 10, 9, 11);      // sıra: IN1, IN3, IN2, IN4 / order: IN1, IN3, IN2, IN4
5
6void setup() {
7  motor.setSpeed(10);                            // devir/dakika, en fazla ~15 / RPM, max ~15
8}
9
10void loop() {
11  motor.step(STEPS_PER_REV);        // bir yönde tam tur / one full turn
12  delay(1000);
13  motor.step(-STEPS_PER_REV / 2);   // ters yönde yarım tur / half a turn back
14  delay(1000);
15}
Para transformar um ângulo em passos, use passos = ângulo × 2048 / 360. Por exemplo, 90 graus são 512 passos e 45 graus são 256 passos.

Controle de posição com um potenciômetro

Se você guardar a posição atual do motor em uma variável, pode mandá-lo para qualquer ponto que quiser. O código abaixo transforma a posição do potenciômetro em 0–2048 passos, e o motor vai até o mesmo ponto, como se seguisse o botão. Uma tolerância de 10 passos ignora pequenas oscilações. A ligação do potenciômetro está em O que é potenciômetro?

C++ (Arduino IDE)
1#include <Stepper.h>
2
3Stepper motor(2048, 8, 10, 9, 11);
4int position = 0;                                    // şu anki adım / current step
5
6void setup() {
7  motor.setSpeed(12);
8}
9
10void loop() {
11  int target = map(analogRead(A0), 0, 1023, 0, 2048);  // potansiyometre → hedef / pot → target
12  if (abs(target - position) > 10) {                 // küçük titreşimleri yok say / ignore jitter
13    motor.step(target - position);
14    position = target;
15  }
16}

AccelStepper: aceleração suave sem travar o programa

O comando step() da biblioteca Stepper para o seu programa até o movimento terminar; durante esse tempo, você não consegue ler botões nem atualizar um display. A AccelStepper, que você instala pelo Gerenciador de Bibliotecas, move o motor passo a passo em segundo plano e acrescenta aceleração e desaceleração para evitar partidas bruscas. Para o 28BYJ-48, usa-se o modo de meio passo (HALF4WIRE), em que uma volta tem 4096 passos:

C++ (Arduino IDE)
1#include <AccelStepper.h>
2
3// 28BYJ-48 + ULN2003, yarım adım: tur başına 4096 / half-step: 4096 per turn
4AccelStepper motor(AccelStepper::HALF4WIRE, 8, 10, 9, 11);
5
6void setup() {
7  motor.setMaxSpeed(1000);      // adım/saniye / steps per second
8  motor.setAcceleration(400);   // adım/saniye² / steps per second²
9  motor.moveTo(4096);           // bir tur ileri / one turn forward
10}
11
12void loop() {
13  if (motor.distanceToGo() == 0) {
14    motor.moveTo(-motor.currentPosition());   // geri dön / go back
15  }
16  motor.run();                  // her döngüde çağır, bekletmez / call every loop, non-blocking
17}

Motores mais potentes: NEMA 17 e o A4988

Módulo driver de motor de passo A4988
Driver de motor de passo A4988: controlado só com os pinos STEP e DIR; o pequeno potenciômetro dele limita a corrente do motor.

Para tarefas que pedem força, como impressoras 3D e máquinas CNC, usam-se motores de passo bipolares como o NEMA 17. Esses motores dão 200 passos por volta (1,8°) e são muito mais fortes que o 28BYJ-48. Você os aciona com drivers como o A4988 ou o DRV8825: o motor dá um passo a cada pulso no STEP, e o pino DIR define o sentido. O driver funciona com 8–35 V e, com microstepping, divide cada passo em até 16 partes para um movimento mais suave.

C++ (Arduino IDE)
1const int STEP_PIN = 3;
2const int DIR_PIN = 4;
3
4void setup() {
5  pinMode(STEP_PIN, OUTPUT);
6  pinMode(DIR_PIN, OUTPUT);
7}
8
9void loop() {
10  digitalWrite(DIR_PIN, HIGH);          // yön / direction
11  for (int i = 0; i < 200; i++) {       // NEMA 17'de 200 adım = 1 tur / 200 steps = 1 turn
12    digitalWrite(STEP_PIN, HIGH);
13    delayMicroseconds(800);             // küçüldükçe hız artar / smaller = faster
14    digitalWrite(STEP_PIN, LOW);
15    delayMicroseconds(800);
16  }
17  delay(1000);
18}
Antes de colocar um A4988 para funcionar, ajuste o limite de corrente para o seu motor no potenciômetro dele, coloque um capacitor de 100 µF na alimentação do motor e nunca desconecte os fios do motor com o driver energizado; isso pode queimar o driver na hora.

Motores de passo com o ESP32 e o Raspberry Pi Pico

As entradas do ULN2003 funcionam bem com sinais de 3,3 V; mesmo assim, alimente o motor separadamente com 5 V. No ESP32, a biblioteca AccelStepper funciona do jeito que está; você pode usar pinos que não sejam os 6–11 e 34–39, por exemplo os GPIO 19, 18, 5 e 17. No Pico com MicroPython, você gira o motor escrevendo uma sequência de meio passo nos quatro pinos, um de cada vez:

MicroPython
1from machine import Pin
2import time
3
4pins = [Pin(n, Pin.OUT) for n in (2, 3, 4, 5)]      # IN1–IN4 → GP2–GP5
5SEQ = [[1,0,0,0],[1,1,0,0],[0,1,0,0],[0,1,1,0],
6       [0,0,1,0],[0,0,1,1],[0,0,0,1],[1,0,0,1]]    # yarım adım dizisi / half-step sequence
7
8def rotate(steps, delay_ms=2):
9    direction = 1 if steps > 0 else -1
10    for i in range(abs(steps)):
11        for pin, value in zip(pins, SEQ[(i * direction) % 8]):
12            pin.value(value)
13        time.sleep_ms(delay_ms)
14    for pin in pins:
15        pin.value(0)                                   # bobinleri bırak / release coils
16
17rotate(4096)        # bir tur / one turn (half-step)
18rotate(-1024)       # çeyrek tur geri / quarter turn back

Ideias de projetos com motor de passo

  • Relógio analógico: um relógio de mesa com os ponteiros de horas e minutos girados por motores de passo.
  • Slider de câmera: um trilho que move uma câmera bem devagar para fazer timelapses.
  • Alimentador automático de peixes: um mecanismo que gira o reservatório duas vezes por dia para soltar ração.
  • Painel que segue o sol: gire um painel para a direção mais clara com dois sensores de luz; para a parte da luz, veja Sensor de luz LDR.
  • Mesa giratória: uma mesa que gira um objeto em passos iguais para fotos de produtos ou escaneamento 3D.
  • Cortina automática: um motor que abre e fecha uma cortina enrolando a cordinha e que lembra a posição dela.

Erros comuns e como resolvê-los

  • O motor vibra, mas não gira: a ordem dos pinos na biblioteca Stepper está errada; escreva 8, 10, 9, 11 em vez de 8, 9, 10, 11.
  • O motor pula passos: a velocidade está alta demais ou a carga pesada demais; mantenha o 28BYJ-48 abaixo de 15 RPM e acrescente aceleração com a AccelStepper.
  • O Arduino reinicia: a alimentação não é suficiente; alimente o motor com uma fonte externa de 5 V e ligue os terras.
  • O motor esquenta parado: as bobinas continuam energizadas; coloque os quatro pinos em LOW quando o movimento terminar.
  • O número de voltas não bate: são 2048 passos no modo de passo completo e 4096 no de meio passo, enquanto um NEMA 17 tem 200. Não confunda o modo com o motor.
  • O motor não gira com um A4988: o limite de corrente está baixo demais, não há alimentação para o motor, ou os pinos RESET e SLEEP não estão ligados entre si.

O motor de passo é o jeito mais fácil de dizer "gire exatamente isto", e é a base de máquinas como fresadoras CNC e impressoras 3D. No app BlueGrays você encontra projetos de uso do motor de passo 28BYJ-48 e de montagem de um servo de 360 graus a partir de um motor de passo, passo a passo, com esquemas do circuito e código.

Perguntas frequentes

Quantos passos o 28BYJ-48 dá por volta?

Cerca de 2048 no modo de passo completo e cerca de 4096 no modo de meio passo. Como a redução interna não é exatamente 1:64, um pequeno desvio pode se acumular em movimentos muito longos; para trabalhos precisos, é uma boa ideia zerar a posição de vez em quando com uma chave de fim de curso.

Por que meu motor de passo vibra, mas não gira?

A causa mais comum é acionar as bobinas na ordem errada. Na biblioteca Stepper do Arduino, os pinos do 28BYJ-48 precisam ser escritos na ordem 8, 10, 9, 11 (IN1, IN3, IN2, IN4). Um motor também pode vibrar em vez de girar se a velocidade estiver alta demais ou a alimentação fraca demais.

Posso alimentar o ULN2003 pelo pino 5V do Arduino?

Para um único 28BYJ-48, normalmente sim; o motor puxa cerca de 240 mA e a USB aguenta isso. Com dois motores, servos ou outras cargas, o regulador e a porta USB do Arduino ficam sobrecarregados; nesse caso, use uma fonte externa de 5 V e ligue os terras.

Como um motor de passo sabe a sua posição?

O motor de passo não mede a posição; ele a conhece contando os passos dados. É por isso que você deve levar o motor até um ponto de referência (como uma chave de fim de curso) na inicialização para zerá-lo, e evitar passos pulados por sobrecarga ou velocidade alta.

Devo usar um motor de passo ou um servo motor?

Se basta ir até um ângulo entre 0 e 180 graus e ficar parado nele, um servo é mais simples e já tem o driver embutido. Para tarefas que pedem várias voltas, torque forte em baixa velocidade ou posicionamento muito preciso, escolha um motor de passo.

Qual é a diferença entre o 28BYJ-48 e o NEMA 17?

O 28BYJ-48 é um motor pequeno e barato de 5 V que gira devagar, mas com precisão, graças à caixa de redução. O NEMA 17 é um motor bipolar muito mais forte e rápido, que dá 200 passos por volta; ele precisa de um driver como o A4988 e de uma fonte de 12–24 V. O 28BYJ-48 é adequado para projetos de hobby, enquanto o NEMA 17 é usado em máquinas como impressoras 3D e fresadoras CNC.

Ver todos os projetos
Uso do motor de passo
#67Intermediário
Premium

Uso do motor de passo

Um motor que gira passo a passo, exatamente o quanto você quer, como o ponteiro de um relógio. Por meio de uma placa de acionamento, o Arduino gira um pequeno motor de passo uma volta completa em uma

4.5(31)
42
Servo motor de 360 graus com motor de passo
#68Intermediário
Premium

Servo motor de 360 graus com motor de passo

Ensine um motor de passo comum a ir até qualquer ângulo que você quiser, ao longo de uma volta completa. O Arduino calcula quantos passos correspondem a cada ângulo; o motor vai para 0, 90, 45, 180, 1

4.5(22)
32
Controle de servos com joystick
#60Intermediário
Premium

Controle de servos com joystick

Controle dois motores com um joystick, como ao girar uma câmera de segurança. Empurre a alavanca para os lados e o servo motor inferior gira lentamente; mova para cima ou para baixo e o servo superior

4.7(42)
58
Servo motor com ESP32 (controle por potenciômetro)
#118Intermediário
Premium

Servo motor com ESP32 (controle por potenciômetro)

Neste projeto, controlamos um servo motor SG90 com um potenciômetro. Ajustamos o ângulo do servo mapeando o valor analógico lido do potenciômetro para a faixa de 0 a 180 graus. A biblioteca ESP32Servo gera sinais para o servo nos GPIOs do ESP32 adequados e capazes de operar como saída; este projeto usa o GPIO 18. Esse é um método básico de controle para braços robóticos, estabilizadores de câmera e mecanismos de portas automáticas.

4.3(29)
42
Carrinho controlado por Bluetooth com L298N
#80Avançado
Premium

Carrinho controlado por Bluetooth com L298N

Transforme seu celular em um controle remoto e dirija seu próprio carrinho robô. O Arduino recebe os comandos de um aplicativo de controle remoto no celular por meio de um módulo Bluetooth e aciona as

5.0(38)
65
Robô que desvia de obstáculos
#81Avançado
Premium

Robô que desvia de obstáculos

Que tal construir um veículo inteligente que encontra seu próprio caminho? O robô que desvia de obstáculos monitora o ambiente constantemente com o sensor ultrassônico na parte da frente. Ao encontrar

5.0(38)
49
Controle de LEDs com joystick
#59Intermediário
Premium

Controle de LEDs com joystick

Empurre a alavanca do joystick até o fim em qualquer direção e o LED correspondente acende: são quatro cores diferentes para direita, esquerda, cima e baixo. Ao soltar a alavanca, ela volta ao centro

4.7(50)
67
Sensor de estacionamento com ESP32 (HC-SR04 + barra de 5 LEDs + buzzer + OLED)
#142Avançado
Premium

Sensor de estacionamento com ESP32 (HC-SR04 + barra de 5 LEDs + buzzer + OLED)

A versão com ESP32 do sensor de estacionamento de carro! Usamos o sensor ultrassônico HC-SR04 para medir a distância até o objeto à sua frente. Conforme a distância diminui, a barra de 5 LEDs vai se preenchendo (verde → amarelo → vermelho) e o intervalo entre os bipes do buzzer diminui. Quando o objeto chega muito perto (menos de 10 cm), o alarme soa continuamente e todos os LEDs acendem.

0.0(0)
14