Controllo PID Arduino on/off

Controllo PID Arduino on/off? Cosa è? Si tratta di un sistema in grado di gestire una grandezza di processo tenendola sotto controllo e agendo su un organi di regolazione la riporta ad un valore noto e preimpostato. Ma andiamo per gradi. Innanzi tutto un pò di teoria (molto semplice ed immediata).

Controllo

Per controllo si intende un maccanismo, automatico, semiautomatico o manuale, atto appunto a controllare in generale un processo. Esistono differenti tipologie di controlli, per esempio sistemi dedicati per il controllo di singole grandezze come temperatura, pressione, flusso, ecc. Esistono poi sistemi in grado di controllare più grandezze nello stesso tempo ed agire su più elementi per poterne controllare lo stato o influenzare il comportamento.

Essi possono essere catalogiati anche per il modo o l’azione che svolgono per controllare il processo. Possono essere inglobati nel processo stesso o essere sistemi remoti. Possono essere ottenuti in sistemi a processore o avere una elettronica o logica a se.

Senza entrare ulteriormente nella teoria diremo semplicemente che: il controllo è un “oggetto” che influenza una grandezza.

PID

Il PID è uno dei sistemi di controllo a cui possiamo ricorrere per gestire una grandezza del processo. Esso essenzialmente è un algoritmo di calcolo. Immaginiamolo come un blocco che riceve in ingresso fondamentalmente i seguenti dati:

  • valore di processo da controllare
  • valore desiderato della grandezza da controllare (anche detto set-point)
  • parametri per eseguire la regolazione

Esso poi genererà un valore in uscita che sarà utilizzato da un attuatore per influenzare la variabile di processo di ingresso per riportarla al set-point desiderato.

Facciamo un esempio semplice per capire come esso agisce e perche lo si usa rispetto ad altri sistemi di regolazione.

Immaginiamo di avere una pentola di acqua fredda. Abbiamo la necessità di riscaldarla per portarla ad una temperatura specifica. Sotto la pentola abbiamo il fornello acceso. Dentro la pentola abbiamo un termometro che ne misura la temperatura ad ogni istante. Man mano che il tempo passa la temperatura sale. Ad un certo punto essa raggiungerà il valore di temperatura desiderato così spegneremo il gas. Ma purtroppo di lì a poco ci accorgeremo che la deriva termica farà salire ancora di un pò la temperatura dell’acqua portandola oltre il valore da noi desiderato. Così aspetteremo che si raffreddi un pò fino a raggiungere la temperatura da noi desiderata. Ma anche in questo caso ci accorgeremo in poco tempo che questa temperatura, per quanto lenta sia la discesa, non sarà più quella desiderata.

Questo è esattamente quello che succede in un semplice sistema di regolazione automatico che tiene solo conto del valore che si vuole ottenere e del valore di processo.

Per migliorare la regolazione in un processo automatico si ricorre ai sistema a retroazione, così chiamati perchè, in base ad un algoritmo di calcolo, portano indietro al valore di ingresso una azione correttiva atta a mantenere stabile la grandezza da controllare.

Il sistema di gran lunga più utilizzato nell’ingegnerizzazione dei controlli a retroazione è quello PID, il cui nome è un acronimo che sta per Proporzionale Integrativo Derivativo. Il suo vasto utilizzo è dovuto alla relativa semplicità di implementazione ed alla efficacia.

Possiamo schematizzarlo come segue in figura:

PID - micheleardito.infoIn pratica all’ingresso (sul lato sinistro) del controllo abbiamo il nostro valore di set-point (che chiameremo anche SP)che viene comparato (come addizione negativa) il valore della grandezza in tempo reale (che chiameremo PV – Process Value). Da questo deriverà un valore detto ERRORE (ER). E qui saranno applicati i seguenti calcoli frutto delle componenti P, I e D del controllo:

  • una componente che ha in uscita un segnale proporzionale all’errore in ingresso al sistema
  • una componente che ha in uscita un segnale proporzionale all’integrale dell’errore in ingresso al sistema
  • una componente che ha in uscita un segnale proporzionale alla derivata dell’errore in ingresso al sistema

La sommatoria di tutte le componenti darà origine all’azione di uscita da eseguire, attraverso un attuatore, per riportare il valore di processo (PV) verso il set-point (SP).

