Régulation PID d'un robot holonome.

il n'y a pas qu'un exemple fourni, avec la lib, mais 4. qui ne correspondent bien évidemment pas exactement à ton cas, mais ça donne tout de même des idées.

je te conseille de lire la très bonne explication détaillée par l'auteur de la librairie PID sur son blog

ainsi que celle sur la librairie d'auto-parametrage

ensuite dans ton cas, si je me base sur les suppositions suivantes :

-la vitesse du moteur est pilotée par une sortie PWM définie comme PwmMoteur1
-tu as une fonction qui mesure la vitesse réelle via un codeur et met à jour une variable par exemple VitesseMoteur1
-tu as une consigne de vitesse ConsigneMoteur1

tu aura quelquechose qui ressemble à ça :

/********************************************************
 * PID Basic Example pour un moteur commandé en PWM 
 *
 ********************************************************/

#include <PID_v1.h>


#define PIN_PWM_MOTEUR1 3

//Define Variables we'll be connecting to
double ConsigneMoteur1, VitesseMoteur1, PwmMoteur1;

//Specify the links and initial tuning parameters
double KpMoteur1=2, KiMoteur1=5, KdMoteur1=1;
PID PIDmoteur1(&VitesseMoteur1, &PwmMoteur1, &ConsigneMoteur1, KpMoteur1, KiMoteur1, KdMoteur1, DIRECT);

void setup()
{
  //initialize the variables we're linked to
  lireVitesseMoteur1();
  VitesseMoteur1 = 100;  

  //turn the PID on
  PIDmoteur1.SetMode(AUTOMATIC);
}

void loop()
{
  lireVitesseMoteur1();
  PIDmoteur1.Compute();
  analogWrite(PIN_PWM_MOTEUR1, PwmMoteur1);
}


void lireVitesseMoteur1()
{
    //fonction qui lit la vitesse du moteur 1
    VitesseMoteur1= .....  ;
}

(basé sur l'exemple "basic" de la ibrairie PID)

ensuite si tu as besoin de plusieurs moteurs, il suffit de les rajouter ainsi :

/********************************************************
 * PID Basic Example pour un moteur commandé en PWM 
 *
 ********************************************************/

#include <PID_v1.h>


#define PIN_PWM_MOTEUR1 3
#define PIN_PWM_MOTEUR2 XXX

//Define Variables we'll be connecting to
double ConsigneMoteur1, VitesseMoteur1, PwmMoteur1;
double ConsigneMoteur2, VitesseMoteur2, PwmMoteur2;

//Specify the links and initial tuning parameters
double KpMoteur1=2, KiMoteur1=5, KdMoteur1=1;
PID PIDmoteur1(&VitesseMoteur1, &PwmMoteur1, &ConsigneMoteur1, KpMoteur1, KiMoteur1, KdMoteur1, DIRECT);
double KpMoteur2=2, KiMoteur2=5, KdMoteur2=1;
PID PIDmoteur2(&VitesseMoteur2, &PwmMoteur2, &ConsigneMoteur2, KpMoteur2, KiMoteur2, KdMoteur2, DIRECT);

void setup()
{
  //initialize the variables we're linked to
  lireVitesseMoteur1();
  lireVitesseMoteur2();
  VitesseMoteur1 = 100;  
  VitesseMoteur2 = 100; 

  //turn the PIDs on
  PIDmoteur1.SetMode(AUTOMATIC);
  PIDmoteur2.SetMode(AUTOMATIC);
}

void loop()
{
  lireVitesseMoteur1();
  lireVitesseMoteur2();
  PIDmoteur1.Compute();
  PIDmoteur2.Compute();
  analogWrite(PIN_PWM_MOTEUR1, PwmMoteur1);
  analogWrite(PIN_PWM_MOTEUR2, PwmMoteur2);
}


void lireVitesseMoteur1()
{
    //fonction qui lit la vitesse du moteur 1
    VitesseMoteur1= .....  ;
}

void lireVitesseMoteur2()
{
    //fonction qui lit la vitesse du moteur 2
    VitesseMoteur2= .....  ;
}

et ainsi de suite, dans la limite des performances rappelées par Pierre :

Un asservissement numérique impose une période d'échantillonnage pendant laquelle les divers calculs (PID) sont effectués. Si cette période est telle que les calculs pour tous les moteurs soient faits, alors, cela ne pose pas de problème ; on sérialise les calculs. Si cette période ne le permet pas, soit il est possible d'augmenter cette période (au détriment des performances des asservissements) et cela va bien, soit ce n'est pas possible. Dans ce cas, il faut utiliser plusieurs micro-contrôleurs.

Ce qui impose, entre autres, que le reste de ton code ne soit pas bloquant nulle part de manière à appeler la fonction .compute() de chaque PID aussi souvent que possible. Donc dans le reste du code, éviter autant que possible les boucles for,while, proscrire l'usage de delay() etc etc.
Par exemple quand tu as une temporisation à faire, tu dois t'inspirer que l'exemple "BlinkWithoutDelay"