En este tutorial, aprenderá todo lo que necesita saber sobre la funcionalidad de un servomotor.
Primero aprendemos los fundamentos teóricos de cómo funciona un servomotor.
En varios ejemplos, aprende a controlar uno o más servos con su microcontrolador Arduino, ESP8266 o ESP32.
Un servomotor es un motor eléctrico que puede controlar con precisión la posición angular, la velocidad y la aceleración. Por lo tanto, el motor utiliza un mecanismo de retroalimentación de circuito cerrado. Un servo consta de las siguientes partes:
- Un motor eléctrico (motor de corriente continua, motor asíncrono o motor síncrono)
- Un sensor para retroalimentación de posición
- Un controlador para regular el movimiento del motor de acuerdo con uno o más puntos de ajuste ajustables, como la posición angular deseada del eje o la velocidad establecida, en un bucle de control.
Los servos se utilizan en aplicaciones como robótica, máquinas CNC y diferentes áreas de la tecnología de automatización.
Descripción general del servomecanismo de circuito cerrado
Como se mencionó al comienzo de este tutorial, el servomotor utiliza un sistema de retroalimentación de circuito cerrado para controlar la posición angular, la velocidad y la aceleración. La siguiente imagen muestra el circuito cerrado.

Etapa de control y modulación PWM en lazo cerrado
La entrada para el controlador es una señal de pulso, que será proporcionada por nuestro microcontrolador en los siguientes ejemplos de este tutorial. La señal de pulso define el ajuste de posición del servo que resulta en un comando de velocidad y final a un comando de corriente que es la entrada para que el variador gire el motor en la dirección preferida.
Hay diferentes tipos de motores que se pueden usar para un servo porque el servomotor no depende del motor sino de la funcionalidad con el circuito de retroalimentación cerrado. Los motores más utilizados son desde motores de CC de imanes permanentes cepillados simples y económicos hasta motores de inducción de CA industriales.
Lazo de realimentación y potenciómetro interno
El motor está acoplado a un codificador para proporcionar retroalimentación de velocidad y posición. La retroalimentación de corriente la proporciona directamente el inversor.
En nuestro ejemplo, estamos usando un servomotor económico que solo usa retroalimentación de posición a través de un potenciómetro. Por lo tanto, el motor siempre funciona a máxima velocidad. Para aplicaciones industriales, los servomotores también tienen un circuito de retroalimentación de velocidad a través de un codificador rotatorio óptico. Estos tipos de servo son capaces de controlar la velocidad y, por tanto, alcanzar la posición deseada de forma más rápida y precisa con menos sobreimpulso.
La retroalimentación de posición para controlar el movimiento y la posición final se compara con la señal de entrada. Si hay una diferencia, se genera una señal de error. La señal de error gira el servo en la dirección preferida hasta que la señal de error es cero. Si la señal de error es cero, se alcanza la posición final y el motor se detiene.
Señal de pulso de entrada en servomecanismo de bucle cerrado
Ahora queremos controlar el servomotor con nuestro microcontrolador Arduino, ESP8266 o ESP32. Por lo tanto, la señal de pulso como entrada debe crearse desde el microcontrolador como una onda cuadrada similar a una señal PWM.
Dado que no estamos creando una señal PWM, el pin del motor digital no tiene que ser un pin PWM en su placa. Cada pin digital funcionará.
La mayoría de los servomotores, especialmente los más baratos que utilizo, no pueden girar 360 grados, pero pueden girar entre 0 y 180 grados. Con la señal PWM, el control es
- 0 grados para un ancho de pulso de 1 ms,
- 90 grados con un ancho de pulso de 1,5 ms y
- 180 grados con un ancho de pulso de 2 ms.
El tiempo total del ciclo es de 20 ms cuando se repite el PWM. La siguiente imagen muestra las tres posiciones diferentes con su pulso.

