Haga clic para más productos.
No se encontraron productos.

Tutorial uso de servomotores con arduino.

303014

En este tutorial se explicará el funcionamiento y características de un servomotor, los diferentes tipos que existen y como programar uno o varios servos.

Un servomotor o comúnmente llamado servo, es un motor DC con la capacidad de ubicar su eje en una posición o ángulo determinado, internamente tiene una caja reductora la cual le aumenta el torque y reduce la velocidad, un potenciómetro encargado de sensar la posición del eje y una pequeña tarjeta electrónica que junto al potenciómetro forman un control de lazo cerrado.

 Partes de un servomotor

  

En el mercado existen diferentes modelos de servomotores, la principal diferencia entre ellos es el torque. Este punto es bueno tenerlo claro para elegir el servomotor adecuado. Es mejor elegir un servo con torque superior al que requerimos, pues el consumo de corriente es proporcional a la carga. En cambio sí sometemos un servomotor a cargas superiores a su torque, corremos el riesgo de malograr tanto la parte mecánica (engranes) y eléctrica del servo, incluso podemos generar ruido en la fuente.

 

 

Servomotor

Modelo

Voltaje

Torque

servo SG90

SG90

3V-7.2V

1-1.6 Kg/cm

SG-5010

SG-5010

4.8V-6V

3.5K-6.5 Kg/cm

MG995

MG995

4.8V – 7.2V

8.5-10 kg/cm

MG946

MG946

4.8V – 7.2V

10.5-14 Kg/cm

RDS3115

RDS3115

5V – 7.2V

13.5- 15Kg/cm

Todos los servos usados para robótica, tiene un conector de 3 cables. VCC (rojo), GND (Marrón) y Señal (Naranja):

 Conector servo

  

La señal o dato que hay que enviarle al servo es una señal de PWM donde el tiempo en alto es equivalente al ángulo o posición del servo. Estos valores pueden variar y van desde 0.5 a 1 milisegundo para la posición 0° y 2 a 2.4 milisegundos para la posición de 180°, el periodo de la señal debe ser cercano a 20 milisegundos.

 Señal pwm servo

 

Librería servo de Arduino

El IDE Arduino trae una librería completa para el control de servomotores, la documentación completa lo encontramos en su página oficial: Servo Library

Expliquemos brevemente las funciones de la librería.

La biblioteca Servo admite hasta 12 motores en la mayoría de las placas Arduino y 48 en el Arduino Mega. En las placas que no sean los de Mega, el uso de la biblioteca desactiva la funcionalidad PWM en las patillas 9 y 10. En el Arduino Mega, hasta 12 servos pueden ser utilizados sin interferir con la funcionalidad PWM, pero si se usan de 12 a 23 motores desactivará el PWM en los pines 11 y 12.

A continuación se muestran las funciones de la librería Servo:

attach(Pin)

Establece el pin indicado en la variable servo. Ej:  servo.attach(3);

attach(Pin,min,max)

Establece el pin indicado en la variable servo, considerando min el ancho de pulso para la posición 0° y máx. el ancho de pulso para 180°.Ej:  servo.attach(3,900,2100);

write(angulo)

Envía la señal correspondiente al servo para que se ubique en el ángulo indicado, ángulo es un valor entre 0 y 180°. Ej: servo.write(45);

writeMicroseconds(tiempo)

Envía al servo el ancho de pulso=tiempo en microsegundos. Ej: servo.writeMicroseconds(1500);

read()

Lee la posición actual del servo, devuelve un valor entre 0 y 180. Ej: angulo=servo.read();

attached(Pin)

Verifica si la variable servo está unido al pin indicado, devuelve true o false. Ej: if(servo.attached(3));

detach(pin)

Separa la variable Servo del pin indicado. Ej: servo.detach(3);

  

Explicado lo anterior empecemos con la parte práctica realizando algunos ejemplos.

1. Control de un servomotor por ángulo:

Para esto realizaremos las siguientes conexiones:

Conexion servo con arduino y potenciometro

  

*La alimentación del motor puede ser la misma que el Arduino siempre y cuando la fuente soporte la potencia del servo y sea de 5V. Los 5V del USB solo soporta un servo SG90, más servos o de otro tipo se necesita usar una fuente externa.

  

Luego de realizar las conexiones procederemos a cargar("subir") el siguiente programa:

//LIBRARIES:
#include <Servo.h> 

Servo myservo;  //creamos un objeto servo 
int angulo;

void setup(){
  myservo.attach(3);  // asignamos el pin 3 al servo.
  Serial.begin(9600); // iniciamos el puerto serial
}

 
void loop() { 
  
  angulo= 0;
  myservo.write(angulo);
  Serial.print("ángulo:  ");
  Serial.println(angulo);
  delay(2000);  

  angulo= 90;
  myservo.write(angulo);
  Serial.print("ángulo:  ");
  Serial.println(angulo);
  delay(2000); 

  angulo= 180;
  myservo.write(angulo);
  Serial.print("ángulo:  ");
  Serial.println(angulo);
  delay(2000);

  angulo= 90;
  myservo.write(angulo);
  Serial.print("ángulo:  ");
  Serial.println(angulo);
  delay(2000);
} 

