Bonjour,
Depuis mon sujet "[ARDUINO] Asservissement grâce au PID" (https://zestedesavoir.com/forums/sujet/11649/arduino-asservissement-grace-au-pid/?page=1#p194416), mon professeur nous a demandé de passer sur MATLAB (Simulink) pour faciliter aux autres la compréhension du programme aux autres (mais ce qui nous simplifie pas la tâche :p). Me voilà donc avec une tentative de programme pour reproduire le programme Arduino que j’ai obtenu à la fin de mon 1er sujet grâce à la participation des membres qui se reconnaitront si ils passent par là ^^.
Pour ceux ne pouvant pas aller voir mon sujet précédant voici un rapide résumé de ce que j’ai dis dans mon sujet précédant :
"Je suis actuellement en terminale SI et dans le cadre de cette matière, je dois réaliser un stabilisateur de drone "simplifié" c’est-à-dire ça : https://www.youtube.com/watch?v=w2hZoZQyRw8&t=28s
L’une des problématiques de ce projet est donc l’asservissement grâce au PID.
Notre cahier des charges nous impose de considérer que le drone n’est plus stabilisé lorsque ses oscillations dépassent de plus ou moins 5degrés de 90degrés."
Et le programme Arduino final :
#include <Wire.h>
#include <ADXL345.h>
double pitch = 0.00;
ADXL345 adxl; //variable adxl en relation avec la bibliothèque ADXL345
float erreur = 0; //consigne - mesure
float consigne = 90;
const float Kp = 10 ;
const float Ki = 0.4 ;
const float Kd = 20 ;
float erreur_precedente = 0 ;
float somme_erreurs = 0 ;
float variation_erreur = 0 ;
float mesure = 0;
float commande = 0;
const int periode = 15 ;
void setup() {
Serial.begin(9600);
adxl.powerOn();
}
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;
erreur = consigne - mesure ;
somme_erreurs += erreur ;
variation_erreur = erreur - erreur_precedente ;
commande = (Kp * erreur) + (Ki * somme_erreurs * periode) + ((Kd * variation_erreur) / periode) ;
erreur_precedente = erreur ;
delay(15) ;
}
Et maintenant rentrant dans le vif du sujet de ce sujet (sujetception :)). Ma question est donc plutôt simple (en apparance) : le programme suivant vous semble t-il correct ?
Voici mon programme sur MATLAB :
Et le sous programme :
C’est tout pour ce message
Je vous remercie (beaucoup) par avance de vos réponses !
Cordialement,
Jupiter41