libreria-arduino-pidcontroller

Librería Arduino PIDController

La librería PIDController permite ejecutar de forma sencilla un controlador PID en un microprocesador como Arduino.

PIDController está basado en la librería Arduino PID, un gran trabajo realizado por Brett Beauregard. En este post del autor se detallan las mejoras implementadas respecto a un controlador PID básico.

Sin embargo, la librería Arduino PID no ha sido actualizada desde 2017. PIDController continua con el trabajo en esta librería, a la vez que la adapta a los nuevos tiempos y procesadores.

Pese a estar basada en Arduino PID, la librería PIDController ha sido reescrita desde cero. Por ello, el código ha sido refactorizado y limpiado, para que sea más fácilmente entendible, mantenible y ampliado.

Por tanto, la librería PIDController no es retrocompatible con Arduino PID. Los proyectos deberán ser adaptados a la nueva librería, según lo explicado en “Diferencias con Arduino PID”.

Una vez adaptado el código a la librería, la respuesta obtenida con PIDController ante las mismas entradas y parámetros del controlador será la mismo que la obtenido con Arduino PID.

Uso

Aquí tenemos un ejemplo de funcionamiento de la librería PIDController.

#include <PIDController.hpp>

const int PIN_INPUT = 0;
const int PIN_OUTPUT = 3;

PID::PIDParameters<double> parameters(4.0, 0.2, 1);
PID::PIDController<double> pidController(parameters);

void setup()
{
  pidController.Input = analogRead(PIN_INPUT);
  pidController.Setpoint = 100;

  pidController.TurnOn();
}

void loop()
{
  pidController.Input = analogRead(PIN_INPUT);
  pidController.Update();

  analogWrite(PIN_OUTPUT, pidController.Output);
}

Cambios respecto a Arduno-PID-Library

La librería PIDController incorpora las siguientes mejoras respecto a la librería Arduino PID. El código de tu proyecto deberá ser adaptado para tener en cuenta estos cambios.

  • La clase PID pasa a llamarse PIDController.
  • Se usa el namespace PID para evitar colisiones
  • Se hace uso de templating, así que ahora es posible usar tanto double como float
  • Input, Output y SetPoint dejan de ser punteros, para pasar a ser variables internas
  • El método Calculate() pasa a llamarse Update()
  • El método SetMode se reemplaza por las funciones TurnOn, TurnOff y Toggle
  • Añadido método Update(T input) que simultáneamente establece Input y llama al método Update()
  • Los parámetros Kp, Ki y Kd ahora están envueltos en una clase PIDParameters
  • #define para opciones son ahora enumeraciones.

Otras funciones de PIDController

Otras características añadidas a PIDController son las siguientes

  • Añadido parámetro Resolution para trabajar tanto con millis() como con micros()
  • Añadido el método ForzeUpdate() para actualizar incluso cuando el intervarlo de muestreo no haya pasado. (No es la opción preferida, pero es necesario en ciertos proyectos)
  • Añadidos parámetros separados para OutpuxMin, OutputMax, y AntiWindupMin, AntiWindupMax
  • Añadidas clases abstractas IController y ISisoController
  • Añadida clase PIDParametersAdaptative para simplificar el uso PID adaptativos.
  • Añadidos métodos Get...() para todas las propiedades del controlador
  • Añadidos métodos para obtener la contribución de cada término (GetTermP, GetTermI, GetTermD)
  • Añadida integración trapezoidal para mejora calculo del término integral

Instalación

  • Descargar la última versión desde GitHub
  • Descomprimir el archivo
  • Copiar en tu carpeta de librerías (normalmente Mis Documentos\Arduino\libraries)
  • Relanzar el IDE de Arduino

github-full