Bonne idée, je vais faire ça ! (des que l’on a projet, c’est à dire je ne sais pas trop quand, peut-être Samedi). Je te tiendrai au courant !
Merci énormément pour ton aide @Aabu en tout cas !
PS : Pour quelle raison, la valeur de la poussée moyenne peut-elle être choisie "aléatoirement" ? (pour que je puisse l’expliquer ;))
EDIT : Mon programme "final" :
////////////////////////////////////
// Les bibliothèques nécessaires //
////////////////////////////////////
#include <Wire.h>
#include <ADXL345.h>
#define MOT_G ... // A REMPLACER
#define MOT_D ... // A REMPLACER
/* Variables */
double pitch = 0.00 ;
ADXL345 adxl ; // Variable adxl en relation avec la bibliothèque ADXL345
float erreur = 0 ; // Erreur = consigne - mesure
float consigne = 90 ; // Valeur à atteindre (modifiable)
const float Kp = 10 ; // Constante du paramètre proportionnel
const float Ki = 0.4 ; // Constante du paramètre intégral
const float Kd = 20 ; // Constante du paramètre dérivée
float erreur_precedente = 0 ;
float somme_erreurs = 0 ;
float variation_erreur = 0 ;
float mesure = 0 ;
int poussee_g = 0 ; // Poussée du moteur gauche (à déterminer)
int poussee_d = 0 ; // Poussée du moteur droit (à déterminer)
float commande = 0 ; // Commande = différence de pousée entre les moteurs : cmd = poussee_g - poussee_d
const int periode = 15 ; // Période d'échantillonage = Pause à la fin du programme Arduino = Temps d'execution de la fonction loop()
const int poussee_moyenne = 100 ; // Poussée moyenne, déterminée aléatoirement mais dois rester logique
void setup() {
pinMode(MOT_G, OUTPUT) ;
pinMode(MOT_D, OUTPUT) ;
Serial.begin(9600) ; // Moniteur série sur 9600 bauds (bits/s)
adxl.powerOn() ; // Démarrage du capteur accéléromètre/gyroscope
}
void loop() {
int x,y,z ;
adxl.readXYZ(&x, &y, &z) ; // Lecture des valeurs issues de l'accéléromètre et stockage dans les variables x,y,z
// Valeurs de sorties x, y, z
double x_Buff = float(x) ;
double y_Buff = float(y) ;
double z_Buff = float(z) ;
pitch = atan2((- x_Buff) , sqrt(y_Buff * y_Buff + z_Buff * z_Buff)) * 63 ;
mesure = pitch ; // Mesure finale
erreur = consigne - mesure ; // Calcul de l'écart entre la consigne et la mesure (-> erreur) => Paramètre proportionnel
somme_erreurs += erreur ; // Paramètre intégral
variation_erreur = erreur - erreur_precedente ; // Paramètre dérivée
commande = (Kp * erreur) + (Ki * somme_erreurs * periode) + ((Kd * variation_erreur) / periode) ; // Calcul de la commande
erreur_precedente = erreur ; // Stockage de l'erreur actuelle
// Conditions pour éviter la saturation (dépassage des valeurs limites (Démarrage du moteur/Moteur à fond)) :
if (commande < ...) commande = ... ; // A REMPLACER par la valeur pour laquelle les moteurs démarrent /!\
else if (commande > ...) commande = ... ; // A REMPLACER par la valeur pour laquelle les moteurs s'arrêtent /!\
// Détermination de la pousée des moteurs :
poussee_g = (1/2) * commande + poussee_moyenne ; // Poussee du moteur gauche
poussee_d = poussee_moyenne - (1/2) * commande ; // Poussee du moteur droit
// Envoie de ces poussées aux moteurs :
analogWrite(MOT_G, poussee_g) ;
analogWrite(MOT_D, poussee_d) ;
/* Debug */
//Serial.println(erreur) ;
//Serial.print("Temps : ") ;
//Serial.println(millis()) ;
//Serial.print("Mesure : ") ;
Serial.println(mesure) ;
//Serial.print("Commande : ") ;
//Serial.println(commande) ;
delay(15) ; // Pause (= periode)
}
+0
-0