Aide pour creation d'un PID

Voila j'ai un projet de stage ou je dois reguler un MAXON MOTOR relié a un MD22 et ce derniers connecté à la carte Arduino Diecimila mais voila je ne vois pas par ou commencer. J'ai pensé de m'aider de cette librairie <PID_Beta6.h> mais elle ne semble pas vraiment compatible avec mon MD22 je ne sais vraiment pas quoi faire. Aidez moi plz :smiley:

Bonjour ( un p'tit bonjour, ça coute pas cher ::slight_smile: )

D'après ce que j'ai vu sur google, il s'agit de ce type de moteur ? : http://www.directindustry.fr/prod/maxon-motor/moteur-electrique-brushless-dc-7173-322189.html et pour la commande c'est bien ça ? : http://www.lextronic.fr/P1917-module-de-commande-de-moteur-md22.html.

Si c'est bien ça, ça marche en I2C donc il te faut la librairie "wire". Regardes cela en détail pour comprendre comment ça marche c 'est très simple ).

Après, décortiques la doc : MD22 Technical Documentation et recontactes nous quand tu en seras à écrire le sketch.

Poses toi aussi la question de savoir exactement ce que tu veux faire avec cela car ce sera plus simple pour t'aider :wink:

A+

Il faudrait savoir si le moteur est brushless ou simplement en CC, car le module ND22 est à priori dédié aux moteurs CC standards (?).

bonjour ^^

bon alors le moteur est un maxon DC motor 118778 donc un avec brush et la commande est bien cela http://www.lextronic.fr/P1917-module-de-commande-de-moteur-md22.html et je dois faire un PID je vois pas trop quoi dire d'autre sa me semble claire :stuck_out_tongue: d'ailleurs voila un petit programme que j'ai réaliser qu'es ce que vous en pensez??

#include <PID_Beta6.h>

double Setpoint, Input, Output;

unsigned long time;

PID pid(&Input, &Output, &Setpoint,2,5,1);

void setup()
{
pid.SetOutputLimits(-4000,4000);
Setpoint = 2000;
pid.SetMode(AUTO);

}

void loop()
{
time=millis();
if(abs(Setpoint-Input)>100)pid.SetTunings(6,4,1);

else pid.SetTunings(3,4,1);

Input = analogRead(0);
pid.Compute();
if(millis()>10000) Output=0;
}

enfin voila je crois que j'ai a peu près tout dit et :smiley:

j'ai procede a quelques modifications de mon programme

Bonjour,

