Skip to Content

Servos posicionales frente a servos continuos

Servos posicionales frente a servos continuos

Los servomotores se utilizan ampliamente en diversas aplicaciones. En esta entrada del blog, exploraremos las diferencias entre los servos posicionales y los continuos, y te ayudaremos a entender cuál es el más adecuado para tu proyecto.

Los servos posicionales, como su nombre indica, están diseñados para moverse a una posición específica y mantenerla hasta que reciban una nueva señal. Se utilizan comúnmente en aplicaciones donde la precisión y la estabilidad son fundamentales. Estos servos tienen un rango de movimiento limitado, normalmente de unos 180 grados, y son ideales para aplicaciones que requieren un control preciso de la posición del motor, como brazos robóticos, dirección de coches RC y control de drones.

Los servos continuos, por otro lado, están diseñados para girar de forma continua en cualquier dirección. A diferencia de los servos posicionales, no mantienen una posición específica. Se utilizan en aplicaciones donde se necesita un movimiento continuo, como robots con ruedas o sistemas de cámara pan-tilt.

Un servo muy popular que está disponible tanto en versión posicional como continua es el SG90. A continuación, veremos las características específicas de los SG90 Micro Servos, cómo conectarlos y las diferencias de control entre el tipo posicional y el continuo.

Materiales necesarios

Makerguides is a participant in affiliate advertising programs designed to provide a means for sites to earn advertising fees by linking to Amazon, AliExpress, Elecrow, and other sites. As an Affiliate we may earn from qualifying purchases.

Para este proyecto necesitarás los siguientes materiales. Ten en cuenta que los servos posicionales y continuos pueden parecer idénticos por fuera. Busca una descripción o una etiqueta que indique «continuous» o «360 degrees» para los servos continuos, y «180 degrees» o «positional» para los servos posicionales.

Arduino Uno

Dupont wire set

Juego de cables Dupont

USB Data Sync cable Arduino

Cable USB para Arduino UNO

basic servo motor

Servo SG90 Posicional

basic servo motor

Servo SG90 Continuo

Características de los SG90 Micro Servos

El micro servo SG90 es un servomotor muy popular y ampliamente utilizado en diversas aplicaciones. Es conocido por su tamaño compacto, bajo coste y versatilidad. Aquí tienes algunas de sus características clave:

Tamaño y peso

El micro servo SG90 es un servo de tamaño pequeño, con unas dimensiones aproximadas de 23mm x 12,2mm x 29mm. Es ligero, pesa alrededor de 9 gramos, lo que lo hace adecuado para proyectos donde el espacio y el peso son importantes.

Voltaje de funcionamiento

El micro servo SG90 funciona con un rango de voltaje de 4,8V a 6V. Esto lo hace compatible con la mayoría de fuentes de alimentación comunes, como baterías LiPo o fuentes de alimentación.

Par y velocidad

El micro servo SG90 ofrece un par de fuerza decente para su tamaño. Normalmente proporciona un par de unos 1,6 kg/cm a 4,8V y 2,2 kg/cm a 6V. La velocidad del servo es de aproximadamente 0,12 segundos por cada 60 grados a 4,8V y 0,10 segundos por cada 60 grados a 6V.

Señal de control

El micro servo SG90 utiliza una señal de control PWM (modulación por ancho de pulso) estándar para su funcionamiento. Requiere una señal de control con una frecuencia de 50Hz y un ancho de pulso entre 1ms y 2ms. El ancho de pulso determina la posición del eje del servo, en el caso de un servo posicional, o la velocidad de rotación en el caso de un servo continuo.

Compatibilidad

El micro servo SG90 es compatible con la mayoría de microcontroladores y placas de desarrollo, como Arduino, Raspberry Pi y ESP32. Se puede controlar fácilmente usando librerías de software y lenguajes de programación habituales en la comunidad maker.

Conexión del SG90 Micro Servo

Sigue estos pasos para conectar el SG90 Micro Servo:

servo-motor-with-arduino-uno-wiring-diagram-schematic-circuit-tutorial
  1. Empieza conectando la fuente de alimentación al servo. El SG90 Micro Servo funciona con un rango de voltaje de 4,8V a 6V. Conecta el cable positivo (rojo) del servo al pin 5V de tu microcontrolador o fuente de alimentación.
  2. Después conecta el cable negativo (negro o marrón) del servo al pin de tierra (GND).
  3. A continuación, conecta el cable de señal de control del servo al PIN 9 de tu microcontrolador. El cable de señal suele ser de color amarillo, blanco o naranja.

