SINTONIZAR PID CON ARDUINO – Control de posición de una pelota en levitación
Introducción
Recientemente, me encontré por casualidad con un vídeo que mostraba cómo un secador de pelo puede hacer levitar una pelota de ping-pong, ilustrando el principio de Bernoulli. Esto despertó mi curiosidad sobre la posibilidad de ajustar la potencia del secador para controlar la altura a la que se mantiene la pelota. Inspirado por esta idea, esa misma noche comencé a experimentar con algunos componentes que tenía guardados y, poco a poco, di forma a la maqueta que les presento hoy. Es un proyecto bastante sencillo de realizar, aunque presenta algunos desafíos a la hora de identificar el sistema. La maqueta consiste en una pelota de ping-pong situada dentro de un tubo, la cual se eleva venciendo la fuerza de la gravedad gracias al aire suministrado por un ventilador.
Componentes
- Arduino UNO R3.
- Tubo transparente. Yo he usado uno de 305mm de longitud con diámetro interno de 42mm para que pueda alojar una pelota de ping-pong de 40mm de diámetro.
- Sensor de medida. La implementación final está realizada con el viejo conocido HC-SR04 aunque os dejo en la carpeta del proyecto el código con el sensor gemelo US-016. La diferencia entre ambos es que el HC-SR04 usa dos pines digitales mientras que el US-016 usa un pin analógico.
- Ventilador. He usado un Arctic S4028-15K de 40x40x28mm y la verdad que me he quedado muy impresionado de la gran calidad que ofrece por unos míseros 12€. Ya de saque nos ofrece velocidades de entre 1400 y 15000 RPMs, conexión de 4 pines con sensor y PWM, cable de 40cm y podemos alimentarlo de 5 a 12V con un consumo de menos de media amperio, vamos que no tiene un pero. Eso sí, si quieres las 15000 RPMs tienes que alimentarlo a 12V, pero es que a 5V te da 7000 RPMs, vamos, una maravilla.
- Modelos 3D. He diseñado para la ocasión dos piezas, una que hace de base y otra de conexión con el tubo.
El coste de la maqueta completa puede oscilar entre 25-65€ dependiendo de donde compréis.
Esquema de conexión
Montaje
Las piezas amarillas están impresas en 3D y sirven para asegurar el caudal de aire y conectar el tubo. En la parte superior, el sensor HC-SR04 encaja justo con las dimensiones del diámetro interior del tubo. Si optáis por usar el sensor US-016 deberéis pegarlo con celo o diseñar una pieza para anclarlo.
Identificación
Adecuación de la señal del sensor de distancia
La señal del sensor de distancia no es muy ruidosa, aún así he implementado un filtro EMA como en la maqueta de control de velocidad. Para no repetir toda la explicación os dejo el enlace y os invito a ver el vídeo de ajuste del parámetro alpha.
Limitaciones del sensor de distancia
Voy a explicar algo importante que aplica tanto al sensor HC-SR04 como al US-016. Estos dispositivos pueden medir distancias en un rango que va desde los 4 hasta los 400 centímetros. Funcionan perfectamente dentro de este rango. Sin embargo, si un objeto se sitúa a menos de 4 centímetros del sensor, este último no puede medir correctamente y, en su lugar, indica que el objeto está al límite máximo de su capacidad de detección. Esta limitación es particularmente problemática cuando se utiliza en sistemas de control PID, ya que una distancia menor a 4 centímetros podría hacer que el controlador PID interprete erróneamente que el objeto se ha movido de estar muy cerca a estar muy lejos, desestabilizando así el sistema de control.
Para mitigar este problema, existen dos estrategias posibles y ambas requieren esfuerzos adicionales. La primera estrategia implica ajustar mediante programación la salida del sensor a un valor que refleje de manera fidedigna la posición real del objeto. Este ajuste requiere realizar un test preliminar para determinar la duración del eco del sensor con el objeto tanto en la distancia mínima como máxima de detección, a fin de establecer un valor fijo a ser aplicado. Este procedimiento puede realizarse incluso antes del montaje final del proyecto, y he incluido el código necesario para este test en la carpeta del proyecto. La segunda estrategia consiste en la instalación de una barrera física que evite que el objeto se posicione a menos de 4 centímetros del sensor.
Ajuste de la señal PWM
La Modulación por Ancho de Pulso (PWM, por sus siglas en inglés Pulse Width Modulation) es una técnica utilizada para simular una señal analógica a partir de una fuente digital, como es el caso de los microcontroladores Arduino. En la práctica, PWM implica alternar rápidamente el estado de un pin entre HIGH y LOW a una frecuencia determinada, variando la proporción de tiempo que el pin permanece en cada estado dentro de cada ciclo. Esta «proporción de tiempo» se conoce como el «ciclo de trabajo» de la señal PWM, y se expresa comúnmente en porcentaje.
La frecuencia de las señales PWM en Arduino UNO es fija y depende del temporizador que controle el pin específico. Por defecto, los pines 5 y 6 operan a aproximadamente 976 Hz, mientras que los pines 3, 9, 10, y 11 funcionan a aproximadamente 490 Hz. Esta diferencia se debe a cómo están configurados los temporizadores internos del ATmega328P.
Modificar la frecuencia de la señal PWM puede ser interesante e incluso necesario para una variedad de aplicaciones, por varias razones:
- Compatibilidad con Dispositivos: Algunos dispositivos, como ciertos tipos de motores o luces LED, pueden requerir frecuencias específicas de PWM para operar correctamente o de manera óptima. Por ejemplo, una frecuencia más alta puede ser necesaria para evitar el parpadeo visible en LEDs o para lograr una operación más suave de motores sin escobillas.
- Reducción de Ruido: En aplicaciones de control de motores, frecuencias específicas de PWM pueden ayudar a reducir el ruido audible generado por la conmutación eléctrica, mejorando así el rendimiento acústico del sistema.
- Eficiencia y Calor: La eficiencia de los dispositivos de potencia (como los transistores que controlan motores en puentes H) puede variar con la frecuencia de PWM. Frecuencias inadecuadas pueden resultar en un calentamiento excesivo y pérdida de eficiencia.
- Control Preciso: Algunas aplicaciones pueden beneficiarse de ajustar la frecuencia de PWM para obtener un control más fino sobre el ciclo de trabajo y, por lo tanto, sobre la potencia entregada al dispositivo controlado.
Modificar la frecuencia de PWM en un Arduino UNO implica interactuar directamente con los registros de bajo nivel del microcontrolador, lo que nos permite ajustar la configuración de los temporizadores para adecuarlo al proyecto. Sin embargo, esta modificación debe realizarse con precaución, ya que también puede afectar el funcionamiento de otras bibliotecas o funciones que dependen de los mismos temporizadores. En el caso que nos ocupa, la modificación del timer no afecta al código implementado.
Para ilustrar el efecto que puede tener modificar la frecuencia, a la izquierda, la señal PWM de Arduino por defecto, que tiene una frecuencia aproximada de 490 Hz. Se puede observar que la señal tiene menos ciclos dentro del mismo período de tiempo en comparación con la señal de 25 kHz. A la derecha, la señal PWM ajustada a 25 kHz para éste proyecto. Esta señal presenta muchos más ciclos en el mismo intervalo de tiempo debido a su mayor frecuencia, lo que hará que el ventilador responda mejor.
Identificación de un proceso integrador
Durante la realización de pruebas en modo manual, hemos determinado que nos enfrentamos a un proceso integrador. Esto significa que ante un cambio escalonado en la salida del controlador (OP), la variable de proceso (PV) experimentará un incremento o decremento continuo e indefinido. Al principio, consideré aplicar el método del relé para la identificación del proceso, pero lo descarté para probar un método propuesto por Tore Hagglund en su nuevo libro Process Control in Practice.
El procedimiento recomendado por Tore Hagglund para identificar este tipo de procesos consiste en efectuar un ajuste manual en la OP hasta conseguir que la PV quede en estado estacionario. Una vez estable debemos efectuar un cambio en la OP que provocará un cambio en la PV, generando un perfil en forma de rampa similar al observado en la figura adjunta. A partir de este ensayo y su análisis visual, estamos capacitados para calcular tanto la velocidad de cambio de la salida del proceso (definida en la ecuación 1) como la ganancia de velocidad (expresada en la ecuación 2).
\begin{align} & v = \frac{ΔPV}{\ T0}=\frac{3}{\ 1,2}=2,5s\\ & Kv = \frac{v}{\ ΔOP} = \frac{2,5}{\ 3} = 2,08s^{-1} \end{align}
Con estos parámetros, podemos establecer un conjunto de valores para la sintonización del controlador PID. Es probable que estos valores requieran ajustes finos, pero nos proporcionan un punto de partida válido para la optimización del control.
Control PID
Esquema de control
Implementación
Nuestro propósito es posicionar con precisión la pelota en un lugar específico dentro del tubo. Utilizamos un sensor de distancia ultrasónico para medir la distancia exacta de la pelota, expresada en centímetros. A continuación, ajustamos la velocidad de giro del ventilador empleando una señal de modulación de ancho de pulso (PWM, por sus siglas en inglés). Este método nos permite variar finamente la potencia aplicada al ventilador y, por ende, controlar la altura a la que se mantiene la pelota.
Conclusiones
Se ha desarrollado una maqueta de diseño compacto y construcción sencilla, la cual ha facilitado la exploración de una diversidad de conceptos técnicos importantes. La experiencia ha incluido el enfrentamiento a retos vinculados con el sensor de distancia, así como la implementación y ajuste de la modulación por ancho de pulso (PWM), sin olvidar la identificación del proceso integrador. Además, ha sido revelador el uso del pequeño ventilador Arctic, que ha permitido una regulación eficaz con mínimo ruido. En lo personal, ha sido sorprendente el amplio aprendizaje y el valor educativo que ha ofrecido esta compacta maqueta.
Enlaces
- Carpeta del proyecto
- Ventilador Artic S4028-15K [Hoja de datos] [Web]
- Arduino IDE
- Arduino COM Plotter
- Fritzing [Oficial] [Arduino Factory]
- Librería PID de Brett Beauregard [Github]
- Funcionamiento del sensor HC-SR04 [proyectosconarduino] [naylamp]
- Funcionamiento del sensor US-016 [sensorstec]
- Filtro exponencial EMA (Exponential Moving Average) [Arduino.cl] [Luis Llamas]
- Introducción al algoritmo PID y su implementación en Arduino [garikoitz.info]
Libros y publicaciones
[1] Karl J. Astrom, Tore Hagglund. Control PID avanzado, Pearson, ISBN: 978-84-8322-511-0
[2] Tore Hagglund. Process Control in Practice, De Gruyter, ISBN: 9783111104959
[3] Myke King. «Process Control – A Practical Approach«, 2nd Edition, Chapter 2.4, Integrating Processes and Chapter 3.23, Suggested Tuning Method for Integrating Processes, Wiley, ISBN: 9781119157755