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:
| Fio | Cor comum | Vai para |
|---|---|---|
| Sinal | Laranja/amarelo | Um pino PWM (ex: D9) |
| Alimentação (+) | Vermelho | 5V |
| GND (-) | Marrom/preto | GND |
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:
| L298N | Vai para |
|---|---|
| ENA | Pino PWM do Arduino (ex: D9) — controla velocidade |
| IN1 | Pino digital (ex: D8) — direção |
| IN2 | Pino digital (ex: D7) — direção |
| +12V | Positivo da fonte externa (ex: bateria/fonte 6–12V) |
| GND | GND da fonte e GND do Arduino (comum!) |
| OUT1 / OUT2 | Os 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
analogWritesó 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.