Saltar al contenido

Como usar un Servomotor con Arduino (180° y 360°)

Controla tus proyectos con precisión utilizando un servomotor Arduino. Aprende a conectar y utilizar un servo motor con tu placa Arduino mediante nuestros tutoriales y códigos de ejemplo fáciles de seguir. Descubre cómo utilizar el código de servomotor Arduino para mover el servo a diferentes posiciones y crear proyectos increíbles como robots, automatización de casa y más. Conviértete en un experto en servo Arduino y lleva tus proyectos al siguiente nivel con nuestra guía completa.

Antes de comenzar, te hago la invitación para que veas nuestro CURSO GRATIS DE ARDUINO.

Y que te suscríbas al canal de YouTube si deseas aprender más sobre estos temas:

Servomotor Arduino

En una entrada pasada, ya habíamos detallado el funcionamiento de un Servomotor utilizando en ese caso un microcontrolador PIC, en esta entrada vamos a ver un rápido resumen del Servo, pero si deseas puedes visitar la entrada de servomotor con PIC.

¿Que es un Servomotor?

Un servomotor es un motor con control, es decir este dispositivo mecánico posee internamente un controlador que posiciona precisamente el rotor del motor en un ángulo especificado por la señal entrante de control.

Servomotor PIC C
Servo

Para entender esto, veamos que físicamente el servomotor se compone de tres cables: GND, Power (5v) y Control. Es decir que los dos primeros se usan como alimentación en cuanto el cable de control es usado para enviar la señal de posicionamiento del motor con una secuencia de pulsos PWM.

servomotor con PIC

Un servo con Arduino podrá tener una potencialidad tremenda, dado que la propia placa de Arduino será la encargada de enviar esa señal PWM para posicionar el motor en una posición en grados en específico.

Servo Arduino: Control de Posición

La señal PWM que ingresa al Servo a través de Arduino, es procesada y dependiendo del ancho de dicho pulso, el servomotor se desplazará a un determinado ángulo.

Generalmente los servomotores comerciales procesan un pulso con un periodo de 20ms para conseguir efectuar todo el movimiento del servo adecuadamente.

Tomemos como ejemplo un servomotor 180 grados con Arduino. En este caso, para posicionar el motor en 0 grados, nuestro pulso debe ser de 1ms encendido y los 19ms restantes debe estar apagado. Para 90 grados, nuestro pulso debe ser de 1.5ms encendido y los 18.5ms restantes debe estar apagado. Y por último, para 180 grados, nuestro pulso debe ser de 2ms encendido y los 18ms restantes debe estar apagado.

Servomotor con PIC

¿Como detener un servomotor con Arduino? Si el servomotor es de posición, basta con asignarle el ángulo deseado, que el propio motor se detendrá solo cuando llegue a dicha posición. Mas abajo en este post, te explico como detener un servomotor de 360 grados con Arduino.

Servomotor Arduino Características

En el mercado es posible encontrar varios tipos de servos, y es importante entender sus características para adaptarlos adecuadamente a nuestros proyectos, por lo tanto, es de extrema importancia de que leas la hoja de datos del servo que deseas comprar para ver si se adapta en fuerza y grados de movimiento a tu proyecto.

Existen 2 servos básicos que son:

  1. Servomotor de -90 grados a 90 grados (total de 180 grados)
  2. Servomotor de 360 grados

Con el servomotor de 180 grados con Arduino podremos controlar la posición donde deseamos ubicar el motor, por otro lado cuando conectamos un servomotor 360 grados en Arduino ya NO tendremos control de posición, porque el servo gira constantemente. Este servomotor de 360 grados es utilizado para realizar control de velocidad, bastante empleado en pequeños o medianos robots para el control de velocidad de las ruedas.

Un factor a tener en cuenta es observar la fuerza del servomotor, que sea adecuada para mover la carga que necesitamos en nuestro proyecto.

Calibrar Servomotor Arduino

