Go Down

Topic: Aide pour creation d'un PID (Read 2858 times) previous topic - next topic

romain

Apr 12, 2010, 05:20 pm Last Edit: Apr 12, 2010, 05:21 pm by freeman32 Reason: 1
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   :D

Bidouille

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

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 : http://www.robot-electronics.co.uk/htm/md22tech.htm 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   ;)

A+

ekaki

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

romain

#3
Apr 13, 2010, 10:18 am Last Edit: Apr 13, 2010, 12:06 pm by freeman32 Reason: 1
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  :P 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 :D

romain

j'ai procede a quelques modifications de mon programme

Bidouille

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 :

Code: [Select]
#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+


Bidouille

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+

fdufnews

Quote
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.
[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]
[/tt]
(extrait de la doc sur le site Lextronic)

Bidouille

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

A+

romain

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 ^^

romain

#11
Apr 13, 2010, 03:20 pm Last Edit: Apr 14, 2010, 11:50 am by freeman32 Reason: 1
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 ?  :D [smiley=2vrolijk_08.gif]

churchill

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  ;)

romain

#13
Apr 14, 2010, 09:50 am Last Edit: Apr 14, 2010, 11:49 am by freeman32 Reason: 1
bonjour :D
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 ? ::)

romain

#14
Apr 14, 2010, 11:45 am Last Edit: Apr 14, 2010, 02:28 pm by freeman32 Reason: 1
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 ... :( si quelqu'un peut m'aider :D
Code: [Select]
#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);
}



Go Up