Gyroscope/servomoteur problème

Bonjour à tous je me présente un peu avant de vous expliquer mon problème: je m'appelle Alexis, j'habite vers Nantes et je viens de m'inscrire sur le forum car j'ai vraiment besoin d'aide...

On m'a imposé un projet à rendre à la fin de l'année scolaire, ça fait déjà quelques mois que je planche dessus mais malheureusement je n'ai toujours pas abouti à ce que je voulais: c'est-à-dire réussir à stabiliser une caméra légère sur une montgolfière à l'aide d'un servomoteur et qu'un capteur MPU6050, le problème c'est que je n'y connais absolument rien et donc même si je me suis renseigné et que j'ai appris beaucoup de choses je n'ai toujours pas réussi à trouver le code adéquat à ce projet... Il faut donc que quand la caméra penche à cause du balancement de la nacelle, elle se redresse automatiquement pour que les images restes celles du sol ^^.

J'ai googliser comme un malade, suivi des tutos, regarder des vidéos mais vu que je suis complètement néophyte là dedans je n'y arrive pas. J'ai aussi vu un topic semblable à celui là mais je n'ai rien compris :'(

Je vous en pris aidez moi!

Cordialement,

Il faut que tu regardes du côté des nacelles DIY avec servo et capteur Le truc c'est qu'aujourdh'ui ce type de nacelles utilise plutot des moteurs brushless que des servos car plus précis. Mais le principe de correction reste le même.

en anglais il faut chercher GIMBAL.

Par exemple: http://www.youtube.com/watch?v=lYnqoaNJRks

Un autre groupe est chargé de faire le "boitier" où se trouvera le tout car on a juste une simple nacelle...

Merci quand même de ta réponse

bonjour,
il y a assez de truc sur le net pour ca quand même.
bon c’est vendredi, suis malade, donc ma bonté va prendre le dessus.
un truc que j’ai commencé a faire pour mettre de niveau mon télescope astro, hé oui suis un gros fénéant parfois.
il n’y a qu’un seul moteur dans le code, mais a toi de te démerd… :slight_smile:
le but étant d’avoir une mise à niveau automatique avec rattrapage

#include <MPU6050.h>
#include <I2Cdev.h>
#include "Wire.h"
#include <AFMotor.h>

// Connect a stepper motor with 48 steps per revolution (7.5 degree)
// to motor port #2 (M3 and M4)
AF_Stepper motor(200, 2);
MPU6050 mpu;

int16_t ax, ay, az;
int16_t gx, gy, gz;

MPU6050 accelgyro;

int val;
int prevVal;
#define LED_PIN 13

void setup()
{
Wire.begin();
Serial.begin(115200);

Serial.println("Initialize MPU");
mpu.initialize();
Serial.println(mpu.testConnection() ? "Connected" : "Connection failed");
  motor.setSpeed(50);  // 10 rpm   
    pinMode(LED_PIN, OUTPUT);

}

void loop()
{
    accelgyro.getMotion6(&ax, &ay, &az, &gx, &gy, &gz);
    ax = map(ax, -32767, 32767, -255, 255);
    ay = map(ay, -32767, 32767, -255, 255);
    az = map(az, -32767, 32767, -255, 255);
 
    Serial.print(ax); Serial.print("\t");
    Serial.print(ay); Serial.print("\t");
    Serial.print(ay); Serial.print("\t");
    Serial.print(az); Serial.print("\t");
    Serial.print(gx); Serial.print("\t");
    Serial.print(gy); Serial.print("\t");
    Serial.print(gz); Serial.print("\t\n");
    
    if (ay < -1)     motor.step(1, BACKWARD, SINGLE); 
    if (ay > 1)     motor.step(1, FORWARD, SINGLE); 
if( ay >= -1 && ay <= 1){digitalWrite(LED_PIN, HIGH);}else{digitalWrite(LED_PIN, LOW);}

    
    delay(100);
}

ça al'ir simple comme code je m'attendais à qqch de bien plus compliqué

john_lenfr: ça al'ir simple comme code je m'attendais à qqch de bien plus compliqué

ben quoi? tu t'attendais à 25000 lignes de codes :) j'ai fait ca vite fait un soir avant d'aller à l'astro, mais pas eu le temps de terminer le projet encore. donc très perfectible. là, il suffit de rajouter un 2eme moteur pour faire l'autre axe avec le même code en changeant simplement 2 paramètres :)

Tu peux faire plus compliqué si tu veux, par exemple avec une commande proportionnelle à l'écart mesuré.

Non je veux pas plus compliqué, je veux dire que je pensais pas pouvoir comprendre le code n'y connaissant pas grand chose mais finalement j'ai à peu près compris :grin:

Du coup je pense qu'à ma prochaine commande j'intégrerais un MPU6050 pour faire mumuse ;)

Tu as utilisé quoi comme controleur de moteur?

un shield santsmart v1 l293d simplement et un PAP que j'avais sous la main. :grin:

Salut Juste un petit renseignement, tu utilise quoi comme bibliothèque pour ce programme ?