Vimos que el Arduino necesita de un determinado pulso para poder despazarse a los diferentes ángulos, sin embargo, cada servomotor tendrá un comportamiento diferente, y antes de usarlo en nuestro proyecto, conviene calibrarlo.

No siempre 1ms va a colocar el Arduino en 0 grados, muchas veces este valor es mucho menor, debemos entonces ir moviendo este valor con la instrucción servo.attach(pin, min, max) que veremos mas adelante para establecer los valores en milisegundos mínimos y máximos en los que el motor hace el barrido completo.

Programar Servomotor en Arduino

Vamos a emplear la librería del Arduino llamada Servo Library con la cual controlaremos estos dispositivos de una manera adecuada que nos permite controlar hasta 12 servos en Arduino Uno/Nano, y hasta 48 en Arduino Mega. Claro también puedes controlar el servomotor con Arduino sin Librería y para eso te invito a ver la entrada que hicimos con PIC donde hicimos algo parecido, donde básicamente debemos generar la señal PWM.

El servomotor Puede ser conectado en cualquier PIN DIGITAL de la PLACA DE ARDUINO.

Primero incluimos la librería Servo Arduino:

#include<Servo.h>

Definimos el PIN de control donde conectaremos el SERVO

Sintaxis:

servo.attach(pin)

servo.attach(pin, min, max)

Parámetros:

servo: una variable de tipo Servo

pin: el número del pin que el servo está conectado

min (opcional): el ancho de pulso, en microsegundos, correspondiente al ángulo mínimo (0 grados) del servo (por defecto 544)

max (opcional): el ancho de pulso, en microsegundos, correspondiente al ángulo máximo (180 grados) del servo (por defecto 2400)

Para escribir en el servo una posición especifica usamos el comando:

servo.write(angle)

Parámetros:

servo: una variable de tipo Servo

angle: el valor a escribir en el servo, de 0 a 180

Para leer la posición actual en la que se encuentra nuestro servo con Arduino podemos usar:

servo.read()

Parámetros:

servo: una variable de tipo Servo

Retornos:

El ángulo del servo, de 0 a 180 grados.

Suscríbete a este sitio WEB para estar enterado de las nuevas entradas!

Servos de rotación continua

Los servo motores de 360 grados son servos RC estándar que se han modificado para ofrecer un control de velocidad en lazo abierto en lugar de su control habitual de posición de lazo cerrado.

La modificación los convierte en motores con un sistema de motoreducción que le permite aumentar su fuerza y disminuir la velocidad, donde adicionalmente se puede controlar el sentido de giro, todo eso integrado en un paquete compacto y económico.

Se puede usar en ruedas de robots y controlarse mediante una señal RC o una simple conexión directa a una sola línea de E / S del microcontrolador (Arduino).

Como controlar un servomotor 360 grados en Arduino

Para eso vamos a valernos de la misma librería del Arduino solo que en este caso usaremos las siguientes configuraciones para manipular un servo continuo o de 360 grados.

Primero veamos que las señales PWM que deben ser enviadas son exactamente las mismas, con la diferencia de que ya no tendremos el control de posición (CCW: sentido antihorario; CW: Centido Horario)

Detener Servomotor 360

Es decir que si deseas saber como detener un servomotor con arduino de 360 usamos la siguiente instrucción:

servo.write(90);

Detener un servomotor de 360 grados es equivalente a programar un servomotor común en 90 grados.

Sentido Anti-Horario

servo.write(180);

Mover un servomotor de 360 grados en sentido anti-horario es equivalente a programar un servomotor común en 180 grados.

Sentido Horario

servo.write(0);

Mover un servomotor de 360 grados en sentido horario es equivalente a programar un servomotor común en 0 grados.

Controlar la Velocidad de un Servomotor de 360 grados

¿Como controlar la velocidad de un Servo con Arduino? Primero que todo cabe aclarar que el control de velocidad de un servomotor de 360 grados no es muy precisa, por lo tanto si tu objetivo es lograr una velocidad precisa deberas optar por agregar un sensor adicional.

