tutoriales.com

Controlando Servomotores con Arduino: Precisión en tus Proyectos de Robótica y Automatización

Este tutorial te guiará paso a paso en el fascinante mundo de los servomotores y cómo controlarlos con Arduino. Descubre los fundamentos, el hardware necesario y el código para implementar un control preciso en tus proyectos. Prepárate para añadir movimiento exacto a tus creaciones.

Principiante18 min de lectura6 views
Reportar error

Los servomotores son componentes clave en el mundo de la electrónica y la robótica, permitiendo un control de posición preciso y repetible. A diferencia de los motores DC que giran continuamente, los servomotores están diseñados para girar a una posición específica y mantenerla. Esto los hace ideales para aplicaciones como brazos robóticos, control de cámaras, mecanismos de dirección, y cualquier proyecto que requiera movimiento angular exacto.

En este tutorial, exploraremos en profundidad cómo interactuar con estos versátiles dispositivos usando la plataforma Arduino. Desde la teoría básica hasta la implementación práctica con código, cubriremos todo lo que necesitas saber para integrar servomotores en tus propios proyectos.

¿Qué es un Servomotor y Cómo Funciona? 🤖

Un servomotor es un tipo de motor rotativo o lineal que permite un control preciso de la posición angular o lineal. Se compone de un motor DC, un conjunto de engranajes reductores, un potenciómetro (sensor de posición), y una placa de control electrónico.

🔥 Importante: La principal diferencia con un motor DC "normal" es su capacidad de control de posición. No gira libremente, sino que va a un ángulo y se detiene allí.

Componentes Clave del Servomotor

  • Motor DC: Proporciona la fuerza motriz.
  • Engranajes Reductores: Reducen la velocidad del motor DC y aumentan el torque, permitiendo un movimiento más controlado y potente.
  • Potenciómetro: Actúa como un sensor de posición. Mide el ángulo actual del eje del motor y envía esta información a la placa de control.
  • Placa de Control Electrónica: Es el "cerebro" del servomotor. Recibe la señal de control (generalmente PWM), la compara con la posición actual (leída del potenciómetro) y ajusta la alimentación del motor DC hasta que la posición deseada se alcanza. Este es un bucle de retroalimentación cerrado.
Señal PWM Controlador Motor DC Engranajes Eje de Salida Vínculo Potenciómetro Retroalimentación

Tipos de Servomotores

Existen principalmente dos tipos de servomotores comunes:

  • Servos de Posición Estándar (o de Ángulo Fijo): Son los más comunes. Pueden girar en un rango específico, típicamente 0 a 180 grados, aunque algunos pueden ofrecer 0 a 270 grados. Son ideales para mover algo a una posición angular discreta.
  • Servos de Rotación Continua: Modificados para girar continuamente en cualquier dirección, actuando más como motores DC controlados, pero con la capacidad de ajustar la velocidad y dirección. Son útiles para aplicaciones donde se requiere rotación constante pero controlada, como ruedas de robots. Para estos, la señal PWM controla la velocidad y dirección, no la posición.

Señal de Control PWM para Servomotores 📊

Los servomotores se controlan mediante una señal PWM (Pulse Width Modulation), que significa Modulación por Ancho de Pulso. Esta señal no es como el PWM que usamos para variar el brillo de un LED. En los servomotores, el ancho del pulso es lo que determina la posición angular.

💡 Consejo: La frecuencia de la señal PWM para la mayoría de los servos es de 50 Hz (un pulso cada 20 ms). Lo que cambia para determinar la posición es la duración (ancho) de cada pulso dentro de esos 20 ms.
Ancho de Pulso (μs)Posición Angular Típica
------
1000 μs (1 ms)0 grados
1500 μs (1.5 ms)90 grados
------
2000 μs (2 ms)180 grados

Estos valores pueden variar ligeramente entre diferentes fabricantes y modelos de servomotores, por lo que a veces es necesario calibrarlos. La biblioteca Servo.h de Arduino se encarga de generar estas señales por nosotros, simplificando mucho el proceso.

Materiales Necesarios 🛠️

