Can I use a PID controller on all Arduino boards?

Control PID para Arduino: La Librería AutoPID

18/04/2022

Valoración: 4.42 (3166 votos)

En el vasto universo de la electrónica y la automatización, el control preciso de sistemas es una meta fundamental. Ya sea para mantener una temperatura constante, regular un nivel de líquido o estabilizar la velocidad de un motor, la capacidad de ajustar y mantener un valor deseado es crucial. Aquí es donde entran en juego los controladores PID, una de las herramientas más extendidas y eficaces en ingeniería de control. Y para los entusiastas y desarrolladores de Arduino, existe una solución elegante y robusta: la librería AutoPID.

What is Arduino autopid library?
Arduino AutoPID library A simple PID library featuring time scaling, bang-bang control, and PWM relay control. Full Documentation Uh oh! There was an error while loading. Please reload this page. Uh oh! There was an error while loading. Please reload this page. Arduino AutoPID library.

Esta librería simplifica enormemente la implementación de un control PID en tus proyectos de microcontroladores, ofreciendo características avanzadas que optimizan el rendimiento y la estabilidad. Si alguna vez te has preguntado cómo lograr que tus sistemas respondan de manera inteligente y autónoma, AutoPID es el camino a seguir.

Índice de Contenido

¿Qué es un Controlador PID?

Antes de sumergirnos en los detalles de la librería AutoPID, es esencial comprender qué es un controlador PID. Un controlador proporcional-integral-derivativo (PID) es un mecanismo de retroalimentación de bucle de control ampliamente utilizado en sistemas de control industrial y una variedad de otras aplicaciones que requieren un control continuamente modulado. Su objetivo principal es calcular continuamente un valor de error, que es la diferencia entre un punto de ajuste deseado (SP, Setpoint) y una variable de proceso medida (PV, Process Variable), y luego aplicar una corrección basada en tres términos:

  • Proporcional (P): Este término produce un valor de salida que es proporcional al error actual. Una respuesta proporcional grande puede reducir el error rápidamente, pero también puede causar sobreimpulsos y oscilaciones.
  • Integral (I): Este término considera la suma acumulada de errores pasados. Ayuda a eliminar el error de estado estacionario que podría quedar con solo el término proporcional, asegurando que el sistema alcance finalmente el punto de ajuste exacto. Sin embargo, un término integral excesivo puede llevar a una "integrator wind-up", donde el controlador acumula un error significativo y causa un gran sobreimpulso.
  • Derivativo (D): Este término predice errores futuros basándose en la tasa de cambio del error. Ayuda a amortiguar las oscilaciones y a mejorar la respuesta transitoria del sistema, reduciendo el sobreimpulso y el tiempo de establecimiento.

Al combinar estos tres términos, un controlador PID puede proporcionar un control preciso y estable para una amplia gama de sistemas dinámicos.

La Librería Arduino AutoPID: Un Control Inteligente a tu Alcance

La librería Arduino AutoPID es una implementación de un controlador PID diseñada específicamente para las placas Arduino. Fue creada por Ryan Downing y se distingue por su facilidad de uso y sus características avanzadas que la hacen ideal para proyectos de automatización. A diferencia de otras implementaciones, AutoPID incluye funcionalidades que optimizan el rendimiento y la eficiencia del control.

Características Destacadas de AutoPID

La librería AutoPID no es solo un controlador PID básico; viene equipada con características que la hacen particularmente potente y flexible:

1. Escalado de Tiempo y Actualización Automática de Valores

Una de las grandes ventajas de AutoPID es su función run(). Esta puede ser llamada tan a menudo como sea posible en el bucle principal de tu programa (loop() de Arduino), pero solo realizará los cálculos de actualización en un intervalo de tiempo especificado. Esto significa que no tienes que preocuparte por la sobrecarga computacional o por llamar la función con una frecuencia incorrecta. Además, los cálculos tienen en cuenta la duración de este intervalo de tiempo, lo que permite ajustar el intervalo sin necesidad de recalcular las ganancias PID (Kp, Ki, Kd).

Dado que el objeto PID almacena punteros a las variables de entrada, punto de ajuste y salida, puede actualizar automáticamente esos valores sin necesidad de sentencias de asignación extra. Esto simplifica tu código y asegura que el controlador siempre esté trabajando con los datos más recientes.