Ten en cuenta que si conectas varios servos a un Arduino, especialmente cuando los servos están bajo carga, el Arduino puede no ser capaz de suministrar suficiente energía a todos los servos al mismo tiempo. Esto puede provocar movimientos erráticos, menor rendimiento o incluso que el Arduino se reinicie o se quede bloqueado. En este caso, necesitarás una fuente de alimentación adicional para los servos.

Ahora que ya sabes cómo conectar el SG90 Micro Servo, vamos a ver las características clave de los servos posicionales en la siguiente sección.

Características clave de los servos posicionales

Los servos posicionales, también conocidos como servos estándar, se utilizan ampliamente en diversas aplicaciones debido a su control preciso sobre la posición angular. Aquí tienes algunas de sus características clave:

Control angular : Los servos posicionales permiten un control preciso sobre la posición angular del eje del servo. Pueden girar a un ángulo específico dentro de un rango definido, normalmente entre 0 y 180 grados.

Retroalimentación de posición : Estos servos cuentan con mecanismos de retroalimentación de posición, como potenciómetros o codificadores, que proporcionan información sobre la posición actual del eje del servo. Esta retroalimentación permite un posicionamiento y control precisos.

Par de fuerza : Los servos posicionales están diseñados para proporcionar un alto par de salida, lo que les permite ejercer una cantidad significativa de fuerza. Esto los hace adecuados para aplicaciones que requieren mover o manipular objetos con resistencia.

Estabilidad : Los servos posicionales son conocidos por su estabilidad y su capacidad para mantener una posición una vez alcanzada. Tienen circuitería interna que ayuda a mantener la posición deseada, incluso bajo fuerzas externas o cambios de carga.

En general, los servos posicionales son ideales para aplicaciones que requieren control angular preciso, estabilidad y alto par de fuerza. Se utilizan habitualmente en robótica, vehículos RC, automatización industrial y otros proyectos donde el posicionamiento preciso es fundamental.

Código para controlar servos posicionales

Normalmente no controlas un servo escribiendo el código para generar las señales PWM necesarias, sino que utilizas una librería. La librería más popular para este propósito es la Servo. En su documentación encontrarás el siguiente code ejemplo:

#include <Servo.h>

Servo myservo;  // create servo object to control a servo
int pos = 0;    // variable to store the servo position

void setup() {
  myservo.attach(9);  // attaches the servo on pin 9 to the servo object
}

void loop() {
  for (pos = 0; pos <= 180; pos += 1) { // goes from 0 degrees to 180 degrees
    myservo.write(pos);              // tell servo to go to position in variable 'pos'
    delay(15);                       // waits 15ms for the servo to reach the position
  }
  for (pos = 180; pos >= 0; pos -= 1) { // goes from 180 degrees to 0 degrees
    myservo.write(pos);              // tell servo to go to position in variable 'pos'
    delay(15);                       // waits 15ms for the servo to reach the position
  }
}

Este código debería mover el servo desde la posición de 0 grados hasta la de 180 grados y luego volver.

Sin embargo, si pruebas esto con algunas marcas de servos SG90, ¡a menudo no funcionará! En mi caso, por ejemplo, el servo no se detiene en el ángulo de 0 grados, sino que realiza una rotación completa en la dirección equivocada para llegar a la siguiente posición. La razón es que los fabricantes a veces no siguen estrictamente los estándares de temporización para la señal PWM (link).

Ajuste fino de los ángulos

Así que tendremos que hacer algunos ajustes para que esto funcione. A continuación tienes un ejemplo de código mejorado:

#include <Servo.h>

const int range = 780;
const int mid = 1600;  // 90 degrees
Servo servo;

void setup() {
  servo.attach(9);  // PIN 9
}

void rotate(int angle, int wait) {
  angle = map(angle, 0, 180, mid - range, mid + range);
  servo.writeMicroseconds(angle);
  delay(wait);
}

void loop() {
  rotate(0, 1000);
  rotate(90, 1000);
  rotate(180, 1000);
  rotate(90, 1000);
}

Ten en cuenta que el comportamiento es algo diferente. En lugar de cambiar la posición de forma incremental, nos movemos directamente de 0 grados a 90 grados, luego a 180 grados y finalmente de nuevo a 90 grados, con un tiempo de espera de 1000ms entre cada uno. Esto es solo por simplicidad. Puedes modificar el código para hacer lo mismo que el ejemplo anterior cambiando la función loop a:

void loop() {  
  for (int angle = 0; angle <= 180; angle += 1) {
    rotate(angle, 15);
  }	
  for (int  angle = 180; angle >= 0; angle -= 1) {
    rotate(angle, 15);
  }
}

