Pages: 1 [2]   Go Down
Author Topic: Aide pour creation d'un PID  (Read 2050 times)
0 Members and 1 Guest are viewing this topic.
France
Offline Offline
Faraday Member
**
Karma: 23
Posts: 3014
There is an Arduino for that
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Quote
mais il ne marche pas ...
c'est à dire ????
Qu'est-ce qui ne marche pas?
Logged

0
Offline Offline
Newbie
*
Karma: 0
Posts: 45
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

Massongex, Suisse
Offline Offline
Full Member
***
Karma: 2
Posts: 169
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

churchill
Logged

0
Offline Offline
Newbie
*
Karma: 0
Posts: 45
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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 :
Code:
void fonctiontrans(double Input,double Output){
  double k;
  k=3;
  Input2=alpha*Input+k*(1-alpha)*Output;

}
mais sa ne marche pas aussi ... smiley-sad
« Last Edit: April 15, 2010, 07:06:22 am by freeman32 » Logged

0
Offline Offline
Newbie
*
Karma: 0
Posts: 45
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

Code:
#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);
}


« Last Edit: April 15, 2010, 04:11:08 am by freeman32 » Logged

0
Offline Offline
Newbie
*
Karma: 0
Posts: 45
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

aidez moi s'il vous plaît  :-[
Logged

Massongex, Suisse
Offline Offline
Full Member
***
Karma: 2
Posts: 169
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Quote
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
"c'est pas terrible" n'est pas vraiment une unité de mesure qui permettra de résoudre ton problème.

Je n'ai jamais utilisé de PID "proportionnel intégrateur et dérivé" ni n'en ressent le besoin, et à vrai dire je n'ai pas envie de me taper la théorie et de lire tout le fichier source de la bibliothèque dont tu parles PID_Beta6.h pour voir comment ça marche. Sans vouloir m'avancer, je ne crois pas être le seul sur ce forum dans ce cas.

Mais je pense (mais peut-être je me répète) que tu devrais tout d'abord te former un peu au C puis te familiariser avec l'arduino avant de te lancer dans un projet dont tu ne maîtrise rien.
La progression c'est d'abord faire clignoter une led, puis deux, puis appuyer sur un bouton pour faire clignoter une led, puis faire tourner un petit moteur, puis etc... Et quand tu es à l'aise avec tout ça tu t'attaques à ton PID.
On ne peux pas aller sur un forum en disant "Voilà j'ai une carte arduino et un moteur et j'aimerais construire un hélicoptère, mais je n'y arrive pas, aidez moi."

Le principe d'un forum comme celui-ci est que l'on t'aide en corrigeant tes erreurs, en t'orientant, en te conseillant, mais pas en faisant le travail pour toi. Le principe c'est "aides toi et le forum t'aidera".

Ah, et puis ça ne sert à rien de poster "aidez moi s'il vous plaît", car si personne n'a pu (ou voulu) "t'aider" avant, ce n'est pas cela qui va relancer la machine, surtout si tu n'apportes rien de nouveau à ton problème.

Si tu veux réellement de l'aide il faut détailler les points qui te posent problème du genre :
Quote
Voilà la fonction machin, normalement en lui donnant le paramètre a=50 je dois obtenir 17.5 mais là j'ai 17. J'ai cherché sur le site du créateur (www.sonsite.com) et lu la documentation mais je ne vois pas ce qui cloche. Avez-vous une idée ?
Code:
float machin(a){...}
et pas comme tu l'as fait (ce n'est qu'un exemple) :
Quote
Je veux une un sous programme contenant ma fonction de transfert du système
Parce que là, personnellement je ne comprends rien (je suis peut-être un peu limité, je l'avoue).

Ne te vexes pas de ce que je te dis, c'est en faisant des erreurs et en les corrigeant qu'on avance.

churchill
Logged

0
Offline Offline
Newbie
*
Karma: 0
Posts: 45
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

bon ok j'ai compris la leçon lol je vais essayer de faire un petit effort ^^
Logged

0
Offline Offline
Newbie
*
Karma: 0
Posts: 45
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

bon j'ai réussit mon programme et il marche du tonnerre smiley maintenant je me penche sur le i2c j'ai compris le principe mais il y a quelque chose qui me chiffonne comme peut on sélectionner un mode (voir http://www.robot-electronics.co.uk/htm/md22tech.htm ) par exemple pour l'adresse 0x00 (mode registre) il me propose plusieurs modes de fonctionnement du moteur  :
Code:
Mode Register
The mode register selects which mode of operation and I2C data input type the user requires. The options being:

0,     (Default Setting) If a value of 0 is written to the mode register then the meaning of the speed registers is literal speeds in the range of:
        0 (Full Reverse)  128 (Stop)   255 (Full Forward).

1,    Mode 1 is similar to Mode 0, except that the speed registers are interpreted as signed values. The meaning of the speed registers is literal speeds in the range of:
       -128 (Full Reverse)   0 (Stop)   127 (Full Forward).

2,     Writing a value of  2 to the mode register will make speed control both motors speed. Speed2 then becomes the turn value (type 1).
        Data is in the range of 0 (Full Reverse)  128 (Stop)  255 (Full  Forward).
        note - version 8+ speed controls the total power, the turn (speed 2) value is now with reference to this.

3,    Mode 3 is similar to Mode 2, except that the speed registers are interpreted as signed values.
        Data is in the range of -128  (Full Reverse)  0 (Stop)   127 (Full Forward)
         note - version 8+ speed controls the total power, the turn (speed 2) value is now with reference to this.

4,    (New from version 9) Alternate method of turning (type 2), the turn value being able to introduce power to the system.
       Data is in the range of 0 (Full Reverse)  128 (Stop)  255 (Full  Forward).

5,    (New from version 9) Alternate method of turning (type 2), the turn value being able to introduce power to the system.
        Data is in the range of -128  (Full Reverse)  0 (Stop)   127 (Full Forward)
j'aimerais sélectionner le mode 1 comment puis je faire?? voici un bout de mon programme :
Code:
void setmode(){
 [color=#ff0000]Wire.beginTransmission(0xB0);                
  Wire.send(Mode);
  Wire.send(0x01);                  
  Wire.endTransmission();[/color]
  
  Wire.beginTransmission(0xB0);     // regle la valeur  255 pour la valeur de l'acceleration
  Wire.send(0x03);
  Wire.send(0xFF);
  Wire.endTransmission()
}
es ce correct??
Logged

Pages: 1 [2]   Go Up
Jump to: