Hay muchos motores para elegir, pero es importante elegir el adecuado para el trabajo. Si tu proyecto requiere un posicionamiento preciso, un servomotor suele ser una buena opción. Indícale hacia dónde apuntar, y ellos lo harán por tí. ¡Es tan simple como eso!

Son útiles en una variedad de proyectos de robótica, se usan para dirigir las ruedas delanteras de un modelo RC o pivotar un sensor en un vehículo robótico.

¿Qué es un Servo y qué lo hace preciso?

Los servos son motores que le permiten controlar con precisión el movimiento físico porque se mueven a una posición en lugar de girar continuamente. Son fáciles de conectar y controlar porque el controlador del motor está integrado en ellos.

Los servos contienen un pequeño motor de CC conectado al eje de salida a través de engranajes. El eje de salida se conecta a una pieza que transmite el movimiento (servo horn) y también está conectado a un potenciómetro.

El potenciómetro proporciona retroalimentación de la posición al amplificador de error en la unidad de control, que compara la posición actual del motor con la posición requerida.

En respuesta al error, la unidad de control ajusta la posición actual del motor para que coincida con la posición deseada.

En ingeniería de control, este mecanismo se conoce como servomecanismo, o servo para abreviar. Es un sistema de control de circuito cerrado que utiliza retroalimentación negativa para ajustar la velocidad y la dirección del motor para lograr el resultado deseado.

¿Cómo funcionan los servomotores?

Puedes controlar el servomotor enviándole una serie de pulsos. Un servomotor típico espera un pulso cada 20 milisegundos (es decir, la señal debe ser de 50Hz).

La longitud del pulso determina la posición del servomotor.

  • Un pulso corto de 1 ms o menos hará girar el servo a 0 grados (un extremo).
  • Una duración de pulso de 1,5 ms hará girar el servo a 90 grados (posición media).
  • Una duración de pulso de 2 ms más o menos girará el servo a 180 grados (otro extremo).

Los pulsos que van de 1 ms a 2 ms girarán el servo a una posición proporcional al ancho del pulso. La siguiente animación le ayudará a comprender la relación entre los pulsos y la posición.

Es importante destacar que no existe un estándar para la relación exacta entre los pulsos y la posición, por lo que es posible que necesites ajustar tu sketch en Arduino para adaptarlo al rango de tu servo.

Además, la duración del pulso puede variar entre marcas; por ejemplo, podría ser de 2.5 ms para 180 grados y de 0.5 ms para 0 grados.

Pinout del servomotor

Los servomotores suelen tener tres conexiones, como se describe a continuación.

GND: sirve como un terreno común para el motor y la lógica.

5V: es un voltaje positivo que alimenta el servo.

Control: es una entrada para el sistema de control.

Como conectar un servomotor a un Arduino UNO

Vamos a conectar el servomotor al Arduino.

Utilizaremos un micro servomotor SG90 en nuestros experimentos. Funciona con 4.8-6VDC (5V típico) y puede girar 180 grados (90 en cada dirección).

Consume aproximadamente 10 mA cuando está inactivo y de 100 mA a 250 mA cuando se mueve, por lo que podemos alimentarlo con la salida de 5 voltios del Arduino.

Si tu servo consume más de 250 mA, considera usar una fuente de alimentación separada para ello.

Conecta el cable rojo al 5V del Arduino y el cable negro/marrón a tierra. Finalmente, conecta el cable naranja / amarillo al pin habilitado para PWM # 9.

En la tabla siguiente se enumeran las conexiones de pines:

La siguiente imagen muestra cómo conectar el servomotor SG90 al Arduino.

Arduino Ejemplo 1 – Barrido

Para comenzar, usaremos uno de los ejemplos incluidos en el IDE de Arduino. Ve al submenú Ejemplos. Selecciona el servo y cargua el sketch sweep (barrido).

Sigue adelante y sube el sketch. El eje de tu servomotor comenzará a barrer hacia adelante y hacia atrás a de 0 a 180 grados.