La parte importante aquí es la función rotate(), que toma un angle (y un tiempo de espera) y maps convierte este ángulo en una longitud de pulso. En teoría, una longitud de pulso de 1000ms es totalmente en sentido antihorario (0 grados), 2000ms es totalmente en sentido horario (180 grados) y 1500ms está en el centro (90 grados). Esto es para los servos posicionales más comunes que tienen un rango de ángulo de 0 a 180 grados.

Ajuste fino del punto medio

En la práctica, las longitudes de pulso realmente necesarias son diferentes y por eso el servo no se mueve como se espera. Empezamos ajustando el punto medio, el ángulo de 90 grados, que debería estar en 1500ms de longitud de pulso. Para esto, coloca el horn en el servo, pon la constante mid a 1500 y cambia la función loop a:

void loop() {
  rotate(90, 1000);
}

Dependiendo del dentado, el horn puede que no quede perfectamente en el ángulo que deseas. Por ejemplo, supón que quieres que 90 grados se vea como en la imagen de abajo, pero el horn está ligeramente descentrado.

Podemos solucionar esto ajustando la constante mid hasta conseguir la alineación perfecta. En el ejemplo de código anterior, tuve que poner mid=1600 para lograrlo.

Ajuste fino de los extremos

A continuación, ajustamos las posiciones de 0 y 180 grados cambiando la constante range. Para ello, modificamos el código en el loop de la siguiente manera

void loop() {
  rotate(0, 1000);
  rotate(180, 1000);
}

Luego dejamos que el servo funcione, observamos las posiciones finales y ajustamos la constante range, empezando con un valor de 500, hasta conseguir los ángulos que se muestran abajo.

Por ejemplo, en el código anterior, tuve que poner la constante range=780 para lograrlo con mis servos. Ten en cuenta que estos valores ajustados para la longitud de pulso se desvían bastante de los valores estándar. Así que se necesita bastante ajuste fino para que los servos hagan lo que quieres.

Para más detalles, echa un vistazo a nuestro tutorial sobre How to control servo motors with Arduino.

A continuación, vamos a ver las características clave de los servos continuos.

Características clave de los servos continuos

Los servos continuos, también conocidos como servos de rotación continua o servos de 360 grados, giran de forma continua en cualquier dirección. A diferencia de los servos posicionales, que tienen un rango de movimiento limitado normalmente a 180 grados, los servos continuos giran sin topes físicos. Aquí tienes algunas de sus características clave:

Control de velocidad : Los servos continuos permiten un control preciso de la velocidad. Ajustando la señal PWM enviada al servo, puedes controlar la velocidad a la que gira. Esto hace que los servos continuos sean ideales para aplicaciones que requieren control de velocidad variable, como robots con ruedas.

Rotación bidireccional : Los servos continuos pueden girar tanto en sentido horario como antihorario.

Sin retroalimentación de posición : A diferencia de los servos posicionales, los servos continuos no proporcionan retroalimentación de posición. Esto significa que no puedes controlar con precisión la posición o el ángulo del eje del servo. Solo puedes controlar la velocidad y la dirección de giro.

Los servos continuos ofrecen ventajas únicas frente a los servos posicionales, especialmente en aplicaciones que requieren movimiento continuo y control de velocidad variable. Sin embargo, no permiten controlar con precisión la posición del eje del servo.

Código para controlar servos continuos

El código de control para un servo continuo es esencialmente idéntico al de un servo posicional. Solo cambiamos los nombres de las variables y constantes para dejar claro el propósito del código:

#include <Servo.h>

const int maxspeed = 700;
const int stop = 1500;
Servo servo;

void setup() {
  servo.attach(9); // PIN 9
}

void rotate(int speed, int wait) {
  speed = map(speed, -100, +100, stop - maxspeed, stop + maxspeed);
  servo.writeMicroseconds(speed);
  delay(wait);
}

void loop() {
  rotate(0, 1000);
  rotate(-100, 1000);
  rotate(+100, 1000);
}

Sin embargo, una diferencia importante está en el mapeo. Aquí mapeamos map velocidades de -100% a +100% (en lugar de ángulos) a las duraciones de pulso necesarias para el control del servo.

Como antes, teóricamente, una longitud de pulso de 1000ms se usaría para velocidad máxima en sentido antihorario, 2000ms para velocidad máxima en sentido horario, y con una longitud de pulso de 1500ms el servo no debería moverse.

En mis servos, una duración de pulso de 1500ms efectivamente detenía el servo. Sin embargo, las velocidades máximas se lograban en 1500ms-700ms = 800ms y 1500ms + 700ms = 2200ms, que están por encima de los valores estándar de 1000ms y 2000ms.

