Servo Motor: Guia Completo com Arduino e ESP32 — SG90, MG995, MG996R e Mais | Eletrônica Básica
Motores & Atuadores

Servo MotorControle Preciso de Posição e Rotação com Arduino e ESP32

Do micro SG90 de 9g ao robusto MG996R com engrenagens de metal — entenda como os servo motores funcionam, como ligar corretamente e como evitar os erros que queimam controladores.

SERVO MOTOR 5V · PWM 50Hz VCC GND SIG
#servomotor #sg90 #mg995 #mg996r #arduino #esp32 #robotica

⚙️ O que é um Servo Motor?

Um servo motor é um motor com engrenagens internas e um circuito de controle que permite posicioná-lo com precisão em um ângulo específico — ou controlar sua rotação contínua. Diferente de um motor DC comum (que só gira para um lado ou outro), o servo vai para exatamente onde você mandar.

Internamente ele combina: motor DC + caixa de redução de engrenagens + potenciômetro de feedback + circuito de controle. Tudo isso em um módulo compacto controlado por apenas 3 fios e um sinal PWM.

📡 Como Funciona — O Sinal PWM

O servo interpreta a posição a partir da largura do pulso de um sinal PWM a 50 Hz (período de 20 ms). Não é o duty cycle — é o tempo absoluto que o pulso fica em HIGH que define o ângulo:

Largura de Pulso → Posição do Servo

1,0 ms pulse
1,5 ms pulse
90°
2,0 ms pulse
180°
→ 20ms 1ms → 0° 1.5ms → 90° 2ms → 180°

O período total é sempre 20 ms (50 Hz). Só a largura do pulso muda.
A biblioteca Servo.h do Arduino faz esse cálculo por você — você só passa o ângulo em graus.

🔌 Os 3 Fios do Servo

Vermelho
VCC — Alimentação
5V DC
NUNCA pelo pino 5V do Arduino
Marrom / Preto
GND — Terra
Compartilhar GND com
o Arduino / ESP32
Laranja / Amarelo / Branco
SINAL — PWM
Qualquer pino digital PWM
do Arduino ou GPIO do ESP32
⚠️ Atenção às cores: Alguns fabricantes usam amarelo para sinal e preto para GND. Sempre verifique o datasheet do modelo antes de ligar.

🔴 NUNCA alimente o servo pelo pino 5V do Arduino!

O pino 5V do Arduino fornece no máximo 200–500 mA. Um único servo pode puxar 500 mA–2 A sob carga. Alimentar pelo Arduino causa:

  • Reset ou travamento do Arduino
  • Jitter no sinal (tremido no servo)
  • Queima do regulador de tensão do Arduino com múltiplos servos

✅ Correto: Use uma fonte externa de 5V (carregador USB antigo, regulador LM7805, fonte DC). Conecte o GND da fonte ao GND do Arduino.


📦 Os Modelos da Mamute — Qual Escolher?

Cada projeto tem um servo certo. Veja as diferenças e o melhor uso de cada um:

Micro Servo SG90
9g · Plástico · 180°
1,8
kg.cm a 4,8V
  • O mais popular do mundo maker
  • Ideal para projetos leves
  • Braços robóticos pequenos
  • Câmeras pan/tilt
  • Velocidade: 0,12s/60°
Micro Servo SG90 360°
9g · Plástico · Rotação Contínua
1,8
kg.cm a 4,8V
  • Gira 360° continuamente
  • Velocidade controlada via PWM
  • 1,5ms = parado
  • Rodas de robôs pequenos
  • Esteiras, mecanismos giratórios
EMAX ES08MA II
12g · Metal · 180°
1,8
kg.cm a 4,8V
  • Engrenagem de metal = mais durável
  • Mais rápido: 0,10s/60°
  • Popular em aeromodelismo
  • Maior vida útil que SG90
  • Superfícies de controle de avião
Servo S3003
39g · Plástico · 180°
3,2
kg.cm a 4,8V
  • Torque intermediário
  • Carga maior que o SG90
  • Bom custo-benefício
  • Braços com carga leve-média
  • Velocidade: 0,23s/60°
Servo MG995
55g · Metal · 180°
9,4
kg.cm a 4,8V
  • Alta potência para robótica
  • Engrenagens totalmente metálicas
  • Garra robótica, pernas de robô
  • Pode puxar até 2A sob carga
  • Fonte externa obrigatória!