Utilises le "insert code" ( logo # au dessus de la zone de texte quand tu écris ton message ) pour afficher ton sketch, ce sera plus lisible :

#include <PID_Beta6.h>


double Setpoint, Input, Output;

unsigned long time;


PID pid(&Input, &Output, &Setpoint,2,5,1);


void setup()
{
 pid.SetOutputLimits(-4000,4000);
 Setpoint = 2000;
 pid.SetMode(AUTO);
 
}

void loop()
{
 time=millis();
 if(abs(Setpoint-Input)>100)pid.SetTunings(6,4,1);

 else pid.SetTunings(3,4,1);

 Input = analogRead(0);
 pid.Compute();
 if(millis()>10000)Input=0;
}

C'est pas mieux ?

A+

ah merci ^^

Y a pas de quoi.

Par contre, je ne comprends pas bien comment tout cela fonctionne : il n'y a point de reference à l'utilisation d bus I2C dans ton prog ??? :o

Après quelques recherches sur le net SANS RENTRER DANS LES DETAILS , les exemples qui utilisent la librairie PID ne semblent pas utiliser un controleur comme le tiens.

Ton programme fonctionne ? comment fais tu pour gèrer le bus I2C alors que la librairie n'est pas prévue pour ?
Comment est branchée ta carte ?

A+

comment fais tu pour gèrer le bus I2C alors que la librairie n'est pas prévue pour ?

A priori la carte supporte plusieurs modes d'interface.

[color=#0000ff][size=12]- Interface I2C? (8 cartes pourront être ainsi pilotées et différents paramètres tels que la vitesse, l'accélération, la valeur indicative de la température et du courant de limitation, etc... peuvent être géré).
   
- Signal analogique: 0 - 2,5 - 5 V
  (0 V -> marche arrière pleine vitesse)
  (2,5 V -> Stop)
  (5 V -> Marche avant pleine vitesse)
 
- Signal analogique: 0 - 5V avec signaux de sélection de sens séparés
 
- Mode RC (pilotage via récepteur modélisme)
 
- Via un signal "PWM"[/size][/color]

(extrait de la doc sur le site Lextronic)

Merci pour la précision, fdufnews, ... j'avais pas tout lu :-[

A+

eh ouai ^^ j'ai voulu essayer avec le mode Signal analogique: 0 - 2,5 - 5 V je pense que sa doit fonctionner enfin j'espère ^^

ah j'ai oublié d'introduire la commande au moteur dans mon programme mais j'ai vraiment aucune idée comment. Si quelqu'un peut m'aider ? :smiley: [smiley=2vrolijk_08.gif]

Salut,

Il faudrait que tu te documentes sur la façon de communiquer avec l'i2c (ici) pour te familiariser un peu avec la chose. Je ne pense pas que tu trouveras ici du code "tout cuit", mais des âmes charitables qui te permettront d'avancer en te conseillant et corrigeant ce que tu auras déjà fait.

Il te faut chercher un peu sur le net avant de poser des questions, et essayer d'être le plus précis et clair possible afin qu'un maximum de gens puisse te répondre. J'espère que tu ne m'en veux pas trop pour ce genre de réflexion.

Franssoa

PS : c'est quoi un PID ?
PPS : s'il te plait, fait un effort dans la rédaction de tes posts, j'ai parfois (...) du mal à comprendre. Avant de poster, tu utilises le bouton "refresh preview" et tu te poses la question si ce que tu vois avait été écrit par un autre, est-ce que tu aurais envie d'y répondre.
PPPS : Ces derniers temps cela fait quelques posts que je vois (très) mal rédigés, et je vais passer pour un rabat-joie, alors si d'autres ont le même soucis de compréhension, n'hésitez pas à vous manifester :wink:

bonjour :smiley:
bon je vais essayer de faire un petit effort ^^. Bon un PID ( proportionnel intégrateur et dérivé ) est utilisé pour réguler un moteur. Et pour le c2i j'essayerai plus tard. Ben voila d'autres questions ? ::slight_smile:

bon voila j'ai creer un progamme qui permet de simuler la regulation d'une fonction de transfert du 1er ordre mais il ne marche pas ... :frowning: si quelqu'un peut m'aider :smiley:

#include <PID_Beta6.h>

#define alpha 0,95
double Setpoint, Input, Output;
double Input2;
unsigned long time;


PID pid(&Input, &Output, &Setpoint,2,5,1);

double fonctiontrans(){
  double k;
  k=3;
  Input2=alpha*Input+k*(1-alpha)*Output;

}

void setup()
{
  Serial.begin(9600); 
  Setpoint = 2000;
  pid.SetOutputLimits(-4000,4000);
  pid.SetMode(AUTO);
  pid.SetSampleTime(200);
}

void loop()
{

  int i;
  i=0;
  Input=0;
  Output=0;
  do{

    if(abs(Setpoint-Input)>100)
      pid.SetTunings(6,4,1);
    else
      pid.SetTunings(3,4,1);
    Input=fonctiontrans();
    pid.Compute();
    i=i+1;
    Serial.print( i );
    Serial.print(' ');
    Serial.print(Input);
    Serial.print(' ');
  }
  while(i<200);
}

mais il ne marche pas ...

c'est à dire ????
Qu'est-ce qui ne marche pas?

il affiche seulement 0 aux valeurs de retour (Input) je comprends pas pourquoi :cry:

A quoi sert ta fontion fonctiontrans() déclarée comme devant retourner un double, mais ne retournant rien ?

churchill

ah je vois le problème je pense vient de là. Je veux un sous programme contenant ma fonction de transfert du système. je pensai au début de type :

void fonctiontrans(double Input,double Output){
  double k;
  k=3;
  Input2=alpha*Input+k*(1-alpha)*Output;

}

mais sa ne marche pas aussi ... :frowning:

ah j'ai vraiment fait n'importe quoi voici un programme décent il tourne mais par contre les valeurs c'est pas terrible si quelqu'un pouvait m'aider je pense qu'il y a juste quelques paramètres a régler

#include <PID_Beta6.h>

#define alpha 0.95
#define k     2 

double Consigne, Mesure, Commande;

PID pid(&Mesure, &Commande, &Consigne,2,3,1);

void fonctiontrans(){
 Mesure=alpha*Mesure+k*(1-alpha)*Commande;
}

void setup()
{
  Serial.begin(9600); 
  Consigne = 1000;
  Commande=0;
  Mesure=0;

  pid.SetOutputLimits(-4000,4000);
  pid.SetMode(AUTO);
  pid.SetSampleTime(1000);
}

void loop()
{
 if(abs(Consigne-Mesure)>100)
  pid.SetTunings(3,2,1);
 else
  pid.SetTunings(2,2,1);
  
 fonctiontrans();
 pid.Compute();
 
 Serial.print("Mesure : ");
 Serial.print(Mesure, DEC);
 Serial.print(" Commande :");
 Serial.println(Commande, DEC);
 delay(40); 
}