Especificaciones técnicas de servomotores para microcontroladores (SG90 y MG996R)
El servo que estoy usando es el Micro Servomotor SG90 (9 g). La siguiente tabla muestra la ficha técnica del motor.
.
| Parámetro técnico | Micro Servo SG90 (Nylon) | Servo Potencia MG996R (Metálico) | Criterio de diseño e impacto eléctrico |
|---|---|---|---|
| Tensión operativa | 4,8 V a 6,0 V DC | 4,8 V a 7,2 V DC | Nunca alimentar a 3,3 V: el motor pierde torque y la electrónica interna se descalibra. |
| Torque de bloqueo (Stall) | 1,8 kg·cm (a 4,8 V) | 9,4 a 11,0 kg·cm (a 6,0 V) | El SG90 es apto para maquetas ligeras y sensores; el MG996R para brazos robóticos y dirección. |
| Corriente en reposo (Idle) | 10 mA | 15 a 20 mA | Consumo base de la lógica interna y del comparador analógico sin movimiento mecánico. |
| Corriente en movimiento sin carga | 100 a 220 mA | 350 a 500 mA | Corriente nominal durante el desplazamiento angular continuo del rotor. |
| Corriente máxima de bloqueo (Stall) | 650 a 800 mA | 2,2 a 2,5 A | Riesgo crítico: Si el servo se frena o arranca con inercia, supera con creces el límite del puerto USB o del regulador del microcontrolador. |
| Frecuencia y período PWM | 50 Hz (período de 20 ms) | 50 Hz (período de 20 ms) | Estándar RC analógico. Requiere pulsos positivos de 1 ms (0°), 1,5 ms (90°) y 2 ms (180°). |
| Engranajes y peso | Plástico / POM (9 gramos) | Latón y acero reforzado (55 gramos) | Los engranajes de nylon del SG90 se desgastan ante sobrecargas continuadas; el MG996R resiste impactos mecánicos. |
El par de bloqueo es el par que el motor empuja contra una diferencia de la posición actual si desea hacer funcionar el motor con la mano. Con un amplio rango de voltaje operativo, el servo puede trabajar con placas Arduino (voltaje de suministro de 5 V) y placas EPS8266 (voltaje de suministro de 3,3 V).
Usaremos la biblioteca Servo en los siguientes ejemplos. Si no sabe cómo instalar una biblioteca en el IDE de Arduino, aquí hay un tutorial.
Si usamos la biblioteca Servo, la funcionalidad PWM en los pines 9 y 10 de las placas Arduino se deshabilita automáticamente.
Cómo girar un servomotor hasta 180 grados
El primer ejemplo es el más simple que puedas imaginar. Queremos rotar el motor de 0 a 180 grados con un tamaño de paso de 1 y después de una pausa de 180 grados durante un segundo, queremos rotar el motor hacia atrás a 0 grados pero con un tamaño de paso más rápido de 5.
Cableado entre el servomotor y el microcontrolador para girar el servo 180 grados
Las siguientes imágenes muestran el cableado entre el microcontrolador Arduino, ESP8266 o ESP32 y el servomotor.
Precaución eléctrica y fiabilidad en control de servomotores
- Peligro de reinicio cíclico por caída de tensión (Brownout Reset): Nunca alimentes la línea roja (VCC) de un servomotor directamente desde el pin de 5 V de una placa Arduino o ESP32. Durante el arranque o cuando el servo encuentra resistencia mecánica, la demanda de corriente instantánea (inrush current) supera los 800 mA en un micro-servo SG90 y los 2,5 A en un MG996R. Esto hace caer el carril de 5 V por debajo del umbral de reset del microcontrolador (2,7 V o 4,3 V), provocando reinicios en bucle y bloqueos de ejecución. Regla obligatoria: Utiliza siempre una fuente de alimentación independiente regulada a 5 V o 6 V para los servomotores y une las masas (GND) con el microcontrolador.
- Condensador de desacoplo electrolítico en el carril de potencia: La conmutación de las escobillas del motor DC interno del servo induce espigas inductivas de alta frecuencia y caídas bruscas de tensión. Conecta un condensador electrolítico de 470 μF a 1.000 μF (16 V) en paralelo directo entre la línea de 5 V y GND de los servomotores para absorber los picos de demanda y proteger los circuitos lógicos.
- Niveles lógicos PWM de 3,3 V frente a 5 V en ESP32 / ESP8266: Los pines GPIO de ESP32 entregan pulsos PWM de 3,3 V. La mayoría de servomotores comerciales aceptan 3,3 V como nivel ALTO válido (VIH mínimo de ~2,0 V), pero el margen de ruido se reduce drásticamente. Si utilizas cables de más de 30 cm o varios servomotores en paralelo, utiliza un desplazador de nivel lógico bidireccional (Level Shifter) o un driver I2C dedicado como el PCA9685 para regenerar los pulsos a 5 V íntegros.
- Peligro de bucle de masa y cortocircuito a tierra (PE) con el osciloscopio: Al medir la señal PWM y la tensión de alimentación de los servos con un osciloscopio de sobremesa con chasis puesto a tierra de protección (PE), conecta la pinza de cocodrilo de masa exclusivamente al carril GND de referencia común. Si la fuente externa de los servos no tiene aislamiento galvánico o está conectada a tierra por otro camino, conectar la pinza de masa a la línea positiva o de control provocará un cortocircuito destructivo.
La potencia del servomotor es el pin de 5V para placas Arduino o el pin de 3.3V para placas ESP8266 o ESP32. Si alimenta las placas del microcontrolador a través de USB, también puede utilizar la salida de 5 V de las placas ESP8266 o ESP32.
Para controlar el servomotor usamos un pin de E / S digital como 9 (Arduino), D7 (ESP8266) o 4 (ESP32). Puede usar cualquier otro pin digital en su microcontrolador, pero también debe modificar el script del programa.
Arduino Nano