2. Control Bang-Bang Integrado

La librería incluye una opción de control bang-bang (también conocido como control ON/OFF). Cuando la entrada está fuera de un rango especificado del punto de ajuste, el control PID se desactiva y la salida se lleva al valor máximo (bang-on) o mínimo (bang-off). Esta característica es extremadamente útil para:

  • Aproximar el punto de ajuste más rápidamente: Cuando el sistema está muy lejos del objetivo, un control ON/OFF es más eficiente para acercarse rápidamente.
  • Reducir el sobreimpulso debido al "integrator wind-up": El "integrator wind-up" ocurre cuando el término integral acumula un error grande mientras el sistema está saturado (por ejemplo, la salida está al máximo o al mínimo). El control bang-bang ayuda a prevenir esto al desactivar el PID en los extremos, evitando que el integrador acumule un error excesivo.

Puedes definir un umbral (bangOn, bangOff o bangRange) para activar este comportamiento, lo que te da un control fino sobre cuándo el sistema debe operar en modo PID o en modo bang-bang.

3. Control PWM (Relay)

Dado que la salida de un control PID es un valor analógico, a menudo es necesario adaptarlo para controlar una salida digital ON/OFF, como un relé o un calentador. AutoPID facilita esto mediante la modulación por ancho de pulso (PWM). Puedes usar la librería AutoPIDRelay para controlar directamente un estado de relé, donde la duración del pulso (ciclo de trabajo) se ajusta proporcionalmente a la salida analógica del PID. Esto es perfecto para aplicaciones como el control de temperatura con elementos calefactores o enfriadores.

Compatibilidad y Facilidad de Uso

Una pregunta común es si esta librería puede usarse con todas las placas Arduino. ¡La respuesta es sí! La librería AutoPID es compatible con todas las arquitecturas de Arduino, lo que significa que puedes utilizarla en una amplia variedad de placas, desde un Arduino UNO hasta un ESP32 o un Teensy. Esta compatibilidad universal la convierte en una opción versátil para cualquier proyecto.

Instalación de la Librería AutoPID

Instalar AutoPID es un proceso sencillo, similar a cualquier otra librería de Arduino:

Vía Gestor de Librerías del IDE de Arduino:

  1. Abre el IDE de Arduino.
  2. Ve a Sketch > Incluir Librería > Administrar Librerías...
  3. En la barra de búsqueda, escribe "autopid".
  4. Selecciona la librería "AutoPID" y haz clic en "Instalar".

Vía Archivo ZIP:

  1. Descarga el archivo ZIP de la librería (generalmente desde GitHub u otra fuente).
  2. Abre el IDE de Arduino.
  3. Ve a Sketch > Incluir Librería > Añadir Librería .ZIP...
  4. Navega hasta el archivo ZIP descargado y selecciónalo.

Una vez instalada, la librería estará disponible para ser incluida en tus proyectos.

Conceptos Fundamentales en AutoPID: Input, Setpoint y Output

En el corazón de la librería AutoPID, y de cualquier controlador PID, se encuentran tres variables clave que definen su operación:

  • Input (Entrada): Es la variable de proceso medida (PV) que el controlador está intentando controlar. Podría ser la temperatura actual de un horno, el nivel de agua en un tanque, la velocidad de un motor, etc. En la librería AutoPID, se pasa como un puntero a una variable tipo double, lo que permite que el controlador lea su valor actual automáticamente.
  • Setpoint (Punto de Ajuste): Es el valor deseado o la referencia a la que el controlador intenta llevar la entrada. Es el objetivo que quieres alcanzar y mantener. Al igual que la entrada, se pasa como un puntero a una variable double.
  • Output (Salida): Es el valor que el controlador calcula y que se aplica al sistema para influir en la entrada. Esta salida se utiliza para manipular el actuador que controla el proceso. Por ejemplo, podría ser un valor PWM para un calentador, un voltaje para un motor, etc. También se pasa como un puntero a una variable double, y la librería se encarga de actualizarla.

