Bonjour ,
Je suis débutant en Arduino et j'ai comme projet un prototype de stabilisateur de caméra (je stabiliserai uniquement l'axe de roulis) , je vous poste la liste de mes composants au cas ou :
IMU : https://www.sparkfun.com/products/11028
Carte arduino micro : https://www.arduino.cc/en/Main/arduinoBoardMicro
Contrôleur de moteur pas à pas : https://www.sparkfun.com/products/12779
Moteur pas à pas : http://www.lextronic.fr/P29742-mini-...aire-1208.html
ainsi que le schéma de mon montage. Nom : PropreCorrect.png
Affichages : 277
Taille : 229,3 Ko
J'en suis donc à l'étape de la programmation et j'ai quelques soucis , j'ai en effet déjà un code pour calculer l'angle de roulis avec l'acceleration gravitationnelle que ressent la carte et j'ai essayé d'y rajouter un code pour donc faire tourner le moteur en fonction. Je ne pourrais tester ce code que demain car je n'ai pas accès a l'alimentation dont j'ai besoin ( d'ailleurs je ne suis pas trop sur de l'alimentation que j'aurai exactement besoin , le moteur a une tension nominale de 10 et un courant nominal de 500mA mais il n'est pas précisé dans la documentation la tension / courant de blocage... Je pensais l'alimenter avec du 12V/1A cela serait il correct ? ), pour en revenir au code je pensais donc faire quelques chose de ce style :
Code:
#include<Wire.h>
 #define DIR_PIN 4
 #define STEP_PIN 5
    const int MPU=0x68;  // I2C address of the MPU-6050
    int16_t AcX,AcY,AcZ;
    float accel,ay,az,phi;
    void setup(){
      Wire.begin();
      Wire.beginTransmission(MPU);
      Wire.write(0x6B);  // PWR_MGMT_1 register
      Wire.write(0);     // set to zero (wakes up the MPU-6050)
      Wire.endTransmission(true);
      Serial.begin(9600);
      pinMode(DIR_PIN, OUTPUT); 
      pinMode(STEP_PIN, OUTPUT);
    }
    void loop(){
      Wire.beginTransmission(MPU);
      Wire.write(0x3B);  // starting with register 0x3B (ACCEL_XOUT_H)
      Wire.endTransmission(false);
      Wire.requestFrom(MPU,6,true);  // request a total of 6 registers
      AcX=Wire.read()<<8|Wire.read();  // 0x3B (ACCEL_XOUT_H) & 0x3C (ACCEL_XOUT_L)    
      AcY=Wire.read()<<8|Wire.read();  // 0x3D (ACCEL_YOUT_H) & 0x3E (ACCEL_YOUT_L)
      AcZ=Wire.read()<<8|Wire.read();  // 0x3F (ACCEL_ZOUT_H) & 0x40 (ACCEL_ZOUT_L)
      Serial.print("AcX = "); Serial.print(AcX);
      Serial.print(" | AcY = "); Serial.print(AcY);
      Serial.print(" | AcZ = "); Serial.println(AcZ);
      // AcZ = 16350 au repos AcZ= -17300 à l’envers
      az = (float)(AcZ + 475 );
      //AcY = 16200 au repos AcX =-16700
      ay = (float)(AcY + 200);
      accel = sqrt(ay*ay+az*az);
      phi = atan2(ay,az)*(360/(2*3.14159265));
      Serial.print("Phi = "); Serial.println(phi);
      delay(100); // actualisation des données toutes les 100ms
      while (phi =!0) {
        rotateDeg(phi,1);
      }
    }
    void rotateDeg(float deg, float speed){ 
  //rotate a specific number of degrees (negitive for reverse movement)
  //speed is any number from .01 -> 1 with 1 being fastest - Slower is stronger
  int dir = (deg > 0)? HIGH:LOW;
  digitalWrite(DIR_PIN,dir); 

  int steps = abs(deg)*(1/0.225);
  float usDelay = (1/speed) * 70;

  for(int i=0; i < steps; i++){ 
    digitalWrite(STEP_PIN, HIGH); 
    delayMicroseconds(usDelay); 

    digitalWrite(STEP_PIN, LOW); 
    delayMicroseconds(usDelay); 
  }
  }
Mais je sais pertinemment que cela ne fonctionne pas car dans le while , phi ne s'actualisera pas avec le mouvement que je ferai faire a ma carte au cours du temps... Je suis donc un peu perdu, sur le forum arduino on m'a parlé d'utilisé un correcteur PID mais malgré mes recherches je ne sais pas trop comment m'en dépatouiller , je connais dans la théorie avec la deuxième année de prépa " du point de vue mathématiques " le correcteur PID dans une fonction de transfert etc ... mais en coder un pour un cas concret est une tout autre paire de manche. De plus je n'ai pas trouvé d'exemple de correcteur PID avec un moteur pas à pas sur internet.
Merci d'avance pour votre aide ,
Cordialement