Manufactura industrial
Internet industrial de las cosas | Materiales industriales | Mantenimiento y reparación de equipos | Programación industrial |
home  MfgRobots >> Manufactura industrial >  >> Manufacturing Technology >> Proceso de manufactura

Cómo controlar servomotores con Arduino – Guía completa

En este tutorial aprenderemos cómo funcionan los servomotores y como controlar servomotores con Arduino . Los servomotores son muy populares y se usan ampliamente en muchos proyectos de Arduino porque son fáciles de usar y brindan un excelente control de posición.

Los servos son una excelente 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í:

Puede ver el siguiente video o leer el tutorial escrito a continuación. Incluye varios ejemplos de cómo usar un servomotor con Arduino, diagrama de cableado y códigos. Además, tiene una guía sobre cómo controlar múltiples servomotores con Arduino utilizando el controlador PCA9685 PWM.

¿Qué es servomotor?

Un servomotor es un sistema de circuito 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.

En los servomotores de tipo industrial, el sensor de retroalimentación de posición suele ser un codificador de alta precisión, mientras que en los servos RC o de hobby más pequeños, el sensor de posición suele ser un simple potenciómetro. La posición real capturada por estos dispositivos se retroalimenta al detector de errores donde se compara con la posición objetivo. Luego, de acuerdo con el error, el controlador corrige la posición real del motor para que coincida con la posición objetivo.

En este tutorial vamos a echar un vistazo detallado a los servomotores de hobby. Explicaremos cómo funcionan estos servos y cómo controlarlos usando Arduino.

Los servos de hobby son actuadores de tamaño pequeño que se utilizan para controlar coches, barcos, aviones, etc.

¿Cómo funcionan los servomotores?

Hay cuatro componentes principales dentro de un servo de hobby, un motor de CC, una caja de cambios, un potenciómetro y un circuito de control. El motor de CC es de alta velocidad y bajo par, pero la caja de cambios reduce la velocidad a alrededor de 60 RPM y al mismo tiempo aumenta el par.

El potenciómetro está conectado al engranaje final o al eje de salida, por lo que a medida que el motor gira, el potenciómetro también gira, produciendo así un voltaje que está relacionado con el ángulo absoluto del eje de salida. En el circuito de control, este voltaje del potenciómetro se compara con el voltaje 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.

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 pulso cada 20 ms. El ancho del pulso determina la posición angular del servo y este tipo de servos generalmente pueden girar 180 grados (tienen límites físicos de recorrido).

Generalmente, los pulsos con una duración de 1 ms corresponden a la posición de 0 grados, una duración de 1,5 ms a 90 grados y una duración de 2 ms a 180 grados. Aunque la duración mínima y máxima de los pulsos a veces puede variar con diferentes marcas y pueden ser de 0,5 ms para 0 grados y 2,5 ms para una posición de 180 grados.

Popular RC / Hobby Servos para proyectos Arduino

Hay muchos modelos y fabricantes diferentes de RC o hobby. La principal consideración al elegir un servomotor es su par, voltaje de funcionamiento, consumo de corriente y tamaño.

Estos son los dos modelos de servo más populares entre los fabricantes, el SG90 Micro Servo y el MG996R.

Microservo SG90 especificaciones técnicas:

Par de parada 1,2 kg·cm a 4,8 V, 1,6 kg·cm a 6 V,
Voltaje de funcionamiento 3.5 – 6V
Sin corriente de carga 100mA
Actual estancada 650mA
Velocidad máxima 60 grados en 0,12 s
Peso 9g

Servomotor MG996R especificaciones técnicas:

Par de parada 11kg.cm @4.8v, 13kg.cm @6V
Voltaje de funcionamiento 4.8 – 7.2V
Sin corriente de carga 220mA @4.8V, 250mA @6V
Actual estancada 650mA
Velocidad máxima 60 grados en 0,20 s
Peso 55g

Control de servomotor Arduino

Pongamos a prueba lo dicho anteriormente y hagamos un ejemplo práctico de cómo controlar un servo de hobby usando Arduino. Usaré el MG996R, que es un servo de alto par con engranajes metálicos con un par de parada de 10 kg-cm. El alto par tiene un precio y esa es la corriente de bloqueo del servo que es 2.5A. La corriente de funcionamiento es de 500 mA a 900 mA y el voltaje de funcionamiento es de 4,8 a 7,2 V.

Las clasificaciones actuales indican que no podemos conectar directamente este servo al Arduino, pero debemos usar una fuente de alimentación separada para ello.

Diagrama del circuito

Aquí está el diagrama del circuito para este ejemplo.

Simplemente necesitamos conectar el pin de control del servo a cualquier pin digital de la placa Arduino, conectar la tierra y los cables positivos a la fuente de alimentación externa de 5 V y también conectar la tierra Arduino a la tierra del servo.

