Control de servomotores con ESP32 de manera sencilla

¡Hola equipo! Bienvenidos a Ingtelecto Pro. Hoy vamos a darle "músculos" a nuestro cerebro digital. Si el ESP32 es el cerebro que piensa, los servomotores son los brazos que actúan.

Seguro que ya has usado servos con Arduino UNO. Parecía fácil, ¿verdad? Pero cuando intentas conectar uno al ESP32... ¡Empiezan los problemas! El chip se reinicia, el servo tiembla como si tuviera frío o el código ni siquiera compila.

No te preocupes. Hoy vamos a dominar la librería ESP32Servo, entenderemos por qué la alimentación es crítica y haremos que ese motor se mueva suave como la seda. ¡A trabajar! 🤖🦾

Analogía del Mundo Real: El Director de Orquesta

Imagina que el ESP32 es un director de orquesta (Cerebro) y el Servo es un violinista (Músculo).
El director solo mueve una varita ligera (Señal PWM de 3.3V), no necesita fuerza. El violinista es quien hace el esfuerzo físico y necesita haber comido bien (Alimentación de 5V).

El error común: Si el violinista intenta comerse la comida del director... ¡el director se desmaya! (Eso es lo que pasa cuando alimentas un servo potente desde el pin de 5V del ESP32: el voltaje cae y el chip se apaga).

Índice de contenido
  1. Materiales Necesarios
  2. Fundamentos Técnicos: PWM y Voltajes
    1. El Dilema de los Voltajes (3.3V vs 5V)
  3. Conexiones y Diagramas ⚙️
    1. Tabla de Conexiones (Modo Seguro)
  4. Instalación de la Librería Correcta
  5. Ejemplo 1: El Barrido Automático (Sweep)
    1. Explicación Clave: myservo.attach()
  6. Ejemplo 2: Control Preciso con Potenciómetro 🎛️
  7. Solución de Problemas Comunes
  8. Conclusión

Materiales Necesarios

Lista de Componentes ✅

  • 1 x Placa ESP32 (Cualquier versión).
  • 1 x Servomotor SG90 (Micro servo azul) o MG996R (Servo de alto torque).
  • 1 x Potenciómetro de 10k$\Omega$ (Para el ejemplo de control manual).
  • 1 x Fuente de alimentación externa de 5V (¡Muy recomendada!).
  • Cables Jumper.

Fundamentos Técnicos: PWM y Voltajes

Antes de conectar, aclaremos dos mitos que confunden a todos.

Servomotor

Actuador

A diferencia de un motor normal que gira sin parar, el servo tiene un cerebro interno y un engranaje. Tú le dices: "Vete a 90 grados", y él va y se queda ahí, haciendo fuerza para mantener la posición.

El Dilema de los Voltajes (3.3V vs 5V)

  • Alimentación (Cables Rojo/Marrón): El servo necesita 5V para tener fuerza. El ESP32 funciona a 3.3V.
  • Señal (Cable Naranja): Aquí está la buena noticia. Aunque el servo se alimenta con 5V, su "oído" (el cable de señal) entiende perfectamente los pulsos de 3.3V que envía el ESP32. ¡No necesitas un convertidor de niveles lógicos!

Conexiones y Diagramas ⚙️

Para un micro servo SG90 pequeño (sin carga), puedes usar el pin VIN del ESP32 (si estás conectado por USB). Pero si el servo hace fuerza, se reiniciará tu placa. Lo ideal es una fuente externa.

Tabla de Conexiones (Modo Seguro)

Servomotor SG90 ESP32 / Fuente
Marrón (GND) GND (Común)
Rojo (VCC) 5V Fuente Externa (o VIN)
Naranja (Señal) GPIO 13

Nota: Si usas fuente externa, ¡no olvides unir el GND de la fuente con el GND del ESP32!

Instalación de la Librería Correcta

La librería estándar `Servo.h` de Arduino NO FUNCIONA en ESP32 porque la arquitectura de los timers es diferente.

  1. Abre Arduino IDE.
  2. Ve al Gestor de Bibliotecas.
  3. Busca "ESP32Servo".
  4. Instala la versión de Kevin Harrington.

Ejemplo 1: El Barrido Automático (Sweep)

Vamos a hacer que el servo se mueva de 0° a 180° y vuelva. Es el "Hola Mundo" de la robótica.

#include
Servo myservo; // Creamos el objeto servo
// Definimos el pin (Puede ser cualquier pin PWM capaz)

