Servomotor SG90 con Arduino: conexión y código para moverlo paso a paso
El servomotor SG90 es uno de los primeros componentes que se mueven de verdad en un proyecto escolar: abre la tapa de una caneca, levanta una barrera de parqueadero, mueve el brazo de un robot o apunta un sensor. En esta guía vas a aprender a usar un servomotor con Arduino paso a paso: qué es, cómo conectarlo (cable marrón, rojo y naranja), tres códigos listos para copiar y los errores más comunes que hacen que el servo tiemble o que el Arduino se reinicie.
¿Qué es un servomotor y para qué sirve?
Un servomotor es un motor pequeño que no gira libremente como un ventilador, sino que va a una posición (un ángulo) y se queda ahí. Por dentro tiene un motor de corriente continua, unos engranajes que reducen la velocidad y aumentan la fuerza, un potenciómetro que mide la posición del eje y un pequeño circuito de control. Ese circuito compara la posición que le pides con la posición real y mueve el motor hasta que coinciden.
Por eso sirve para todo lo que necesita moverse a un punto exacto: timones de aviones a escala, pinzas, brazos robóticos, cerraduras, barreras, girasoles solares o la típica caneca que abre la tapa cuando detecta la mano.
Características del micro servo SG90
El SG90 es un "micro servo" azul de plástico muy barato y fácil de conseguir en tiendas de electrónica de Colombia y Latinoamérica. Los valores que siguen son los que suelen aparecer en las hojas de datos; como hay muchos fabricantes y copias, tómalos como referencia y no como números exactos:
- Voltaje de trabajo: alrededor de 4,8 a 6 V. Con los 5 V del Arduino funciona bien.
- Recorrido: aproximadamente de 0° a 180° (muchos llegan a algo menos en la práctica).
- Peso: unos 9 gramos.
- Fuerza (torque): la hoja de datos habla de cerca de 1,8 kg·cm a 4,8 V. Alcanza para mover piezas livianas, no para levantar cosas pesadas.
- Señal de control: PWM de unos 50 Hz (un pulso cada 20 ms). El ancho del pulso, más o menos entre 1 y 2 ms, indica el ángulo.
Si necesitas más fuerza existen el MG90S (mismo tamaño, engranajes metálicos) y el MG996R (más grande y con mucho más consumo). Se programan igual, pero piden una fuente más robusta.
Cómo funciona la señal: ángulo y ancho de pulso
El Arduino no le manda "voltaje" al servo para moverlo, le manda pulsos. Cada 20 ms envía un pulso por el cable de señal, y lo que importa es cuánto dura ese pulso:

| Ancho de pulso (aprox.) | Posición del eje | Instrucción en Arduino |
|---|---|---|
| 1 ms | 0° (un extremo) | servo.write(0); |
| 1,5 ms | 90° (centro) | servo.write(90); |
| 2 ms | 180° (el otro extremo) | servo.write(180); |
Estos tiempos son aproximados. La librería Servo de Arduino, por defecto, usa un rango algo más amplio (de unos 0,544 ms a 2,4 ms) para que la mayoría de servos alcancen todo su recorrido. La buena noticia es que no tienes que calcular nada: escribes el ángulo y la librería genera el pulso.
Materiales
- Arduino Uno o Nano (sirve cualquiera compatible).
- Servomotor SG90.
- Potenciómetro de 10 kΩ (para el segundo ejemplo).
- Cables tipo jumper macho-macho y protoboard.
- Opcional: fuente externa de 5 V (cargador de celular, módulo de pilas o fuente de protoboard) si vas a usar varios servos.
Cómo conectar un servomotor a Arduino
El SG90 trae tres cables. Los colores son casi siempre los mismos:
| Cable del SG90 | Función | Pin del Arduino |
|---|---|---|
| Marrón (a veces negro) | Tierra (GND) | GND |
| Rojo | Alimentación (+) | 5V |
| Naranja (a veces amarillo o blanco) | Señal PWM | Pin digital 9 |

Puedes usar otro pin digital para la señal; solo cambia el número en el código. En el Arduino Uno, la librería Servo desactiva el analogWrite() en los pines 9 y 10 mientras la uses, así que si además quieres controlar el brillo de un LED, ponlo en otro pin PWM como el 3, 5 o 6.
¿Y si voy a conectar varios servos?
Un solo SG90 sin carga se puede alimentar desde el pin 5V del Arduino conectado por USB. Pero cuando arranca o hace fuerza, el servo puede pedir picos de corriente de varios cientos de miliamperios. Con dos o más servos, o si el servo mueve algo pesado, lo recomendable es:
- Alimentar los servos (cable rojo) con una fuente externa de 5 V que entregue al menos 1 A.
- Unir el GND de la fuente con el GND del Arduino. Sin esa tierra común la señal no tiene referencia y el servo no responde o se mueve de forma errática.
- Seguir conectando solo el cable naranja de señal al pin del Arduino.
Nunca alimentes el servo con una batería de 9 V directa: supera el voltaje recomendado y puede dañarlo.
Código 1: mover el servo de 0° a 180° (barrido)
Este es el ejemplo clásico "Sweep". Copia el código en el IDE de Arduino, selecciona tu placa y el puerto, y súbelo:
#include <Servo.h>
Servo miServo; // creamos el objeto servo
int angulo = 0;
void setup() {
miServo.attach(9); // señal en el pin 9
}
void loop() {
// de 0 a 180 grados
for (angulo = 0; angulo <= 180; angulo++) {
miServo.write(angulo);
delay(15); // tiempo para que el servo llegue
}
// de 180 a 0 grados
for (angulo = 180; angulo >= 0; angulo--) {
miServo.write(angulo);
delay(15);
}
}
Qué hace cada parte:
#include <Servo.h>carga la librería, que ya viene instalada con el IDE de Arduino.Servo miServo;crea un objeto para controlar un servo. Si tienes dos, creasservo1yservo2.attach(9)le dice a la librería en qué pin está la señal.write(angulo)envía el ángulo de 0 a 180.- El
delay(15)hace el movimiento suave. Si lo subes a 30, el barrido será más lento.
Código 2: controlar el servo con un potenciómetro
Ahora el servo seguirá la perilla de un potenciómetro, como si fuera un control remoto. Conecta las patas de los extremos del potenciómetro a 5V y GND, y la pata del centro al pin A0.

