En esta entrada te enseñaremos a controlar un servomotor con tu tarjeta Arduino Uno. Aprenderás todos los aspectos necesarios para su conexión y programación de forma que puedas integrar libremente estos dispositivos en cualquier proyecto. Los servomotores son ampliamente utilizados en proyectos con Arduino debido a que son fáciles de usar y ampliamente disponibles en el mercado a costos muy accesibles. Además ofrecen una precisión aceptable en el posicionamiento para la mayoría de los proyectos. Para desarrollar un proyecto exitoso que involucre servomotores y Arduino, es importante comprender primero qué son ambos. Por defecto, Arduino nos proporciona las herramientas necesarias a nivel de software para facilitar la programación de estos dispositivos electromecánicos, generando por nosotros las señales de control necesarias. Controlar un servo desde Arduino es una tarea muy sencilla gracias al uso de la librería Servo.h.
¿Qué es un Servomotor?
Un servomotor es un dispositivo actuador electromecánico que permite controlar de forma relativamente precisa el posicionamiento del eje del motor y además es capaz de mantener esa posición aunque se aplique una fuerza externa al eje. Es un tipo de accionador ampliamente empleado en electrónica. A diferencia de otros tipos de motores en los que controlamos la velocidad de giro, en un servo indicamos directamente el ángulo deseado y el servo se encarga de posicionarse en este ángulo. Típicamente los servos disponen de un rango de movimiento de entre 0 a 180º, aunque existen servos que abarcan un mayor rango e incluso algunos de rotación continua. Es decir, no son capaces de dar la vuelta por completo (de hecho disponen de topes internos que limitan el rango de movimiento).
Los servomotores son ampliamente utilizados en la industria, donde se emplean en sistemas automatizados y maquinaria de precisión. Su capacidad para recibir señales de control y responder de manera rápida y precisa los convierte en componentes esenciales en la robótica moderna. Por este motivo son ampliamente empleados en proyectos de robótica, como brazos robóticos, robots con patas, controlar el giro de torretas, u orientar sensores como sensores de ultrasonidos o sensores de temperatura a distancia.
Partes Internas de un Servomotor
Los principales componentes que encontramos dentro de un servomotor estándar son:
- Motor de corriente directa.
- Caja de engranes reductora.
- Sensor de posición o potenciómetro, conectado físicamente al eje de salida del servomotor.
- Circuito de control electrónico de lazo cerrado.
Internamente un servo está constituido por un motor de corriente continua, acoplado a un reductor para reducir la velocidad de giro, junto con la electrónica necesaria para controlar su posición. Frecuentemente se dispone de un potenciómetro unido al eje del servo, que permite al servo conocer la posición del eje. Esta información es tratada por un controlador integrado que se encarga de ajustar y actuar sobre el motor para alcanzar la posición deseada. La mayoría de los servomotores emplean internamente un control de lazo cerrado diseñado con electrónica analógica, sin embargo el servo acepta una señal de control digital de tipo PWM que define la posición en donde queremos colocar el eje del motor.
Lea también: IVA 21% Excel
Funcionamiento: La Señal PWM
La modulación por anchura de pulso (PWM) es una técnica de transmisión de información o energía que consiste en cambiar el ciclo de trabajo de una señal cuadrada, mientras que la frecuencia se mantiene constante. El ciclo de trabajo se define como la parte activa o el tiempo que pasa en alto la señal. En el caso de un servomotor que se conecta con Arduino, el ciclo de trabajo dicta la posición en la que queremos posicionar el eje del servo RC. La comunicación de la posición deseada se realiza mediante la transmisión de una señal pulsada con periodo de 20ms. El ancho del pulso determina la posición del servo. Debido a que la señal de control de un servomotor es digital, es muy sencillo generarla desde un microcontrolador o microprocesador y en general cualquier tipo de hardware digital.
Relación entre Ancho de Pulso y Posición
La forma en la que trabajan la mayoría de los servos es la siguiente:
- Para posicionar el servo a la mitad de su recorrido (90º) debemos enviar un pulso con una duración de 1.5 mili-segundos.
- Para ir a un extremo del recorrido (0º) debemos enviar un pulso con una duración de 1 mili-segundo.
- Finalmente para ir al otro extremo (180º) el pulso deberá ser de 2 mili-segundos.
Se puede variar el ancho de los pulsos en este rango (1 a 2 mili-segundos, o incluso entre 500-2500 µs según el fabricante) para colocar el eje del servo en cualquier posición que deseemos. Las características de la señal requerida para el control de un servo suelen variar con el fabricante y modelo del servo, por lo que siempre es importante consultar las especificaciones del fabricante para evitar problemas de funcionamiento. Para un control de velocidad preciso, se puede generar manualmente la señal PWM.
Características de la Señal de Control Estándar
Las características que debe tener la señal de control para un servo estándar son las siguientes:
- Frecuencia: 50 Hz
- Periodo: 20 ms
- Ancho de pulso: 1 a 2 ms (dependiendo de la posición deseada)
- Voltaje típico: 5 volts
Tipos de Servomotores Comunes para Proyectos
Existe una gran variedad de servos, que varían en tamaño, fuerza, velocidad y precisión. Para nuestros proyectos caseros usaremos principalmente dos tamaños de servo. Dentro de los distintos modelos destacaremos tres por su calidad/precio. Podéis encontrarlos fácilmente en vendedores internacionales de eBay o AliExpress. Conviene aclarar que estos servos, sobre todo los comprados en China, destacan por su calidad/precio. Pero, lógicamente, son modestos en sus características.
Lea también: Guía IVA reducido
Micro Servo SG90
Es el servo de tamaño “pequeño” estándar dentro de los proyectos de electrónica. Es un servo pequeño, ligero y barato, que dispone de engranajes de plástico. Muchos dispositivos, como torretas y partes de robots, están diseñados para instalar servos de este tamaño. El ángulo de giro, en este caso nos permite hacer un barrido entre -90º y 90º.
Servo MG90S
El MG90S es similar al SG90 pero dispone de engranajes y el acoplamiento metálicos. A cambio pesa un poco más y es más caro. Físicamente es compatible con los accesorios del SG90. Usaremos este servo como sustituto del SG90 cuando tengamos una aplicación en la que realmente necesitemos ejercer fuerza, y las partes de plástico podrían ceder y quedarse “redondas”.
Servo MG996R
Este es el servo de tamaño “grande” que usaremos frecuentemente. Este tipo de servos es ampliamente utilizado en proyectos de robótica. Igual que con el SG90, muchos dispositivos y kits como brazos robóticos o hexápodos, están diseñados para instalar este tamaño de servo.
Tabla Comparativa de Servomotores Comunes
| Característica | SG90 | MG90S | MG996R |
|---|---|---|---|
| Torque (4.8V) | 1.4 kg·cm | 1.8 Kg·cm | 13kg·cm |
| Torque (6V) | - | - | 15kg·cm |
| Velocidad (4.8V) | 0.1 seg/60º | 0.1 seg/60º | 0.17 seg/60º |
| Velocidad (6V) | 0.08 seg/60º | 0.08 seg/60º | 0.13 seg/60º |
| Dimensiones | 21.5 x 11.8 x 22.7mm | 22.8 x 12.2 x 28.5mm | 40 x 19 x 43mm |
| Peso | 9g | 13.4g | 56g |
| Precio aproximado | 1.20€ | 2€ | 3.70€ |
| Engranajes | Plástico | Metálicos | Metálicos |
Materiales Necesarios
Para las prácticas que mencionamos en esta página recomendamos adquirir los siguientes materiales:
- 1 x Arduino Uno R3
- 1 x Cables dupont macho a macho
- 1 x Micro servomotor SG90 (o MG90S, MG996R según necesidad)
- 1 x Potenciómetro tipo rotatorio de 10K (opcional, para el ejemplo Knob)
- 1 x Protoboard de 400 puntos (opcional, para facilitar conexiones)
- 2 x Botón o push button estándar (opcional)
La placa Arduino Uno es la más popular y cuenta con un microprocesador que facilita la programación y ejecución de nuestro código. El servomotor es el componente que controlaremos, y debemos elegir uno adecuado para nuestras necesidades. Los cables jumper son necesarios para realizar las conexiones entre la placa Arduino y el servomotor. Asegúrate de trabajar en un área bien iluminada y libre de distracciones para poder concentrarte en la programación y las conexiones.
Lea también: ¿Cómo localizar tus XML del SAT?
Conexión de un Servomotor con Arduino
Conectar un servo a Arduino es sencillo. El servo dispone de tres cables, dos de alimentación (GND y Vcc) y uno de señal (Sig). El color de estos cables suele tener dos combinaciones: Marrón (GND), Rojo (Vcc) y Naranja (Sig) o Negro (GND), Rojo (Vcc) y Blanco (Sig). El cable rojo, va conectado a positivo (Vcc). El cable amarillo o blanco, va conectado a una salida digital. Para el caso de esta práctica, se ha seleccionado el pin 9. Los pulsos enviados por este pin, tienen un ancho de 20 milisegundos y dependiendo de la posición, varían este ancho.
La conexión de un servomotor RC con una tarjeta Arduino puede ser un tema simple o bastante complicado dependiendo del tamaño y cantidad de servomotores que deseamos conectar. A medida que conectamos motores más grandes a la tarjeta, el consumo de corriente aumenta y se hace necesario utilizar una fuente de alimentación externa para los motores en vez de usar la salida de 5 volts en nuestra placa.
Conexión con Alimentación Directa desde Arduino
Esta conexión es ideal para experimentar y podemos usar uno o dos servos pequeños como el SG90 o MG90S. Su principal desventaja es que la corriente disponible para los servomotores será limitada. Si excedemos el límite de corriente podemos causar que nuestro Arduino se reinicie o funcione de manera inestable. Una regla crítica es: Nunca alimente un servo directamente desde el pin de 5 V del Arduino si el servo consume más de 200 mA durante el funcionamiento. Para la mayoría de los servos de 9g, el Arduino 5V directo es seguro para realizar pruebas.
Conexión con Alimentación Independiente
Esta conexión es óptima cuando utilizamos servos de gran tamaño o estamos controlando varios motores que en total tienen una gran demanda de corriente. La fuente externa que utilicemos debe ser seleccionada tomando en cuenta la corriente promedio y pico de los servomotores. En general, la alimentación a los servos se realizará desde una fuente de tensión externa (una batería o fuente de alimentación) a una tensión de 5V-6.5V, siendo 6V la tensión idónea. Es importante destacar que la tierra de las baterías o de la fuente externa debe estar conectada también a la tierra de la placa Arduino. Al usar varias fuentes de tensión recordar poner siempre en común todos los GND. De lo contrario podríais dañar algún componente. Los servos consumen mucha intensidad, sobre todo cuando se les obliga a hacer mucha fuerza, porque por ejemplo, se fuerza su eje. Los servos deben conectarse siempre correctamente. De no ser así pueden ser destruidos fácilmente o, peor, tu placa Arduino. Cada servo puede alimentarse a un voltaje máximo, en general 5 ó 6V. Si aplicas más tensión, los quemarás.
Programación de un Servomotor con Arduino
Gracias a las bibliotecas o librerías incluidas en el entorno Arduino, el control de servos de modelismo es una de las cosas que podemos hacer sin la necesidad de instalar software adicional. La librería destinada al control de servos se llama Servo.h. La biblioteca Arduino Servo está preinstalada en el IDE oficial. El control de servos en Arduino es muy sencillo, ya que el IDE Standard proporciona la librería “servo.h”, que permite controlar simultáneamente hasta 12 servos en Arduino Uno/Nano y hasta 48 servos en Arduino Mega.
Incluyendo la Librería Servo.h
Para incluir la librería Servo en el proyecto, es necesario ir al Menú: Programa -> Incluir Librería -> Servo. Esta acción ya nos ha hecho un #include <Servo.h> en nuestro código que nos permite controlar el servo. Después de incluir la librería Servo en el proyecto, es posible usar sus funciones. Utilice siempre la biblioteca Servo por simplicidad y confiabilidad.
Funciones Básicas para Controlar el Servo
De la librería Servo.h hemos declarado un objeto o variable, por ejemplo Servo myservo;. Esta línea de código le dice al compilador que la variable myservo va a asociar un conjunto de variables y funciones. Este estilo de programación viene del lenguaje C++ y es muy parecido a estructuras en lenguaje C. Algunas de las funciones principales son:
- myservo.attach(pin);: Asigna el pin digital al que está conectado el servo. Es vital verificar que myservo.attach(pin) utiliza un pin compatible con PWM. En Arduino Uno, los pines 3, 5, 6, 9, 10, 11 admiten PWM.
- myservo.write(angulo);: Para controlar el servo a un ángulo específico (por ejemplo, 45°), simplemente use myservo.write(45);.
- myservo.attach(pin, minimo, maximo);: Permite ajustar el ancho de pulso mínimo/máximo donde el valor mínimo es 544 µs (0°) y el máximo es 2400 µs (180°). Algunos servos requieren entre 500 y 2500 µs.
Ejemplo: Barrido Continuo (Sweep)
Este programa recorre todo el rango de posiciones en las que es capaz de funcionar el servomotor. Va de 0 a 180 grados y de vuelta a cero. Esto ocurre todo el tiempo que el Arduino recibe alimentación. Entre los ejemplos típicos para ilustrar el funcionamiento de servos tenemos el Sketch “Sweep”, que realiza un barrido continuo con el servo. Para ello incrementa el ángulo de 0 a 180º a razón de 1º cada 15ms, posteriormente realiza la operación contraria de 180º a 0º, para finalmente reiniciar el bucle. En este programa usamos una función for(), muy útil cuando necesitamos crear loops o repetir algún código. Incrementa la variable pos hasta llegar a 180. Y por cada incremento ejecuta el código que se encuentre entre sus { }. Pero en este caso la variable pos es inicializada con un valor de 180 y decrementa (down counter) por cada paso por el loop for(). Así controlamos que el servo gire en un sentido y luego en el otro sentido. Este ejemplo puede ser obtenido a través de Menú: Archivo -> Ejemplos -> Servo -> Sweep.
Ejemplo: Control con Potenciómetro (Knob)
Este ejemplo de código permite controlar la posición del servo utilizando un potenciómetro. El código ejemplo puede ser encontrado en el Menú: Archivo -> Ejemplos -> Servo -> Knob. En este programa ejemplo la función setup(), asignamos el pin 9 para controlar el servo. Note que la función attach(), pertenece a la clase Servo. Luego, en la función loop(), lo primero que hacemos es leer el canal analógico '0', donde está conectado el potenciómetro. Este valor, que va de 0 hasta 1023, es almacenado en una variable. Después, escalamos o mapeamos este valor entre 0 y 180 para ser usado por el servo. Luego, usamos la función myservo.write(val); para posicionar el servo de acuerdo al valor escalado. Y finalmente damos un retardo de 15 milisegundos.
Carga del Código y Pruebas
Con las conexiones adecuadas realizadas, ahora es el momento de programar el Arduino para controlar el servomotor. Para cargar el código en la placa Arduino, primero abre el IDE de Arduino y copia el código escrito. Finalmente, haz clic en el botón de «Cargar» y espera a que el proceso finalice. Al encender el sistema, el servomotor comenzará a moverse a las posiciones definidas en el código. Observa si se mueve correctamente y si alcanza las posiciones deseadas. Es recomendable realizar pruebas en un entorno controlado para evitar daños tanto en el servomotor como en la placa Arduino. Si el servomotor no se comporta como esperabas, puedes realizar ajustes. Además, ten en cuenta que un servomotor puede tener una limitación física en cuanto a las posiciones que puede alcanzar. Al realizar estos ajustes y pruebas, podrás optimizar el control del servomotor y asegurar que tu proyecto sea un éxito.
