iotdata, by Data Frontieriot
data
Programación por bloques

Mini servo SG90: cómo el PWM controla el ángulo

Cómo el mini servo SG90 convierte el ancho de un pulso en ángulo, por qué la señal se repite 50 veces por segundo, cómo calibrar los extremos y qué hacen por debajo la biblioteca Servo de Arduino y MicroPython.

Ingeniería Data Frontier· Publicado el 22 de octubre de 2026

El mini servo SG90 es la articulación más común de los brazos robóticos de banco de trabajo. Por dentro, tiene un motor pequeño, una caja de engranajes, un potenciómetro unido al eje de salida y un circuito de control. El circuito compara la posición pedida con la posición leída en el potenciómetro y gira el motor hasta que las dos coinciden.

Los tres cables

  • Marrón: GND.
  • Rojo: alimentación, alrededor de 5 V.
  • Naranja: señal de comando.

El cable de señal no alimenta nada: solo le dice al servo adónde ir. Por eso el rojo puede, y con cuatro servos debe, venir de una fuente aparte, siempre que el GND sea común con el de la placa.

El pulso que se convierte en ángulo

El comando es un pulso repetido 50 veces por segundo, es decir, uno cada 20 ms. Lo que importa no es la frecuencia, sino cuánto tiempo el pulso permanece en nivel alto:

Ancho del pulsoPosición (referencia de la hoja de datos)
cerca de 1 msun extremo
1,5 mscentro (90 grados)
cerca de 2 msel otro extremo

Esto es PWM, modulación por ancho de pulso. En la práctica, muchos SG90 solo alcanzan los 180 grados completos con pulsos de entre unos 0,5 ms y 2,4 ms, y cada unidad varía un poco. Por eso conviene calibrar.

Calibrar los extremos

  1. Mande el servo a 90 grados y monte el brazo de la articulación alineado en esa posición.
  2. Vaya bajando el ángulo hasta que la articulación llegue al límite mecánico o el servo empiece a zumbar. Anote el último ángulo sin zumbido.
  3. Haga lo mismo hacia el lado de arriba.

El zumbido es el servo empujando contra algo que no cede. En esa situación consume la corriente máxima y se calienta. Un servo que zumba quieto es señal de un límite mal ajustado.

Los números del SG90

Según la hoja de datos del fabricante, con 4,8 V: torque de cerca de 1,8 kgf·cm y velocidad de 0,1 s para girar 60 grados. En términos prácticos: sostiene con holgura una pinza liviana y un objeto de pocos gramos en la punta de un brazo corto. Un brazo largo o un objeto pesado piden un servo mayor, como el MG90S, de engranajes metálicos.

En el Arduino Nano

La biblioteca Servo, que viene con el Arduino IDE, genera los pulsos por interrupción de temporizador. Por eso el servo funciona en cualquier pin digital, no solo en los marcados con PWM. El comando write recibe el ángulo, y la biblioteca lo convierte en pulsos que van, por defecto, de 544 µs a 2400 µs.

Un efecto secundario importante: en el Nano, usar la biblioteca Servo desactiva el PWM (analogWrite) de los pines 9 y 10, aunque no haya ningún servo en ellos.

En el ESP32 con MicroPython

El ESP32 tiene PWM por hardware en casi todos los pines de salida. En MicroPython:

from machine import Pin, PWM

servo = PWM(Pin(13), freq=50)
servo.duty_ns(1_500_000)   # 1,5 ms: centro

El IDE de bloques hace esa cuenta: la tarjeta "mover servo a 120 grados" se convierte en el pulso correspondiente, dentro de los límites de pulso que usted defina para esa articulación.

Qué ver en el IDE

En el IDE de bloques, cada tarjeta de servo pide el pin y el ángulo, y el panel de código muestra el write de Arduino o el duty de MicroPython que generó. Para alimentar los cuatro servos del brazo, vea el artículo sobre el brazo robótico con cuatro mini servos.