Como controlar um motor com Arduino (servo, DC e de passo)

Colocar um motor pra girar é um daqueles momentos mágicos no mundo maker: de repente seu projeto sai da tela e ganha movimento no mundo real. Braço robótico, carrinho, cortina automática, impressora 3D... tudo isso é motor. Mas existe uma regra de ouro que precisa ficar clara antes de qualquer código: você quase nunca liga o motor direto no pino do Arduino. Vou te explicar o porquê e mostrar como controlar os três tipos de motor mais comuns, cada um do seu jeito.

O aviso mais importante deste artigo

Um pino digital do Arduino Uno entrega no máximo cerca de 20 mA com segurança (o limite absoluto é 40 mA, mas você não trabalha no limite). Um motor DC pequeno, daqueles de brinquedo, puxa facilmente 200 a 500 mA — e muito mais no arranque ou se travar o eixo.

Faça a conta: o motor quer 10 a 25 vezes mais corrente do que o pino consegue dar. Ligar direto significa queimar o pino ou a placa inteira. Não é "talvez", é física.

A solução é sempre a mesma: um driver entre o Arduino e o motor. O Arduino manda o sinal fraquinho (o "comando"), e o driver, alimentado por uma fonte externa, entrega a corrente pesada pro motor. O Arduino nunca toca na corrente do motor.

E tem um detalhe que derruba metade dos iniciantes: sempre que você usa fonte externa, o GND (terra) do Arduino e o GND da fonte precisam estar ligados juntos. Sem esse GND comum, os sinais não têm referência e nada funciona (ou funciona de forma maluca).

Guardou? Então vamos aos motores.

Motor 1: Servo — o mais fácil de começar

O servomotor (aquele SG90 azul de poucos gramas) é o motor mais amigável pra iniciante. Ele não gira sem parar: você manda um ângulo (de 0° a 180°) e ele vai pra lá e segura a posição. Perfeito pra braço robótico, leme, garra, direção de carrinho.

Ele tem 3 fios:

FioCor comumVai para
SinalLaranja/amareloUm pino PWM (ex: D9)
Alimentação (+)Vermelho5V
GND (-)Marrom/pretoGND

O servo já tem toda a eletrônica de controle dentro dele, por isso a biblioteca Servo do Arduino resolve tudo:

#include <Servo.h>

Servo meuServo;

void setup() {
  meuServo.attach(9); // sinal no pino D9
}

void loop() {
  meuServo.write(0);    // vai para 0 graus
  delay(1000);
  meuServo.write(90);   // vai para o meio
  delay(1000);
  meuServo.write(180);  // vai para o outro extremo
  delay(1000);
}

Atenção: um SG90 sozinho até roda pelo 5V do Arduino. Mas assim que você usa dois ou mais servos, ou um servo maior com carga, o 5V da placa não dá conta e o Arduino trava/reinicia. Aí você alimenta os servos por uma fonte externa de 5V e liga o GND dela junto com o GND do Arduino. De novo: GND comum.

Motor 2: Motor DC — precisa de ponte-H

O motor DC é o clássico: dois fios, liga na energia e gira. Quanto mais tensão, mais rápido; inverte os fios, gira pro outro lado. É o motor dos carrinhos e ventiladores.

Como ele puxa muita corrente, entra um driver com ponte-H — o famoso L298N ou o mais moderno DRV8833. A ponte-H faz duas coisas que você não consegue só com um transistor: controla a velocidade (via PWM) e a direção (frente e ré), sem precisar mexer nos fios.

Ligação típica com o L298N controlando um motor:

L298NVai para
ENAPino PWM do Arduino (ex: D9) — controla velocidade
IN1Pino digital (ex: D8) — direção
IN2Pino digital (ex: D7) — direção
+12VPositivo da fonte externa (ex: bateria/fonte 6–12V)
GNDGND da fonte e GND do Arduino (comum!)
OUT1 / OUT2Os dois fios do motor
const int ENA = 9;  // PWM: velocidade
const int IN1 = 8;  // direcao
const int IN2 = 7;  // direcao

void setup() {
  pinMode(ENA, OUTPUT);
  pinMode(IN1, OUTPUT);
  pinMode(IN2, OUTPUT);
}