Para obtener más información sobre Arduino Nano, visite el tutorial de Arduino Nano.
Arduino Pro Mini

Arduino Uno

Para obtener más información sobre Arduino Uno, visite el tutorial de Arduino Uno.
Arduino Mega

Para obtener más información sobre Arduino Mega, visite Arduino Nano Mega.
ESP32 NodeMCU

ESP8266 NodeMCU

ESP8266 WeMos D1 Mini

Código de programa para girar el servo 180 grados
Después de realizar el cableado entre el microcontrolador y el servomotor, creamos el script Arduino que avanza el servomotor a un grado de 180 y lo devuelve a 0 grados. Describo en detalle el script escrito para las placas de microcontroladores Arduino, ESP8266 y ESP32.
#include "Servo.h"
int servo_pin = 9; // for Arduino microcontroller
//int servo_pin = D7; // for ESP8266 microcontroller
//int servo_pin = 4; // for ESP32 microcontroller
Servo myservo;
int angle = 0;
void setup()
{
myservo.attach(servo_pin);
}
void loop()
{ // move from 0 to 180 degrees with a positive angle of 1
for(angle = 0; angle < 180; angle += 1)
{
myservo.write(angle);
delay(15);
}
delay(1000);
// move from 180 to 0 degrees with a negative angle of 5
for(angle = 180; angle>=1; angle-=5)
{
myservo.write(angle);
delay(5);
}
delay(1000);
}
Al comienzo del script, incluimos la biblioteca Servo que facilita mucho la operación del servo.
A continuación, necesitamos definir el pin de E / S digital que conecta el microcontrolador al servomotor. Debido a que el pin utilizado depende del microcontrolador, creé un total de 3 líneas de código que corresponden a las imágenes de cableado anteriores. Depende de tu microcontrolador debes comentar 2 líneas y descomentar la línea de código que corresponde a tu microcontrolador.
Ahora podemos inicializar un objeto servo de la biblioteca de servos incluida anteriormente.
Nuestro objetivo es rotar el servo hasta cierto punto en cada bucle del código del programa. Por lo tanto, necesitamos una variable para almacenar el ángulo actual del motor. El valor inicial del ángulo es 0.
En la función de configuración, usamos la función adjuntar objeto de servo para decirle al objeto que el servomotor está conectado al husillo del servo.
En la función de bucle, necesitamos dos bucles para girar el motor de 0 grados a 180 grados y una segunda función que devuelve el motor a 0 grados pero con otra velocidad.
Por lo tanto, en cada bucle for, usamos la función de escritura del objeto myservo para establecer el ángulo absoluto que debe girar el servo. Este ángulo puede ser positivo y también negativo.
En el primer ciclo for, aumentamos el ángulo de cada ciclo en +1 y usamos un retardo de 15 milisegundos. Por lo tanto, el motor funciona con relativa lentitud.
En la función del segundo bucle, donde queremos que el servo vuelva a 0 grados, disminuimos el ángulo en cada bucle en 5 y usamos un retraso de 5 milisegundos. El motor gira más rápido de 180 grados a 0 grados.
Al final del script, esperamos 1 segundo y volvemos a iniciar la función de bucle.
El siguiente video muestra el script Arduino en acción con un Arduino Uno como ejemplo.
Control del servomotor con potenciómetro analógico
En el segundo ejemplo, queremos usar un potenciómetro para ajustar el servomotor a un ángulo específico. Por lo tanto, leemos el valor del potenciómetro que está entre 0 y 1023, reescalamos el valor entre 0 y 180 para mover el motor entre 0 y 180 grados.
Cableado entre servomotor, microcontrolador y potenciómetro
La siguiente imagen muestra el cableado entre la placa del microcontrolador Arduino, EPS8266 o ESP32, el servomotor y el potenciómetro.
El cableado se basa en el primer cableado donde solo usamos el servomotor y el microcontrolador. Ahora necesitamos agregar la conexión para el potenciómetro. Usamos los mismos pines para la alimentación y necesitamos usar un pin analógico para leer el valor analógico actual del potenciómetro.
Arduino Nano

Para obtener más información sobre Arduino Nano, visite el tutorial de Arduino Nano.
Arduino Pro Mini

Arduino Uno

Para obtener más información sobre Arduino Uno, visite el tutorial de Arduino Uno.
Arduino Mega

Para obtener más información sobre Arduino Mega, visite el tutorial de Arduino Mega.
ESP32 NodeMCU

ESP8266 NodeMCU

ESP8266 WeMos D1 Mini

