Skip to Content

Cómo controlar un servomotor de 360 grados con Arduino

Cómo controlar un servomotor de 360 grados con Arduino

In this tutorial you will learn how to control a 360 degree servo motor. 360 degree servos, also known as continuous rotation servo motors, are a special type of servo motors that can rotate continuously. 

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.

In this tutorial, I will show you what 360 degree servos are, how they work and how to control one using an Arduino Uno.  First, I will explain how the continuous rotation servo works and how to connect one with the Arduino. Then, I will show you how you can create a circuit to control the speed and the direction of a servo motor.

We also have an article on How To Control A 360 Degree Servo Motor with ESP32 if you want to work with an ESP32 microcontroller instead.

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

Makerguides.com is a participant in the Amazon Services LLC Associates Program, an affiliate advertising program designed to provide a means for sites to earn advertising fees by advertising and linking to products on Amazon.com. As an Amazon Associate we earn from qualifying purchases.

You might already be familiar with the servo motors, and think that ‘I already have one’. But look close where the item description mentions ‘360 degree servo’ or ‘continuous rotation servo’.

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. 

So, if you’re purchasing the motors from someone else other than the link mentioned above, make sure that they are in fact 360 servos before!

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.

Be careful when you try this; if your servo is a plastic geared one, you could accidentally damage its gears!

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.

Servo pulses
Servo pulses

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á.

If we decrease the pulse width from 1.5ms, the motor will start to rotate in the clockwise direction. On the other hand, if we increase the pulse width, it will rotate in the counter-clockwise direction.

For a pulse width is higher or lower than 1.5ms (for example, 1.8ms or 1.2ms), the motor speed will increase. At 2ms, the motor will have its maximum counter-clockwise speed and at 1ms, the motor will turn at its maximum speed in the clockwise direction.

Servo
Servo

It is worth noting that continuous servos do not offer exact position control of the shaft. We can only control the direction and the speed of rotation.

In positional 180 degree servos, we can control the position and the direction but not the speed. For details regarding those differences see our tutorial on Positional versus Continuous Servos.

Pinout del servomotor continuo

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

Servo Pinout
Servo Pinout

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.

If you have one of those, you can identify the exact position of the shaft at any given moment by measuring the analodRead() value of that 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
Wiring Servo with Arduino

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.

Wiring Servo with Arduino and Power supply
Wiring Servo with Arduino and Power supply

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
Board Manager

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); // stop the motor
}

// Loop to keep the motor turning!
void loop() {
  myservo.write(45); // rotate the motor counter-clockwise
  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 😀
}

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

Observaciones

The 360 degree servo will rotate in one direction (clockwise) for 5 seconds; stay still for 5 seconds and rotate in the reverse direction for another 5 seconds. This cycle repeats as long as the power is given.

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.

By using the myservo.attach() function, I let my code know about this so when I modify the servo object, I can see the output on that particular motor. This is particularly useful when we have multiple servo motors.

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.

For example, a universal servo reaches the center position when we write myservo.write(90). For a continuous rotation servo, the same line stops its rotation. Any value greater than 90 causes the servo to rotate clockwise, and determines the speed.

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:

Wiring of Servo with Arduino and Potentiometer
Wiring of Servo with Arduino and Potentiometer

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.

The loop() section is where the interesting things happen! The loop works in the following order:

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.

Finally, I’m sending the value to the 360 degree servo by using myservo.write(val); statement to update the motor behavior.

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.

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.

Angel Paíno

Thursday 25th of May 2023

Muy interesante. Si yo quisiera, mediante una señal PWM -es decir conectando el arduino a un canal de una emisora rc- controlar que el motor gire en un sentido, hasta un final de carrera físico -mediante un microswitch- y después una vez parado, volver a ponerlo en funcionamiento, pero en sentido contrario, hasta llegar a otro final de carrera -otro microswitch-. Con ésto quiero hacer un tren de aterrizaje retràctil para un avión de radiocontrol. Gracias

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?