Cómo controlar un servomotor de 360 grados con Arduino

Cómo controlar un servomotor de 360 grados con Arduino

Los servomotores de 360 grados (también conocidos como servomotores de rotación continua) son una versión especial de los servomotores que pueden girar continuamente. 

A diferencia de sus homólogos universales, que sólo pueden girar de 0° a 180° y no tienen control de la velocidad, aparte del control de la posición, los servos de rotación continua nos permiten controlar la dirección de rotación y establecer también la velocidad.

Los servos de rotación continua se encuentran en muchas aplicaciones, como los pequeños robots para aficionados, como el BoeBot.

En este tutorial, te mostraré qué son los servos de 360 grados, cómo funcionan y cómo controlar uno usando un Arduino Uno. 

Primero, explicaré cómo funciona el servo de rotación continua y cómo conectar uno con el Arduino.

A continuación, te mostraré cómo puedes crear un circuito para controlar la velocidad y la dirección de un servomotor.

Suministros

Para seguir los pasos de este tutorial, necesitarás los siguientes elementos:

Componentes de hardware

FEETECH FS90R Micromotor de rotación continua de 360 gradosx1
Arduino UNO R3x1
Cables de puente macho a machox1
Tablero de pruebasx1
Potenciómetro de 10 kΩ (tipo placa de pan)x1
Cable USB tipo A/Bx1
Fuente de alimentación de 5V (opcional)x1

Software

Arduino IDE (es preferible la versión 1.8.x)

Makerguides.com participa en el Programa de Asociados de Amazon Services LLC, un programa de publicidad de afiliados diseñado para proporcionar un medio para que los sitios ganen honorarios de publicidad mediante la publicidad y los enlaces a productos en Amazon.com.

Puede que ya estés familiarizado con los servomotores y pienses que "ya tengo uno".

Pero fíjate bien donde la descripción del artículo menciona "servo de 360 grados" o "servo de rotación continua".

En el caso de los motores FEETECH, mencionan específicamente la frase "servo de rotación continua" en la pegatina que se encuentra en la carcasa del motor. 

Por lo tanto, si vas a comprar los motores a través de otro enlace que no sea el mencionado anteriormente, ¡confirma que son realmente servos 360 antes de comprarlos!

-> Lee nuestro artículo sobre ¿Es fácil aprender Arduino?

Servomotores de rotación continua frente a servomotores universales

Los servos de rotación continua son una versión especializada de los servomotores universales para aficionados.

Los servos universales para aficionados constan de tres secciones principales:

1. Motor eléctrico

Se trata normalmente de un motor de corriente continua con escobillas que funciona con 5V-12V dependiendo del suministro. 

2. Sistema de engranajes

Si has utilizado antes un servomotor, habrás observado que un servomotor gira mucho más despacio que un motor normal, pero es muy difícil detener su rotación a mano.

Esto se debe a un sistema de engranajes que aumenta el par de la salida del motor, lo que a su vez reduce la velocidad de rotación.

3. Circuitos de retroalimentación y control

El circuito de control consiste en un mecanismo de retroalimentación, normalmente un potenciómetro conectado al eje de salida de la caja de cambios para saber cuál es la posición actual del motorreductor.

En función de la posición actual y de la señal que le demos para girar a una posición diferente, el circuito de control da potencia al motor para que alcance la posición deseada.

Los servomotores también tienen un "par de retención". Esto significa que cuando dirigimos un servomotor a una determinada posición e intentamos girar el eje con la mano/fuerza externa, éste contrarrestará nuestro esfuerzo e intentará mantener su posición.

[Ten cuidado cuando intentes esto; si tu servo es de plástico, podrías dañar sus engranajes accidentalmente].

Si quieres información más detallada sobre los servomotores universales, no dudes en consultar nuestro Cómo controlar los servomotores con Arduino ¡tutorial!

¿Qué hace especial a un servomotor continuo?

Un servomotor típico necesita una señal PWM de ~50 Hz con anchos de pulso que van de 1 a 2 ms para controlar la posición de su eje.

Por ejemplo, si nuestro ancho de pulso es de 1,5ms, el motor girará instantáneamente a su posición de 90 grados y mantendrá el ángulo hasta que cambiemos el ancho de pulso.

