Mini servo SG90: como o PWM controla o ângulo
Como o mini servo SG90 transforma a largura de um pulso em ângulo, por que o sinal se repete 50 vezes por segundo, como calibrar os extremos e o que a biblioteca Servo do Arduino e o MicroPython fazem por baixo.

O mini servo SG90 é a junta mais comum dos braços robóticos de bancada. Por dentro, ele tem um motor pequeno, uma caixa de engrenagens, um potenciômetro preso ao eixo de saída e um circuito de controle. O circuito compara a posição pedida com a posição lida no potenciômetro e gira o motor até as duas baterem.
Os três fios
- Marrom: GND.
- Vermelho: alimentação, em torno de 5 V.
- Laranja: sinal de comando.
O fio de sinal não alimenta nada: ele só diz ao servo para onde ir. Por isso o vermelho pode, e com quatro servos deve, vir de uma fonte separada, desde que o GND seja comum com o da placa.
O pulso que vira ângulo
O comando é um pulso repetido 50 vezes por segundo, ou seja, um a cada 20 ms. O que importa não é a frequência, e sim quanto tempo o pulso fica em nível alto:
| Largura do pulso | Posição (referência do datasheet) |
|---|---|
| cerca de 1 ms | um extremo |
| 1,5 ms | centro (90 graus) |
| cerca de 2 ms | o outro extremo |
Isso é PWM, modulação por largura de pulso. Na prática, muitos SG90 só alcançam os 180 graus completos com pulsos entre cerca de 0,5 ms e 2,4 ms, e cada unidade varia um pouco. Por isso vale calibrar.
Calibrar os extremos
- Mande o servo para 90 graus e monte o braço da junta alinhado nessa posição.
- Vá diminuindo o ângulo até a junta encostar no limite mecânico ou o servo começar a zumbir. Anote o último ângulo sem zumbido.
- Faça o mesmo para o lado de cima.
O zumbido é o servo empurrando contra algo que não cede. Nessa situação ele puxa a corrente máxima e esquenta. Um servo que zumbe parado é sinal de limite mal ajustado.
Os números do SG90
Pelo datasheet do fabricante, com 4,8 V: torque de cerca de 1,8 kgf·cm e velocidade de 0,1 s para girar 60 graus. Em termos práticos: segura com folga uma garra leve e um objeto de poucos gramas na ponta de um braço curto. Braço longo ou objeto pesado pedem servo maior, como o MG90S, de engrenagens metálicas.
No Arduino Nano
A biblioteca Servo, que vem com a Arduino IDE, gera os pulsos por interrupção de timer. Por isso o servo funciona em qualquer pino digital, não só nos marcados com PWM. O comando write recebe o ângulo, e a biblioteca converte para pulsos que vão, por padrão, de 544 µs a 2400 µs.
Um efeito colateral importante: no Nano, usar a biblioteca Servo desliga o PWM (analogWrite) dos pinos 9 e 10, mesmo que nenhum servo esteja neles.
No ESP32 com MicroPython
O ESP32 tem PWM por hardware em quase todos os pinos de saída. Em MicroPython:
from machine import Pin, PWM
servo = PWM(Pin(13), freq=50)
servo.duty_ns(1_500_000) # 1,5 ms: centro
A IDE de blocos faz essa conta: o cartão "mover servo para 120 graus" vira o pulso correspondente, dentro dos limites de pulso que você definir para aquela junta.
O que ver na IDE
Na IDE de blocos, cada cartão de servo pede o pino e o ângulo, e o painel de código mostra o write do Arduino ou o duty do MicroPython que ele gerou. Para alimentar os quatro servos do braço, veja o artigo sobre o braço robótico com quatro mini servos.
A IoTData faz o cadastro e o envio por você.
Um engenheiro nosso responde: qual rede chega até o poço, o que o IGAM ou a ANA vão pedir, quanto custa e quem cuida do cadastro de operador.