Bonsoir tout le monde ceci est la suite de mon projet de stabilisateur de bateau a masse mobile (Stabilisateur du porte avion Charle de Gaule ).Si vous souhaitez voir tout le debut de ce projet je vous invite a jeter un coup d'oeil sur ce lien :https://www.developpez.net/forums/d1...u-arduino-uno/. Si vous êtes toujours là ,mon projet actuel est de faire en sorte que la planche ce stabilise le plus rapidement possible à l'aide d'un correcteur PID. Je ne suis qu'au tout début de ce codage , j'ai pour le moment récupérer un code de correcteur PID d'un stabilisateur de drone avec 2 moteurs que j'ai déjà commencé à adapter. Néanmoins je fais face a quelque soucis, car je ne comprend pas absolument tout le code et a vrai dire je me sens un peu perdue . C'est pourquoi je sollicite votre aide . Merci à tous d'avance.

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
#include <Wire.h>
int16_t Acc_rawY,Gyr_rawY;
float Acceleration[2];
float Gyro_angle[2];
float Total_angle[2];
float elapsedTime,time,timePrev;
int i;
float rad_to_deg = 180/3.141592654;
float PID,pwmLeft,pwmRight,error,previous_error;
float pid_d =0;
float pid_i =0;
float pid_p =0;
double kp=3.55;
double kd=0.005;
double ki=2.05;
double throttle =1300;
float desired_angle =0;
 
 
void setup() {
  Wire.begin();
  Wire.beginTransmission(0x68);
  Wire.write(0);
  Wire.endTransmission(true);
  Serial.begin(250000);
  moteur.attach(...);
  time = millis();
  moteur.writeMicroseconds(1000);
  delay(7000);
}
 
void loop() {
 
  timePrev = time;
  time = millis();
  elapsedTime = (time - timePrev) / 1000;
  Wire.beginTransmission(0x68);
  Wire.write(0x3B);
  Wire.endTransmission(false);
  Wire.requestFrom(0x68,6,true);
  Acc_rawY = Wire.read()<<8| Wire.read();
  Gyro_angle[1] = Gyr_rawY/131;
  Total_angle[1] = 0.98*(Total_angle[1] + Gyro_angle[1]*elapsedTime) + 0.02*Acceleration_angle[1];
   error = Total_angle[1] - desired_angle;
  pid_p = kp*error;
if (-3<error) and (error<3){
  pid_i = pid_i +(ki*error);
}
  pid_d = kd*((error - previous_erreur)/elapsedTime);
  PID = pid_d + pid_i + pid_p;
if(PID<-1000){
  PID=-1000;
}
if (PID>1000){
  PID=1000
}
  pwmLeft = throttle +PID;
  pwmRight = throttle -PID;
 
//Right
if (pwmRight < 1000){
  pwmRight =1000;
 
}
if(pwmRight>2000){
  pwmRight =2000;
} 
//Left
if (pwmLeft < 1000){
  pwmLeft =1000;
 
}
if(pwmLeft>2000){
  pwmLeft =2000;
}
 
 
 
 
Ce que je pensais faire!!!
 
int i = 200
 
if (abs (int alpha(t) - int alpha(t+1)) < 2 ){
  i+=5
  moteur.setSpeed(i)
}
else if (abs (int alpha(t) - alpha(t+1)) > 2 ){
  i-=5
  moteur.setSpeed(i)
}

Je ne comprend pas ceci:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
if(PID<-1000){
  PID=-1000;
}
if (PID>1000){
  PID=1000
}
  pwmLeft = throttle +PID;
  pwmRight = throttle -PID;
 
//Right
if (pwmRight < 1000){
  pwmRight =1000;
 
}
if(pwmRight>2000){
  pwmRight =2000;
} 
//Left
if (pwmLeft < 1000){
  pwmLeft =1000;
 
}
if(pwmLeft>2000){
  pwmLeft =2000;
}
et ceci: //car c'est à dire que si error n'est pas inclus dans cette intervalle alors il n'a pas de correcteur intégrateur ,pourquoi donc?
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
if (-3<error) and (error<3){
  pid_i = pid_i +(ki*error);
}