Para seguir este tutorial, necesitarás:

  • Placa Arduino: Un Arduino UNO es perfecto, pero cualquier placa compatible funcionará (Nano, Mega, ESP32, ESP8266).
  • Servomotor: Un servomotor SG90 o MG996R son excelentes opciones para empezar. El SG90 es pequeño y ligero, ideal para proyectos básicos. El MG996R es más robusto y potente.
  • Cables Jumper: Varios cables macho-macho para las conexiones.
  • Protoboard (opcional): Útil para conexiones más complejas, aunque para un solo servo no es estrictamente necesario.
  • Fuente de alimentación externa (opcional, pero recomendada para servos más grandes): Si usas servomotores potentes (como el MG996R o múltiples servos), es crucial alimentarlos con una fuente externa para no sobrecargar el regulador de voltaje del Arduino. Un adaptador de 5V y al menos 1A-2A será suficiente para un MG996R.
⚠️ Advertencia: Un servomotor que intenta girar contra una resistencia significativa puede consumir mucha corriente. Si la alimentación no es adecuada, el Arduino podría resetearse o comportarse de forma errática. ¡Siempre considera una fuente externa para servos potentes!

Conexión del Servomotor a Arduino 🔌

La conexión de un servomotor es bastante sencilla. Los servomotores tienen generalmente tres cables:

  • Marrón (o Negro): GND (Tierra)
  • Rojo: VCC (Alimentación, usualmente 5V)
  • Naranja (o Amarillo/Blanco): Señal (PWM)

Esquema de Conexión Básico (SG90)

Para un servomotor pequeño como el SG90, puedes alimentarlo directamente desde el Arduino:

  1. Cable Marrón/Negro: Conéctalo al pin GND del Arduino.
  2. Cable Rojo: Conéctalo al pin 5V del Arduino.
  3. Cable Naranja/Amarillo/Blanco (Señal): Conéctalo a un pin digital PWM del Arduino (en un Arduino UNO, son los pines con el símbolo ~ al lado, como D3, D5, D6, D9, D10, D11).
Arduino UNO Pin 9 5V GND SG90 Señal (Pin 9) VCC (5V) GND (Tierra) Señal VCC GND Conexión Arduino - Servomotor

Esquema de Conexión con Fuente de Alimentación Externa (Servos más Grandes) ⚡

Cuando uses un servomotor más grande (como un MG996R) o varios servos, es esencial utilizar una fuente de alimentación externa.

  1. Cable Marrón/Negro (GND del servo): Conéctalo al GND de la fuente de alimentación externa Y también al GND del Arduino. ¡Es crucial que las tierras estén conectadas para tener una referencia común!
  2. Cable Rojo (VCC del servo): Conéctalo al VCC (positivo) de la fuente de alimentación externa.
  3. Cable Naranja/Amarillo/Blanco (Señal): Conéctalo a un pin digital PWM del Arduino (ej. D9).
Conexión MG996R + Arduino + Fuente Externa Arduino UNO PIN 9 GND MG996R Fuente 5V/6V - + Señal VCC (+) GND Común S + -
💡 Consejo: Recuerda siempre conectar los GNDs (tierras) del Arduino y de la fuente externa. Sin una tierra común, las señales no tendrán una referencia válida y el circuito no funcionará correctamente.

Programación del Servomotor con Arduino: La Biblioteca Servo.h 💻

Arduino simplifica enormemente el control de servomotores gracias a su biblioteca Servo.h. Esta biblioteca se encarga de generar la señal PWM correcta y de manejar los detalles de temporización, permitiéndonos controlar el servo con funciones sencillas.

Primeros Pasos: Incluir la Biblioteca y Crear un Objeto Servo

La biblioteca Servo.h ya viene preinstalada en el IDE de Arduino. Para usarla, solo necesitas incluirla al inicio de tu código y crear un objeto Servo.

#include <Servo.h>

Servo myServo; // Crea un objeto servo para controlar un servomotor