Código de programa para configurar el servomotor en un ángulo específico
La siguiente sección muestra y explica el código del programa Arduino para los microcontroladores Arduino, ESP8266 y ESP32 para configurar el servomotor en un ángulo específico con la entrada de un potenciómetro.
#include "Servo.h"
// for Arduino microcontroller
int servo_pin = 9;
int potpin = 0;
// for ESP8266 microcontroller
//int servo_pin = D7;
//int potpin = A0;
// for ESP32 microcontroller
//int servo_pin = 4;
//int potpin = 0;
Servo myservo;
int val;
void setup() {
myservo.attach(servo_pin);
}
void loop() {
val = analogRead(potpin);
val = map(val, 0, 1023, 0, 180);
myservo.write(val);
delay(15);
}
La primera parte del script de Arduino es muy similar a la anterior. Primero necesitamos incluir la biblioteca de servos y definir los pines que conectan la placa del microcontrolador al servo. Debido a que tenemos otro componente conectado en este ejemplo, también necesitamos configurar el pin analógico que conecta el potenciómetro y la placa Arduino, ESP8266 o ESP32.
Si no sabe qué pines de la placa del microcontrolador Arduino, ESP8266 o ESP32 se pueden usar para conectar diferentes componentes eléctricos, puedo recomendar el libro electrónico de la hoja de datos del microcontrolador.
Después de inicializar un objeto servo, creamos una variable para almacenar el valor del potenciómetro entre 0 y 1023.
La función de configuración sigue siendo la misma, basta con indicar al objeto servo a qué cabezal está conectado el motor.
En la función de lazo leemos el valor analógico del potenciómetro y asociamos el rango de valores del potenciómetro (0… 1023) con el rango de valores del servo (0… 180). Después del mapeo de valores, configuramos el ángulo del servo al valor del potenciómetro mapeado con la función de escritura e incluimos un breve retraso de 15 milisegundos para asegurarnos de que el servo pueda girar a la posición deseada.
El siguiente video muestra cómo gira el servo, controlado por el potenciómetro.
Conexión de múltiples servomotores con driver PCA9685
Precaución de potencia y corriente máxima en el bloque de bornes del PCA9685
Al conectar múltiples servomotores al módulo PCA9685, la demanda de corriente puede sobrepasar fácilmente los límites de seguridad de un montaje de protoboard:
- Demanda de corriente masiva en paralelo: mover de 8 a 16 servomotores simultáneamente (por ejemplo en un brazo robótico o robot hexápodo) genera picos de corriente combinada de 10 A a más de 25 A durante aceleraciones o bloqueos mecánicos.
- Peligro de sobrecalentamiento y fusión de cables Dupont: los cables finos para placa de pruebas solo soportan hasta 1 A continuo. Intentar alimentar los servos del PCA9685 a través de pines de la protoboard o desde el pin de 5 V del microcontrolador provocará la fundición del aislamiento de los cables y la destrucción inmediata del regulador lineal integrado en la placa.
- Conexionado de potencia seguro: alimenta siempre los motores a través del bloque de bornes de tornillo (clema verde
V+ / GND) con cables de calibre mínimo de 18 AWG (1 mm²) conectados a una fuente conmutada externa de 5 V o 6 V de al menos 10 A. Mantén unida la masa (GND) con el microcontrolador para fijar el nivel de referencia del bus I2C.
Por supuesto, es posible conectar varios servos a su microcontrolador y el Arduino Mega tiene muchos pines. Pero hay una forma más inteligente de conectar múltiples servos a su Arduino o NodeMCU usando la conexión I2C. Si desea saber más sobre la conexión I2C, encontrará una guía completa en este artículo.
Servocontrolador de 16 canales PCA9685
Para conectar varios servomotores a través de I2C, utilizamos el servomotor de 16 canales PCA9685 que utiliza un controlador PWM integrado para controlar los 16 canales al mismo tiempo. Además, puede conectar varios servomotores PCA9685 de 16 canales en una cadena de hasta 62 controladores. Por lo tanto, podemos controlar hasta 992 servos con los 2 pines I2C.

La conexión entre el PCA9685 y el microcontrolador es simple y se muestra en la siguiente tabla, así como en el esquema de fritzing.
. . . . .
| Pin PCA9685 | Función eléctrica | Conexión Arduino Uno / Nano | Conexión ESP32 (3.3V) | Conexión ESP8266 (D1 / NodeMCU) |
|---|---|---|---|---|
| GND | Masa lógica y referencia común de 0 V | Pin GND | Pin GND | Pin GND |
| VCC | Alimentación del chip I2C (3,0 V a 5,5 V) | Pin 5V | Pin 3V3 | Pin 3V3 |
| V+ (Bornera) | Alimentación de potencia para servomotores (5 V a 6 V DC externa) | Fuente externa 5V-6V (GND unido) | Fuente externa 5V-6V (GND unido) | Fuente externa 5V-6V (GND unido) |
| SDA | Línea de datos serie del bus I2C | Pin A4 / SDA | GPIO 21 (SDA nativo) | Pin D2 (GPIO 4) |
| SCL | Línea de reloj del bus I2C | Pin A5 / SCL | GPIO 22 (SCL nativo) | Pin D1 (GPIO 5) |
| OE | Output Enable (activo en BAJO). Opcional | Sin conectar (pull-down interno) | Sin conectar | Sin conectar |
Si no está familiarizado con los pines SCL y SDA de su microcontrolador, encontrará los pines para cada placa en los siguientes artículos: Arduino Nano, Arduino Uno, Arduino Mega, ESP8266, ESP32 o mejor en el libro de jugadas de la hoja de datos del microcontrolador.
Los 16 puertos de salida (V +, GND y PWM) se pueden utilizar para conectar servos o LED. Todas las salidas usan la misma frecuencia PWM que puede ser de 1 kHz para LED y 60 Hz para servos. La corriente máxima por pin es de 25 mA. Si solo usa ciertos servos como hasta cinco, puede alimentarlos desde su microcontrolador. Pero si desea utilizar más motores, recomendaría alimentar los servos con el terminal de 2 pines y una fuente de alimentación externa. En la lista de piezas encontrará algunas buenas opciones para una fuente de alimentación externa.
Cableado entre el PCA9685 y el microcontrolador
Las siguientes imágenes muestran el cableado cuando no estamos usando una fuente de alimentación externa para la placa PCA9685.
Arduino Nano

Para obtener más información sobre Arduino Nano, visite el tutorial de Arduino Nano.
Arduino Pro Mini

Arduino Uno

Para obtener más información sobre Arduino Uno, visite el tutorial de Arduino Uno.
Arduino Mega

Para obtener más información sobre Arduino Mega, visite el tutorial de Arduino Mega.
ESP32 NodeMCU

ESP8266 NodeMCU

ESP8266 WeMos D1 Mini

Y si queremos utilizar muchos servomotores y por tanto necesitamos una fuente de alimentación externa, tenemos que desconectar la conexión entre V + y el microcontrolador y por tanto conectar el PCA9685 a una fuente de alimentación externa entre 5V y 12V.
Arduino Nano

Para obtener más información sobre Arduino Nano, visite el tutorial de Arduino Nano.
Arduino Pro Mini

Arduino Uno

Para obtener más información sobre Arduino Uno, visite el tutorial de Arduino Uno.
Arduino Mega

Para obtener más información sobre Arduino Mega, visite el tutorial de Arduino Mega.
ESP32 NodeMCU

ESP8266 NodeMCU

ESP8266 WeMos D1 Mini

Cómo parametrizar un servomotor
Antes de que podamos comenzar con el ejemplo en sí, debemos configurar nuestros servomotores para encontrar la posición exacta en 0 y 180 grados, cuando el motor está controlado por el PCA9685. Por lo tanto, utilizamos el boceto del primer ejemplo y debemos recordar la posición exacta del sujetador de plástico en el motor.
Ahora debemos encontrar los valores óptimos para dos parámetros: MIN_PULSE_WIDTH y MAX_PULSE_WIDTH para establecer la posición del servo en 0 grados y 180 grados. La siguiente imagen muestra el resultado deseado. He descubierto que para el Micro Servomotor SG90 (9 g) los parámetros son los siguientes:
- MIN_PULSE_WIDTH = 600
- MAX_PULSE_WIDTH = 2600

