iotdata, por Data Frontieriot
data
Programação em blocos

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.

Engenharia Data Frontier· Publicado em 22 de outubro de 2026

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 pulsoPosição (referência do datasheet)
cerca de 1 msum extremo
1,5 mscentro (90 graus)
cerca de 2 mso 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

  1. Mande o servo para 90 graus e monte o braço da junta alinhado nessa posição.
  2. 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.
  3. 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.

Na prática

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.