2. Control de un servomotor a través de un potenciómetro:

En este ejemplo controlaremos la posición del servo por medio de un potenciómetro, donde el servo se posicionará en función de la posición del potenciómetro.

#include <Servo.h> 
 
Servo myservo;  //creamos un objeto servo 
 
void setup() { 
  myservo.attach(3);  // asignamos el pin 3 al servo.
   Serial.begin(9600);
} 
 
void loop() { 
  int adc = analogRead(A0);  // realizamos la lectura del potenciometro
  int angulo = map(adc, 0, 1023, 0, 180);  // escalamos la lectura a un valor entre 0 y 180
  myservo.write(angulo);  // enviamos el valor escalado al servo
  Serial.print("ángulo:  ");
  Serial.println(angulo);
  delay(10);            
}

Como se observa en el código, básicamente se hace la lectura del potenciómetro y se lo escala entre valores de 0° y 180° para después enviarlo al servomotor.

Una vez cargado el programa el servo debe moverse cada vez que movemos le potenciómetro, y si abrimos el Monitor Serie de Arduino IDE debería mostrar el ángulo del servomotor.

  

Monitor serial angulo servo

  

Si la poción del servomotor no coincide con el ángulo correspondiente, es porque el ancho del pulso que maneja la librería no coincide con los del servo, para esto es necesario indicarle el ancho de pulso min(para 0°) y el máximo (para 180°), la única modificación seria en la siguiente linea:

myservo.attach(3,900,2100);  // asignamos el pin 3 al servo, 900->0° y 2100->180°

Deben cambiar los valores 900 y 2100 hasta lograr las posiciones correctas.

 

3. Controlando varios Servomotores con potenciómetros:

Este ejemplo es una extensión del ejemplo anterior, las conexiones serían las siguientes

 conexion arduino con varios servos, con potenciometros

  

El código se muestra a continuación:

#include <Servo.h> 
 
Servo servo1;  //creamos un objeto servo 
Servo servo2;  //creamos un objeto servo 
Servo servo3;  //creamos un objeto servo 
Servo servo4;  //creamos un objeto servo 
Servo servo5;  //creamos un objeto servo 
void setup() 
{ 
  servo1.attach(3);  // asignamos el pin al servo.
  servo2.attach(4);  // asignamos el pin al servo.
  servo3.attach(5);  // asignamos el pin al servo.
  servo4.attach(6);  // asignamos el pin al servo.
  servo5.attach(7);  // asignamos el pin al servo.
   Serial.begin(9600);
} 
 
void loop() 
{ 
  int angulo1 = map(analogRead(A0), 0, 1023, 0, 180);  // escalamos la lectura a un valor entre 0 y 180
  int angulo2 = map(analogRead(A1), 0, 1023, 0, 180);  // escalamos la lectura a un valor entre 0 y 180
  int angulo3 = map(analogRead(A2), 0, 1023, 0, 180);  // escalamos la lectura a un valor entre 0 y 180
  int angulo4 = map(analogRead(A3), 0, 1023, 0, 180);  // escalamos la lectura a un valor entre 0 y 180
  int angulo5 = map(analogRead(A4), 0, 1023, 0, 180);  // escalamos la lectura a un valor entre 0 y 180  
  servo1.write(angulo1);  // enviamos el valor escalado al servo.
  servo2.write(angulo2);  // enviamos el valor escalado al servo.
  servo3.write(angulo3);  // enviamos el valor escalado al servo.
  servo4.write(angulo4);  // enviamos el valor escalado al servo.
  servo5.write(angulo5);  // enviamos el valor escalado al servo.
  //----Enviamos los ángulos serialmente--------------
  Serial.print("Angulos  1: ");
  Serial.print(angulo1);
  Serial.print("  2: ");
  Serial.print(angulo2);
  Serial.print("  3: ");
  Serial.print(angulo3);
  Serial.print("  4: ");
  Serial.print(angulo4);
  Serial.print("  5: ");
  Serial.println(angulo5);
  delay(10);            
}

Como se observa es similar al primer ejemplo, se necesita declarar una variable (objeto) servo para cada servomotor.

Al abrir el Monitor Serie de Arduino IDE deben de visualizarse los ángulos correspondientes para cada servo

  

Monitor serial arduino , angulos servomotores

  

Se puede eliminar las últimas líneas de código si no necesitan visualizar los ángulos a través del monitor serial.

 