Como ya lo notaste, en un servo de giro completo en lugar de enviar un ángulo entre 0 y 180 grados lo que estaremos enviando realmente es su velocidad y no solo el sentido siendo, el control de velocidad del servo 360 con Arduino se logra entonces como:

  • 0: máxima velocidad de giro en sentido horario.
  • Entre 0 y 90: se conserva el mismo sentido horario pero la velocidad se reduce conforme nos acercamos a 90
  • 90: el servomotor 360 se detiene.
  • Entre 90 y 180: la velocidad aumenta conforme nos acercamos al valor de 180, girando en sentido antihorario.
  • 180: máxima velocidad de giro en el sentido antihorario.

Servo Arduino Ejemplo

El siguiente ejemplo puede ser reproducido para programar 1 servo, controlar 4 servos con arduino o controlar hasta los 12 servos utilizando en este caso el Arduino UNO.

En este ejemplo, conectaremos un servomotor al Arduino en el PIN 5, y a través del puerto serial le enviaremos los grados a los cuales se debe desplazar el servomotor.

Servomotor Arduino

Primeramente, se recomienda calibrar el servo con Arduino para encontrar los extremos máximos y mínimos del mismo, y si se emplea un servomotor grande o que esté arrastrando alguna carga, debemos alimentarlo con una fuente EXTERNA, dado que el arduino no será capaz de moverlo. Esta fuente EXTERNA deberá compartir la misma TIERRA o GND que el Arduino.

Código de implementación al final de este post.

Servomotor 360 – Ejemplo

Para el mismo circuito mostrado anteriormente, cambie el Servomotor por uno de Giro continuo o de 360 grados y a través del monitor serial, enviar la orden al servomotor de girar en cualquiera de los dos sentidos, o incluso detenerse.

Servomotor Arduino Código

Para copiar el código basta con que compartas este post con cualquiera de los siguientes tres botones para de esa forma hacer que este contenido llegue a más personas y puedan aprender y aportar cada día más al conocimiento.

Servo Convencional

#include <Servo.h>  //Include the Servo Library
int degree=0;
String words;       
Servo servo1;   // "Servos" objects are created
void setup() {
  // put your setup code here, to run once:
  Serial.begin(9600);
  Serial.println("Servos - Arduino");
  //servo1.attach(5); //Default
  servo1.attach(5,600,2400);
  servo1.write(0);
}
void loop() {
  // put your main code here, to run repeatedly:
 
  while (Serial.available()) {    // Read the value sent by the Serial Port
    delay(5);
    char c  = Serial.read();     // Read the characters
    words += c;              // Convert Characters to character string
  }  
  if (words.length()>0){       
        degree = words.toInt();   // Convert character string to integers
        Serial.print(degree);         //Send value in Degrees
        Serial.println(" Grados");
        delay(5);
        servo1.write(degree); // Ajuste de 512 vueltas a los 360 grados
        while(servo1.read()<degree-3)
        {Serial.println("Desplazando...");}
  }  
  words = "";   // Initialize the string of characters received 
  
}

Servo 360

#include <Servo.h>  //Include the Servo Library

