01 · Punto de partida
Qué entendemos por servomotor
En los temas anteriores manejamos motores DC con drivers y motores paso a paso con secuencias. Un servo incorpora un sistema de realimentación para regular una variable, habitualmente posición o velocidad.
En este tema nos concentraremos en el servo de posición de tipo RC o educativo, con una interfaz habitual de tres cables. No todos los servos industriales ni todos los modelos comerciales usan esa interfaz.
La ventaja práctica es pedir una referencia sin generar desde cero el control del motor. Los límites siguen existiendo: carga, velocidad, temperatura, holgura y respuesta ante fallos requieren verificación.
02 · Un controlador dentro de otro
El lazo interno de posición
El servo interpreta la referencia, mide su eje mediante un sensor y gobierna el motor para reducir el error. La transmisión adapta velocidad y torque. Bajo una carga admisible puede seguir corrigiendo aunque el programa principal no actualice el objetivo.
El lazo interno no significa que nuestro programa conozca el ángulo real. En muchos servos de tres cables la señal solo lleva órdenes. Hay modelos con realimentación externa o comunicación bidireccional, pero hay que elegirlos y leer su protocolo.
Si la carga supera la capacidad, el servo puede quedar fuera de posición y consumir mucho. Repetir la misma orden no elimina la sobrecarga.
03 · Identificar la función
Posición y rotación continua
| Tipo | Qué suele pedir la señal | Qué verificar |
|---|---|---|
| Servo de posición de recorrido limitado | Posición dentro de su intervalo | Rango, sentido, torque y límites de pulso |
| Servo de rotación continua | Sentido y nivel aproximado de velocidad alrededor de un neutro | Neutro real, banda de parada y respuesta bajo carga |
| Servo con bus o realimentación adicional | Posición, velocidad u otros modos según protocolo | Telemetría, configuración e interpretación de cada dato |
En un modelo continuo, un pulso de neutro puede solicitar que se detenga; no ordena necesariamente «ir a 90°». Cambiar la duración no permite fijar un ángulo absoluto salvo que el sistema tenga otra medición y control apropiados.
«Digital» y «analógico» pueden describir la electrónica interna de un servo RC. No indican por sí solos que el conector entregue posición digital ni que el programa reciba una confirmación.
04 · Duración de pulso
Señal de control por pulsos
Una interfaz RC habitual recibe pulsos altos de aproximadamente 1–2 ms repetidos cerca de cada 20 ms. Son referencias comunes, no límites universales. La duración admitida, frecuencia y niveles eléctricos se comprueban en el modelo.
En un servo de posición, la información principal se codifica en el ancho del pulso. Una referencia de centro suele estar cerca de 1500 µs. El artículo de Pololu sobre la interfaz de control de servos distingue amplitud, ancho y período.
Pulso de 1500 µs en 20 ms → ciclo de trabajo de 7,5 %
No es el mismo uso de PWM que en el tema 13. Allí variábamos tiempos de potencia del motor. Aquí mandamos una referencia a un controlador que decide internamente cómo alimentar su motor.
Si el período cambia a 25 ms y el pulso sigue en 1500 µs, el ciclo pasa a 6 %. En un modelo que acepte ambos períodos, el ancho conserva la misma referencia. No deduzcas que cambiar de 50 a 100 Hz es admisible ni que duplica la velocidad del eje.
05 · Definir coordenadas útiles
Rango y calibración
No supongas que 1000–2000 µs representa siempre 0–180°. Como ejemplo concreto, la ficha del HD-1160A declara 90° de recorrido entre esos anchos, centro de 1500 µs y otros límites para un recorrido mayor.
Para un mecanismo calibrado, podés relacionar dos referencias mediante una aproximación lineal:
Si 1000 µs corresponde a −45° y 2000 µs a +45°, el centro es 0° a 1500 µs. Para +30° resultan aproximadamente 1833 µs. La referencia cero pertenece a nuestra calibración del mecanismo, no a una propiedad universal de la biblioteca.
Separá rango eléctrico admitido, recorrido del eje y límites de la carga montada. Un servo puede aceptar una orden que empuje el brazo contra la estructura del robot. Definí límites de software dentro de una zona verificada.
06 · Capacidad mecánica
Torque, velocidad y carga
El torque depende de la fuerza y su brazo perpendicular. Para una masa m en un brazo horizontal de longitud r, τ = m · g · r. Con 0,2 kg a 10 cm se necesitan 0,196 N·m solo para esa carga.
Hay que sumar brazo, pinza y otras piezas. Un brazo uniforme de 0,1 kg y 10 cm agrega unos 0,049 N·m al estar horizontal. La demanda estática total llega a 0,245 N·m, antes de aceleración y otras pérdidas.
Las fichas suelen anunciar torque de bloqueo en kgf·cm y velocidad sin carga en segundos por 60°. No son un punto de funcionamiento conjunto ni una autorización para sostener bloqueo. 1 kgf·cm ≈ 0,0981 N·m.
Una velocidad sin carga de 0,12 s/60° equivale nominalmente a 500°/s bajo ese ensayo. No garantiza recorrer 60° en ese tiempo con carga; tampoco describe toda la aceleración y el asentamiento.
Para sostener una articulación hacen falta condiciones continuas admisibles, no solo un número de torque máximo. La temperatura, repetición, holgura y retención ante pérdida de energía forman parte de la selección.
07 · Separar señal y potencia
Alimentación y conexiones
En la interfaz habitual hay alimentación positiva, retorno y señal. Los colores varían: verificá el conector y no los uses como única evidencia. La señal del microcontrolador no entrega la corriente del motor.
Usá una fuente regulada dentro del rango del servo, con capacidad para las condiciones de arranque y carga previstas. Conectá la referencia de masa entre fuente y controlador cuando la interfaz no esté aislada. Arduino explica estos puntos en su guía de diagnóstico de servos.
La corriente puede variar mucho con carga, cambios de posición y retención. Una fuente que alcanza en reposo puede caer cuando varios servos se mueven a la vez. No dimensionés un brazo completo multiplicando solo el consumo sin carga.
- Hacé volver la corriente del servo a su fuente por un camino adecuado, evitando el retorno fino de la lógica.
- Ubicá desacoplos y reserva de energía según el montaje y los transitorios medidos.
- Verificá niveles de señal admitidos y evita alimentar indirectamente una electrónica apagada desde su entrada.
- No agregues un diodo fijo en paralelo al conjunto como si fuera el motor desnudo del tema 11: el servo ya contiene un accionamiento interno.
Un capacitor puede ayudar con transitorios, pero no resuelve una fuente incapaz de sostener la carga. Si el servo o el controlador se reinician, medí también la tensión durante el esfuerzo.
08 · Una API de órdenes
La biblioteca Servo de Arduino
La biblioteca Servo genera pulsos mediante temporizadores. En el UNO R3 puede usar un pin digital como señal sin exigir que sea una salida marcada para analogWrite().
| Función | Qué hace | Qué no confirma |
|---|---|---|
| attach(pin, mínimo, máximo) | Asocia la salida y configura límites de su escala | Que esos límites sean seguros para el mecanismo |
| write(valor) | Aplica una referencia mediante la escala de la biblioteca | Un ángulo físico exacto medido |
| writeMicroseconds(us) | Fija una duración solicitada de pulso | Que la carga haya alcanzado la posición |
| read() | Devuelve la última referencia representada por la biblioteca | La posición observada del eje |
| detach() | Deja de generar pulsos para ese canal | Corte de alimentación, liberación o parada física garantizados |
El código oficial de Servo declara un rango predeterminado de 544–2400 µs. No lo trates como una recomendación universal de recorrido. En este tema usaremos límites explícitos y órdenes en microsegundos.
En el UNO R3 la implementación AVR utiliza recursos de temporización que pueden interferir con PWM de otros pines, especialmente 9 y 10 al usar Timer1. Revisá la implementación para AVR y las bibliotecas con las que compartís el programa.
09 · Código para la placa
Primera prueba con recorrido acotado
Usaremos UNO R3 y un servo de posición previamente identificado, que admita centro de 1500 µs y la ventana 1400–1600 µs. Es un supuesto que debés verificar. No uses el programa para descubrir a ciegas el rango de un servo desconocido.
Señal a D6, alimentación desde una fuente regulada compatible y referencia GND común. Probá sin una carga que pueda caer o trabarse. La placa empieza sin generar pulsos. C conecta el canal y solicita centro; L/R piden 1400/1600 µs; S deja de emitir señal.
#include <Servo.h>
Servo eje;
const byte PIN_SERVO = 6;
const int MIN_US = 1400, CENTRO_US = 1500, MAX_US = 1600;
unsigned long ultimaOrden = 0;
void setup() {
digitalWrite(PIN_SERVO, LOW);
pinMode(PIN_SERVO, OUTPUT);
Serial.begin(115200);
Serial.println("C: centro; L/R: referencias; S: quitar señal");
}
void loop() {
if (eje.attached() && millis() - ultimaOrden >= 1500) {
eje.detach();
digitalWrite(PIN_SERVO, LOW);
Serial.println("Sin pulsos; estado mecanico no confirmado");
}
if (Serial.available() == 0) return;
const char cmd = Serial.read();
if (cmd == 'S') {
eje.detach();
digitalWrite(PIN_SERVO, LOW);
} else if (cmd == 'C') {
if (!eje.attached()) eje.attach(PIN_SERVO, 1000, 2000);
eje.writeMicroseconds(CENTRO_US);
ultimaOrden = millis();
} else if (eje.attached() && (cmd == 'L' || cmd == 'R')) {
eje.writeMicroseconds(cmd == 'L' ? MIN_US : MAX_US);
ultimaOrden = millis();
}
}
La escala configurada en attach() es 1000–2000 µs, pero las únicas órdenes que emite este programa están entre 1400 y 1600 µs. Ese límite de prueba lo establece el código de comandos; no depende de convertir grados con write().
C puede provocar movimiento desde una posición inicial desconocida. Los pulsos continúan en segundo plano durante la prueba; no hace falta llamar a writeMicroseconds() en cada período. Cada orden aceptada renueva el plazo de 1500 ms.
Al vencer el plazo se elimina la señal, no la alimentación. El comportamiento del servo sin pulsos depende del modelo: no supongas que queda libre, quieto o sin corriente. El montaje de prueba debe tolerar esa condición.
L y R son nombres de comandos; el sentido físico depende de calibración y montaje. Este ejemplo no implementa trayectorias suaves ni verifica llegada. El próximo tema desarrolla el cambio gradual de referencias.
10 · Exploración interactiva
Laboratorios: interpretar señal y dimensionar carga
1. El mismo pulso no significa lo mismo en todos los servos
Son tres modelos ficticios con ventana admitida de 1000–2000 µs. El modelo continuo tiene neutro de 1500 µs, banda de parada de ±20 µs y velocidad nominal máxima de 60 RPM en su curva didáctica.
Modificá ancho y tipo.
Con 1800 µs, los modelos de posición piden +27° o +54°. El continuo pide aproximadamente +35 RPM en su curva ficticia. Con 1500 µs, las posiciones piden cero de referencia y el continuo pide detener, sin confirmar una posición angular.
Conservá 1500 µs y cambiá de 20 a 25 ms: el ciclo pasa de 7,5 a 6 %, pero el significado del ancho se conserva en estos modelos. No implica que ambos períodos estén admitidos por cualquier servo real. Fuera de 1000–2000 µs se rechaza la interpretación y no se extrapola.
2. Esfuerzo estático en una articulación
Brazo uniforme de 0,1 kg, longitud r y una masa puntual m en el extremo. El ángulo β se mide desde la horizontal. Se compara con un servo ficticio de 0,4 N·m continuos y 0,8 N·m de bloqueo a una tensión y condiciones fijadas.
Ajustá geometría y masa.
Con 0,2 kg a 10 cm y brazo horizontal, el torque total es unos 0,245 N·m y el de diseño 0,368 N·m. Subí la carga a 0,3 kg: la demanda de diseño supera 0,4 N·m, aunque quede debajo de 0,8 N·m. Estar por debajo del bloqueo no aprueba un régimen continuo.
Al acercar el brazo a vertical disminuye el torque gravitatorio de este modelo. Eso no elimina inercia, fricción o perturbaciones ni autoriza a quitar retención. El factor 1,5 es ilustrativo, no un criterio universal. No se predice corriente ni tiempo de movimiento.
11 · Código ejecutable
Conversión y límites en Python
Tomemos una calibración de −45° a +45° con 1000–2000 µs, pero limitemos el mecanismo a 1100–1900 µs. El programa conserva objetivo solicitado, pulso calculado y referencia representada después del límite.
Probalo en el navegador. Python se descarga con Pyodide la primera vez y requiere conexión. El código es editable y no controla un servo real.
from math import floor
def convertir(angulo):
ideal = 1000 + (angulo + 45) * 1000 / 90
limitado = min(1900, max(1100, ideal))
pulso = floor(limitado + 0.5)
representado = -45 + (pulso - 1000) * 90 / 1000
return ideal, pulso, representado
for solicitado in (-45, -30, 0, 30, 45):
ideal, pulso, representado = convertir(solicitado)
recortado = ideal < 1100 or ideal > 1900
print(f"Pedido={solicitado:+3}°; ideal={ideal:.1f} µs; "
f"enviado={pulso} µs; referencia={representado:+.2f}°; "
f"recortado={recortado}")Las solicitudes de ±45° se limitan a referencias de ±36°. Para +30° se envían 1833 µs, que representan aproximadamente +29,97° en la calibración. El resultado es una referencia, no un ángulo medido.
El recorte es explícito para poder diagnosticar un objetivo fuera de recorrido. En otra aplicación puede convenir rechazarlo en vez de saturarlo. No ocultes esa decisión al comportamiento que solicitó la posición.
12 · Método y diagnóstico
Pruebas y diagnóstico
- Identificá tipo de servo, alimentación, señal, período y rango documentados.
- Probá cerca de centro, sin carga y sin una pieza que pueda golpear al arrancar.
- Relacioná pulsos con posiciones medidas y límites del mecanismo.
- Agregá carga progresivamente dentro de condiciones conocidas; observá corriente, tensión y temperatura.
- Verificá comportamiento al retirar señal y alimentación, y ante reinicio del controlador.
- Definí si hace falta una medida externa de posición, finales de recorrido o retención independiente.
«write(90) confirma que está en 90°»
Representa una orden en la escala de la biblioteca. El ángulo físico requiere calibración y, para confirmarlo desde software, una observación adecuada.
«read() me devuelve el sensor interno»
En la biblioteca habitual devuelve la última referencia representada, no telemetría del eje. Un servo con protocolo bidireccional requiere otro tratamiento.
«Si vibra, sigo aumentando el pulso»
Puede estar contra un tope, sobrecargado, con alimentación inestable o señal perturbada. Revisá la causa antes de insistir con más recorrido.
«Un continuo sirve igual para posicionar una articulación»
Su interfaz suele pedir velocidad y sentido, no posición. Para posicionar hace falta otra medición y un lazo apropiado, además de una mecánica compatible.
«detach equivale a cortar potencia»
Solo deja de generar pulsos desde esa biblioteca. La electrónica sigue alimentada y su reacción depende del servo.
«La corriente sin carga alcanza para elegir la fuente»
Arranque, retención y carga pueden exigir más. Verificá picos, funcionamiento conjunto de varios servos y caída de tensión bajo esfuerzo.
13 · Práctica guiada
Predecí antes de comprobar
1. Ancho y período
Un pulso de 1500 µs se repite cada 20 ms. Calculá frecuencia y ciclo de trabajo. ¿El porcentaje describe directamente la potencia del motor interno?
Ver solución
Frecuencia: 50 Hz. Ciclo: 1,5/20 = 0,075 = 7,5 %. Es una señal de referencia para el controlador interno, no una orden directa de potencia del bobinado.
2. Calibración
En la escala −45° a +45° para 1000–2000 µs, ¿qué pulso corresponde a +18°?
Ver solución
1000 + (18 + 45) × 1000/90 = 1700 µs. La posición física se verifica con la calibración y la carga reales.
3. Torque de una carga
Una masa de 0,3 kg está a 8 cm del eje en horizontal. ¿Qué torque aporta, sin contar el brazo?
Ver solución
0,3 × 9,81 × 0,08 ≈ 0,235 N·m, aproximadamente 2,4 kgf·cm. Faltan brazo, dinámica y pérdidas.
4. Tiempo sin carga
Una ficha declara 0,12 s/60° sin carga. ¿Qué tiempo proporcional orientativo correspondería a 30°? ¿Garantiza llegada cargado?
Ver solución
La proporción simple da 0,06 s. No garantiza llegada ni asentamiento: es una referencia derivada del ensayo sin carga, y la dinámica real puede diferir.
5. Límites de mecanismo
El servo acepta 1000–2000 µs, pero tu mecanismo solo está validado entre 1200 y 1800 µs. ¿Qué hacés con un objetivo que necesita 1950 µs?
Ver solución
Rechazarlo o limitarlo explícitamente a la región validada, informando el recorte. La capacidad del servo no elimina un límite del mecanismo.
6. Posición sin confirmación
Enviaste una referencia y Servo.read() devuelve el valor esperado, pero el eje está trabado. ¿Hay contradicción?
Ver solución
No. La biblioteca informa su orden, no el sensor interno. Para detectar o confirmar el estado físico hace falta otra observación o un servo con telemetría adecuada.
14 · Síntesis
Ideas para recordar
- El servo de posición integra motor, transmisión, sensor y control local.
- Un modelo continuo interpreta la señal de otra manera; no es equivalente a uno de posición.
- El ancho del pulso codifica la referencia; el período y los niveles deben ser compatibles.
- La relación pulso–ángulo y el recorrido seguro se calibran para el conjunto real.
- Torque de bloqueo y velocidad sin carga no garantizan régimen continuo ni llegada bajo esfuerzo.
- La alimentación del motor va por una rama adecuada, con la referencia de señal necesaria.
- La biblioteca conserva órdenes; read() no confirma posición y detach() no corta alimentación.
- Los límites, la observación y la respuesta ante fallos completan el uso del servo.
¿Listo para el tema 16?
Antes de avanzar, elegí una calibración de pulso y ángulo, calculá dos referencias y estimá el torque de una carga. Explicá qué harías si no llega al objetivo y qué ocurre al retirar la señal.
En el próximo tema estudiamos posicionamiento de servos y movimientos suaves: rampas, interpolación y velocidad limitada de articulaciones.