Servo MG996R
55g · Metal · 180°
9,4
kg.cm a 4,8V
  • Versão melhorada do MG995
  • Menor backlash nas engrenagens
  • Mais silencioso
  • Melhor para impressoras 3D, hexápodes
  • Referência em robótica amadora

📊 Tabela Comparativa Completa

ModeloPesoTorque (4.8V)VelocidadeEngrenagemTipoUso Ideal
SG90 180°9g1,8 kg.cm0,12s/60°PlásticoPosiçãoProjetos leves, aprendizado
SG90 360°9g1,8 kg.cmVariávelPlásticoContínuoRodas, esteiras, rotação
EMAX ES08MA II 180°12g1,8 kg.cm0,10s/60°MetalPosiçãoAeromodelo, uso intenso
S3003 180°39g3,2 kg.cm0,23s/60°PlásticoPosiçãoCarga intermediária
MG995 180°55g9,4 kg.cm0,20s/60°MetalPosiçãoRobótica, braços pesados
MG996R 180°55g9,4 kg.cm0,20s/60°MetalPosiçãoRobótica profissional

💻 Código Arduino UNO / NANO / MEGA

Use a biblioteca nativa Servo.h — já vem instalada na IDE do Arduino. Conecte o fio de sinal em qualquer pino digital (ex: D9):

// servo_arduino.ino — Controle básico + varredura
#include <Servo.h>

// Servo Motor com Arduino — Mamute Eletrônica
// blog.mamuteeletronica.com.br

Servo meuServo;

#define PINO_SINAL  9   // fio laranja/amarelo do servo
// VCC → fonte externa 5V | GND → GND comum

void setup() {
  meuServo.attach(PINO_SINAL);  // vincula o pino ao objeto
  Serial.begin(9600);
  Serial.println("Servo pronto!");
}

void loop() {
  // ── Posições fixas ──
  meuServo.write(0);     // vai para 0°
  delay(1000);
  meuServo.write(90);    // vai para 90° (centro)
  delay(1000);
  meuServo.write(180);   // vai para 180°
  delay(1000);

  // ── Varredura suave 0° → 180° ──
  for (int pos = 0; pos <= 180; pos++) {
    meuServo.write(pos);
    delay(12);  // velocidade do movimento
  }

  // ── Varredura suave 180° → 0° ──
  for (int pos = 180; pos >= 0; pos--) {
    meuServo.write(pos);
    delay(12);
  }
}

🎛️ Controlando com Potenciômetro

Mapeie o potenciômetro (0–1023) para o ângulo do servo (0–180°) — perfeito para controle manual:

int leitura = analogRead(A0);
int angulo  = map(leitura, 0, 1023, 0, 180);
meuServo.write(angulo);

🔄 Servo de 360° (Rotação Contínua) — Controle diferente!

O SG90 360° não usa ângulo — usa velocidade e direção. O ponto neutro (parado) é em torno de 90°, mas pode variar por servo:

meuServo.write(90);   // parado (aprox — calibrar se necessário)
meuServo.write(0);    // velocidade máx → sentido anti-horário
meuServo.write(180);  // velocidade máx → sentido horário
meuServo.write(100);  // lento horário
meuServo.write(80);   // lento anti-horário

Calibração: Se o servo não parar em 90°, ajuste com meuServo.writeMicroseconds(1500) e varie ±50 µs até parar completamente.

💻 Código ESP32 3.3V GPIO

No ESP32, instale a biblioteca ESP32Servo pelo Gerenciador de Bibliotecas da IDE Arduino. O sinal do ESP32 é 3.3V — o suficiente para todos os servos listados aqui. Alimentação ainda precisa ser 5V externo:

// servo_esp32.ino — requer biblioteca "ESP32Servo"
#include <ESP32Servo.h>

// Servo Motor com ESP32 — Mamute Eletrônica
// Instale: Gerenciador de Bibliotecas → ESP32Servo

Servo meuServo;
#define PINO_SINAL  18  // qualquer GPIO do ESP32

void setup() {
  Serial.begin(115200);

  // Aloca timer de hardware para PWM
  ESP32PWM::allocateTimer(0);

  // Configura 50Hz e faixa de pulso (µs)
  meuServo.setPeriodHertz(50);
  meuServo.attach(PINO_SINAL, 500, 2400);
  // 500µs = 0° | 2400µs = 180°
  // Ajuste esses valores se seu servo tiver alcance diferente
}

void loop() {
  meuServo.write(0);
  delay(1000);
  meuServo.write(90);
  delay(1000);
  meuServo.write(180);
  delay(1000);
}