Productos relacionados
Artículos relacionados
21 Comentarios
  • Bi******

    Bi****** 10/10/2023 Responder

    Hola, estoy haciendo un proyecto para abrir un garaje, y quisiera saber si me sirve este motor (Servo RDS5160 60Kg) si con 2 es suficiente para abrir y cerrar la puerta, el peso de la puerta es de 90kg
  • Er***

    Er*** 09/03/2023 Responder

    Mi servo MG995 se vuelve loco al colocar el ángulo en el puerto serial.
    Estoy controlándolo con un Arduino y motorshield pwm
  • Gu****

    Gu**** 08/08/2022 Responder

    Hola. Si alguien sabe me responde a sconbrown@gmail.com por favor.

    Necesito comandar un servo MG946R con Arduino, a una distancia de 20 metros. ¿ Será posible utilizando cableado normal ( 1mm2 de sección)? Gracias.
  • is**** *****no

    is**** *****no 11/06/2022 Responder

    hola buen día, excelente explicación, me podrías apoyar en mi proyecto de brazo robótico con 4 servos, cuando los aplico se vuelven locos o no hacen la función, o tiemblan mucho al usarlos, gracias
    • gu*****

      gu***** 03/09/2022 Responder

      hola buenas !! eso es un problema de alimentacion,tendrias que alimentar los servos externmente y no mediante la conexion con arduino. ya que los ervos consumen mucha tension.otra solucion seria alternar el uso para repartir la corriente, si haces funcionar varios servos al mismo momento consume mas tension por ende no alcanza.saludos
    • yo

      yo 10/08/2022 Responder

      Arreglaste el problema? y si es así, como?
  • wi******

    wi****** 27/03/2021 Responder

    en el ejemplo del metodo read, deberia de ser angulo= servo.read();
    Saludos! genial el tutorial
  • Ne**

    Ne** 20/01/2021 Responder

    Hola a todos!. Excelente post. Pero necesito ayuda con servo. Quiero hacer un tipo barrera con 1 SERVO y añadir un led con el comando cuando se mueva el servo. me gustaría saber si hay alguna posibilidad de cortar voltage una vez haya hecho el recorrido el SERVO. quiero montar una Y para aprovechar el cableado. Estoy utilizando un controlador de servos USC-32 ssc..por si alguien me puede ayudar a cual es la mejor opcion mi idea es que cuando se mueva el servo se encienda el led (2 polos) y cuando se pare se apague o cuando termine el recorrido cortar voltaje.

    GRACIAS
  • ma**

    ma** 28/10/2020 Responder

    nice post
  • Ur** ****ls

    Ur** ****ls 01/07/2020 Responder

    Excellent Blog! I would like to thank for the efforts you have made in writing this post. I am hoping the same best work from you in the future as well. I wanted to thank you for this websites! Thanks for sharing.
  • Ji*** *****on

    Ji*** *****on 02/06/2020 Responder

    But when the issue is complex and can’t be resolved on the phone then you should drop a mail to customer support team.
  • Le*****

    Le***** 17/03/2020 Responder

    A servomotor or normally called servo, is a DC engine with the capacity to find its pivot at a specific position or edge, inside it has a gearbox that builds torque and diminishes speed, a potentiometer accountable for detecting the situation of the hub and a little electronic card that together with the potentiometer structure a shut circle control.
  • CI** ********** ******** UK

    CI** ********** ******** UK 29/10/2019 Responder

    Looking for CIPD assignment services UK? We offer reliable & unique assignment help online, our assignment writers UK help you round the clock!
  • Jo*** ****er

    Jo*** ****er 11/01/2019 Responder

    En la imagen del apartado: Control de un servomotor a través de un potenciómetro:

    Hay un error. El cable naranja del servo está conectado al pin número 3. En el programa que le sigue
    utiliza el pin 9:

    myservo.attach(9); // asignamos el pin 9 al servo.

    Un saludo.
  • Ma*****

    Ma***** 16/12/2018 Responder

    Consulta.. el servo rds 3115 necesita de un transistor driver entiendase 2n2222 o similares para entregar los pulsos o solo con conectarlo a los 5vcc y enviar pulsos desde el micro funciona? Les agradezco cualquier ayuda . Saludos
  • Al*******

    Al******* 23/07/2018 Responder

    Disculpa conecto mi servo y comineza a moverce como loco a todos lados
    • Al*******

      Al******* 23/07/2018 Responder

      Como puedo hacer para controlar de la mejor manera tengo un servo motor mg995
  • Lu**

    Lu** 06/07/2018 Responder

    A la hora de declarara los motores es posible hacer una arreglo de los objetos como en Java?
  • Al*****

    Al***** 18/11/2017 Responder

    Hola Naylamp serias tan amable de hacer un tuto para manejar un brazo robotico con los servomotores y ademas un matricial 4x4 y un lcd 2x16
  • er******

    er****** 18/10/2017 Responder

    saludos, estaba impresionado con la capacidad de manejo de servos de un arduino mega,pero me queda una simple duda, en serio el uso de mas de 12 servos implica la desactivacion de pwm en 11 y 12,y los demas se usarian a traves de lospines digitales de la placa??
  • Fe****** ***io

    Fe****** ***io 28/09/2017 Responder

    Saludos,

    Tienen usted un titurial que complemente el de los servomotores, donde se pueda agregar la capacidad de grabar las posiciones deseadas de los servomotores y después se muevan de la manera en la que se programaron? He visto algunos tituriales pero no explican en si el concepto de como grabar posiciones en la memoria del Arduino.

    Muchas gracias y valoro muchos sus tituriales

    Saludos

    Fernando
Dejar un comentario
Deja su comentario

Menú

Ajustes

Crear una cuenta gratuita para usar listas de deseos.

Registrarse