En caso de que usemos un servo de hobby más pequeño, el S90 Micro Servo, es posible alimentarlo directamente desde el pin Arduino de 5V.

El S90 Micro Servo tiene un consumo de corriente más bajo, alrededor de 100-200 mA de corriente de funcionamiento sin carga, pero alrededor de 500-700 mA de corriente de bloqueo. Por otro lado, el pin de 5 V de Arduino puede emitir solo alrededor de 500 mA si se alimenta a través de USB, o hasta 1 A si se alimenta a través del conector de barril.

Aunque es posible ejecutar estos servomotores 9g directamente en Arduino, para un trabajo más estable, sugeriría usar siempre una fuente de alimentación externa para ellos.

Puede obtener los componentes necesarios para este ejemplo en los siguientes enlaces:

  • Servomotor MG996R ………………………….
  • o S90 MicroServo ………..……………………
  • Placa Arduino …………………………………….
  • Fuente de alimentación de CC de 5 V, 2 A …………………..…..

Código Arduino de control de servomotor

Ahora echemos un vistazo al código Arduino para controlar el servomotor. El código es muy simple. Solo necesitamos definir el pin al que se conecta el servo, definir ese pin como una salida y, en la sección de bucle, generar pulsos con la duración y frecuencia específicas como explicamos anteriormente.

