¿Alguna vez has querido controlar servomotores con Arduino pero no sabías por dónde empezar? ¡No te preocupes más! En esta guía completa te enseñaremos paso a paso cómo controlar servomotores con Arduino de forma sencilla y efectiva. Desde qué materiales necesitas hasta cómo programar tu Arduino, ¡todo lo que necesitas saber está aquí! ¡Sigue leyendo para convertirte en un experto en el control de servomotores con Arduino!
En este tutorial aprenderemos Cómo funcionan los servomotores y como controlar servomotores arduino. Los servomotores son muy populares y ampliamente utilizados en muchos proyectos Arduino porque son fáciles de usar y proporcionan un excelente control de posición.
Los servos son una buena opción para proyectos de robótica, automatización, modelos RC, etc. Ya los he usado en muchos de mis proyectos Arduino y puedes ver algunos de ellos aquí:
- Brazo robot DIY Arduino con control por teléfono inteligente
- Robot hexápodo hormiga Arduino
- Aerodeslizador RC basado en Arduino DIY
- Robot SCARA | Cómo construir tu propio robot basado en Arduino
- Réplica de bricolaje del Mars Rover Perseverance: proyecto basado en Arduino
Puede ver el vídeo a continuación o leer el tutorial escrito a continuación. Contiene varios ejemplos del uso de un servomotor con Arduino, esquemas y códigos. Además, incluye instrucciones sobre cómo controlar múltiples servomotores con Arduino utilizando el controlador PWM PCA9685.
¿Qué es un servomotor?
Un servomotor es un sistema cerrado que controla su movimiento y su posición final mediante retroalimentación de posición. Existen muchos tipos de servomotores y su característica principal es la capacidad de controlar con precisión la posición de su eje.
En>
En>
Los>
¿Cómo funcionan los servomotores?
Un servo aficionado consta de cuatro componentes principales: un motor de CC, una caja de cambios, un potenciómetro y un circuito de control. El motor de CC tiene alta velocidad y bajo par, pero la caja de cambios reduce la velocidad a aproximadamente 60 rpm mientras aumenta el par.
El>
Un servomotor se controla enviando una serie de pulsos a través de la línea de señal. La frecuencia de la señal de control debe ser de 50 Hz o debe producirse un impulso cada 20 ms. El ancho del pulso determina la posición angular del servo y este tipo de servos normalmente pueden girar 180 grados (tienen límites de movimiento físico).
En>
Leer más: Motores paso a paso y Arduino: la guía definitiva
Servos RC/hobby populares para proyectos Arduino
Hay muchos modelos y fabricantes diferentes para modelos RC o hobby. Las consideraciones más importantes al seleccionar un servomotor son el par, el voltaje de funcionamiento, el consumo de corriente y el tamaño.
Estos son los dos modelos de servo más populares entre los fabricantes, el SG90 Micro Servo y el MG996R.
microservo> Especificaciones técnicas:
momento de inclinación | 1,2 kg cm a 4,8 V, 1,6 kg cm a 6 V, |
Tensión de funcionamiento | 3,5-6V |
corriente de reposo | 100mA |
Corriente parada | 650mA |
Velocidad máxima | 60 grados en 0,12 s |
Peso | 9g |
ServoMG996R Especificaciones técnicas:
momento de inclinación | 11 kg.cm a 4,8 V, 13 kg.cm a 6 V |
Tensión de funcionamiento | 4,8 – 7,2 V |
corriente de reposo | 220 mA a 4,8 V, 250 mA a 6 V |
Corriente parada | 650mA |
Velocidad máxima | 60 grados en 0,20 s |
Peso | 55g |
Controlador de servomotor Arduino
Probemos lo anterior y hagamos un ejemplo práctico de cómo controlar un servo aficionado con Arduino. Usaré el MG996R, un servo de alto torque con engranajes metálicos con un torque de pérdida de 10 kg-cm. El alto par tiene un precio, y ese es la corriente de parada del servo, que es de 2,5 A. La corriente de funcionamiento está entre 500 mA y 900 mA y el voltaje de funcionamiento está entre 4,8 y 7,2 V.
Las>
diagrama de circuito
Aquí está el esquema de este ejemplo.
Simplemente>
Si utilizamos un servo hobby más pequeño, el S90 Micro Servo, es posible alimentarlo directamente desde el pin Arduino de 5V.
El>
Aunque es posible alimentar estos servomotores 9g directamente con Arduino, para un funcionamiento más estable recomendaría utilizar siempre una fuente de alimentación externa para ellos.
Puede obtener los componentes necesarios para este ejemplo a través de los siguientes enlaces:
- Servomotor MG996R …………………………. Amazon / Banggood / AliExpress
- o microservo S90…………..…………………… Amazonas / Banggood / AliExpress
- Placa Arduino……………………………………. Amazon / Banggood / AliExpress
- Fuente de alimentación de 5V 2A CC………………..….. Amazon / Banggood / AliExpress
Divulgación: estos son enlaces de afiliados. Como asociado de Amazon, gano con compras que califican.
Ver también
Tutorial de control de motores sin escobillas con Arduino |
Código Arduino para control de servomotores.
Ahora veamos el código Arduino para controlar el servomotor. El código es muy simple. Sólo necesitamos definir el pin al que está conectado el servo, definir este pin como salida y generar pulsos en la sección del bucle con la duración y frecuencia específicas como explicamos antes.
/*
Servo Motor Control - 50Hz Pulse Train Generator
by Dejan, https://howtomechatronics.com
*/
#define servoPin 9
void setup() {
pinMode(servoPin, OUTPUT);
}
void loop() {
// A pulse each 20ms
digitalWrite(servoPin, HIGH);
delayMicroseconds(1450); // Duration of the pusle in microseconds
digitalWrite(servoPin, LOW);
delayMicroseconds(18550); // 20ms - duration of the pusle
// Pulses duration: 600 - 0deg; 1450 - 90deg; 2300 - 180deg
}
Code language: Arduino (arduino)
Después de algunas pruebas se me ocurrieron los siguientes valores para la duración de los pulsos que funcionan con mi servo. Los impulsos con una duración de 0,6 ms corresponden a la posición de 0 grados, 1,45 ms a 90 grados y 2,3 ms a 180 grados.
Conecté un multímetro en serie con el servo para verificar el consumo de corriente. El consumo de corriente máximo que noté fue de hasta 0,63 A mientras estaba parado. Esto se debe a que no es el servo TowerPro MG996R original, sino una réplica más barata que obviamente tiene peor rendimiento.
Sin>
/*
Servo Motor Control using the Arduino Servo Library
by Dejan, https://howtomechatronics.com
*/
#include <Servo.h>
Servo myservo; // create servo object to control a servo
void setup() {
myservo.attach(9,600,2300); // (pin, min, max)
}
void loop() {
myservo.write(0); // tell servo to go to a particular angle
delay(1000);
myservo.write(90);
delay(500);
myservo.write(135);
delay(500);
myservo.write(180);
delay(1500);
}
Code language: Arduino (arduino)
Aquí solo necesitamos incluir la biblioteca, definir el objeto servo y usar la función adjuntar() para definir el pin al que está conectado el servo, así como establecer los valores mínimo y máximo de la duración del pulso. Luego simplemente configuramos la posición del servo de 0 a 180 grados usando la función “write()”.
Ver también
Brazo robot DIY Arduino con control por teléfono inteligente
Controlando múltiples servomotores con Arduino
La biblioteca Arduino Servo admite el control simultáneo de hasta 12 servos con la mayoría de las placas Arduino y 48 servos con la placa Arduino Mega. Además, controlar varios servomotores con Arduino es tan fácil como controlar uno solo.
Aquí>
/*
Controlling multiple servo motors with Arduino
by Dejan, https://howtomechatronics.com
*/
#include <Servo.h>
Servo servo1;
Servo servo2;
Servo servo3;
Servo servo4;
Servo servo5;
void setup() {
servo1.attach(8);
servo2.attach(9);
servo3.attach(10);
servo4.attach(11);
servo5.attach(12);
}
void loop() {
// move all servos to position 0
servo1.write(0);
servo2.write(0);
servo3.write(0);
servo4.write(0);
servo5.write(0);
delay(2000);
// move all servos to position 90
servo1.write(90);
servo2.write(90);
servo3.write(90);
servo4.write(90);
servo5.write(90);
delay(2000);
// move all servos to position 180
servo1.write(180);
servo2.write(180);
servo3.write(180);
servo4.write(180);
servo5.write(180);
delay(2000);
}
Code language: Arduino (arduino)
Entonces todo lo que tenemos que hacer es crear objetos de la clase Servo para cada servomotor y definir a qué pin Arduino está conectado. Por supuesto, podemos configurar cualquier servo para que se mueva a cualquier posición en cualquier momento.
Como ejemplo, también puedes consultar mi proyecto Arduino Ant Hexapod Robot donde utilicé una placa Arduino MEGA para controlar 22 servomotores.
Controladores servo/PWM Arduino y PCA9685
También hay otra forma de controlar los servos con Arduino y es utilizar el servocontrolador PCA9685. Este es un servocontrolador y PWM de 12 bits y 16 canales que se comunica con Arduino a través del bus I2C. Tiene un reloj incorporado por lo que puede controlar 16 servos de forma libre o independiente de Arduino.
Lo>
Aquí>
Puede>
- Servomotor MG996R …………………………. Amazon / Banggood / AliExpress
- Servocontrolador PCA9685 PWM………………. Amazon / Banggood / AliExpress
- Placa Arduino……………………………………. Amazon / Banggood / AliExpress
- Fuente de alimentación de 5V 6A CC………………..….. Amazon / Banggood / AliExpress
Divulgación: estos son enlaces de afiliados. Como asociado de Amazon, gano con compras que califican.
Ahora veamos el código Arduino. Para controlar este servocontrolador utilizamos la biblioteca PCA9685 que se puede descargar aquí: GitHub.
Código Arduino y PCA9685
/*
Servo Motor Control using Arduino and PCA9685 Driver
by Dejan, https://howtomechatronics.com
Library: https://github.com/NachtRaveVL/PCA9685-Arduino
*/
#include <Wire.h>
#include "PCA9685.h"
PCA9685 driver;
// PCA9685 outputs = 12-bit = 4096 steps
// 2.5% of 20ms = 0.5ms ; 12.5% of 20ms = 2.5ms
// 2.5% of 4096 = 102 steps; 12.5% of 4096 = 512 steps
PCA9685_ServoEvaluator pwmServo(102, 470); // (-90deg, +90deg)
// Second Servo
// PCA9685_ServoEvaluator pwmServo2(102, 310, 505); // (0deg, 90deg, 180deg)
void setup() {
Wire.begin(); // Wire must be started first
Wire.setClock(400000); // Supported baud rates are 100kHz, 400kHz, and 1000kHz
driver.resetDevices(); // Software resets all PCA9685 devices on Wire line
driver.init(B000000); // Address pins A5-A0 set to B000000
driver.setPWMFrequency(50); // Set frequency to 50Hz
}
void loop() {
driver.setChannelPWM(0, pwmServo.pwmForAngle(-90));
delay(1000);
driver.setChannelPWM(0, pwmServo.pwmForAngle(0));
delay(1000);
driver.setChannelPWM(0, pwmServo.pwmForAngle(90));
delay(1000);
}
Code language: Arduino (arduino)
Primero debemos incluir las bibliotecas y definir el objeto PCA9685. Luego, usando la instancia Servo_Evaluator, definimos la duración del pulso o salida PWM del controlador. Tenga en cuenta que las salidas son de 12 bits, lo que corresponde a una resolución de 4096 pasos. La duración mínima del pulso de 0,5 ms o posición de 0 grados correspondería a 102 pasos y la duración máxima del pulso de 2,5 ms o posición de 180 grados correspondería a 512 pasos. Pero como ya se explicó, estos valores deben ajustarse según su servomotor. Tenía un valor de 102 a 470, que correspondía a una posición de 0 a 180 grados.
En la sección de configuración necesitamos definir la velocidad del reloj I2C, configurar la dirección del controlador y configurar la frecuencia a 50Hz.
En el área del bucle se utiliza el establecerCanalPWM() Y pwmForAngle() Simplemente ajustamos el servo al ángulo deseado.
Conecté un segundo servo al controlador y como era de esperar no se posicionó de la misma manera que el primero, y eso se debe a que los servos que uso son copias baratas y no tan confiables. Sin embargo, esto no es un gran problema ya que usar el Servo_Evaluador Por ejemplo, podemos establecer diferentes configuraciones de salida para cada servo. También podemos ajustar la posición de 90 grados si no está exactamente en el medio. De esta manera todos los servos funcionan igual y se posicionan en el ángulo exacto.
Controlando muchos servos con Arduino y los controladores PCA9685
Veremos otro ejemplo, controlando muchos servos con múltiples controladores PCA9685 encadenados.
Para>
Ahora>
/*
Servo Motor Control using Arduino and PCA9685 Driver
by Dejan, https://howtomechatronics.com
Library: https://github.com/NachtRaveVL/PCA9685-Arduino
*/
#include <Wire.h>
#include "PCA9685.h"
PCA9685 driver;
// PCA9685 outputs = 12-bit = 4096 steps
// 2.5% of 20ms = 0.5ms ; 12.5% of 20ms = 2.5ms
// 2.5% of 4096 = 102 steps; 12.5% of 4096 = 512 steps
PCA9685_ServoEvaluator pwmServo(102, 470); // (-90deg, +90deg)
// Second Servo
PCA9685_ServoEvaluator pwmServo2(102, 310, 505); // (0deg, 90deg, 180deg)
void setup() {
Wire.begin(); // Wire must be started first
Wire.setClock(400000); // Supported baud rates are 100kHz, 400kHz, and 1000kHz
driver.resetDevices(); // Software resets all PCA9685 devices on Wire line
driver.init(B000000); // Address pins A5-A0 set to B000000
driver.setPWMFrequency(50); // Set frequency to 50Hz
}
void loop() {
driver.setChannelPWM(0, pwmServo.pwmForAngle(-90));
delay(1000);
driver.setChannelPWM(0, pwmServo.pwmForAngle(0));
delay(1000);
driver.setChannelPWM(0, pwmServo.pwmForAngle(90));
delay(1000);
}
Code language: Arduino (arduino)
Por lo tanto, debemos crear un objeto PCA9685 separado para cada controlador, definir las direcciones para cada controlador y establecer la frecuencia en 50 Hz. Ahora podemos configurar cada servo en cada controlador para posicionar cualquier ángulo que queramos usando las funciones setChannelPWM() y pwmForAngle().
Solución de problemas
El servomotor sacude y reinicia mi placa Arduino
Este es un problema común con estos servomotores aficionados, el SG90 Micro Servo y el MG996R. La razón de esto es que, como se mencionó anteriormente, pueden consumir una cantidad bastante grande de corriente bajo carga. Esto puede hacer que la placa Arduino se reinicie, especialmente si alimenta el servo directamente desde el pin de 5 V del Arduino.
Para solucionar este problema puedes utilizar un condensador entre GND y el pin de 5V. Actúa como un condensador de desacoplamiento que proporciona energía adicional al sistema en el arranque cuando arranca el motor de CC.
El servomotor no se mueve en el rango de 0 a 180 grados
Este es otro problema común con estos servos aficionados. Como explicamos, un ancho de pulso de 1 ms (0,5 ms) corresponde a una posición de 0 grados y 2 ms (2,5 ms) corresponde a una posición de 180 grados. Sin embargo, estos valores pueden variar de un servo a otro y entre diferentes fabricantes.
Para solucionar este problema necesitamos ajustar el ancho de pulso que enviamos al servomotor usando el Arduino. Por suerte, con la biblioteca Arduino Servo podemos obtener los valores de ancho de pulso en el adjuntar() Función.
El adjuntar() La función puede tomar dos parámetros adicionales, a saber, el ancho de pulso mínimo y máximo en microsegundos. Los valores predeterminados son 544 microsegundos (0,544 milisegundos) para el ángulo mínimo (0 grados) y 2400 microsegundos (2,4 ms). Entonces, ajustando estos valores podemos ajustar el rango de torque del servo.
myservo.attach(9,600,2300); // (pin, min, max)
Code language: Arduino (arduino)
Dimensiones y modelo 3D.
Creé modelos 3D de los dos servomotores más populares, el Micro Servo SG90 y el Servo Motor MG996R. Puede descargarlos desde los enlaces a continuación.
microservo SG90
modelo>Descargar desde Thangs.
Dimensiones:
ServomotorMG996R
Modelo>Descargar desde Thangs.
Dimensiones:
Diploma
Con esto, hemos cubierto casi todo lo que necesitamos saber sobre el uso de servomotores con Arduino. Por supuesto, existen muchos fabricantes y modelos de este tipo de servomotor hobby o RC, y cada uno de ellos tiene sus propias características únicas que pueden diferir de las explicadas anteriormente.
Las posibilidades para crear grandes proyectos de robótica, automatización y RC con motores son infinitas. Sin embargo, es muy importante seleccionar el modelo correcto para su aplicación.
Espero que hayas disfrutado este tutorial y hayas aprendido algo nuevo. No dude en hacer sus preguntas en la sección de comentarios a continuación y también consulte mi colección de proyectos Arduino.
Preguntas frecuentes (FAQ)
Usar un servomotor con Arduino es bastante sencillo. El servomotor solo tiene tres cables, dos de los cuales son GND y 5V para fuente de alimentación y el tercer cable es la línea de control que va a la placa Arduino.
Podemos controlar servomotores directamente desde Arduino, pero puede haber problemas de energía. Si el servomotor consume más de 500 mA de corriente, la placa Arduino puede perder energía y reiniciarse. Es mejor utilizar siempre una fuente de alimentación independiente para los servomotores.
Usando la biblioteca Arduino Servo, podemos controlar hasta 12 servomotores con la mayoría de las placas Arduino y hasta 48 servomotores con la placa Arduino Mega. Por supuesto, tenemos que utilizar nuestra propia fuente de energía para los servomotores.
Cómo controlar servomotores con Arduino – Guía completa
En este completo tutorial aprenderemos cómo funcionan los servomotores y cómo controlarlos con Arduino. Los servomotores son muy populares y ampliamente utilizados en muchos proyectos de Arduino porque son fáciles de usar y proporcionan un gran control de posición. Los servos son una excelente elección para proyectos de robótica, automatización, modelos RC, entre otros.
¿Qué es un servomotor?
Un servomotor es un sistema de bucle cerrado que utiliza retroalimentación de posición para controlar su movimiento y posición final. Hay muchos tipos de servomotores, y su característica principal es la capacidad de controlar con precisión la posición de su eje. Las principales características de los servos de aficionados incluyen un motor de CC de alta velocidad, una caja de engranajes, un potenciómetro y un circuito de control.
¿Cómo funcionan los servomotores?
En los servomotores de aficionados, el potenciómetro está unido al engranaje final o al eje de salida, por lo que a medida que el motor gira, el potenciómetro también gira, produciendo una tensión que está relacionada con el ángulo absoluto del eje de salida. En el circuito de control, esta tensión del potenciómetro se compara con la tensión proveniente de la línea de señal. Si es necesario, el controlador activa un puente H integrado que permite que el motor gire en cualquier dirección hasta que las dos señales alcancen una diferencia de cero.
¿Cómo controlar un servomotor con Arduino?
Controlar un servomotor con Arduino es bastante sencillo. Solo necesitamos definir el pin al que está conectado el servo, definir ese pin como una salida y, en la sección de bucle, generar pulsos con una duración y frecuencia específicas. Para controlar múltiples servomotores, podemos utilizar la biblioteca de servos de Arduino, que permite controlar hasta 12 servos con la mayoría de las placas de Arduino y hasta 48 servos con la placa Arduino Mega.
Conclusiones
En resumen, hemos cubierto casi todo lo que necesitamos saber sobre el uso de servomotores con Arduino. Aunque hay muchos fabricantes y modelos de estos servomotores de hobby o RC, cada uno con características únicas, las posibilidades de crear increíbles proyectos de robótica, automatización y RC son infinitas. Es importante elegir el modelo adecuado para tu aplicación.
Espero que hayas disfrutado este tutorial y aprendido algo nuevo. No dudes en hacer cualquier pregunta en la sección de comentarios. ¡Asegúrate también de explorar mi Colección de Proyectos de Arduino para inspirarte aún más en tus creaciones!
Preguntas frecuentes (FAQs)
- ¿Cómo usar un servomotor con Arduino?
- ¿Puede Arduino controlar servomotores?
- ¿Cuántos servomotores puede controlar Arduino?
Siempre es recomendable usar una fuente de alimentación separada para los servomotores para evitar problemas de energía con la placa Arduino.
Este tutorial detallado te ayudará a comprender mejor cómo funciona y cómo controlar servomotores con Arduino. ¡Empieza a crear tus propios proyectos hoy mismo!
¡Increíble guía! Me dejó todo bien claro sobre cómo controlar los servomotores con Arduino. ¡Gracias por compartir esta información tan útil! 🤖👏
¡Qué buena guía! Ahora me siento mucho más seguro de cómo controlar los servomotores con Arduino. ¡Gracias por la ayuda! 🤖🙌
¡Genial artículo! La explicación fue súper clara y me ayudó un montón a entender cómo controlar servomotores con Arduino. ¡Mil gracias por compartir la guía! 🤖👏
¡Excelente artículo! Muy fácil de entender, me sirvió un montón para controlar mis servomotores con Arduino. ¡Gracias! 🤖👍
¡Buena guía! Me ayudó un chorro a dominar el control de los servomotores con Arduino. ¡Gracias por la info! 🤖👌