El uso de punteros para estas variables es una característica de diseño inteligente en AutoPID. Significa que la librería no necesita que le pases el valor de entrada o de punto de ajuste en cada llamada a run(); simplemente lee los valores de las direcciones de memoria a las que apuntan, asegurando que siempre esté utilizando los datos más recientes de tus sensores o configuraciones.

Funciones Clave de la Librería AutoPID

La librería AutoPID ofrece un conjunto de funciones que te permiten configurar, controlar y monitorear el comportamiento del controlador. Aquí te presentamos las más importantes:

Constructor AutoPID::AutoPID

AutoPID(double* input, double* setpoint, double* output, double outputMin, double outputMax, double Kp, double Ki, double Kd)

Este es el corazón de la librería. Se utiliza para crear una nueva instancia del objeto AutoPID. Los parámetros son:

  • input, setpoint, output: Punteros a las variables que contienen los valores de entrada, punto de ajuste y salida, respectivamente.
  • outputMin, outputMax: El rango mínimo y máximo al que puede ser ajustada la salida del controlador. Deben usar las mismas unidades que la variable output.
  • Kp, Ki, Kd: Las ganancias proporcionales, integrales y derivativas del PID. Estos son los parámetros que ajustas para sintonizar el comportamiento del controlador.

AutoPID::setGains

void setGains(double Kp, double Ki, double Kd)

Permite ajustar manualmente las ganancias PID (Kp, Ki, Kd) en cualquier momento después de la inicialización del objeto. Esto es útil para la sintonización dinámica o si las condiciones del sistema cambian.

AutoPID::setBangBang

void setBangBang(double bangOn, double bangOff)
void setBangBang(double bangRange)

Configura los umbrales para el control bang-bang. Si la entrada está por debajo de (setpoint - bangOn), la salida se establecerá en outputMax. Si la entrada está por encima de (setpoint + bangOff), la salida se establecerá en outputMin. La sobrecarga con bangRange permite establecer un umbral simétrico para ambos lados del punto de ajuste.

AutoPID::setOutputRange

void setOutputRange(double outputMin, double outputMax)

Permite reajustar el rango mínimo y máximo de la salida del controlador en cualquier momento. Esto es útil si los límites operativos de tu actuador cambian.

AutoPID::setTimeStep

void setTimeStep(unsigned long timeStep)

Ajusta el intervalo de tiempo en milisegundos en el que se permiten ejecutar los cálculos PID. El valor por defecto es 1000 ms (1 segundo). Un timeStep más pequeño significa actualizaciones más frecuentes, lo que puede mejorar la respuesta pero también aumentar la carga de procesamiento.

AutoPID::atSetPoint

bool atSetPoint(double threshold)

Indica si la entrada ha alcanzado el punto de ajuste deseado dentro de un umbral específico. Retorna true si la entrada está dentro de +-(threshold) del punto de ajuste, y false en caso contrario. Útil para saber cuándo el sistema ha estabilizado.

AutoPID::run

void run()

Esta es la función principal que debe ser llamada repetidamente desde el bucle loop() de tu Arduino. Solo realizará los cálculos PID cuando haya transcurrido el intervalo de tiempo definido por setTimeStep(). Lee los valores de entrada y punto de ajuste (a través de los punteros) y actualiza la variable de salida.

AutoPID::stop

void stop()

Detiene los cálculos PID y reinicia los valores internos de cálculo del PID (integral, derivativo). Puede reanudarse con run().

AutoPID::reset

void reset()

Reinicia solo los valores internos de cálculo del PID (integral, derivativo), sin detener el controlador. Útil para reiniciar el estado del PID sin detener su operación.

AutoPID::isStopped

bool isStopped()

Indica si los cálculos PID han sido detenidos. Retorna true si el PID está detenido.

AutoPID::getIntegral

double getIntegral()

Retorna el valor actual del término integral del error. Esto es útil para almacenar el estado del controlador, por ejemplo, después de un ciclo de energía, para reanudar el control desde un punto conocido.

AutoPID::setIntegral

void setIntegral(double integral)

Permite sobrescribir el valor actual del término integral. Complementa a getIntegral(), siendo útil para reanudar estados después de un ciclo de energía. Importante: debe llamarse después de que run() sea llamado por primera vez, de lo contrario, se restablecerá.