#include <Servo.h>

int servoPin = 9;
Servo servo;
int angle = 0;  // posición de servo en grados

void setup() {
    servo.attach(servoPin);
}

void loop() {

    // barrido de 0 a 180 grados
    for(angle = 0; angle < 180; angle++) {
        servo.write(angle);
        delay(15);
    }
    
    // barrido de regreso de 180 a 0 grados
    for(angle = 180; angle > 0; angle--) {
        servo.write(angle);
        delay(15);
    }
}

Explicación del código:

Controlar servos no es una tarea sencilla, pero afortunadamente, el IDE de Arduino ya incluye una maravillosa biblioteca llamada Servo. Contiene comandos simples que se pueden usar para instruir rápidamente al servo para que gire a un ángulo específico.

Por lo tanto, al comienzo del sketch, incluimos esta biblioteca.

#include <Servo.h>

Luego declaramos el pin Arduino al que está conectado el pin de control del servomotor.

int servoPin = 9;
La línea siguiente crea un sketch servo.
servo servo;
En realidad, puede definir hasta ocho servos de esta manera; Por ejemplo, si tuvieras dos servos, escribirías:
servo servo1;
servo servo2;
La variable angle se utiliza para almacenar el angulo actual del servo en grados.
int angle = 0;

En la función setup() , usamos el siguiente comando para vincular el objeto al pin de control de nuestro objeto servo

servo.attach(servoPin);

En la función loop() tenemos dos ciclos for. El primer bucle girará el motor en una dirección, mientras que el segundo lo girará en la dirección opuesta.

La función servo.write(angle) indica al servo que actualice su posición al ángulo especificado.

servo.write(angle);

Solución de problemas

A veces, tu servo puede funcionar de una forma errónea, especialmente si decides alimentarlo directamente desde el Arduino. La razón de esto es que el servo consume una cantidad significativa de energía, particularmente durante el arranque, lo que puede hacer que la placa Arduino se reinicie.

Para resolver este problema, utiliza un condensador de desacoplamiento electrolítico relativamente grande (470μF – 1000μF) en la alimentación. Asegúrate de que la pata más larga del condensador esté conectado a 5V y el negativo esté conectado a GND.

El condensador almacena carga eléctrica, por lo que cuando el motor arranca, extrae energía tanto de la fuente de alimentación de Arduino como del condensador, lo que garantiza un flujo suave de corriente.

Arduino Ejemplo 2 – Control de servo con un potenciómetro

Nuestro siguiente ejemplo consiste en incluir un potenciómetro para que podamos ajustar manualmente la posición del servo.

Cableado

Reutilizaremos el cableado del ejemplo anterior, pero esta vez agregaremos un potenciómetro de 10KΩ. Conecta un extremo del potenciometro a tierra, el otro a 5V y el cable de control a la entrada analógica A0.

Código Arduino

El código para hacer que el servo siga la posición del potenciometro es más simple que el código anterior.

#include <Servo.h>

int potPin = 0;
int servoPin = 9;
Servo servo;

void setup() {
    servo.attach(servoPin);
}

void loop() {
    int reading = analogRead(potPin);
    int angle = map(reading, 0, 1023, 0, 180);
    servo.write(angle);
}

Explicación del código

Observe que se ha introducido una nueva variable con nombre potPin

int potPin = 0;

Comenzamos la función loop() leyendo el valor del pin analógico A0.

int reading = analogRead(potPin);

La función analogRead() devuelve un valor entre 0 y 1023. Sin embargo, debemos escalarlo porque el servo solo puede girar 180 grados.

Un método es usar la función map() de Arduino, que reasigna un número de un rango a otro. La línea siguiente convierte la lectura en grados entre 0 y 180.

int angle = map(reading, 0, 1023, 0, 180);

Finalmente, usamos el comando write() para actualizar la posición del servo al ángulo seleccionado por el potenciómetro.

servo.write(angle);

Tutorial traducido desde: How Servo Motor Works & Interface It With Arduino – Last Minute Engineers