#include <Servo.h>
Servo miServo;
const int pinPot = A0;
void setup() {
miServo.attach(9);
Serial.begin(9600);
}
void loop() {
int lectura = analogRead(pinPot); // 0 a 1023
int angulo = map(lectura, 0, 1023, 0, 180); // convertimos a grados
miServo.write(angulo);
Serial.println(angulo); // ver en el Monitor Serie
delay(15);
}
La función map() convierte un rango en otro: toma la lectura del convertidor analógico (0 a 1023) y la pasa a grados (0 a 180). Abre el Monitor Serie a 9600 baudios para ver el ángulo mientras giras la perilla.
Código 3: llevar el servo a posiciones fijas
En muchos proyectos no necesitas un barrido, sino ir a posiciones concretas: tapa cerrada, tapa abierta. Este código lleva el servo a 0°, 90° y 180° con una pausa entre cada una:
#include <Servo.h>
Servo miServo;
void setup() {
miServo.attach(9);
miServo.write(90); // posición inicial: centro
delay(1000);
}
void loop() {
miServo.write(0);
delay(1000);
miServo.write(90);
delay(1000);
miServo.write(180);
delay(1000);
}
Con esta idea y el sensor ultrasónico HC-SR04 con Arduino puedes armar la caneca automática: si la distancia es menor a 15 cm, write(90) para abrir; si no, write(0) para cerrar.
Probarlo primero en Tinkercad
Si todavía no tienes el servo, en Tinkercad Circuits (gratis, en el navegador) hay un "Micro servo" y un Arduino Uno. Puedes armar exactamente el mismo circuito, pegar el código y ver cómo se mueve el eje en la simulación. Es una buena forma de practicar en clase antes de tocar los componentes.
Errores comunes con el servomotor SG90
- El servo tiembla o vibra (jitter): casi siempre es alimentación insuficiente o falta de tierra común. Usa una fuente externa de 5 V, une los GND y, si quieres, pon un condensador electrolítico de 100 a 470 µF entre 5V y GND cerca del servo. También ayuda no forzarlo contra un tope mecánico.
- El Arduino se reinicia o el puerto USB se desconecta: el pico de corriente al arrancar el servo hace caer el voltaje. Es la señal clara de que necesitas fuente externa.
- No se mueve nada: revisa que el número en
attach()coincida con el pin donde conectaste el cable naranja, y que el cable marrón esté en GND y no al revés. - Zumba en los extremos: algunos SG90 no llegan a 0° o 180° exactos y se quedan empujando. Limita el recorrido, por ejemplo de 10° a 170°.
- Gira sin parar y no obedece el ángulo: tienes un servo de 360° (rotación continua). En esos,
write(90)lo detiene, valores menores giran hacia un lado y mayores hacia el otro; no se puede llevar a un ángulo fijo. - Error "Servo.h: No such file or directory": revisa que escribiste
Servo.hcon S mayúscula y que el IDE está bien instalado.
Si tu proyecto también tiene que encender cargas grandes, como un bombillo o una bomba de agua, no las conectes al pin del Arduino: usa un módulo relé con Arduino o un transistor como interruptor.
Preguntas frecuentes
¿Cuántos servos puedo conectar a un Arduino Uno?
La librería Servo permite hasta 12 servos en el Uno, usando cualquier pin digital. El límite real suele ser la alimentación: con más de uno, usa fuente externa de 5 V con tierra común.
¿Puedo conectar el SG90 a 3,3 V?
No es lo recomendado. Está pensado para unos 5 V; con menos voltaje puede moverse débil o no moverse. En placas de 3,3 V (como ESP32) se alimenta el servo con 5 V aparte y solo la señal sale de la placa, que normalmente el servo acepta.
¿Qué diferencia hay entre un servo de 180° y uno de 360°?
El de 180° va a un ángulo y se queda ahí. El de 360° o de rotación continua gira como un motor y lo que controlas es la velocidad y el sentido, no la posición.
¿Para qué sirve el servomotor en proyectos escolares?
Para barreras de parqueadero, canecas automáticas, brazos robóticos, seguidores de luz con fotorresistencias, cerraduras con teclado y cualquier mecanismo que deba moverse a una posición exacta.
¿Cómo conecto dos servomotores a Arduino?
Crea dos objetos (Servo servo1; Servo servo2;), usa servo1.attach(9) y servo2.attach(10), y alimenta ambos con una fuente externa de 5 V unida al GND del Arduino.
Conclusión
Usar un servomotor con Arduino es sencillo: marrón a GND, rojo a 5V, naranja a un pin digital, la librería Servo.h y la instrucción write() con el ángulo. Empieza con el barrido, pasa al potenciómetro con map() y luego combínalo con sensores para que tu proyecto reaccione solo. Y recuerda la regla de oro: si el servo tiembla o el Arduino se reinicia, el problema casi siempre es la alimentación.
Comentarios