PID Library arduino è uno degli argomenti che spesso mi viene richiesto nei corsi o nella realizzazione di progetti.
Il PID ( Proporzionale Integrale Derivato ) rappresenta un argomento abbastanza ostico sia per la complessità dei calcoli sia per i molti modi in cui può essere applicato ad uno sketch.
Cercando on-line delle soluzioni da impiegare in u progetto mi sono imbattuto nella PID library arduino di Brett Beauregard.
PID library arduino di Brett Beauregard
La PID library arduino la puoi trovare nel repository dell’autore: github di Brett Beauregard
che oltre alla libreria vera e propria contiene degli esempi di utilizzo.
Documentazione della PID LIbrary arduino sul playground
Sul playground arduino trovi la documentazione relativa alla PID library arduino:
Nella pagina di documentazione leggi che il PID è un algoritmo basato sulla correzione dell’errore dato un INPUT al fine di ragiungere il setpoint desiderato controllando l’OUTPUT.
Un esempio interessante descritto nella stessa pagina chiarisce bene l’idea:
For reference, in a car, the Input, Setpoint, and Output would be the speed, desired speed, and gas pedal angle respectively.
Ossia se ti riferissi ad un automobile in cui l’INPUT è la velocità ed il setpoint è la velocità a cui desideri andare l’OUTPUT l’angolo da imporre al pedale dell’accelleratore.
Modificando quest’ultimo valore ( output ) varia la velocità e di conseguenza si ridure o aumenta l’errore che fa discostare la velocità rilevata ( input ) e quella desiderata ( setpoint ).
Il costruttore PID library arduino
Il costruttore della libreria si chiama PID() ed accetta i parametri descritti nel paragrafo precedente oltre ad altri che ti servono per raggiungere il risultato desiderato:
- Input: di tipo double, è la variabile contenente la rilavazione eseguita dal sistema;
- Output: di tipo double, è la variabile con cui imponi un comando al sistema;
- Setpoint: di tipo double, è il punto di arrivo desiderato;
- Kp, Ki, Kd: di tipo double >= 0, rappresentano le tre costati mediante cui l’algoritmo modifica il proprio comportamento per raggiungere il punto desiderato, solitamente sono calcolati empiricamente;
- Direction: puoi definirla DIRECT o REVERSE e determina la direzione in cui si sposterà l’output in funzione dell’errore rilevato per raggiungere il setpoint;
- POn: Abilita la P_ON_E di default o P_ON_M ( Proportional on Measurement ).
Negli esempi che leggerai della PID Library arduino lasceremo il parametro POn sempre impostato a default.
Esempio Basic PID
Il primo esempio proposto dall’autore della libreria è definito Basic per la semplicità dell’esempio e serve per introdurre l’utilizzo della libreria:
/******************************************************** * PID Basic Example * Reading analog input 0 to control analog PWM output 3 ********************************************************/ #include <PID_v1.h> //Define Variables we'll be connecting to double Setpoint, Input, Output; //Specify the links and initial tuning parameters PID myPID(&Input, &Output, &Setpoint,2,5,1, DIRECT); void setup() { Serial.begin(9600); //initialize the variables we're linked to Input = (analogRead(A0)/4); Setpoint = 100; //turn the PID on myPID.SetMode(AUTOMATIC); } void loop() { Input = (analogRead(A0)/4); myPID.Compute(); analogWrite(3,Output); Serial.print(Input); Serial.print(" "); Serial.println(Output); }
iniziando dalla linea 06: includi la libreria PID;
linea 09: definisci 3 variabili globali di tipo double;
linea 12: crea una istanza myPid a cui passi, per riferimento, i valori definiti alla linea 09 ed i valori iniziali di Kp,Ki,Kd oltre alla direzione;
linea 15: attiva la comunicazione seriale a 9600 baud, questa linea l’ho aggiunta allo sketch per visualizzare il dato sul monitor seriale;
linea 17: nella funzione di setup() leggi il valore di Input dal pin analogico A0 dividendolo per 4 in quanto come sai il convertitore AD di Arduino è a 210 ( 1024 valori ) e l’output è 28 ( 256 valori );
linea 18: imposta il setPoint a 100;
linea 21: metti il PID in modalità automatica usando il metodo setMode();
linea 25: ad ogni loop() leggi il valore di INPUT, sempre adattandolo da 1024 a 256 valori come alla linea 17;
linea 26: usa il metodo Compute() per calcolare l’output dato l’INPUT ed il setPoint;
linea 27: invia al pin 3 il valore di output appena calcolato;
linea 29: ho aggiunto la linea corrente per scrivere sul monitor seriale i valori di INPUT e OUTPUT;
Il Video Demo
Per realizzare il video demo durante il test della libreria PID library arduino ho usato una fotoresistenza ed un led.
Coprendo con un foglio la fotoresistenza il valore rilavato si incrementa ed la PID labrary arduino entra in funzione per cercare di “fare luce” accendendo proporzionalmente il led:
Il circuito del PID library Arduino usato nel test
Il circuito che ho utilizzato è molto semplice e fa solo uso di una fotoresistenza da 20Kohm e di un a resistenza di pull-up da 10Kohm per la parte di rilevazione della luminosità ambientale:
ed una resistenza da 470ohm per la protezione del led ad alta luminosità controllato dal pin 3.
2 commenti
Gentile signor Alfieri,
ho usato il suo tutorial per gestire un motore calettato su un timone di barca.
In pratica il motore esegue il comando dato da una bussola inseguendo il valore di rotta impostato.
Il tutto funziona in parte in quantochè alcune volte quando il valore di Input (bussola) diventa uguale al valore di Setpoint (rotta impostata) mi trovo ancora 255 sulla uscita Analogica.
Non capisco dove stò sbagliando.
Il suo suggerimento mi sembra tanto mai semplice che dovrebbe sicuramente fare al caso mio. E’ forse questo valore dipendente dai 3 set inseriti? (Ki,Kp,Kd)
Può darmi qualche dritta?
Grazie
Claudio
Autore
Ciao Claudio,
certamente dipende dai tre patametri di PID, il mio consiglio, se la condizione in cui verifichi l’errore è sempre e solo una è di escluderla in modo che non influenti il buon funzionamento nelle altre condizioni.