Debido a que estos valores dependen de sus servos individuales, ahora necesitamos encontrar los valores óptimos para sus servos.
Encuentre el valor de MIN_PULSE_WIDTH
Usamos parte del futuro boceto completo para permitir que el motor se estabilice en 0 grados. Utilice el siguiente esquema y cambie los valores de MIN_PULSE_WIDTH hasta alcanzar la posición deseada. Tal vez sobrepase la posición y luego deba cambiar la configuración nuevamente.
El script de Arduino puede sonar un poco complicado pero explico todo en detalle. Además, la mayoría de los siguientes scripts son reutilizables para nosotros para el ejemplo real.
#include "Wire.h"
#include "Adafruit_PWMServoDriver.h"
Adafruit_PWMServoDriver pwm = Adafruit_PWMServoDriver(0x40);
#define MIN_PULSE_WIDTH 600
#define MAX_PULSE_WIDTH 2600
#define FREQUENCY 50
void setup() {
pwm.begin();
pwm.setPWMFreq(FREQUENCY);
// find MIN_PULSE_WIDTH: set angle to 0
// find MAX_PULSE_WIDTH: set angle to 180
pwm.setPWM(0,0,pulseWidth(0)); // 0 or 180
}
int pulseWidth(int angle) {
int pulse_wide, analog_value;
pulse_wide = map(angle, 0, 180, MIN_PULSE_WIDTH, MAX_PULSE_WIDTH);
analog_value = int(float(pulse_wide) / 1000000 * FREQUENCY * 4096);
return analog_value;
}
void loop() {
}
Para controlar el PCA9685, usamos la biblioteca Adafruit_PWMServoDriver. Si no sabe cómo instalar una biblioteca, encontrará un tutorial aquí.
Primero incluimos las bibliotecas Wire.h para usar la comunicación I2C y Adafruit_PWMServoDriver para administrar la placa de servo de 16 canales CA9685. A continuación, creamos un objeto ServoDriver llamado pwm con la correspondiente dirección I2C HEX, es decir, en mi caso 0x40. Para encontrar la dirección I2C HEX correcta, puede utilizar el escáner de código I2C HEX en este artículo.
A continuación, definimos nuestras variables. En este paso, debe modificar los parámetros MIN_PULSE_WIDTH y establecer el parámetro MAX_PULSE_WIDTH en un valor fijo. Casi todos los servos utilizan una frecuencia de 50 Hz. Puede encontrar esta información en la hoja de datos de su motor.
En la función de configuración, el objeto PWM que creamos anteriormente se activa con la frecuencia de 50 Hz. También controlamos el servomotor con la función setPWM del objeto pwm. La función contiene 3 argumentos:
- En qué posición del PCA9685 está conectado el servo. Los números están impresos en la pizarra comenzando del 0 al 15.
- Constante 0
- Función para especificar el ángulo: PulseWidth (ángulo) donde el ángulo puede estar entre 0 y 180.
- Para encontrar el valor óptimo de MIN_PULSE_WIDTH, establezca el ángulo en 0
- Para encontrar el valor óptimo de MAX_PULSE_WIDTH, establezca el ángulo en 180
Debido a que solo queremos configurar el servomotor, necesitamos esta iteración de la función de configuración y necesitamos cambiar el valor de MIN_PULSE_WIDTH para obtener la posición de 0 grados. Por lo tanto, no necesitamos una función de bucle.
Ahora creamos la función pulseWidth para calcular el valor analógico del motor en función del ángulo deseado. Primero, el pulso con se calcula entre 0 grados y 180 grados según el ancho de pulso mínimo y máximo con la función de mapa. Luego, el valor del servo analógico se calcula dividiendo el ancho del pulso por 1,000,000 para convertir el valor a nosotros por segundo y multiplicarlo por la frecuencia y 4096 para una resolución de 12 bits. Al final de esta función, se devuelve este valor analógico.
Encuentre el valor de MAX_PULSE_WIDTH
Si encontró el valor correcto para MIN_PULSE_WIDTH, hacemos lo mismo con MAX_PULSE_WIDTH para encontrar la posición del motor 180 grados. Usamos el mismo código de programa y cambiamos el valor de MAX_PULSE_WIDTH hasta encontrar la posición de 180 grados. También debe cambiar el valor del ángulo en la función setPWM a 180. Debe establecerse el valor de MIN_PULSE_WIDTH.
Cómo controlar varios servomotores con el PCA9685
En este ejemplo, queremos utilizar 3 servomotores al mismo tiempo. La secuencia de comandos no tiene un uso práctico directo, pero muestra cómo controlar varios servos en una secuencia de comandos a través de la conexión I2C.
#include "Wire.h"
#include "Adafruit_PWMServoDriver.h"
Adafruit_PWMServoDriver pwm = Adafruit_PWMServoDriver(0x40);
#define MIN_PULSE_WIDTH 600
#define MAX_PULSE_WIDTH 2600
#define FREQUENCY 50
void setup() {
pwm.begin();
pwm.setPWMFreq(FREQUENCY);
}
int pulseWidth(int angle) {
int pulse_wide, analog_value;
pulse_wide = map(angle, 0, 180, MIN_PULSE_WIDTH, MAX_PULSE_WIDTH);
analog_value = int(float(pulse_wide) / 1000000 * FREQUENCY * 4096);
return analog_value;
}
void loop() {
pwm.setPWM(0, 0, pulseWidth(0));
pwm.setPWM(1, 0, pulseWidth(180));
delay(1000);
pwm.setPWM(4, 0, pulseWidth(0));
delay(1000);
pwm.setPWM(0, 0, pulseWidth(180));
pwm.setPWM(1, 0, pulseWidth(90));
delay(500);
pwm.setPWM(4, 0, pulseWidth(180));
delay(1000);
pwm.setPWM(0, 0, pulseWidth(90));
pwm.setPWM(1, 0, pulseWidth(0));
delay(1000);
}
Debido a que ya conocemos la mayor parte del script por la parametrización, me centraré en los cambios que hicimos para este ejemplo.
La primera parte del script donde incluimos las bibliotecas, creamos el objeto pwm y establecemos las variables es la misma. MIN_PULSE_WIDTH y MAX_PULSE_WIDTH son los valores de la parametrización.
En la función de configuración, no usamos la función setPWM para hacer funcionar el motor. Esto se hace en la función de bucle, donde giramos los servomotores bajo diferentes ángulos con el argumento de la función pulseWidth.
Para diferenciar los servos, cambiamos el primer argumento de la función setPWM a un pin de conexión en la placa PCA9685. En mi caso, tengo un servo conectado a los pines 0, 1 y 4.
La función pulseWidth es la misma que la configuración del parámetro.
El siguiente video muestra el ejemplo en acción para Arduino Uno y ESP8266 NodeMCU.
Cómo utilizar varios PCA9685 en una cadena
Como se dijo anteriormente, es posible conectar varios PCA9685 en una cadena para conectar hasta 992 servos con los 2 pines I2C de su microcontrolador.
El siguiente esquema muestra cómo conectar varias tarjetas PCA9685.