servomotor continuo

Según algunos fabricantes, sus anchos de pulso/frecuencias pueden variar ligeramente entre 0,5ms y 2,5ms y la mayoría de los servos RC para aficionados pueden aceptar frecuencias de pulso en el rango de 40-200Hz.

Los servos continuos, en cambio, no proporcionan control de posición. Por ejemplo, si proporcionamos un pulso de 1,5 ms a 50 Hz, el servo no girará.

Si disminuimos el ancho de pulso de 1,5ms, el motor comenzará a girar en el sentido de las agujas del reloj. Si aumentamos el ancho de pulso, girará en el sentido contrario a las agujas del reloj.

Si el ancho de pulso es muy superior o inferior a 1,5ms (por ejemplo, 1,8ms o 1,2ms), la velocidad del motor aumentará.

A los 2ms, el motor tendrá su máxima velocidad en el sentido contrario a las agujas del reloj y a los 1ms, el motor girará a su máxima velocidad en el sentido de las agujas del reloj.

velocidad máxima en sentido contrario a las agujas del reloj

Cabe destacar que los servos continuos no ofrecen un control exacto de la posición del eje.

Sólo podemos controlar la dirección y la velocidad de rotación.

En los servos universales de 180 grados, podemos controlar la posición y la dirección pero no la velocidad.

Pinout del servomotor continuo

El pinout del servomotor de 360 grados es el mismo que el del servomotor universal de 180 grados.

Pinout del servomotor continuo

Los pines marrón y rojo son los pines de alimentación, y el pin amarillo es el pin de entrada de señal.

Para casos especiales como el servomotor Adafruit Feedback 360 Grados, hay un pin adicional que emite un voltaje de 0-5V dependiendo del ángulo de 0-360 grados del eje.

Si tienes uno de esos, puedes identificar la posición exacta del eje en cualquier momento midiendo el valor de analodRead() de ese pin.

Cómo utilizar un servo de 360 grados con Arduino

Empecemos con la instalación del software Arduino y la prueba de la placa de desarrollo.

Paso 1: Instalación de Arduino IDE

Si aún no has instalado el IDE de Arduino en tu sistema, sigue este tutorial de thecoderworld para instalarlo en tu sistema.

Paso 2: Instalación de las bibliotecas necesarias

Para este tutorial, no necesitamos instalar ninguna librería. El IDE de Arduino viene con todo lo que necesitamos fuera de la caja.

Paso 3: Cableado del servomotor de 360 grados con Arduino Uno

El conector de tres pines del servomotor tiene el pinout mencionado anteriormente. Si tienes un pequeño servomotor de 5V como el que he enumerado aquí, puedes conectarlo directamente como se muestra a continuación:

Cableado del servomotor de 360 grados con Arduino Uno

NOTA: Para minimizar el riesgo de consumir demasiada corriente y dañar su puerto USB, no ponga cargas pesadas en el motor. Si necesitas que el motor controle la posición de algo, por favor, conecta una fuente externa de 5V (o una fuente que pueda proporcionar el voltaje de funcionamiento del motor) como se muestra en el siguiente diagrama.

Conecta el Arduino a tu ordenador

Después de conectar todo, conecta el Arduino a tu ordenador mediante el cable USB.

Paso 4: Configurar el Arduino para cargar el código

Ve al menú Herramientas -> Placa y selecciona Arduino Uno de la lista. A continuación, vaya a Herramientas -> Puerto y seleccione el puerto COM.

Normalmente, sólo hay un puerto COM y si tu Arduino es una placa auténtica, lo más probable es que el IDE seleccione automáticamente el puerto por ti.

Configurar el Arduino para cargar el código

Paso 5: Código de ejemplo para probar el servo

Ahora que tenemos todo preparado, ¡escribamos algo de código!

Como he mencionado antes, el servo de rotación continua/360 servo es una versión especial de servo universal que nos permite controlar no la posición, sino la velocidad y la dirección de la rotación del motor.

El código es idéntico al código de conducción del servo universal, pero la salida es diferente.

// Include the library
#include <Servo.h>

// Create the servo object
Servo myservo;