Ben73:
Salut
Juste un petit renseignement, tu utilise quoi comme bibliothèque pour ce programme ?

heuuuuu, comment dire?
lire le code et tu l’auras, :grin:

Trouvé c'est bon ! Autant pour moi dsl :)

Donc, ton code est pour une stabilisation sur 1 axe.
Si je veux une stabilisation sur 3 axes, je suppose qu’il faut copier cette partie 2 fois pour avoir les 3 axes ?
(je suppose qu’il y’a aussi 2-3 modif a faire ?)

void loop()
{
accelgyro.getMotion6(&ax, &ay, &az, &gx, &gy, &gz);
ax = map(ax, -32767, 32767, -255, 255);
ay = map(ay, -32767, 32767, -255, 255);
az = map(az, -32767, 32767, -255, 255);

Serial.print(ax); Serial.print("\t");
Serial.print(ay); Serial.print("\t");
Serial.print(ay); Serial.print("\t");
Serial.print(az); Serial.print("\t");
Serial.print(gx); Serial.print("\t");
Serial.print(gy); Serial.print("\t");
Serial.print(gz); Serial.print("\t\n");

if (ay < -1) motor.step(1, BACKWARD, SINGLE);
if (ay > 1) motor.step(1, FORWARD, SINGLE);
if( ay >= -1 && ay <= 1){digitalWrite(LED_PIN, HIGH);}else{digitalWrite(LED_PIN, LOW);}

si tu veux mettre quelque chose de niveau, 2 axes suffisent. X et Y tu as ca aussi http://duino4projects.com/gyro-camera-for-motorcycle-using-arduino/

Salut! D’abord merci pour le code que tu as fait mais même si le tableau indique que le capteur réagit le servomoteur ne bouge pas d’un pouce…

Je l’ai pourtant brancher comme il le fallait mais rien n’y fait. Peux-tu m’aider encore une fois stp?

Il est alimenté comment ce servo ?

Pour l'instant avec la prise USB de l'ordinateur sur la carte arduino... Pour la montgolfière on prendra une pile 9 volt.

montre ton code. le servo utilise peut être une autre lib ;)

Ne me tapes pas ^^ sinon j’ai essayé avec ton code en ajoutant les trucs sur le servo…

#include "I2Cdev.h"
#include "MPU6050.h"
#include <Servo.h>
#if I2CDEV_IMPLEMENTATION == I2CDEV_ARDUINO_WIRE
    #include "Wire.h"
#endif
Servo myservo;
MPU6050 accelgyro;
int16_t ax, ay, az;
int16_t gx, gy, gz;
int capteur = A0;
int valeur;

#define OUTPUT_READABLE_ACCELGYRO

#define LED_PIN 13
bool blinkState = false;

void setup() {
    #if I2CDEV_IMPLEMENTATION == I2CDEV_ARDUINO_WIRE
        Wire.begin();
    #elif I2CDEV_IMPLEMENTATION == I2CDEV_BUILTIN_FASTWIRE
        Fastwire::setup(400, true);
    #endif

 
    Serial.begin(38400);
    Serial.println("Initializing I2C devices...");
    accelgyro.initialize();
    Serial.println("Testing device connections...");
    Serial.println(accelgyro.testConnection() ? "MPU6050 connection successful" : "MPU6050 connection failed");
    pinMode(LED_PIN, OUTPUT);
}

void loop() {

    accelgyro.getMotion6(&ax, &ay, &az, &gx, &gy, &gz);
    delay (500);
    #ifdef OUTPUT_READABLE_ACCELGYRO
        
        Serial.print("a/g:\t");
        Serial.print(ax); Serial.print("\t");
        Serial.print(ay); Serial.print("\t");
        Serial.print(az); Serial.print("\t");
        Serial.print(gx); Serial.print("\t");
        Serial.print(gy); Serial.print("\t");
        Serial.println(gz);
    #endif

    #ifdef OUTPUT_BINARY_ACCELGYRO
        Serial.write((uint8_t)(ax >> 8)); Serial.write((uint8_t)(ax & 0xFF));
        Serial.write((uint8_t)(ay >> 8)); Serial.write((uint8_t)(ay & 0xFF));
        Serial.write((uint8_t)(az >> 8)); Serial.write((uint8_t)(az & 0xFF));
        Serial.write((uint8_t)(gx >> 8)); Serial.write((uint8_t)(gx & 0xFF));
        Serial.write((uint8_t)(gy >> 8)); Serial.write((uint8_t)(gy & 0xFF));
        Serial.write((uint8_t)(gz >> 8)); Serial.write((uint8_t)(gz & 0xFF));
    #endif

    
    blinkState = !blinkState;
    digitalWrite(LED_PIN, blinkState);
    
    valeur = analogRead(capteur);
    valeur = map(valeur, 0, 1023, 0, 178);                
    myservo.write(valeur);              
    delay(15);                                                    
    myservo.write(valeur);               
    delay(15);                    
    
}

mais cette code pour la stabilisation servo