Le singole componenti del controllo agiscono come segue:

  • Proporzionale: tiene conto della differenza tra il set-point ed il valore di processo amplificando questa differenza attraverso un fattore moltiplicativo. Maggiore è il fattore moltiplicativo e maggiore è la differenza tra il set-point ed il valore da controllare maggiore sarà il peso di questa componente. Man mano che il valore di processo si avvicina al set-point il suo contributo si ridurrà. La sua reazione è puntuale, cioè immediata nel momento della regolazione.
  • Integrale: tiene conto del comportamento nel tempo integrando, sempre attraverso un fattore, la differenza nel tempo. Questa componente, tenendo conto del trascorrere del tempo ed integrando il valore nel tempo, agisce più o meno velocemente o lentamente a seconda del parametro stesso. La sua azione è quindi da considerare nel tempo. Integrata man mano che il tempo scorre.
  • Derivativa: tiene conto della velocità con cui varia la grandezza da controllare e reagisce più o meno velocemente per contrastarla. Esso agisce sulla velocità di variazione, maggiore essa è maggiore sarà la sua influenza. Se la variazione è molto lenta la sua influenza si riduce tendendo quasi a zero.

A seconda del processo da controllare potremo avere necessità di eliminare una o più componenti del PID trasformandolo ad esempio in PI, in cui agisce solo la componente proporzionale ed integrativa.

Ok, ci siamo dilungati abbastanza.

Torniamo al nostro esempio dell’acqua calda.

Se ad esso applichiamo un controllo PID esso si comporterà in modo da mantenere la temperatura dell’acqua al valore desiderato. Come?

Innanzi tutto andremo a definire i parametri del controllo come segue:

  • valore di ingresso: temperatura – il termomentro sostituito con una sonda di temperatura
  • imposteremo i parametri per la componente proporzionale, integrativa e derivativa
  • valore di uscita: la manopola del gas verrà controllata da un attuatore in grado di posizionarla in base al valore di uscita del regolatore

All’inizio la differenza tra la temperatura voluta e quella impostata sarà alta quindi la componente P avrà un peso molto alto mentre la I e la D meno. L’uscita del regolatore sarà molto alta visto che alta è la differenza dei valori tra il desiderato e l’ottenuto. Man mano che il tempo passa la temperatura di processo (dell’acqua) tende verso il valore desiderato e quindi la componente P inizierà a scendere mentre la componente I continuerà ad integrare l’errore facendo sentire sempre di più la sua influenza. La D, dato che reagisce alle variazioni repentine è abbastanza bassa. All’approssimarsi della temperatura voluta il controllo inizierà a chiudere la manopola perchè la componente P sarà progressivamente sempre minore e la I inizierà la sua fase di avvicinamento al set. Una volta raggiunto il valore voluto il sistema manterrà il gas aperto a sufficienza per garantire che la temperatura non si discosti dal set. Se dovesse superare il suo valore allora il gas verrà ridotto perchè la componente P sarà adesso negativa e la componente I inizierà ad accumulare errore. In pratica inizierà una oscillazione nella regolazione intorno al valore da mantenere. Dalla bontà dei parametri delle singole componenti P, I e D dipenderà quanto stabile e robusto sarà il regolatore PID.

Questo concetto si applica a quella che si chiama regolazione continua, cioè un valore di uscita analogico che può assumere vari valori. Nel nostro caso andremo a vedere come:

  • applicarlo ad una regolazione on/off, cioè ad un oggetto che deve accendersi e spegnersi come ad esempio una resistenza elettrica;
  • utilizzare Arduino come controllore principale

Innanzi tutto useremo una libreria pronta per lo scopo.

E’ disponibile a questo link: PID_v1.rar

Sviluppata da Brett Beauregard

info su: http://playground.arduino.cc/Code/PIDLibrary

Dopo aver scaricato ed installato la libreria potremo usare il controllo PID, che ne nostro caso sarà on/off.

Iniziamo con la solita dichiarazione di libreria e variabili:

// library declaration
#include <PID_v1.h> 

// definition of the pin where is attached 
// our actuator (for example an heater)
#define RelayPin 6

// define variables for the setpoint, 
// the input value - process one
// the output value - the regulator
double Setpoint, Input, Output;

// specify the links and initial tuning parameters
// the value 2, 5 and 1 are the P, I and D respectively
// the declaration DIRECT means that the PID regulator
// is acting according with the value direction 
PID myPID(&Input, &Output, &Setpoint, 2, 5, 1, DIRECT);