💡 Múltiplos Servos no ESP32

Para usar mais de um servo no ESP32, aloque um timer para cada grupo de até 4 servos:

ESP32PWM::allocateTimer(0);  // servos 1-4
ESP32PWM::allocateTimer(1);  // servos 5-8
// Depois: servo1.attach(18), servo2.attach(19), ...

🔧 Problemas Comuns e Como Resolver

📳

Jitter — Servo tremendo sem parar

O servo oscila levemente mesmo em repouso. Causa mais comum: ruído na alimentação por estar usando o 5V do Arduino.

✅ Solução

Use fonte externa 5V. Adicione um capacitor eletrolítico de 100–470 µF entre VCC e GND próximo ao servo. Separe o GND da fonte do circuito analógico.

🔥

Servo aquecendo ou parado com ruído

Servo emite ruído mas não gira, ou fica quente. É stall — o motor está tentando girar, mas alguma carga mecânica ou limite físico impede.

✅ Solução

Nunca deixe o servo forçado contra uma parada mecânica. Use meuServo.detach() quando não precisar de posição. Verifique se o torque do modelo é suficiente para a carga.

📍

Servo não vai até 0° ou 180° completos

Alguns servos usam faixa de pulso diferente do padrão (1ms–2ms). O SG90, por exemplo, vai de ~500µs a ~2400µs, além do padrão.

✅ Solução

Use meuServo.attach(pino, min_us, max_us) para ajustar a faixa. Valores típicos para SG90: .attach(9, 500, 2400). Teste com writeMicroseconds().

🔄

Servo 360° não para no neutro

O servo de rotação contínua continua girando levemente mesmo em write(90). O ponto neutro varia por unidade.

✅ Solução

Calibre com writeMicroseconds(): comece em 1500 e ajuste ±10µs até o servo parar completamente. Anote o valor e use-o como "neutro" no seu código.

Arduino reseta ao mover o servo

O servo causa queda de tensão na alimentação do Arduino, fazendo-o resetar. Acontece quando alimentado pelo USB + servo no 5V do Arduino.

✅ Solução

Fonte externa para o servo. Se não tiver, coloque capacitor de 1000 µF no barramento de 5V. Nunca alimente MG995/MG996R pelo Arduino — eles puxam até 2A sob carga.

🤖

Múltiplos servos — conflito de timers

No Arduino Uno, a biblioteca Servo.h usa os timers de hardware. Com muitos servos (>12), ou ao usar junto com analogWrite(), podem ocorrer conflitos.

✅ Solução

Use uma placa PCA9685 (driver I²C para 16 servos) para projetos com muitos servos. Libera os timers do Arduino e permite muito mais canais com apenas 2 fios.


✅ Checklist — Antes de Ligar o Servo

  • 1
    Fonte externa de 5V para o servo. Nunca use o pino 5V do Arduino. Um SG90 em movimento pode puxar 400 mA — mais do que o Arduino consegue fornecer com estabilidade.
  • 2
    GND da fonte e do Arduino compartilhados. Se você usar fonte separada, ligue o GND da fonte no GND do Arduino. Sem isso, o sinal PWM não tem referência e o servo não responde corretamente.
  • 3
    Confirme a cor dos fios antes de ligar. A ordem VCC/GND/Sinal pode variar por fabricante. Com polaridade invertida você queima o servo imediatamente.
  • 4
    Escolha o torque certo para a carga. Use a tabela comparativa. Um SG90 (1,8 kg.cm) não segura o braço de um robô com peso real — para isso use MG995 ou MG996R (9,4 kg.cm).
  • 5
    Evite stall (servo parado contra resistência). Servo em stall aquece, consome corrente alta e queima. Sempre use detach() quando a posição não precisa ser mantida ativamente.
  • 6
    Para ESP32: instale a biblioteca ESP32Servo. A biblioteca nativa Servo.h não funciona corretamente no ESP32. Use ESP32Servo e configure a faixa de pulso com attach(pino, 500, 2400).

🛒 Servo Motores na Mamute Eletrônica

SG90, MG995, MG996R, EMAX ES08MA II, S3003 e mais — todos em estoque

🤖 Pronto para dar movimento ao seu projeto?

Servo motores, fontes externas, jumpers e componentes — tudo na Mamute. Ou passa pessoalmente: Rua Vitória, 125 — Santa Efigênia/SP ☕

🛒 Ver Servo Motores na Mamute