Cómo lograr movimientos suaves en robots con Arduino
¿Alguna vez has construido un robot y has notado que sus movimientos son demasiado bruscos?
Este es un problema muy común en proyectos de robótica. Un servomotor puede pasar rápidamente de una posición a otra, generando movimientos poco naturales e incluso afectando la precisión del sistema.
Para solucionar este inconveniente, podemos suavizar las señales de control antes de enviarlas al actuador. De esta manera, los movimientos se vuelven más fluidos y agradables a la vista.
En este tutorial aprenderás cómo lograr movimientos suaves en robots con Arduino utilizando un filtro de Media Móvil Exponencial (EMA). Para demostrar su funcionamiento realizaremos las pruebas en nuestro brazo robótico impreso en 3D y controlado con Arduino, permitiéndonos observar claramente la mejora en los movimientos.
Cómo suavizar el movimiento de un robot
Para suavizar el movimiento de nuestro robot utilizaremos un filtro conocido como Media Móvil Exponencial (EMA). La idea es sencilla: en lugar de enviar directamente la posición deseada al servomotor, primero la procesamos para evitar cambios bruscos.
La ecuación utilizada es la siguiente:
Donde:
- Valor suavizado: nueva posición que será enviada al servomotor.
- Valor deseado: posición objetivo que queremos alcanzar.
- Valor suavizado anterior: último valor calculado por el filtro.
- α (factor de suavizado): parámetro que controla qué tan suave será el movimiento.
El factor de suavizado es el encargado de determinar el comportamiento del sistema.
Si aumentamos el valor de α, el servomotor responderá más rápido a los cambios y alcanzará antes la posición deseada. Sin embargo, el movimiento será menos suave.
Por el contrario, si disminuimos el valor de α, el movimiento será mucho más fluido y progresivo, aunque el servomotor tardará más tiempo en llegar a su posición objetivo.
Por esta razón, será necesario encontrar un valor de α que proporcione un equilibrio adecuado entre suavidad y velocidad de respuesta.
Implementación en Arduino
Ahora que conocemos cómo funciona el filtro, es momento de implementarlo en Arduino.
Para este ejemplo utilizaremos programación por bloques. Si todavía no estás familiarizado con esta forma de programación, te recomiendo revisar primero el tutorial «Cómo programar Arduino con bloques», donde explico paso a paso cómo crear programas para Arduino sin necesidad de escribir código.
🧠 IA Educativa desde cero
Explora nuestros eBooks educativos con proyectos guiados paso a paso para enseñar inteligencia artificial desde casa o en el aula.
Antes de comenzar, debemos crear tres variables globales:
- joint: almacena la posición deseada del servomotor.
- smoothJoint: almacena la posición suavizada.
- alpha: almacena el factor de suavizado.
La programación mostrada en la siguiente imagen está dividida en tres partes identificadas con las etiquetas 1, 2 y 3.
En la parte 1, utilizamos las teclas de dirección para mover el brazo robótico de forma directa. Al presionar la flecha hacia arriba el brazo sube y al presionar la flecha hacia abajo el brazo baja. Esta sección nos permitirá observar el comportamiento normal del servomotor, donde los movimientos suelen ser bruscos.
En la parte 2, utilizamos las teclas A y S para cambiar el valor de la variable joint, que representa la posición deseada. Al presionar la tecla A, la variable toma el valor de 90 grados para subir el brazo. Al presionar la tecla S, la variable cambia a 30 grados para bajar el brazo.
Finalmente, en la parte 3, encontramos el programa principal encargado de aplicar el filtro de suavizado. Cuando se presiona la bandera verde, inicializamos la variable joint con un valor de 90 grados. Luego asignamos ese mismo valor a smoothJoint para que ambas variables comiencen sincronizadas. También configuramos la variable alpha con un valor de 0.1, un factor de suavizado que ofrece muy buenos resultados en esta aplicación.
Dentro del bloque por siempre, calculamos continuamente el nuevo valor suavizado utilizando la ecuación:
smoothJoint = redondear(alpha × joint + (1 − alpha) × smoothJoint)
Puede parecer extraño que la ecuación utilice la misma variable smoothJoint en ambos lados de la igualdad. Sin embargo, esto funciona porque después de cada cálculo la variable guarda automáticamente el resultado obtenido. De esta manera, en la siguiente iteración el programa reutiliza el valor suavizado previamente calculado, generando una transición progresiva y evitando cambios bruscos en el movimiento.
Una vez calculado el nuevo valor suavizado, este se envía al servomotor, permitiendo que el brazo robótico se desplace de forma mucho más fluida entre una posición y otra.
Pruebas Experimentales
Ahora es momento de realizar las pruebas y observar el efecto del filtro en el movimiento del brazo robótico.
Te recomiendo comenzar utilizando un valor de alpha = 0.1, ya que ofrece un movimiento bastante suave y natural. Sin embargo, no existe un valor único que funcione para todos los proyectos. Por esta razón, es importante que realices tus propias pruebas modificando el factor de suavizado.
Prueba aumentando y disminuyendo el valor de alpha y observa cómo cambia el comportamiento del sistema. Notarás que algunos valores producen movimientos más rápidos, mientras que otros generan transiciones más suaves entre posiciones.
En el video que acompaña este tutorial podrás observar el resultado obtenido en tiempo real. Te recomiendo verlo con atención y comparar el comportamiento del brazo robótico mientras experimentas con diferentes valores del factor de suavizado.
Esta técnica no se limita únicamente a brazos robóticos. También puede utilizarse en ojos animatrónicos para conseguir movimientos más naturales, mecanismos robóticos, personajes animados, sistemas automatizados y, en general, cualquier proyecto que emplee servomotores. Al suavizar las señales de control, es posible lograr movimientos más fluidos, realistas y agradables a la vista.
🧠 IA Educativa desde cero
Explora nuestros eBooks educativos con proyectos guiados paso a paso para enseñar inteligencia artificial desde casa o en el aula.