// this variable specidy the interval window duration 
// on with the regulation must be performed 
int WindowSize = 5000;

// variable that carries the actual regulator on/off value
unsigned long windowStartTime;

In pratica abbiamo definito la libreria, il pid dove sarà collegato il dispositivo di regolazione, le variabili di ingresso, uscita e setpoint della regolazione, i parametri del PID, la finestra temporale di regolazione.

Adesso abbiamo tutto per procedere.

Andiamo a scrivere il SETUP() dove avverranno le inizializzazioni e la preparazione della regolazione:

void setup() {

  // catch-up the actual value in milliseconds
  windowStartTime = millis();
  
  // initialize the setpoint variables to the desired value
  Setpoint = 100;

  // set the time window limit
  myPID.SetOutputLimits(0, WindowSize);

  // turn the PID on in automatic mode
  myPID.SetMode(AUTOMATIC);
}

Il PID adesso è impostato ed “acceso”.

Adesso toccherà alla routine LOOP() all’interno della quale avverrà

  • la lettura della grandezza di processo
  • l’esecuzione del controllo PID (il calcolo)
  • l’emissione del segnale di uscita secondo il valore stimato dal PID:
void loop() {

  // read the process value from the analog input 0
  Input = analogRead(0);

  // compute the PID algorithm
  myPID.Compute();

  // turn the output pin on/off based on pid output
  if(millis() - windowStartTime>WindowSize) { 
    // time to shift the Relay Window
    windowStartTime += WindowSize;
  }

  // generate the digital output accordingly with the 
  // PID computation result
  digitalWrite(RelayPin, (Output < (millis() - windowStartTime)));
}

A questo punto il gioco è fatto.

La regolazione on/off avverrà in questo modo:

Più lontano sarà il valore di setpoint dall’attuale più tempo sarà accesso il dispositivo di comando, man mano che ci approssimeremo al valore da raggiungere il dispositivo verrà progressivamente spento alternando spegnimento ed accensione fino a raggiungere il valore desiderato. Anche quando il valore sarà raggiunto il sistema continuerà sporadicamente ad energizzare il comando per mantenere il valore.

Questa soluzione è estremamente efficiente.

Questo meccanismo del controllo PID l’ho utilizzato sulla GAGGIA MUSA EVOLUTION, segui il link per scoprire cosa è.

I parametri del PID

Per garantire che un PID sia efficiente è necessario eseguire una fase così detta di TUNING, durante la quale vengono determinati i parametri ottimali per le singole componenti P, I e D.

Analizzando (a titolo di esempio) la risposta nel tempo di un controllo PID si possono avere oscillazioni durante i transitori, nell’intorno del valore di setpoint:

Questo può dipendere da valori troppo alti di P o I.

Esistono diversi metodi per individuare o calcolare i parametri corretti in base al processo da controllare. Normalmente sono metodi empirici che utilizzano il processo stesso per determinare a posteriori questi parametri.

Cosa si fa? Si attiva il processo utilizzando dei parametri iniziali stimati sulla base di un ragionamento basato sull’esperienza (tipo per le temperature che variano lentamente i valori di P ed I possono essere bassi, per i flussi i valori devono essere più alti, etc…). Si valuta come il sistema di regolazione reagise all’approssimarsi del setpoint o come lo supera. Da quel momento, valutando la risposta al transitorio (così detta perchè il sistema impiegerà del tempo per raggiungere il valore desiderato), si potrà ricorrerre a:

  • metodo empirico per approssimazioni successive, cioè si modificano i parametri e di volta in volta si testa nuovamente la risposta correggendoli in modo da raggiungere un comportamento calmo e lineare
  • metodo matematico di Ziegler–Nichols, si tratta in pratica di avviare il regolatore aumentando progressivamente la componenete P fino a far oscillare il sistema. A quel punto viene misurato il periodo dell’oscillazione e questo valore viene utilizzato nelle formule del metodo per ottenere i parametri giusti. Vi invito a visionare il seguente link per approfondimenti Controllo PID (Wikipedia)

Esistono anche altri metodi matematici ma il metodo Ziegler-Nichols è uno dei miei preferiti perchè consente nel giro di un paio di test di determinare il corretto valore delle singole componenti.