In this tutorial, you will learn how servo motors work and how to control them with Arduino. I have included wiring diagrams and several example codes!
Servo motors are often used in robotics projects but you can also find them in RC cars, planes, etc. They are very useful when you need precise position control and/or high torque.
En la primera parte de este artículo, veremos el funcionamiento interno de un servo y qué tipo de señal de control utiliza. También explicaré cuáles son las diferencias entre un servo estándar y uno continuo. A continuación, te mostraré cómo conectar un servomotor al Arduino.
Con el primer ejemplo de código, puedes controlar tanto la posición como la velocidad del servomotor. Después, veremos cómo controlar un servo con un potenciómetro y cómo puedes modificar el código para controlar varios servomotores al mismo tiempo. Por último, al final de este artículo, puedes encontrar las especificaciones y dimensiones de algunos de los servomotores más populares del mercado.
Si quiere saber más sobre otros tipos de motores, consulte los artículos siguientes:
Artículos recomendados
- Positional versus Continuous Servos
- Motor paso a paso 28BYJ-48 con controlador ULN2003 y tutorial de Arduino
- Cómo controlar un motor paso a paso con Arduino Motor Shield Rev3
- Cómo controlar un motor paso a paso con el driver A4988 y Arduino
- Cómo controlar un carácter I2C LCD con Arduino
I also have an article on How To Control Servo Motors using ESP32 if you want to work with an ESP32 microcontroller instead.
Suministros
Componentes de hardware
SG90 micro servo | × 1 | Amazon |
Servo de alto par MG996R | × 1 | Amazon |
Arduino Uno Rev3 | × 1 | Amazon |
Cables de puente | × 15 | Amazon |
Tablero de pruebas | × 1 | Amazon |
Potenciómetro de 10 kΩ (tipo placa de pan) | × 1 | Amazon |
Cable USB tipo A/B | × 1 | Amazon |
Fuente de alimentación de 5V (opcional) | × 1 | Amazon |
Software
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.
¿Cómo funciona un servomotor?
Un servo estándar para aficionados suele consistir en un pequeño motor eléctrico, un potenciómetro, la electrónica de control y una caja de cambios. El potenciómetro interno mide constantemente la posición del eje de salida y la compara con la posición objetivo establecida por el controlador (por ejemplo, el Arduino).
En función del error, la electrónica de control ajusta la posición real del eje de salida para que coincida con la posición objetivo. Esto se conoce como un sistema de control en bucle cerrado.
El reductor disminuye la velocidad del motor, lo que aumenta el par en el eje de salida. La velocidad máxima del eje de salida suele ser de unas 60 RPM.
Servocontrol
Los servomotores se controlan enviando una señal PWM (modulación de ancho de pulso) a la línea de señal del servo. El ancho de los pulsos determina la posición del eje de salida. Cuando se envía al servo una señal con un ancho de pulso de 1,5 milisegundos (ms), el servo se moverá a la posición neutral (90 grados). La posición mínima (0 grados) y máxima (180 grados) corresponden normalmente a un ancho de pulso de 1 ms y 2 ms respectivamente. Tenga en cuenta que esto puede variar ligeramente entre los diferentes tipos y marcas de servomotores (por ejemplo, 0,5 y 2,5 ms). Muchos servos sólo giran alrededor de 170 grados (o incluso sólo 90) pero la posición media es casi siempre de 1,5 ms.
Para ajustar la posición mínima y máxima en el código, véase la sección siguiente.
Los servomotores generalmente esperan un pulso cada 20 milisegundos o 50 Hz, pero muchos servos RC funcionan bien en un rango de 40 a 200 Hz.
Servo de 360 grados (continuo) frente a 180 grados (estándar)
La mayoría de los servos RC son de la variedad de 180 grados, lo que significa que sólo pueden girar en un rango de 0 a 180 grados. Sin embargo, también están disponibles los de rotación continua, también conocidos como servomotores de 360 grados.
Los servos de rotación continua reaccionan de forma diferente a la señal de control que los servos estándar de 180 grados. Con un servo de rotación continua, no puedes controlar la posición exacta del eje de salida, sólo la velocidad y la dirección. Un pulso de 1 ms ajustará la velocidad del servomotor a la máxima velocidad en una dirección y un pulso de 2 ms a la máxima velocidad en la otra. Un valor cercano a 1,5 ms permite que el motor se detenga.
Si tu servo se comporta de forma inesperada, puede que estés utilizando un servo continuo en lugar de uno estándar.
For more information have a look a our tutorial Positional versus Continuous Servos.
¿Cómo conectar un servomotor al Arduino?
El cableado de un servomotor es muy sencillo porque sólo hay que conectar tres cables: alimentación, tierra y señal. El cable de alimentación suele ser rojo y debe conectarse a 5 V.
A micro servo like the SG90 consumes around 10 mA when it’s idle and 100 – 250 mA when rotating, so you can power it directly with the 5 V output of the Arduino. However, you need to be careful when using multiple or larger servo motors. If your motor(s) consume more than 300 mA you should use an external power supply to avoid damaging the Arduino! See the schematic below for using external power supplies.
El cable de tierra suele ser negro o marrón y debe conectarse a la clavija de tierra del Arduino. Si utiliza una fuente de alimentación independiente, conecte el cable de tierra tanto al Arduino como a la tierra de la fuente de alimentación.
El cable de señal es típicamente amarillo, naranja o blanco puede ser conectado a cualquiera de los pines digitales del Arduino. En este caso, lo conecté al pin digital 9.
Las conexiones también se indican en la tabla siguiente.
Conexiones del servomotor
Servomotor | Arduino |
---|---|
Potencia (rojo) | 5 V |
Tierra (negra o marrón) | GND |
Señal (amarilla, naranja o blanca) | Pin 9 |
Como he mencionado antes, si usted está utilizando grandes o múltiples servomotores debe utilizar una fuente de alimentación externa. Simplemente conecte la fuente de alimentación como se muestra en el diagrama de cableado de abajo. Asegúrese de conectar el pin GND del Arduino y la fuente de alimentación juntos.
You can also use this setup if your servo motor requires a different voltage than the Arduino can provide e.g. 6 V or higher. The following picture shows how to use an external power supply to drive the servo:
Connections for servo motor with external power supply
Servomotor | Conexión |
---|---|
Potencia (rojo) | Alimentación de 5 V |
Tierra (negra o marrón) | Tierra de la fuente de alimentación y GND del Arduino |
Señal (amarilla, naranja o blanca) | Pin 9 Arduino |
Arduino example code
Para controlar el servomotor usaremos la librería Servo.h que viene preinstalada con el IDE de Arduino. Con el código de ejemplo de abajo, puedes controlar la posición exacta del servomotor y también incluye código para barrer el brazo del servo hacia adelante y hacia atrás automáticamente.
Puedes cargar el código de ejemplo en tu Arduino a través del IDE de Arduino. A continuación, voy a explicar cómo funciona el código.
Puede copiar el código haciendo clic en el botón de la esquina superior derecha del campo de código.
/* Servo motor with Arduino example code. Position and sweep. More info: https://www.makerguides.com/ */ // Include the servo library: #include "Servo.h" // Create a new servo object: Servo myservo; // Define the servo pin: #define servoPin 9 void setup() { // Attach the Servo variable to a pin: myservo.attach(servoPin); } void loop() { // Tell the servo to go to a particular angle: myservo.write(90); delay(1000); myservo.write(180); delay(1000); myservo.write(0); delay(1000); // Sweep from 0 to 180 degrees: for (int angle = 0; angle <= 180; angle += 1) { myservo.write(angle); delay(15); } // And back from 180 to 0 degrees: for (int angle = 180; angle >= 0; angle -= 1) { myservo.write(angle); delay(15); } delay(1000); }
Cómo funciona el código
El primer paso es incluir la biblioteca de Arduino necesaria. También puedes encontrar esta biblioteca en Sketch > Include Library > Servo.
// Include the servo library: #include "Servo.h"
A continuación, necesitas crear un nuevo objeto de la clase Servo. En este caso, llamé al servo 'myservo' pero puedes usar otros nombres también. Ten en cuenta que también tendrás que cambiar el nombre del servo en el resto del código.
// Create a new servo object: Servo myservo;
Después de eso, definí a qué pin de Arduino está conectado el servomotor.
// Define the servo pin: #define servoPin 9
La declaración #define
se utiliza para dar un nombre a un valor constante. El compilador sustituirá cualquier referencia a esta constante por el valor definido cuando se compile el programa. Por lo tanto, en todos los casos en los que se menciona servoPin
el compilador lo sustituirá por el valor 9 al compilar el programa.
En la sección de configuración del código, enlazamos el objeto servo que hemos creado con el pin que controlará el servo. El attach()
también tiene dos parámetros opcionales, de los que hablo en la sección siguiente.
void setup() { // Attach the Servo variable to a pin: myservo.attach(servoPin); }
Ángulo de control/posición:
En la primera parte del bucle, simplemente le decimos al servomotor que se mueva a un ángulo determinado con la función write()
. Ten en cuenta que necesitas un retardo entre los comandos para que el servomotor tenga tiempo de moverse hasta la posición establecida.
// Tell the servo to go to a particular angle: myservo.write(90); delay(1000); myservo.write(180); delay(1000); myservo.write(0); delay(1000);
Velocidad de control:
En la última parte del código, utilicé dos bucles for para barrer el servomotor hacia adelante y hacia atrás. Esta parte del código también puede ser útil si quieres controlar la velocidad del servomotor. Cambiando el valor de retardo al final del bucle for, puedes ajustar la velocidad del servo brazo.
// Sweep from 0 to 180 degrees: for (int angle = 0; angle <= 180; angle += 1) { myservo.write(angle); delay(15); } // And back from 180 to 0 degrees: for (int angle = 180; angle >= 0; angle -= 1) { myservo.write(angle); delay(15); }
¿Por qué mi servo no gira completamente de 0 a 180 grados?
Como he comentado en la introducción, el ángulo del eje de salida del servomotor está determinado por la anchura del pulso eléctrico que se aplica al cable de control. Generalmente, un ancho de pulso de aproximadamente 1 ms (milisegundo) corresponde a la posición mínima, 2 ms a la posición máxima, y 1,5 ms a 90° (posición neutral). Sin embargo, esto puede variar ligeramente entre marcas e incluso diferentes servos de la misma marca. Esto significa que tendrás que ajustar los valores mínimos y máximos en el código para que coincidan con el servo que estás utilizando.
La librería Arduino Servo hace que sea muy fácil ajustar el ángulo mínimo y máximo del servomotor especificando dos parámetros opcionales en el comando attach()
función. En esta función, el primer parámetro es el número del pin al que se conecta el servo. El segundo parámetro es el ancho de pulso, en microsegundos (μs), correspondiente al ángulo mínimo (0 grados) del servomotor. El tercer parámetro es el ancho de pulso, en microsegundos, correspondiente al ángulo máximo (180 grados) del servomotor.
Por defecto, el ancho de pulso mínimo y máximo se establece en 544 y 2400 microsegundos. Estos valores funcionan para la mayoría de los servos comunes, pero a veces hay que ajustar los valores ligeramente.
Recomiendo ajustar los valores min y max en pequeños incrementos (10-20 microsegundos) para evitar dañar el servo. Si el brazo del servo está golpeando los límites físicos del motor, aumentar el valor min, y disminuir el valor max.
#define servoPin 9 int min = 480; int max = 2500; Servo myservo; void setup() { myservo.attach(servoPin, min, max); }
Controlar un servomotor con un potenciómetro y Arduino
Controlar la posición de un servomotor con un potenciómetro es muy fácil y puede ser muy útil si quieres ajustar la posición del motor a mano. Como puedes ver en el diagrama de cableado de arriba, el servomotor está cableado de la misma manera que antes. La única diferencia es que he utilizado una protoboard para distribuir la energía desde el Arduino.
El potenciómetro tiene tres pines, conecta los pines exteriores a 5 V y GND. El pin central del potenciómetro se conecta al pin analógico A0 del Arduino.
Servomotor con potenciómetro Código de ejemplo de Arduino
El código de ejemplo que se muestra a continuación permite controlar un servomotor con un potenciómetro.
Puede copiar el código haciendo clic en el botón de la esquina superior derecha del campo de código.
/* Servo motor with potentiometer and Arduino example code. More info: https://www.makerguides.com/ */ #include "Servo.h" // include the required Arduino library #define servoPin 9 // Arduino pin for the servo #define potPin A0 // Arduino pin for the potentiometer int angle = 0; // variable to store the servo position in degrees int reading = 0; // variable to store the reading from the analog input Servo myservo; // create a new object of the servo class void setup() { myservo.attach(servoPin); } void loop() { reading = analogRead(potPin); // read the analog input angle = map(reading, 0, 1023, 0, 180); // map the input to a value between 0 and 180 degrees myservo.write(angle); // tell the servo to go to the set position delay(15); // wait 15 ms for the servo to reach the position }
Fíjate que antes de la sección de configuración y bucle del código se crea una nueva variable reading
y se define el pin de entrada del potenciómetro.
En la sección de bucle del código, leemos el valor del pin analógico A0 con la función analogRead()
.
reading = analogRead(potPin); // leer la entrada analógica
Las placas Arduino contienen un convertidor analógico-digital (ADC) de 10 bits, por lo que nos da un valor entre 0 y 1023 dependiendo de la posición del potenciómetro.
Debido a que el servomotor sólo puede girar entre 0 y 180 grados, necesitamos escalar los valores hacia abajo con la función map(). Esta función re-mapea un número de un rango a otro.
angle = map(reading, 0, 1023, 0, 180); // asignar la entrada a un valor entre 0 y 180 grados
Por último, escribimos el ángulo al servomotor:
myservo.write(angle); // dile al servo que vaya a la posición establecida delay(15); // espera 15 ms para que el servo alcance la posición
Control de varios servomotores
Controlar múltiples servos es tan fácil como controlar sólo uno, pero a menudo recibo preguntas sobre cómo modificar el código. Por lo tanto, he añadido un ejemplo sencillo a continuación.
Ten en cuenta que tendrás que utilizar una fuente de alimentación externa para alimentar los servos porque el Arduino no puede proporcionar suficiente corriente para alimentar todos los motores.
Para este ejemplo, simplemente utilizamos más pines de Arduino para los servos adicionales. Sin embargo, esto significa que estás limitado a 12 servos cuando usas un Arduino Uno, y puede que no te queden suficientes pines para otros componentes.
Otra opción es utilizar uno o varios drivers PWM/servo PCA9685. Este controlador le permite controlar 16 servos con sólo 2 pines del Arduino mediante el uso de I2C. Adafruit también los vende en forma de escudo Arduino.
Debido a que la configuración de estos servocontroladores es un poco más difícil, voy a cubrir esto en un tutorial separado.
Código de ejemplo de Arduino con múltiples servos
Como puedes ver en el ejemplo de abajo, sólo tienes que crear más objetos de la clase Servo con diferentes nombres. Puedes dirigirte a cada servo utilizando el nombre correcto en la sección de configuración y bucle del código.
/* Arduino with multiple servos example code. More info: https://www.makerguides.com/ */ #include "Servo.h" Servo servo1; Servo servo2; Servo servo3; Servo servo4; Servo servo5; void setup() { servo1.attach(9); servo2.attach(10); servo3.attach(11); servo4.attach(12); servo5.attach(13); } void loop() { servo1.write(0); servo2.write(0); servo3.write(0); servo4.write(0); servo5.write(0); delay(2000); servo1.write(90); servo2.write(90); servo3.write(90); servo4.write(90); servo5.write(90); delay(1000); servo1.write(180); servo2.write(180); servo3.write(180); servo4.write(180); servo5.write(180); delay(1000); }
Especificaciones del servomotor
A continuación puede encontrar las especificaciones de algunos de los servomotores más populares del mercado. El fabricante original de estos servomotores es Tower Pro Pte Ltd. , pero también se pueden adquirir modelos similares de muchos otros proveedores.
Microservo analógico SG90
Pinout
Marrón | GND |
Rojo | VCC |
Amarillo | Señal (PWM) |
Especificaciones
Tensión de funcionamiento | 4.8 V |
Peso | 9 g |
Par de arranque | 1,8 kg/cm (4,8 V) |
Tipo de engranaje | Juego de engranajes POM |
Velocidad de funcionamiento | 0,12 seg/60° (4,8 V) |
Temperatura de funcionamiento | 0 - 55 °C |
Coste | Comprobar el precio |
Dimensiones
A | 34,5 mm |
B | 22,8 mm |
C | 26,7 mm |
D | 12,6 mm |
E | 32,5 mm |
F | 16 mm |
Microservo digital MG90S
Pinout
Marrón | GND |
Rojo | VCC |
Amarillo | Señal (PWM) |
Especificaciones
Tensión de funcionamiento | 4.8 V |
Peso | 13.4 g |
Par de arranque | 1,8 kg/cm (4,8 V), 2,2 kg/cm (6,6 V) |
Tipo de engranaje | Aluminio 6061-T6 |
Velocidad de funcionamiento | 0,10 seg/60° (4,8 V), 0,08 seg/60° (6,0 V) |
Temperatura de funcionamiento | 0 - 55 °C |
Coste | Comprobar el precio |
Dimensiones
A | 32,5 mm |
B | 22,8 mm |
C | 28,4 mm |
D | 12,4 mm |
E | 32,1 mm |
F | 18,5 mm |
Servo digital de alto par MG996R
Pinout
Marrón | GND |
Rojo | VCC |
Amarillo | Señal (PWM) |
Especificaciones
Tensión de funcionamiento | 4.8 - 6.6 V |
Consumo de corriente al ralentí | 10 mA |
Consumo de corriente en vacío | 170 mA |
Consumo de corriente de parada | 1400 mA |
Peso | 55 g |
Par de arranque | 9,4 kg/cm (4,8 V), 11 kg/cm (6,0 V) |
Tipo de engranaje | Engranaje metálico |
Velocidad de funcionamiento | 0,19 seg/60° (4,8 V), 0,15 seg/60° (6,0 V) |
Temperatura de funcionamiento | 0 - 55 °C |
Coste | Comprobar el precio |
Dimensiones
A | 42,7 mm |
B | 40,9 mm |
C | 37 mm |
D | 20 mm |
E | 54 mm |
F | 26,8 mm |
Conclusión
En este tutorial, te he mostrado cómo utilizar servomotores con Arduino. Hemos visto lo básico para controlar la posición y la velocidad de los servomotores, cómo controlar un servomotor con un potenciómetro y cómo controlar varios servomotores al mismo tiempo.
Espero que este artículo te haya resultado útil e informativo. Si es así, ¡compártalo con un amigo al que también le guste la electrónica y hacer cosas!
Me encantaría saber qué proyecto planeas construir o ya has construido con servomotores y el Arduino. Si tienes alguna pregunta, sugerencia, o si crees que faltan cosas en este tutorial, por favor deja un comentario abajo.
Tenga en cuenta que los comentarios son retenidos por la moderación para evitar el spam.
Esta obra está bajo una licencia de Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International License.
Otros enlaces útiles de la web:
Benne is professional Systems Engineer with a deep expertise in Arduino and a passion for DIY projects.
Lonnie
Wednesday 21st of June 2023
Thank you for the excellent tutorial and information. My project is a pet food dispenser to feed my dog when I am away all day. The servo would, at a scheduled time, open a door to allow Jumper access to his bowl of food. I subscribe to the KISS philosophy. It's all in my head for the moment. Your tutorial really helped me with size of the servo.
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
Colin Telfer
Domingo 18 de septiembre de 2022
Hola Benne Buena explicación detallada sobre los Servos, estoy particularmente interesado en el uso de las placas de servo controlador PCA9685 y el uso de los servos en cámara lenta, cualquier escala de tiempo en el tutorial propuesto Benne? La razón por la que lo pregunto es que tengo una maqueta de ferrocarril con JMRI que utiliza servos para los desvíos y otros accesorios (2 placas PCA9685 conectadas con I2C), que necesitan ser ralentizados ya que el movimiento repentino es demasiado duro y poco realista. Entiendo que el uso de Millis es necesario para no ralentizar el elemento "multitarea" del trazado, pero no soy lo suficientemente competente para entender y seguir esto en este momento, por lo que su tutorial sería una buena manera de seguir esto. Su ayuda en esto sería realmente apreciada no sólo por mí, sino que creo que otros en la fraternidad modelo de ferrocarril. Saludos Colin
robot frambuesa
Sábado 23 de julio de 2022
muy buena información instructiva. esto es todo lo que necesitas para usar cualquier servomotor con arduino.
grandes descripciones e ilustraciones
tnx
Ted Becker
Viernes 29 de enero de 2021
El diagrama de este tutorial está equivocado.
La anchura del pulso en un SG90 es la siguiente
.5 mSec = 0 Grados 1.0 mSec = 45 Grados 1,5 mSec = 90 Grados 2,0 mSec = 135 Grados 2,5 mSec = 180 Grados
Los ángulos son aproximados.
Vea los resultados que obtiene con myservo.writeMicroseconds(1000); myservo.writeMicroseconds(1500); myservo.writeMicroseconds(2000);
Sugiero a los autores que conecten realmente el circuito y lo prueben. Comprueben la anchura de los pulsos con un osciloscopio como hice yo.
Benne de Bakker
Viernes 29 de enero de 2021
Hola Ted,
Gracias por tu comentario. Como mencioné en el artículo, las posiciones mínima (o grados) y máxima (180 grados) del servo pueden variar según el tipo y la marca/fabricante. También, vea la sección bajo '¿Por qué mi servo gira un completo 0 - 180 grados?' donde explico cómo ajustar la sincronización mínima y máxima usando la función attach().
Benne