Un servomotor (también conocido simplemente como servo), es un dispositivo electromecánico que se utiliza para controlar la posición angular de un eje específico a un ángulo específico
A diferencia de los motores convencionales, los servos son dispositivos de lazo cerrado. Es decir contienen sensores y circuitos internos para recibir señales de control y ajustar su posición al ángulo que le indicamos.
Los servos son ampliamente utilizados en proyectos de robótica, impresoras 3D, vehículos teledirigidos, brazos robóticos y otros sistemas donde se requiere un control de movimiento preciso.
Utilizar un servo en el ESP32 con el IDE de Arduino es algo más complicado que con un Arduino convencional, por que el Core del ESP32 para Arduino no incluye una versión de la librería Servo.
Si necesitáis más información sobre qué es y cómo controlar un servo, echad un ojo a estas entradas:
Conexión del servo al ESP32
Antes de comenzar a controlar un servo con el ESP32, debemos conectarlo correctamente. Un servo típico tiene tres cables: uno para la alimentación (VCC), otro para la tierra (GND) y uno para el control de la señal (señal).
Aquí está la configuración de los pines del servo:
- Cable rojo (VCC): Conectar a un pin de 5V del ESP32 o a una fuente de alimentación externa de 5V.
- Cable marrón o negro (GND): Conectar a un pin GND del ESP32.
- Cable amarillo o blanco (señal): Conectar a uno de los pines GPIO del ESP32.
Salvo en el caso de servos muy muy pequeños, no debéis alimentar el Servo desde el ESP32. Es más incluso en servos muy pequeños, siempre es mejor si lo alimentáis desde otra fuente.
Biblioteca Servo para el ESP32
Como decíamos, a diferencia de un Arduino “convencional”, el Core del ESP32 no incluye una librería nativa para controlar servos.
En su lugar, tendremos que descargar una. Afortunadamente, la comunidad ha desarrollado varias librerías. Por ejemplo, a mi me gusta esta GitHub - madhephaestus/ESP32Servo: Arduino-compatible servo library for the ESP32
Esta también es muy conocida. Aunque a mi me gusta menos porque tiene menor compatibilidad con las variantes del ESP32 GitHub - RoboticsBrno/ServoESP32: Generate RC servo signal
En cualquier caso, estar atentos a la compatibilidad con vuestro modelo de ESP32, porque no todas las librerías son compatibles con todos los modelos.
Ambas librerías tienen sus peculiaridades y funciones adicionales. Consultar su documentación si queréis profundizar en ellas
Cómo usar un Servo con un ESP32
Incluir la biblioteca Servo
Para comenzar, debemos incluir la biblioteca Servo en nuestro programa. Dependiendo de vuestra librería, deberéis añadir una de las siguientes líneas al comienzo de tu código:
// para la librermadhephaestus
#include <ESP32Servo.h>
// para la libreria RoboticsBrno
#include <Servo.h>
A partir de aquí, el uso del servo debería ser igual a lo que estamos acostumbrados. Ante la duda, consultad la documentación y los ejemplos de la librería que estéis usando.
Crear un objeto Servo
Después de incluir la biblioteca que hayáis decidido, crea un objeto Servo para interactuar con el servo. Esto se hace mediante la siguiente línea de código:
Servo miServo;
Que funciona con ambas librerías que os he recomendado.
Configurar el pin del servo
Antes de comenzar a usar el servo, necesitamos decirle a la biblioteca Servo en qué pin está conectado. Utiliza la función attach()
para hacerlo:
const int pinServo = 18; // Pin GPIO al que está conectado el servo
void setup()
{
miServo.attach(pinServo);
}
Controlar el servo
Una vez que hayas configurado el pin, puedes controlar el servo utilizando la función write()
. El valor que se pasa como argumento a write()
representa el ángulo al que deseas que se mueva el servo. Por ejemplo, un valor de 0 grados moverá el servo a su posición más a la izquierda, mientras que un valor de 180 grados lo moverá a su posición más a la derecha.
void loop()
{
miServo.write(0); // Mover el servo a 0 grados
delay(1000); // Esperar 1 segundo
miServo.write(90); // Mover el servo a 90 grados
delay(1000); // Esperar 1 segundo
miServo.write(180); // Mover el servo a 180 grados
delay(1000); // Esperar 1 segundo
}
En este ejemplo, el servo se mueve a las posiciones de 0, 90 y 180 grados con un intervalo de 1 segundo entre cada movimiento.