De forma similar al ajuste fino de un servo continuo, empiezas encontrando el punto medio, que es el valor para la constante stop donde el servo no se mueve. Luego aumentas la constante maxspeed (empezando en 500ms) hasta que no observes más mejoras en la velocidad de giro.

Para más detalles, echa un vistazo a nuestro tutorial sobre How to Control a 360 Degree Servo Motor with Arduino.

Elegir entre servos posicionales y continuos

A la hora de elegir entre servos posicionales y continuos, aquí tienes un breve resumen de los factores a tener en cuenta.

Servos posicionales

Los servos posicionales están diseñados para girar hasta un ángulo específico y mantener esa posición. Por lo tanto, los servos posicionales son ideales para tareas que implican mover objetos a ubicaciones o ángulos concretos.

Las características clave de los servos posicionales incluyen:

  • Control de posición : Los servos posicionales te permiten establecer el ángulo de giro deseado y mantendrán esa posición hasta que se les indique lo contrario.
  • Mecanismo de retroalimentación : Estos servos suelen incluir un potenciómetro o un codificador que proporciona información sobre la posición actual del servo.
  • Par de fuerza : Los servos posicionales son conocidos por su alta capacidad de par, lo que los hace adecuados para aplicaciones que requieren mover cargas pesadas.

Servos continuos

Por otro lado, los servos continuos están diseñados para girar de forma continua en cualquier dirección. Por lo tanto, los servos continuos son ideales para tareas que implican girar ruedas, hélices u otros componentes rotativos.

Las características clave de los servos continuos incluyen:

  • Rotación continua : A diferencia de los servos posicionales, los servos continuos pueden girar de forma continua en cualquier dirección.
  • Control de velocidad : Estos servos suelen incluir un mecanismo de control de velocidad, lo que te permite ajustar la velocidad de rotación.
  • Sin control de posición : Los servos continuos no tienen control de posición como los servos posicionales. No mantienen un ángulo específico.

Elegir el servo adecuado

Si necesitas un control preciso de la posición del servo y alta capacidad de par, un servo posicional es la mejor opción. Por otro lado, si necesitas movimiento continuo y control de velocidad, un servo continuo será más adecuado.

Conclusión

En este artículo hemos visto las diferencias entre servos posicionales y continuos, sus características clave y cómo controlarlos.

Los servos posicionales están diseñados para girar dentro de un rango específico de ángulos, lo que los hace ideales para aplicaciones que requieren posicionamiento preciso. Por otro lado, los servos continuos ofrecen rotación continua en cualquier dirección, por lo que son adecuados para aplicaciones que requieren movimiento constante, como motores de ruedas para pequeños robots o vehículos.

Al decidir entre servos posicionales y continuos, ten en cuenta los requisitos específicos de tu proyecto. Si necesitas un control preciso de la posición del servo, elige un servo posicional. Sin embargo, si necesitas movimiento continuo o la posibilidad de modificar el servo para aplicaciones concretas, un servo continuo es la mejor opción.

En esta entrada del blog nos hemos centrado en las características de los micro servos SG90, que se utilizan habitualmente en proyectos de aficionados por su pequeño tamaño y bajo coste. Sin embargo, los conceptos tratados se aplican también a otros servomotores.

En resumen, comprender las características clave y las diferencias entre servos posicionales y continuos es esencial para elegir el servomotor adecuado para tu proyecto. Ten en cuenta los requisitos y aplicaciones concretas, y elige en consecuencia. ¡Feliz experimentación con servomotores!

Nota

Implementamos una función especial rotate() que realiza un mapeo de ángulos o velocidades a duraciones de pulso. La función attach() de la Servo library tiene dos parámetros adicionales (min y max) que logran un efecto similar.

attach(pin, min, max)

Sin embargo, esto no permite ajustar el punto medio y para velocidades de -100% a +100% necesitarías un mapeo aparte. Por eso optamos por la solución más genérica presentada arriba.

Conclusiones

En este tutorial has aprendido las diferencias entre servos posicionales y continuos.

Para más información sobre servos continuos, echa un vistazo a nuestro tutorial sobre How to Control a 360 Degree Servo Motor with Arduino. Para servos posicionales, consulta el tutorial How to control servo motors with Arduino y si quieres controlar un servo con un mando a distancia por infrarrojos, lee el tutorial How to Control a Servo with an IR Remote.

Si tienes alguna pregunta, no dudes en dejarla en la sección de comentarios.

¡Feliz cacharreo ; )