int servoPin = 13;
// Posición inicial

int pos = 0;
void setup() {

// Configuración opcional pero recomendada para evitar errores

// Asignamos los timers internos del ESP32 para generar el PWM

ESP32PWM::allocateTimer(0);

ESP32PWM::allocateTimer(1);

ESP32PWM::allocateTimer(2);

ESP32PWM::allocateTimer(3);
// Frecuencia estándar de 50Hz para servos

myservo.setPeriodHertz(50);
// Vinculamos el servo al pin 13

// Min: 500us (0 grados), Max: 2400us (180 grados)

// ¡Ajusta estos valores si tu servo no llega al tope!

myservo.attach(servoPin, 500, 2400);

}
void loop() {

// De 0 a 180 grados

for (pos = 0; pos <= 180; pos += 1) { myservo.write(pos); delay(15); // Esperamos a que llegue } // De 180 a 0 grados for (pos = 180; pos >= 0; pos -= 1) {

myservo.write(pos);

delay(15);

}

}

Explicación Clave: myservo.attach()

Fíjate que usamos myservo.attach(servoPin, 500, 2400);.
En Arduino normal solo pones el pin. En ESP32, es vital definir el ancho de pulso mínimo y máximo (en microsegundos).

  • Si tu servo hace ruido al llegar a 0° o 180° y se calienta, es que está "forzado". Cambia 500 por 550 o 2400 por 2300 para reducir el rango mecánico.

Ejemplo 2: Control Preciso con Potenciómetro 🎛️

Aquí hay un truco matemático importante.
El Arduino UNO tiene un conversor ADC de 10 bits (0 a 1023).
El ESP32 tiene un conversor ADC de 12 bits (0 a 4095).

Si usas el código de Arduino sin cambiar el `map`, el servo se volverá loco.

#include
Servo myservo;

int servoPin = 13;

int potPin = 34; // Pin analógico (ADC1)
int val = 0; // Variable para guardar la lectura
void setup() {

Serial.begin(115200);
ESP32PWM::allocateTimer(0);

ESP32PWM::allocateTimer(1);

ESP32PWM::allocateTimer(2);

ESP32PWM::allocateTimer(3);
myservo.setPeriodHertz(50);

myservo.attach(servoPin, 500, 2400);

}
void loop() {

// 1. Leemos el potenciómetro (Valor entre 0 y 4095)

val = analogRead(potPin);
// 2. Mapeamos la escala

// Convertimos de 0-4095 (entrada) a 0-180 (salida grados)

int angulo = map(val, 0, 4095, 0, 180);
// 3. Movemos el servo

myservo.write(angulo);
// Pequeño delay para estabilidad

delay(15);

}

¡Ojo con el WiFi y el ADC2!

Si usas WiFi en tu proyecto, no podrás usar los pines del ADC2 (GPIOs 0, 2, 4, 12, 13, 14, 15, 25, 26, 27) para leer sensores analógicos como el potenciómetro.
Solución: Usa siempre pines del ADC1 (GPIOs 32, 33, 34, 35, 36, 39) para tus potenciómetros.

Solución de Problemas Comunes

¿Tu servo tiene "parkinson" (tiembla)?

  • Causa #1 (Energía): El USB de la PC no da suficiente corriente. Conecta una fuente externa de 5V 2A.
  • Causa #2 (Tierra): Olvidaste conectar el GND de la fuente externa con el GND del ESP32. Sin referencia común, la señal de control es ruido puro.
  • Causa #3 (Código): Estás escribiendo en el servo demasiado rápido. Aumenta el delay() en el loop.

Conclusión

¡Control Total! 🎯

Ahora tienes el poder de mover objetos físicos desde tu código. Ya sea para abrir una cerradura inteligente, mover una cámara de vigilancia o saludar con un brazo robot.

Tu Próximo Reto:
Combina este tutorial con el de "Servidor Web con ESP32". Crea una página web con un deslizador (slider) que controle el ángulo del servo desde tu teléfono móvil. ¡Así nace la domótica!

¡Sigue construyendo!

Carlos Julián

Carlos Julián es el fundador de Ingtelecto, es Ingeniero Mecatrónico, Profesor y Programador, cuenta con una Maestria en Ciencias de la Educación, creador de contenido educativo en redes sociales. Lee más sobre mi trayectoria aquí.

Estos temas te pueden interesar

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Tu puntuación: Útil

Subir