// Setup section to run once
void setup() {
  myservo.attach(9); // attach the servo to our servo object

  myservo.write(90); 
}

// Loop to keep the motor turning!
void loop() {
  myservo.write(45); // rotate the motor counterclockwise

  delay(5000); // keep rotating for 5 seconds (5000 milliseconds)

  myservo.write(90); // stop the motor

  delay(5000); // stay stopped

  myservo.write(135); // rotate the motor clockwise

  delay(5000); // keep rotating :D
}

Copia este código, haz clic en Cargar y observa cómo el servo gira por sí solo.

-> Lea nuestra guía sobre lo que puede construir con Adruino.

Observaciones

El servo de 360 grados girará en una dirección (en el sentido de las agujas del reloj) durante 5 segundos; permanecerá quieto durante 5 segundos y girará en la dirección inversa durante otros 5 segundos.

Este ciclo se repite mientras se da el poder.

Cómo funciona el código del servo de rotación 360

Comenzamos incluyendo la librería Servo proporcionada por el Arduino. Esta librería genera y maneja el pulso de 50Hz necesario para controlar el servomotor.

#include <Servo.h>

Si te olvidas de cómo debes escribir exactamente esta línea, ir a Sketch -> Incluir Biblioteca te permite seleccionar la biblioteca requerida y el IDE añadirá automáticamente la línea por ti.

A continuación, he creado mi Objeto Servo. Esto representa mi servo a través de mi código y cualquier cambio que haga a esto se reflejará en el servo real.

Usted puede nombrar el objeto servo en cualquier nombre que desee, pero asegúrese de que:

  • Comienza el objeto del nombre con una letra
  • No ponga espacios en el nombre del objeto
Servo myservo;

Pasemos a la sección de configuración. Esta parte del código del firmware de Arduino se ejecuta sólo una vez en cuanto proporcionamos energía al Arduino.

He utilizado esta sección para unir mi servomotor al objeto servo que acabo de crear y asegurarme de que está parado.

He conectado el pin 9 del Arduino a la entrada de señal del servomotor.

Usando la función myservo.attach(), dejo que mi código sepa esto para que cuando modifique el objeto servo, pueda ver la salida en ese motor en particular.

Esto es especialmente útil cuando tenemos varios servomotores.

Al crear un objeto servo por cada motor, podemos controlarlos fácilmente de forma individual.

void setup() {
  myservo.attach(9); // attach the servo to our servo object
  myservo.write(90); 
}

Usando la línea myservo.write() en un servomotor de rotación continua, podemos controlar la dirección y la velocidad de rotación.

Por ejemplo, un servo universal alcanza la posición central cuando escribimos myservo.write(90). Para un servo de rotación continua, la misma línea detiene su rotación.

Cualquier valor superior a 90 hace que el servo gire en el sentido de las agujas del reloj, y determina la velocidad.

Por ejemplo, myservo.write(95) hará que el motor comience a girar muy lentamente mientras que usar myservo.write(180) pone el motor a toda velocidad en el sentido de las agujas del reloj.

Del mismo modo, si se utiliza un valor menor entre 0 y 90 se invertirá el sentido de giro.

Un valor cercano a 0 fija el motor a la máxima velocidad en sentido contrario a las agujas del reloj, mientras que un valor como 85 reducirá la velocidad de forma significativa.

En la sección del bucle, he escrito un código sencillo para mostrar la secuencia; girar en sentido contrario a las agujas del reloj a la mitad de la velocidad durante cinco segundos, dejar de girar durante cinco segundos más y girar en sentido de las agujas del reloj durante otros segundos.

Nota: ¡El código dará un resultado distinto al que he comentado aquí si has comprado por error un servomotor normal!

Controla la velocidad de un servo de 360 grados mediante un potenciómetro

A veces querrás controlar con precisión la velocidad de un servomotor de rotación de 360 grados utilizando un Arduino.

En los siguientes pasos te mostraré cómo leer la posición de un potenciómetro y controlar la velocidad del servo de 360 grados usando Arduino:

Paso 1: Configurar el hardware

Como he comentado en el experimento anterior, sigue los pasos 1 a 4 para configurar el entorno de hardware y software.