Funciones Clave de la Biblioteca Servo.h

  • attach(pin): Asocia el objeto Servo a un pin digital de Arduino. Este pin generará la señal PWM para el servo. Puedes especificar opcionalmente los valores mínimos y máximos del ancho de pulso en microsegundos si tu servo necesita una calibración diferente a la predeterminada (1000-2000 μs).
myServo.attach(9); // Asocia el servo al pin 9
// myServo.attach(9, 500, 2500); // Para calibración personalizada de 500us a 2500us
  • write(angle): Mueve el servo a la posición especificada en grados. El rango suele ser de 0 a 180 grados.
myServo.write(90); // Mueve el servo a 90 grados
  • writeMicroseconds(us): Mueve el servo a la posición especificada por el ancho de pulso en microsegundos. Útil para un control más fino o si la función write() no da el rango deseado.
myServo.writeMicroseconds(1500); // Mueve el servo a la posición central (90 grados)
  • read(): Devuelve el ángulo actual al que el servo está configurado (el último ángulo pasado a write()).
  • attached(): Comprueba si el objeto servo está adjunto a un pin.
  • detach(): Desvincula el objeto servo del pin, liberando el pin para otros usos.
📌 Nota: Cuando usas la biblioteca `Servo.h`, hay un límite en la cantidad de pines PWM que puedes usar para otros propósitos. La biblioteca puede interferir con la funcionalidad PWM en algunos pines. En Arduino UNO, los pines 9 y 10 son típicamente afectados, impidiendo que se usen para `analogWrite()` con valores PWM bajos.

Ejemplos Prácticos de Control de Servomotores ✨

Ahora vamos a poner en práctica lo aprendido con algunos ejemplos. Asegúrate de tener tu servomotor conectado correctamente al pin 9 de tu Arduino.

Ejemplo 1: Mover el Servo a Posiciones Fijas

Este código moverá el servomotor a 0, 90 y 180 grados, esperando un segundo en cada posición.

#include <Servo.h>

Servo myServo;  // Crea un objeto servo

const int servoPin = 9; // Pin donde está conectado el cable de señal del servo

void setup() {
  myServo.attach(servoPin); // Asocia el objeto servo al pin 9
  Serial.begin(9600);
  Serial.println("Servomotor inicializado.");
}

void loop() {
  Serial.println("Moviendo a 0 grados...");
  myServo.write(0); // Mueve el servo a 0 grados
  delay(1000);     // Espera 1 segundo

  Serial.println("Moviendo a 90 grados...");
  myServo.write(90); // Mueve el servo a 90 grados
  delay(1000);     // Espera 1 segundo

  Serial.println("Moviendo a 180 grados...");
  myServo.write(180); // Mueve el servo a 180 grados
  delay(1000);      // Espera 1 segundo
}

Ejemplo 2: Barrido del Servomotor (Sweeping) 🌊

Este es un ejemplo clásico que hace que el servomotor se mueva suavemente de 0 a 180 grados y luego de regreso, como si estuviera "barriendo" un área.

#include <Servo.h>

Servo myServo;

const int servoPin = 9;
int currentAngle = 0; // Variable para almacenar el ángulo actual del servo

void setup() {
  myServo.attach(servoPin);
  Serial.begin(9600);
  Serial.println("Servomotor Sweeping inicializado.");
}

void loop() {
  // Mueve el servo de 0 a 180 grados
  for (currentAngle = 0; currentAngle <= 180; currentAngle += 1) {
    myServo.write(currentAngle);
    delay(15); // Pequeña pausa para un movimiento suave
  }

  Serial.println("Barrido ascendente completado.");
  delay(500); // Pausa al final del barrido ascendente

  // Mueve el servo de 180 a 0 grados
  for (currentAngle = 180; currentAngle >= 0; currentAngle -= 1) {
    myServo.write(currentAngle);
    delay(15); // Pequeña pausa para un movimiento suave
  }

  Serial.println("Barrido descendente completado.");
  delay(500); // Pausa al final del barrido descendente
}
💡 Consejo: Puedes ajustar el valor de `delay(15);` para controlar la velocidad del barrido. Un valor más pequeño hará que el servo se mueva más rápido, y uno más grande lo hará más lento.