Puede usar el diagrama del ejemplo anterior y solo necesita cambiar la dirección hexadecimal y crear tantos objetos ServoDriver como conecte las tarjetas PCA9685. Los objetos se pueden llamar pwm1, pwm2, etc. con la dirección individual I2C HEX. Como se mencionó anteriormente, puede usar el escáner de código I2C HEX en este artículo para encontrar las direcciones correctas.
Conclusión
En este tutorial, hemos aprendido mucho sobre servomotores. Primero analizamos la teoría sobre los servos y la funcionalidad. En la segunda parte del tutorial, llegamos a los ejemplos prácticos y comenzamos con algunos ejemplos básicos para cambiar a motor hasta 180 grados y volver a 0 grados. También logramos rotar el servo según la posición de un potenciómetro. Después del ejemplo simple, aprendimos cómo controlar múltiples servos con el PCA9685 y cómo conectar múltiples placas PCA9685.
Si tiene alguna pregunta sobre la funcionalidad del servomotor o cualquier ejemplo en este tutorial, use la sección de comentarios a continuación para hacer preguntas para que pueda responderlas directamente.
Diagnóstico y verificación de señales de servomotores con osciloscopio
La depuración de servomotores mediante simples instrucciones de código suele generar confusión: movimientos erráticos, temblores en reposo (chattering), calentamiento excesivo o microcontroladores que se reinician misteriosamente. El osciloscopio es el instrumento de banco imprescindible para diagnosticar la integridad del tren de pulsos y la estabilidad de la alimentación:
1. Verificación del período PWM y calibración del ancho de pulso
Un servomotor analógico estándar opera a una frecuencia de refresco de 50 Hz, lo que equivale a un período constante de T = 1 / 50 = 20 ext{ms . Al conectar la sonda del osciloscopio a la línea de señal PWM (cable naranja o amarillo):
- Comprobación de la base temporal: Ajusta la base de tiempos a 2 ms/div o 5 ms/div para observar la repetición de pulsos cada 20 ms. Si la frecuencia cae por debajo de 40 Hz o sube por encima de 60 Hz (frecuente en temporizadores por software mal configurados), el servomotor perderá par de retención o entrará en resonancia.
- Medición del ancho de pulso activo (Pulse Width): Con los cursores de tiempo del osciloscopio, mide la duración exacta del pulso en nivel ALTO:
- Posición 0° (Mínimo): 1,0 ms (1.000 μs). En modelos reales el tope puede variar entre 500 μs y 900 μs.
- Posición 90° (Centro / Neutro): Exactamente 1,5 ms (1.500 μs).
- Posición 180° (Máximo): 2,0 ms (2.000 μs). Puede extenderse hasta 2.400 μs según el fabricante.
- Detección de colisión contra topes mecánicos: Si el software envía pulsos de 400 μs o 2.600 μs que exceden el recorrido físico del potenciómetro interno, el motor forzará el engranaje continuamente contra el tope mecánico sin poder alcanzar la posición de equilibrio. Con el osciloscopio puedes calibrar visualmente los valores exactos de
minPulseymaxPulsede tu biblioteca para evitar que el servo se queme por corriente de bloqueo continua.
2. Detección de fluctuación temporal (Jitter) y conflictos de interrupciones
Uno de los problemas más comunes en proyectos de robótica es el temblor o zumbido permanente del servomotor cuando teóricamente debería estar inmóvil en una posición fija:
- Jitter por interrupciones en Arduino (Servo.h): En placas Arduino Uno y Nano, la librería estándar
Servo.hutiliza el Timer 1 para generar la señal por software. Si tu programa utiliza comunicación serie intensa (Serial.print), librerías de tiras LED NeoPixel (WS2812B) o protocolos de radiofrecuencia (SoftwareSerial, IRremote), las rutinas de interrupción (ISR) bloquean temporalmente el temporizador, provocando fluctuaciones de 20 a 50 μs en el ancho del pulso PWM. En la pantalla del osciloscopio, activando la persistencia de pantalla (Infinite Persistence), observarás cómo el flanco descendente oscila visiblemente hacia adelante y atrás, lo que se traduce directamente en vibraciones mecánicas del brazo del servo. - Estabilidad en ESP32 mediante módulos hardware (LEDC / MCPWM): En ESP32 y ESP8266, el stack de radio Wi-Fi genera interrupciones constantes que inutilizan cualquier generación PWM por software. Con el osciloscopio se puede validar la perfecta estabilidad temporal de los módulos de hardware dedicados (MCPWM o LEDC), cuyos generadores por hardware producen pulsos con un jitter inferior a 100 ns independientemente del tráfico de red.
3. Correlación de caída de tensión en el carril de 5 V con doble canal
Para diagnosticar por qué un microcontrolador se bloquea o pierde la conexión Wi-Fi al mover los servos, utiliza dos canales simultáneos en el osciloscopio:
- Canal 1 (Amarillo): Conectado a la señal PWM de control, con trigger en flanco de subida para sincronizar el inicio del movimiento.
- Canal 2 (Azul): Conectado al carril de alimentación de 5 V que alimenta a los servos y a la placa, con acoplamiento en AC y escala vertical de 200 mV/div o 500 mV/div.
- Interpretación diagnóstica: En el instante exacto en que el pulso PWM cambia de ancho y el rotor acelera, observarás una caída pronunciada de tensión (sag / droop) en el Canal 2. Si la caída supera los 800 mV, confirmará que la fuente de alimentación es insuficiente o que falta desacoplo capacitivo, diagnosticando con total certeza el origen de los reinicios espontáneos del microcontrolador.
Para depurar servomotores, calibrar drivers I2C PCA9685 y monitorizar señales PWM y carriles de alimentación en laboratorio, estos son los 4 osciloscopios de referencia recomendados para banco de trabajo:
| Modelo recomendado | Formato / Arquitectura | Ancho de banda / Muestreo | Canales y Memoria | Función clave para Servomotores y Control PWM | Oferta |
|---|---|---|---|---|---|
| Sobremesa digital laboratorio | 50 MHz (ampliable) / 1 GSa/s | 4 canales / 24 Mpts | 4 canales simultáneos para correlacionar señal de control PWM, línea de alimentación de 5 V, corriente del motor y bus I2C del PCA9685 | VER MEJOR PRECIO | |
| Sobremesa con tecnología SPO (Super Fósforo) | 200 MHz / 1 GSa/s | 2 canales / 14 Mpts | Medición de jitter y estabilidad temporal con persistencia de color para detectar micro-temblores en el ancho de pulso PWM | VER MEJOR PRECIO | |
| Módulo USB con aislamiento galvánico de hardware | 25 MHz / 100 MSa/s | 2 canales / 5 Kpts | Aislamiento de hardware de hasta 400 Vpk que protege los puertos USB del ordenador frente a espigas inductivas generadas por servomotores | VER MEJOR PRECIO | |
| Sobremesa de banco clásico | 100 MHz / 1 GSa/s | 2 canales / 40 Kpts | Pantalla panorámica de 7 pulgadas y disparo por ancho de pulso para verificar tiempos de 1,0 ms a 2,0 ms a bajo coste | VER MEJOR PRECIO |
Si buscas el instrumento más versátil para depurar sistemas embebidos, sensores y actuadores con 4 canales de laboratorio y memoria profunda:
Para profundizar en técnicas de control, temporización y medición de buses y microcontroladores, consulta nuestras guías especializadas: Cómo elegir un osciloscopio para proyectos con Arduino y ESP32, Osciloscopio con Arduino, Arduino Uno Pinout y señales PWM, Diagnóstico de buses I2C y SPI y nuestra comparativa de osciloscopios digitales, osciloscopios portátiles y osciloscopios USB.
Preguntas frecuentes sobre vibraciones y fallos en servomotores
¿Por qué el servomotor tiembla sin parar o hace que el Arduino se reinicie al moverse?
Incluso un micro-servo SG90 puede demandar picos de arranque de 500 a 700 mA, y un servo metálico MG996R supera los 1,5 A a 2,2 A bajo carga. El puerto USB de un ordenador o el regulador de 5 V del Arduino solo entregan ~500 mA; al caer la tensión por debajo de 4 V el microcontrolador se reinicia. Usa una fuente externa de 5 V dedicada para los servos y recuerda unir ambos cables GND (masa común).
¿Por qué dejan de funcionar las salidas PWM en los pines 9 y 10 de Arduino Uno al usar Servo.h?
En placas con microcontrolador ATmega328P (Arduino Uno, Nano y Pro Mini), la librería estándar Servo.h toma el control exclusivo del temporizador interno de 16 bits Timer1 para generar los pulsos de 20 ms, lo que desactiva la función analogWrite() en los pines asociados a ese timer (D9 y D10).
El servo sg90 no abarca los 180′ como mucho 160′ y eso es lo q no entiendo, en esfuerzo tampoco llega a los valores dados.
Hola me gustaria saber como contolar la velocidad de giro del servo cuando cambia de posición angular
saludos