← Índice del curso

Robótica y Automatización · Tema 15

Servomotores

Un servo de posición reúne motor, transmisión, sensor y control en una misma unidad. Vamos a enviarle referencias, interpretar sus límites y elegir alimentación y carga sin confundir la orden con una posición confirmada.

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.

Lazo interno de un servo de posición El programa envía una referencia por pulsos. El control interno compara esa referencia con el sensor del eje y gobierna motor y engranajes. La medición vuelve al controlador interno; una interfaz de señal de un solo sentido no devuelve necesariamente la posición al programa. Programadel robotControl internoerror de posiciónMotor y engranajeseje de salidaSensor de posiciónInterior del servoreferencia

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

La forma del conector no define el significado de la orden.
TipoQué suele pedir la señalQué verificar
Servo de posición de recorrido limitadoPosición dentro de su intervaloRango, sentido, torque y límites de pulso
Servo de rotación continuaSentido y nivel aproximado de velocidad alrededor de un neutroNeutro real, banda de parada y respuesta bajo carga
Servo con bus o realimentación adicionalPosición, velocidad u otros modos según protocoloTelemetrí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.

Período de ejemplo: 20 ms → 50 Hz
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:

pulso = pmín + (θ − θmín) · (pmáx − pmín) / (θmáx − θmín)

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().

Funciones habituales; verificá implementación y arquitectura.
FunciónQué haceQué no confirma
attach(pin, mínimo, máximo)Asocia la salida y configura límites de su escalaQue esos límites sean seguros para el mecanismo
write(valor)Aplica una referencia mediante la escala de la bibliotecaUn ángulo físico exacto medido
writeMicroseconds(us)Fija una duración solicitada de pulsoQue la carga haya alcanzado la posición
read()Devuelve la última referencia representada por la bibliotecaLa posición observada del eje
detach()Deja de generar pulsos para ese canalCorte 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.

Un período de la señal de servoSe muestra un pulso alto al principio de un período completo. Cambiar el período cambia su proporción visual aunque se conserve el ancho en microsegundos.HL0TVentana de un período completo
Orden interpretada en el modelo—
Frecuencia de repetición—
Ciclo de trabajo de la señal—

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.

Torque gravitatorio total—
Torque con factor didáctico 1,5—
Demanda / referencia continua—

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

  1. Identificá tipo de servo, alimentación, señal, período y rango documentados.
  2. Probá cerca de centro, sin carga y sin una pieza que pueda golpear al arrancar.
  3. Relacioná pulsos con posiciones medidas y límites del mecanismo.
  4. Agregá carga progresivamente dentro de condiciones conocidas; observá corriente, tensión y temperatura.
  5. Verificá comportamiento al retirar señal y alimentación, y ante reinicio del controlador.
  6. 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.