Servo Motor: Guia Completo com Arduino e ESP32 — SG90, MG995, MG996R e Mais
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.
⚙️ 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
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
5V DC
NUNCA pelo pino 5V do Arduino
Compartilhar GND com
o Arduino / ESP32
Qualquer pino digital PWM
do Arduino ou GPIO do ESP32
🔴 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:
- O mais popular do mundo maker
- Ideal para projetos leves
- Braços robóticos pequenos
- Câmeras pan/tilt
- Velocidade: 0,12s/60°
- Gira 360° continuamente
- Velocidade controlada via PWM
- 1,5ms = parado
- Rodas de robôs pequenos
- Esteiras, mecanismos giratórios
- 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
- Torque intermediário
- Carga maior que o SG90
- Bom custo-benefício
- Braços com carga leve-média
- Velocidade: 0,23s/60°
- 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!
- 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
| Modelo | Peso | Torque (4.8V) | Velocidade | Engrenagem | Tipo | Uso Ideal |
|---|---|---|---|---|---|---|
| SG90 180° | 9g | 1,8 kg.cm | 0,12s/60° | Plástico | Posição | Projetos leves, aprendizado |
| SG90 360° | 9g | 1,8 kg.cm | Variável | Plástico | Contínuo | Rodas, esteiras, rotação |
| EMAX ES08MA II 180° | 12g | 1,8 kg.cm | 0,10s/60° | Metal | Posição | Aeromodelo, uso intenso |
| S3003 180° | 39g | 3,2 kg.cm | 0,23s/60° | Plástico | Posição | Carga intermediária |
| MG995 180° | 55g | 9,4 kg.cm | 0,20s/60° | Metal | Posição | Robótica, braços pesados |
| MG996R 180° | 55g | 9,4 kg.cm | 0,20s/60° | Metal | Posição | Robó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):
#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:
#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.
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.
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.
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.
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.
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.
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
-
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.
-
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.
-
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.
-
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).
-
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. -
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