Régulation PID d'un robot holonome.

Bonjour ! :slight_smile:

Il y a trois catégories de personnes :

  • celles qui savent construire un robot.
  • celles qui savent programmer un robot.
  • celles qui savent construire ET programmer un robot.

Je fais partie de la première catégorie ! :sweat_smile:

Il y a environ 1 an j’ai intégralement consrtruit ce robot holonome y compris les roues mecanum !

Je l’ai codé comme un cochon avec des bouts de code trouvé sur internet... :roll_eyes:

Comme c’est le genre de projet qu’on n’abbandone jamais vraiment, je lui ai refait un jeunesse :

  • Un rehausseur de tension pour porter la vitesse du robot au pas d’un homme.
  • Un Raspberry pi 3 pour le bluetooth (commande) et le wifi (vidéo).

Seulement voilà, augmenter la vitesse des moteurs, ça accentue les différences de vitesse et, sur ce type de robot c’est mortel...

J’ai donc placé des fourches optiques pour relever mes vitesse et troqué le uno d’origine par un méga pour avoir suffisament d’interrupt.

Voilà le résultat :

Pour des raisons matérielle au niveau des moteurs, les fourches optique sont placées sur les sortie des réducteurs...

Donc voici la liste d’embarquement :

  • 1 arduino mega 2560.

  • 1 raspberry pi 3.

  • 1 shield motor rev 1 type Adafrruit (Afmotor.h).

  • 4 fourche optique, une par roue, sur les pin 18, 19, 20 et 21 avec des roues crantée de 60 dents.

  • 4 motoréducteurs 60.5/1 de 19.1v.

  • 1 batterie de Dremel 10.8v et 1 réhausseur de tesion réglé à 19.1v.

  • 1 batterie usb pour l’arduino et le raspbery.

Premiere destination :

réguler les moteurs en vitesse en fonction de valeurs qui seront envoyées par la liaison série usb depuis le raspberry.

Voilà voilà... Si un quelqu’un a du temps et de la patience pour m’aider, ce serait super !:grin:

OlivierV:
Bonjour ! :slight_smile:

Il y a trois catégories de personnes :

  • celles qui savent construire un robot.
  • celles qui savent programmer un robot.
  • celles qui savent construire ET programmer un robot. ...

Vous oubliez une quatrième catégorie de personnes :

  • celles qui ne savent ni construire une robot ni le programmer. :wink:

Plaisanterie à part, c'est quoi la question ?

Cordialement.

Pierre

En effet, j'y avais pas pensé à celle-là !

Ma question est simple, mais la réponse va être compliquée à m'expliquer...

Comment réguler les vitesses des roues ?

J'ai trouvé de nombreux exemple mais tous partent dans des histoires de quadrature avec deux fourches par codeuse pour les sens de rotation et ne concernent jamais la régulation de plusieurs moteurs ensemble...

Les histoires de pid et d'interrupt, j'ai bien pigé l'usage mais les principes de programmation m'échappent...

Si je pouvais avoir un exemple simple et concret d'un code bien documenté je commencerais sans doute à y voir plus clair...

OlivierV:
... Comment réguler la vitesse des roues ? ...

Si les roues peuvent tourner dans les deux sens, alors, il est nécessaire d'avoir un capteur qui permet de connaître ce sens. Une simple fourche donnera le module de la vitesse, mais pas son signe.

OlivierV:
... ne concernent jamais la régulation de plusieurs moteurs ensemble ...

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.

OlivierV:
... Si je pouvais avoir un exemple simple et concret d'un code bien documenté je commencerais sans doute à y voir plus clair...

Il existe une bibliothèque PID pour Arduino, elle doit posséder des exemples.

Quels type de moteur utilisez-vous ?

Cordialement.

Pierre

Ce sont des moteurs courant continu à balais avec réducteur 60.5/1.

Le but qui m'intéresse est seulement d'asservir leur vitesse quelle que sois le sens de rotation. 100 rpm, dans un sens ou dans l'autre, c'est toujours 100 rpm

Je cherche à allez au plus simple, pour peu que cela soit possible...

Il y a en effet une bibliothèque pid, mais l'exemple fourni me laisse totalement dans le flou...

Merci pour votre attention.

Olivier.

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"

Merci pour ces précisions ! :slight_smile:

Je vais analyser tout cela tranquillement ce soir.

Je reviendrai sûrement avec quelques questions.

Bien à vous.
Olivier.

Bonjour,

Je dois également coder un robot 4 roues holonomes avec moteurs pas à pas mais, débutant dans Arduino, je ne sais pas vraiment par où commencer.. On m'a conseillé d'utiliser une bibilothèque AccelStepper pour pouvoir faire fonctionner les roues simultanément..

Merci de vos conseils !

Bonjour,
Avec 3 degrés de liberté ?