Ejemplo 3: Control del Servo con un Potenciómetro 🕹️

Este ejemplo es muy interactivo y útil. Conectaremos un potenciómetro a una entrada analógica del Arduino para controlar la posición del servomotor manualmente.

Materiales Adicionales

  • Potenciómetro: De 10k ohmios es un buen valor.

Conexión del Potenciómetro

  1. Pin central del potenciómetro: Conéctalo a un pin analógico del Arduino (ej. A0).
  2. Un pin exterior del potenciómetro: Conéctalo a 5V del Arduino.
  3. El otro pin exterior del potenciómetro: Conéctalo a GND del Arduino.
Conexión Arduino, Servo y Potenciómetro Arduino UNO D9 A0 5V GND Potenciómetro Servo SG90 GND A0 5V GND VCC SIG

Código del Potenciómetro al Servo

#include <Servo.h>

Servo myServo;

const int servoPin = 9;         // Pin para la señal del servomotor
const int potentiometerPin = A0; // Pin analógico para el potenciómetro

int potValue;    // Variable para almacenar el valor leído del potenciómetro
int servoAngle;  // Variable para almacenar el ángulo del servo calculado

void setup() {
  myServo.attach(servoPin);
  Serial.begin(9600);
  Serial.println("Control de Servomotor con Potenciómetro inicializado.");
}

void loop() {
  // Lee el valor del potenciómetro (0-1023)
  potValue = analogRead(potentiometerPin);
  Serial.print("Valor del potenciómetro: ");
  Serial.print(potValue);

  // Mapea el valor del potenciómetro (0-1023) al rango del servo (0-180 grados)
  servoAngle = map(potValue, 0, 1023, 0, 180);
  Serial.print(" | Ángulo del servo: ");
  Serial.println(servoAngle);

  // Mueve el servo al ángulo calculado
  myServo.write(servoAngle);

  delay(15); // Pequeña pausa para evitar movimientos bruscos y lecturas excesivas
}

Aquí, la función map() es fundamental. Convierte un rango de valores (0-1023 del potenciómetro) a otro rango (0-180 grados del servo). Esto hace que girar el potenciómetro se traduzca directamente en el movimiento del servomotor.


Calibración del Servomotor Avanzada ⚙️

Aunque la biblioteca Servo.h funciona bien con la mayoría de los servomotores usando sus valores por defecto (pulso de 1000 a 2000 microsegundos), algunos servos pueden tener un rango ligeramente diferente o requerir un ajuste para alcanzar sus extremos reales (0° y 180°).

Para calibrar, puedes usar la función attach() con parámetros adicionales:

myServo.attach(servoPin, minPulseWidth, maxPulseWidth);

Donde minPulseWidth y maxPulseWidth son los anchos de pulso en microsegundos que corresponden a 0 y 180 grados respectivamente para tu servo específico. Puedes encontrarlos experimentando con writeMicroseconds().

Cómo encontrar los valores min/max del pulso Usa un sketch simple que te permita enviar valores `writeMicroseconds()` al servo y observa cuándo alcanza sus límites físicos sin forzarse.
#include <Servo.h>

Servo myServo;
const int servoPin = 9;

void setup() {
  myServo.attach(servoPin); // Adjuntar sin valores personalizados primero
  Serial.begin(9600);
  Serial.println("Introduzca un ancho de pulso (ej. 1000, 1500, 2000):");
}

void loop() {
  if (Serial.available()) {
    int pulseWidth = Serial.parseInt();
    if (pulseWidth > 0) {
      myServo.writeMicroseconds(pulseWidth);
      Serial.print("Servo movido a: ");
      Serial.print(pulseWidth);
      Serial.println(" us");
    }
  }
}

Carga este código, abre el Monitor Serial y experimenta con diferentes valores (por ejemplo, empieza con 500 y ve subiendo hasta 2500) hasta encontrar los puntos exactos donde el servo llega a sus topes. Ten cuidado de no forzar el servo más allá de sus límites, ya que esto puede dañarlo.