/*
     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, obtuve los siguientes valores para la duración de los pulsos que funcionan con mi servo. Los pulsos con una duración de 0,6 ms correspondieron 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.63A en el estancamiento. Bueno, eso es porque este no es el servo TowerPro MG996R original, sino una réplica más barata, que obviamente tiene peor rendimiento.

Sin embargo, echemos un vistazo a una forma más conveniente de controlar servos usando Arduino. Eso es usar la biblioteca de servos de Arduino.

/*
     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 del servo y, mediante la función adjuntar (), definir el pin al que está conectado el servo y definir los valores mínimo y máximo de la duración de los pulsos. Luego, usando la función write(), simplemente establecemos la posición del servo de 0 a 180 grados.

Control de múltiples servomotores con Arduino

La biblioteca de servos Arduino admite el control de hasta 12 servos al mismo tiempo 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í hay un código de ejemplo para controlar múltiples servos:

/*
     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, solo tenemos que 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 puede consultar mi proyecto Arduino Ant Hexapod Robot en el que utilicé una placa Arduino MEGA para controlar 22 servomotores.

Arduino y PCA9685 PWM/ Servocontrolador

También hay otra forma de controlar los servos con Arduino, y es usando el servocontrolador PCA9685. Este es un PWM de 16 canales y 12 bits y un servocontrolador que se comunica con Arduino mediante el bus I2C. Tiene un reloj incorporado para que pueda manejar 16 servos de forma libre o independientemente de Arduino.

Lo que es aún mejor, podemos conectar en cadena hasta 62 de estos controladores en un solo bus I2C. Entonces, en teoría, podemos controlar hasta 992 servos usando solo los dos pines I2C de la placa Arduino. Los 6 pines de selección de dirección se utilizan para configurar diferentes direcciones I2C para cada controlador adicional. Solo necesitamos conectar las almohadillas de soldadura de acuerdo con esta tabla.

Aquí está el esquema del circuito y podemos notar una vez más que necesitamos una fuente de alimentación separada para los servos.

Puede obtener los componentes necesarios para este ejemplo en los siguientes enlaces:

  • Servomotor MG996R ………………………….
  • Servocontrolador PCA9685 PWM  ……………….
  • Placa Arduino …………………………………….
  • Fuente de alimentación de CC de 5 V y 6 A …………………..…..

Ahora echemos un vistazo al código de Arduino. Para controlar este servocontrolador, utilizaremos la biblioteca PCA9685 que se puede descargar desde 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)

Entonces, primero debemos incluir las bibliotecas y definir el objeto PCA9685. Luego, utilizando la instancia Servo_Evaluator, defina la duración de los pulsos o la salida PWM del controlador. Tenga en cuenta que las salidas son de 12 bits, o esa es una resolución de 4096 pasos. Por lo tanto, la duración mínima del pulso de 0,5 ms o la posición de 0 grados correspondería a 102 pasos, y la duración máxima del pulso de 2,5 ms o la posición de 180 grados correspondería a 512 pasos. Pero como se explicó anteriormente, estos valores deben ajustarse de acuerdo con 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, debemos definir la frecuencia del reloj I2C, establecer la dirección del controlador y establecer la frecuencia en 50 Hz.

En la sección de bucle, usando setChannelPWM() y pwmForAngle() funciones simplemente configuramos el servo en el ángulo deseado.

Conecté un segundo servo al driver, y como esperaba, no estaba posicionado igual que el primero, y eso es porque los servos que estoy usando son copias baratas y no son tan confiables. Sin embargo, esto no es un gran problema porque usar el Servo_Evaluator Por ejemplo, podemos establecer diferentes configuraciones de salida para cada servo. También podemos ajustar la posición de 90 grados en caso de que no esté precisamente en el medio. De esa manera, todos los servos funcionarán de la misma manera y se colocarán en el ángulo exacto.

Controlando muchos servos con Arduino y los controladores PCA9685

Echaremos un vistazo a un ejemplo más y eso es controlar muchos servos con múltiples controladores PCA9685 encadenados.

Para ese propósito, necesitamos conectar los controladores entre sí y conectar las almohadillas de soldadura de selección de dirección apropiada. Aquí está el esquema del circuito:

Echemos un vistazo al código de Arduino 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 simplemente usando las funciones setChannelPWM() y pwmForAngle() podemos configurar cualquier servo en cualquier controlador para posicionar cualquier ángulo que queramos.

Resolución de problemas

El servomotor tiembla y restablece mi placa Arduino

Este es un problema común con estos servomotores para aficionados, el SG90 Micro Servo y el MG996R. La razón de esto es que, como se mencionó anteriormente, pueden consumir una cantidad bastante significativa de corriente cuando están bajo carga. Esto puede hacer que la placa Arduino se reinicie, especialmente si está alimentando el servo directamente desde el pin Arduino 5V.

Para resolver este problema, puede usar un capacitor a través de GND y el pin de 5V. Actuará como un condensador de desacoplamiento que proporcionará corriente adicional al sistema en el arranque cuando arranque el motor de CC.

El servomotor no moverá todo el rango de 0 a 180 grados

Este es otro problema común con estos servos de hobby. Como explicamos anteriormente, un ancho de pulso de 1 ms (0,5 ms) corresponde a una posición de 0 grados y 2 ms (2,5 ms) a 180 grados. Sin embargo, estos valores pueden variar de servo a servo y entre diferentes fabricantes.

Para resolver este problema, necesitamos ajustar el ancho de pulso que enviamos al servomotor con el Arduino. Afortunadamente, con la biblioteca Arduino Servo podemos ajustar fácilmente los valores de ancho de pulso en attach() función.

El adjuntar() La función puede tomar dos parámetros adicionales, y ese es 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, al ajustar estos valores, podemos afinar el rango de momento del servo.

  myservo.attach(9,600,2300);  // (pin, min, max)Code language: Arduino (arduino)

Dimensiones y Modelo 3D

Hice modelos 3D de los dos servomotores más populares, el SG90 Micro Servo y el servomotor MG996R. Puede descargarlos desde los enlaces a continuación.

Microservo SG90

Modelo 3D:Descargar desde Thangs.

Dimensiones:

Servomotor MG996R

Modelo 3D del servomotor MG996R:descarga desde Thangs.

Dimensiones:

Conclusión

Entonces, hemos cubierto casi todo lo que necesitamos saber sobre el uso de servomotores con Arduino. Por supuesto, hay muchos fabricantes y modelos de este tipo de servomotores RC o de hobby, y cada uno de ellos tiene sus propias características únicas que pueden diferir de lo que explicamos anteriormente.

Las posibilidades para crear increíbles proyectos de robótica, automatización y RC utilizando motores son infinitas, sin embargo, elegir el modelo adecuado para su aplicación es muy importante.

Espero que hayas disfrutado este tutorial y hayas aprendido algo nuevo. Siéntase libre de hacer cualquier pregunta en la sección de comentarios a continuación, y asegúrese de que puede ver mi colección de proyectos de Arduino.

Preguntas frecuentes (FAQ)

¿Cómo uso un servomotor con Arduino?

Usar un servomotor con Arduino es bastante fácil. El servomotor tiene solo 3 cables, dos de los cuales son GND y 5V para alimentación, y el tercer cable es la línea de control que va a la placa Arduino.

¿Arduino puede ejecutar servomotores?

Podemos ejecutar servomotores directamente desde Arduino, pero es posible que tengamos problemas de energía. Si el servomotor consume más de 500 mA de corriente, la placa Arduino podría perder su potencia y reiniciarse. Es mejor utilizar siempre una fuente de alimentación independiente para los servomotores.

¿Cuántos servomotores puede controlar un Arduino?

Con 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, necesitamos usar una fuente de alimentación dedicada para los servomotores.


Proceso de manufactura

  1. Controlar el aceptador de monedas con Arduino
  2. Obstáculos que evitan el robot con servomotor
  3. ¡Arduino con Bluetooth para controlar un LED!
  4. Arduino Nano:Controla 2 motores paso a paso con joystick
  5. Control del servomotor con Arduino y MPU6050
  6. ThimbleKrox - Control del mouse con los dedos
  7. Cómo hacer música con un Arduino
  8. Cómo utilizar NMEA-0183 con Arduino
  9. Controla una cucaracha con Arduino por menos de $ 30
  10. Cómo soldar aluminio:una guía completa
  11. Cómo funciona un embrague:una guía completa