PID library arduino

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

PID Library Brett Beauregard github

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:

PID Library arduino Brett Beauregard arduino playground

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:

PID library arduino led foto resistor schema

ed una resistenza da 470ohm per la protezione del led ad alta luminosità controllato dal pin 3.

  • Questo sito ed i suoi contenuti è fornito "così com'è" e Mauro Alfieri non rilascia alcuna dichiarazione o garanzia di alcun tipo, esplicita o implicita, riguardo alla completezza, accuratezza, affidabilità, idoneità o disponibilità del sito o delle informazioni, prodotti, servizi o grafiche correlate contenute sul sito per qualsiasi scopo.
  • Ti chiedo di leggere e rispettare il regolamento del sito prima di utilizzarlo
  • Ti chiedo di leggere i Termini e Condizioni d'uso del sito prima di utilizzarlo
  • In qualità di Affiliato Amazon io ricevo un guadagno dagli acquisti idonei qualora siano presenti link al suddetto sito.

Permalink link a questo articolo: https://www.mauroalfieri.it/elettronica/pid-library-arduino.html

2 commenti

    • Claudio il 2 Luglio 2022 alle 10:00
    • Rispondi

    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

    1. 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.

Lascia un commento

Il tuo indirizzo email non sarà pubblicato.

Questo sito usa Akismet per ridurre lo spam. Scopri come i tuoi dati vengono elaborati.