int dir=0,menu=1,opc=0;
char c='
#include <Servo.h>  //Include the Servo Library
int dir=0,menu=1,opc=0;
char c='\0';
String words;       
Servo servo1;   // "Servos" objects are created
void setup() {
// put your setup code here, to run once:
Serial.begin(9600);
Serial.println("Servo 360 - Arduino");
//servo1.attach(5); //Default
servo1.attach(5);
servo1.write(90);
}
void loop() {
// put your main code here, to run repeatedly:
if(menu==1){
Serial.println(" ");
Serial.println("------------  DIGITE UNA OPCIÓN ENTRE 1 Y 3   -------------");
Serial.println("1)  Detener Motor");
Serial.println("2)  Sentido Horario");
Serial.println("3)  Sentido Anti-Horario");
menu=0;
}
while (Serial.available()) {    // Read the value sent by the Serial Port
delay(5);
c  = Serial.read();     // Read the characters
words += c;              // Convert Characters to character string
}
opc=words.toInt();  
if (opc!=0){     
if(opc>=1 && opc<=3){
switch(opc){
case 1:
servo1.write(90); 
Serial.println(">>>>> Motor DETENIDO! <<<<<<");
break;
case 2:
servo1.write(0); 
Serial.println(">>>>> GIRANDO SENTIDO CW <<<<<<");
break;
case 3:
servo1.write(180); 
Serial.println(">>>>> GIRANDO SENTIDO CCW <<<<<<");
break;
}
}else{
Serial.println("   OPCIÓN INVALIDA!!!! INTENTE NUEVAMENTE");
}
menu=1;
opc=0;
}  
words = "";   // Initialize the string of characters received 
}
'; String words; Servo servo1; // "Servos" objects are created void setup() { // put your setup code here, to run once: Serial.begin(9600); Serial.println("Servo 360 - Arduino"); //servo1.attach(5); //Default servo1.attach(5); servo1.write(90); } void loop() { // put your main code here, to run repeatedly: if(menu==1){ Serial.println(" "); Serial.println("------------ DIGITE UNA OPCIÓN ENTRE 1 Y 3 -------------"); Serial.println("1) Detener Motor"); Serial.println("2) Sentido Horario"); Serial.println("3) Sentido Anti-Horario"); menu=0; } while (Serial.available()) { // Read the value sent by the Serial Port delay(5); c = Serial.read(); // Read the characters words += c; // Convert Characters to character string } opc=words.toInt(); if (opc!=0){ if(opc>=1 && opc<=3){ switch(opc){ case 1: servo1.write(90); Serial.println(">>>>> Motor DETENIDO! <<<<<<"); break; case 2: servo1.write(0); Serial.println(">>>>> GIRANDO SENTIDO CW <<<<<<"); break; case 3: servo1.write(180); Serial.println(">>>>> GIRANDO SENTIDO CCW <<<<<<"); break; } }else{ Serial.println(" OPCIÓN INVALIDA!!!! INTENTE NUEVAMENTE"); } menu=1; opc=0; } words = ""; // Initialize the string of characters received }

Eso es todo por la entrada del dia de hoy, espero les haya gustado y hayan aprendido algo nuevo. Si te ha servido el contenido de esta entrada, de los videos y los códigos de implementación y deseas apoyar mi trabajo invitandome a un café super barato, puedes hacerlo en el siguiente link:

👉 Invitar a Sergio a un Café ☕️

Que esten muy bien, nos vemos en la siguiente entrada.

Entradas relacionadas

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.

Comentarios (3)

Hola, ¿como puedo controlar 4 servos con 4 potenciometros en una misma placa Arduino UNO?

Responder

Hola Sergio, te molesto con una pregunta. Intente mover el servo a través de un pulsador incrementando el ángulo desde -90 hasta 90 sin la librería de Arduino. Modificando la frecuencia del PWM con el registro TCCR0B y el pin digital 5 como salida, lo configure por la frecuencia más cercana que pude a 61Hz. En Proteus la simulación realiza el movimiento pero cuando lo implemento con los materiales no. Puede que el problema sea que servo al procesar señales de 50 Hz no este siendo posible procesar la de 60Hz ? Cuando presiono el pulsador para que incremente el Angulo , se percibe que se mueve pero luego vuelve a la posición inicial. Si el problema es este, no habría otra forma de mover el servo que no sea con la librería?

Saludos!

Responder

Hola:
La información que das en tu blog es bastante buena e ilustrativa pero me surge la siguiente duda respecto a los servos de rotación continua y es la siguiente: en el video de los servo de rotación continua tu dices que el sistema es de lazo abierto y que podemos definir el sentido de giro pero no la posición, para la posición tu estableces que se requiere de un sensor de posición para determinar la posición, ¿ cual sería la circuitería para implementarlo a través de un sensor de posición ( potenciómetros, encoders o shields)? y ¿el código de programación en Arduino?

Responder