void loop() {
  // gira para frente a meia velocidade
  digitalWrite(IN1, HIGH);
  digitalWrite(IN2, LOW);
  analogWrite(ENA, 128); // 0 a 255 (128 = ~50%)
  delay(2000);

  // para o motor
  analogWrite(ENA, 0);
  delay(1000);

  // gira para tras a velocidade maxima
  digitalWrite(IN1, LOW);
  digitalWrite(IN2, HIGH);
  analogWrite(ENA, 255);
  delay(2000);

  analogWrite(ENA, 0);
  delay(1000);
}

A lógica é simples: IN1 e IN2 opostos definem a direção; se os dois ficarem iguais (LOW/LOW ou HIGH/HIGH), o motor para. E o analogWrite em ENA, de 0 a 255, é o "acelerador".

Motor 3: Motor de passo — movimento preciso

O motor de passo (stepper) gira em pequenos "passos" contados, em vez de girar livre. Isso dá um controle de posição preciso sem sensor nenhum — é o motor das impressoras 3D, CNCs e scanners. Um NEMA 17 típico dá 200 passos por volta, ou seja, 1,8° por passo.

O par mais comum pra iniciante é o motor 28BYJ-48 com a placa driver ULN2003, que já vem juntinhos e baratos. Pra motores maiores (NEMA 17), o driver usual é o A4988 ou DRV8825.

Exemplo com o 28BYJ-48 + ULN2003, usando a biblioteca Stepper que já vem no Arduino:

#include <Stepper.h>

// 28BYJ-48: 2048 passos por volta completa (com a caixa de reducao)
const int passosPorVolta = 2048;

// ligue IN1, IN2, IN3, IN4 do ULN2003 nesta ordem: 8, 10, 9, 11
Stepper motor(passosPorVolta, 8, 10, 9, 11);

void setup() {
  motor.setSpeed(10); // velocidade em RPM
}

void loop() {
  motor.step(passosPorVolta);   // uma volta no sentido horario
  delay(1000);
  motor.step(-passosPorVolta);  // uma volta no sentido anti-horario
  delay(1000);
}

Repare na ordem dos pinos: 8, 10, 9, 11 não é engano — a biblioteca Stepper espera as bobinas nessa sequência pra girar suave. Trocar a ordem faz o motor vibrar sem sair do lugar.

E o de sempre: o 28BYJ-48 é alimentado pelos 5V pela placa ULN2003, com fonte externa quando for exigir torque, sempre com GND comum com o Arduino.

Erros comuns (e como evitar)

  • Ligar motor direto no pino. O erro número 1. Sempre use driver. Sempre.
  • Esquecer o GND comum. Fonte externa sem GND ligado ao Arduino = comportamento aleatório ou nada funcionando.
  • Alimentar motor pelo 5V do Arduino. Dá pra testar 1 servo pequeno, mas motor DC e stepper puxam corrente demais. Use fonte externa.
  • Usar pino sem PWM pra velocidade. O analogWrite só varia mesmo nos pinos marcados com ~ (no Uno: 3, 5, 6, 9, 10, 11). Nos outros ele vira liga/desliga.
  • Fonte fraca. Uma bateria 9V "quadradinha" não segura um motor de torque. Use fonte/bateria com corrente suficiente (veja o valor do motor).
  • Motor de passo esquentando parado. É normal ele ficar morno segurando posição — as bobinas ficam energizadas. Só desconfie se ferver.

Fechando

Resumindo o mapa: servo pra ângulo (fácil, biblioteca Servo), DC pra girar com ponte-H tipo L298N (velocidade e direção), stepper pra precisão com driver como o ULN2003 ou A4988. E por baixo de tudo, três mandamentos: nunca ligue motor direto no pino, use fonte externa e nunca esqueça o GND comum.

Se você quer sair do "copiei o código e funcionou" pra realmente entender o que acontece dentro do driver, dimensionar a fonte certa e projetar seus próprios movimentos, é exatamente isso que a gente destrincha, passo a passo e sem pressa, no Curso Maker. Bora dar movimento aos seus projetos.