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:

Ángulo del servomotor SG90 según el ancho de pulso: pulso de 1 ms para 0 grados, 1,5 ms para 90 grados y 2 ms para 180 grados, repetido cada 20 ms (50 Hz)
Ancho de pulso (aprox.)Posición del ejeInstrucción en Arduino
1 ms0° (un extremo)servo.write(0);
1,5 ms90° (centro)servo.write(90);
2 ms180° (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 SG90FunciónPin del Arduino
Marrón (a veces negro)Tierra (GND)GND
RojoAlimentación (+)5V
Naranja (a veces amarillo o blanco)Señal PWMPin digital 9
Conexión del servomotor SG90 con Arduino Uno: cable marrón a GND, cable rojo a 5V y cable naranja de señal al 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:

  1. Alimentar los servos (cable rojo) con una fuente externa de 5 V que entregue al menos 1 A.
  2. 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.
  3. 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, creas servo1 y servo2.
  • 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.

Servo SG90 controlado con potenciómetro de 10k en Arduino: patas extremas del potenciómetro a 5V y GND, pata central a A0 y señal del servo al pin 9, con map de 0-1023 a 0-180 grados
#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.h con 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.

No hay comentarios