Aplicaciones Avanzadas y Consideraciones 🚀

Múltiples Servomotores

La biblioteca Servo.h te permite controlar hasta 12 servomotores en la mayoría de los Arduinos (o 48 en un Mega). Simplemente crea un objeto Servo por cada motor:

#include <Servo.h>

Servo servo1;
Servo servo2;

void setup() {
  servo1.attach(9);
  servo2.attach(10);
}

void loop() {
  servo1.write(45);
  servo2.write(135);
  delay(1000);
  servo1.write(135);
  servo2.write(45);
  delay(1000);
}
⚠️ Advertencia: Para múltiples servos, la alimentación externa es **obligatoria**. La suma del consumo de corriente de varios servos excederá rápidamente la capacidad del Arduino.

Servomotores de Rotación Continua

Para servos de rotación continua, la función write() se comporta de manera diferente:

  • myServo.write(90); (o un pulso de 1500 μs) detiene el servo.
  • myServo.write(0); (o un pulso más corto como 1000 μs) lo hace girar en una dirección a máxima velocidad.
  • myServo.write(180); (o un pulso más largo como 2000 μs) lo hace girar en la dirección opuesta a máxima velocidad.
  • Valores intermedios (ej. myServo.write(60); o myServo.writeMicroseconds(1300);) controlan la velocidad y pueden requerir calibración para encontrar el punto de parada y las velocidades deseadas.

Control de Velocidad

Los servomotores estándar no tienen un control de velocidad intrínseco. El delay() entre los cambios de ángulo en un bucle for (delay(15); en el ejemplo de barrido) es la forma de simular una velocidad reducida. Para un control de velocidad real, se necesitarían servos de rotación continua o motores paso a paso.

Elección del Servomotor

  • SG90 / MG90S: Pequeños, ligeros, económicos. Ideales para proyectos de baja carga, maquetas, robots pequeños. Plástico.
  • MG996R / MG995: Más grandes, potentes, con engranajes metálicos. Buenos para brazos robóticos de tamaño medio, dirección de vehículos RC. Requieren alimentación externa.
  • Servos Digitales: Mayor precisión y torque, respuesta más rápida. Suelen ser más caros. Usan un microcontrolador interno para un control más fino del motor.
60% de Complejidad en Proyectos Típicos

Solución de Problemas Comunes 🐛

  • Servo tembloroso o errático:
    • Causa: Poca corriente. Asegúrate de usar una fuente de alimentación externa si el servo es grande o si hay varios servos.
    • Solución: Revisa las conexiones de alimentación, usa una fuente externa adecuada, conecta los GNDs comunes.
  • Servo no se mueve o hace un ruido:
    • Causa: Cable de señal incorrecto, pin incorrecto, problemas de código o alimentación insuficiente.
    • Solución: Verifica las conexiones (especialmente el pin de señal y el GND), asegúrate de que el attach() se haga en el setup(), revisa que el código esté enviando valores válidos.
  • Servo vibra pero no se detiene en una posición exacta:
    • Causa: Podría ser ruido en la señal o un servo defectuoso. También puede ocurrir si el servo está cerca de su límite mecánico y el código intenta moverlo un poco más allá.
    • Solución: Intenta añadir un condensador (100uF a 470uF) entre VCC y GND del servo para suavizar la alimentación. Ajusta los valores minPulseWidth y maxPulseWidth si es necesario.

Conclusión ✅

Los servomotores son componentes increíblemente útiles para añadir movimiento preciso a tus proyectos de Arduino. Con la biblioteca Servo.h y una comprensión básica de cómo funcionan, puedes implementar brazos robóticos, sistemas de dirección, aperturas y cierres automatizados, y mucho más.

Recuerda siempre prestar atención a la alimentación, especialmente con servos más grandes o múltiples, y experimentar con los ejemplos proporcionados. ¡Ahora tienes las herramientas para hacer que tus creaciones cobren vida con movimientos exactos!

Tutoriales relacionados

Comentarios (0)

Aún no hay comentarios. ¡Sé el primero!