Funciones de AutoPIDRelay

Para aplicaciones que requieren control de relés o salidas ON/OFF, la librería AutoPIDRelay proporciona funciones específicas:

Constructor AutoPIDRelay::AutoPIDRelay

AutoPIDRelay(double* input, double* setpoint, bool* relayState, double pulseWidth, double Kp, double Ki, double Kd)

Similar al constructor de AutoPID, pero incluye un puntero a relayState (que será true o false para encender/apagar el relé) y pulseWidth, que es el ancho del pulso PWM en milisegundos para el control del relé.

AutoPIDRelay::getPulseValue

double getPulseValue()

Retorna la longitud del pulso actual. Aunque el estado del relé se gestiona internamente, esta función puede ser útil para monitoreo o depuración.

Ejemplo de Uso: Control Básico de Temperatura

Un caso de uso clásico para la librería AutoPID es el control de temperatura. Imagina que quieres mantener una temperatura específica en un incubador o un horno casero. Aquí un esquema simplificado de cómo se usaría:

#include <AutoPID.h>
#include <DallasTemperature.h>
#include <OneWire.h>

// Pines
#define POT_PIN A0 // Potenciómetro para el punto de ajuste
#define OUTPUT_PIN A1 // Salida analógica (ej. para un calentador con PWM)
#define TEMP_PROBE_PIN 5 // Pin para el sensor de temperatura Dallas DS18B20
#define LED_PIN 6 // LED indicador de punto de ajuste alcanzado
#define TEMP_READ_DELAY 800 // Retraso de lectura del sensor (min 750ms)

// Configuración y ganancias PID
#define OUTPUT_MIN 0
#define OUTPUT_MAX 255
#define KP .12
#define KI .0003
#define KD 0

double temperature, setPoint, outputVal;

OneWire oneWire(TEMP_PROBE_PIN);
DallasTemperature temperatureSensors(&oneWire);

// Objeto AutoPID: la entrada, punto de ajuste y salida se pasan por referencia (punteros)
// para que se actualicen automáticamente.
AutoPID myPID(&temperature, &setPoint, &outputVal, OUTPUT_MIN, OUTPUT_MAX, KP, KI, KD);

unsigned long lastTempUpdate; // Rastrea el tiempo de la última actualización de temperatura

// Función para actualizar la lectura del sensor de temperatura
bool updateTemperature() {
if ((millis() - lastTempUpdate) > TEMP_READ_DELAY) {
temperature = temperatureSensors.getTempFByIndex(0); // Obtener lectura de temperatura en Fahrenheit
lastTempUpdate = millis();
temperatureSensors.requestTemperatures(); // Solicitar lectura para la próxima vez
return true;
}
return false;
}

void setup() {
pinMode(POT_PIN, INPUT);
pinMode(OUTPUT_PIN, OUTPUT);
pinMode(LED_PIN, OUTPUT);
temperatureSensors.begin();
temperatureSensors.requestTemperatures();
while (!updateTemperature()) {} // Esperar hasta que el sensor de temperatura se actualice

// Si la temperatura está más de 4 grados por debajo o por encima del punto de ajuste,
// la SALIDA se establecerá en min o max respectivamente (control bang-bang).
myPID.setBangBang(4);
// Establecer el intervalo de actualización del PID a 4000ms (4 segundos)
myPID.setTimeStep(4000);
}

void loop() {
updateTemperature(); // Leer el sensor de temperatura
setPoint = analogRead(POT_PIN); // Leer el punto de ajuste desde el potenciómetro
setPoint = map(setPoint, 0, 1023, 60, 100); // Mapear el valor del potenciómetro a un rango de temperatura (ej. 60-100 F)

myPID.run(); // Llamar en cada bucle, se actualiza automáticamente en el intervalo de tiempo establecido
analogWrite(OUTPUT_PIN, (int)outputVal); // Aplicar la salida PID (PWM para calentador)
digitalWrite(LED_PIN, myPID.atSetPoint(1)); // Encender el LED cuando estamos en el punto de ajuste +-1 grado
}

Tabla Comparativa: Parámetros del Controlador PID

Comprender el efecto de cada ganancia es fundamental para la sintonización del PID.

