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.
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 :
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.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); } }
Merci d'avance pour votre aide ,
Cordialement
-----