Además de estos pasos, conecte el potenciómetro de 10k como se muestra en el siguiente diagrama:

Controla la velocidad de un servo de 360 grados mediante un potenciómetro

Como el potenciómetro es un componente analógico, necesitamos conectarlo a una entrada analógica de nuestro Arduino. Los pines analógicos del arduino están marcados como A0, A1, etc. Yo he conectado el potenciómetro al pin A0.

Paso 2: Programación del Arduino para controlar el servo

Aquí está el código que escribí para controlar la velocidad y dirección del servomotor usando el potenciómetro:

#include <Servo.h> // Include the servo library

Servo myservo;  // create servo object to control our servo

int potentiometerPin = A0;  // analog pin used to connect the potentiometer
int val;	// variable to read the value from the analog pin


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

void loop() {
  val = analogRead(potentiometerPin);  // reads the value of the potentiometer (value between 0 and 1023)
  val = map(val, 0, 1023, 0, 180); 	// scale it for use with the servo (value between 0 and 180)
  myservo.write(val);              	// sets the servo speed and direction according to the scaled value
}

Al igual que el código anterior, primero empecé con la inclusión de la biblioteca Servo y la creación del objeto servo.

A continuación, definí dos variables para mantener el nombre del pin y el valor analógico leído del potenciómetro.

int potentiometerPin = A0; // pin analógico utilizado para conectar el potenciómetro
int val; // variable para leer el valor del pin analógico

En la sección Setup, adjunto mi servomotor al objeto servo que acabo de crear. Como siempre, esto une el motor físico a la variable myservo de forma similar al experimento anterior.

La sección loop() es donde ocurren las cosas interesantes.

El bucle funciona en el siguiente orden:

El bucle funciona en el siguiente orden

La línea val = analogRead(potentiometerPin); lee la lectura del potenciómetro y la asigna a la variable val.

Puede tomar cualquier valor de 0 a 1023 dependiendo de la posición del potenciómetro.

A continuación, utilizo la función de Arduino mapa() para convertir este valor 0-1023 en un rango 0-180 porque nuestro servo espera un valor entre 0 y 180.

El sitio web oficial de Arduino tiene una explicación detallada de la función y sus parámetros.

El valor mapeado devuelto se almacena en la variable val variable. Esto sustituye a la lectura analógica en bruto que había antes.

Por último, estoy enviando el valor al servo de 360 grados mediante el uso de myservo.write(val); declaración para actualizar el comportamiento del motor.

Observaciones

Podemos observar que cuando el potenciómetro está en la posición media, el servomotor dejará de girar.

Una vez que empiece a girar el mando del potenciómetro en el sentido de las agujas del reloj, el motor también empezará a girar en el sentido de las agujas del reloj y viceversa.

Cuando el potenciómetro se gira completamente hacia cualquiera de los extremos, el servo girará a su máxima velocidad hacia cualquiera de los dos sentidos.

->Consulta nuestra guía de los 12 mejores cursos online de Arduino

Conclusión

En este tutorial, te he mostrado cómo empezar a utilizar un servomotor de 360 grados con Arduino Uno.

Aunque los servos de 360 grados son algo poco común en el mercado, ciertamente tienen sus usos en muchas disciplinas, incluyendo los proyectos de RC para aficionados.

Este tutorial fue sólo una introducción al concepto general de los servos de 360 grados con componentes mínimos y hay mucho que podemos hacer con estos motores si se utilizan correctamente.

Para aplicaciones estables y de alto par/potencia, se recomienda encarecidamente una fuente de alimentación independiente.

Ahora es el momento de que te hagas con un kit de desarrollo y empieces a jugar con los servos de 360 grados.

¿Tiene alguna pregunta o sugerencia? ¿Dónde crees que pueden ser útiles estos motores?

Hágamelo saber en los comentarios a continuación.

Ashwini Jadhav

Jueves 15 de diciembre de 2022

Quiero código para girar el motor servo con 360 grados en sentido horario y 360 grados en sentido antihorario

Rhea

Martes 18 de octubre de 2022

Hola, ¿cómo puedo detener el servo cuando ha girado tantas veces como quiero?