ParámetroDescripciónEfecto en la Respuesta del Sistema
Kp (Ganancia Proporcional)Respuesta a la magnitud del error actual.Aumenta la velocidad de respuesta, reduce el error de estado estacionario, pero puede causar sobreimpulso y oscilaciones.
Ki (Ganancia Integral)Respuesta a la acumulación de errores pasados.Elimina el error de estado estacionario, pero puede causar "integrator wind-up" y mayor sobreimpulso si es demasiado alto.
Kd (Ganancia Derivativa)Respuesta a la tasa de cambio del error.Reduce el sobreimpulso, mejora la estabilidad, reduce el tiempo de establecimiento, pero puede ser sensible al ruido en la medición.
Setpoint (Punto de Ajuste)Valor deseado que el sistema debe alcanzar.El objetivo al que el controlador intenta llevar la variable de proceso.
Input (Entrada)Valor medido actual de la variable de proceso.La retroalimentación del sistema que el controlador utiliza para calcular el error.
Output (Salida)Valor calculado por el PID para controlar el actuador.La acción correctiva aplicada al sistema para alcanzar el punto de ajuste.

Preguntas Frecuentes sobre AutoPID

1. ¿Qué es la librería Arduino AutoPID?

La librería Arduino AutoPID es una implementación de un controlador proporcional-integral-derivativo (PID) diseñado para ser utilizado con placas Arduino. Permite automatizar sistemas mediante el ajuste continuo de una salida para mantener una variable de proceso en un punto de ajuste deseado, incorporando características avanzadas como el escalado de tiempo, control bang-bang y funciones de control de relés (PWM).

2. ¿Puedo usar un controlador PID con la librería AutoPID en todas las placas Arduino?

Sí, la librería AutoPID es compatible con todas las arquitecturas de Arduino. Esto significa que puedes utilizarla en cualquier placa Arduino, incluyendo las basadas en AVR (como Uno, Nano), ESP32, ESP8266, Teensy, etc., lo que la convierte en una solución muy versátil.

3. ¿Qué significan Input, Setpoint y Output en el contexto de AutoPID?

  • Input (Entrada): Es el valor medido actual de la variable que estás intentando controlar (ej. la temperatura actual de un sensor).
  • Setpoint (Punto de Ajuste): Es el valor deseado que quieres que la entrada alcance y mantenga (ej. la temperatura objetivo).
  • Output (Salida): Es el valor que el controlador calcula y que se aplica al actuador para influir en la entrada (ej. la potencia de un calentador o la velocidad de un motor).

La librería AutoPID utiliza punteros a estas variables para que pueda leer y escribir sus valores automáticamente, simplificando la integración en tu código.

4. ¿Cómo puedo contribuir al desarrollo de la librería Arduino-PID-autotune-library (o AutoPID)?

La librería AutoPID fue desarrollada por Ryan Downing. La información de contribución para la librería original de Brett Beauregard (de la cual AutoPID parece ser una evolución o proyecto relacionado, dado el contexto del texto proporcionado que mezcla información de ambas) indica que está bajo la licencia BSD. Para contribuir, generalmente se recomienda contactar directamente a los desarrolladores principales, como Brett Beauregard ([email protected], brettbeauregard.com) o participar en grupos de discusión relevantes, como el grupo de Google "diy-pid-control". Si encuentras algún problema o tienes sugerencias, la mejor manera es comunicarte a través de los canales establecidos por los mantenedores del proyecto.

Conclusión

La librería Arduino AutoPID es una herramienta invaluable para cualquier persona que busque implementar un control PID robusto y eficiente en sus proyectos de Arduino. Su diseño intuitivo, combinado con características avanzadas como el escalado de tiempo, el control bang-bang y la compatibilidad con todas las placas, la convierte en una opción superior para una amplia gama de aplicaciones de automatización. Desde sistemas de control de temperatura hasta la gestión de procesos más complejos, AutoPID te proporciona la precisión y estabilidad necesarias para llevar tus creaciones al siguiente nivel. Empieza a experimentar con ella y descubre el poder del control inteligente en tus manos.

Si quieres conocer otros artículos parecidos a Control PID para Arduino: La Librería AutoPID puedes visitar la categoría Librerías.

Subir