IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Arduino Discussion :

Programme GPS et Accéléromètre


Sujet :

Arduino

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2024
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 25
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2024
    Messages : 2
    Par défaut Programme GPS et Accéléromètre
    Bonjour,

    J'ai un problème : j'utilise un module GPS Ultimate GPS Breakout V3 (Adafruit Ultimate GPS Breakout - 66 canaux 10 Hz - V3 - Boutique Semageek) et deux accéléromètres MPU6050 (Module 6 DoF SEN-MPU6050 Joy-It - Modules 6 degrés de liberté | GO TRONIC).

    J'aimerais afficher la latitude et la longitude sur le moniteur série, puis exécuter mon programme pour les accéléromètres. Pour plus de précision, mon projet est de créer un sac connecté. Le module GPS me permet d'afficher la localisation, et les deux accéléromètres seront positionnés en haut et en bas du sac pour prendre la position du dos et faire une moyenne. Un bouton permettra de calibrer la valeur de référence. Ensuite, par rapport à la position de référence et la position mesurée, faire un calcul et déterminer si la position est correcte par rapport à la valeur de référence.
    J'arrive pas a trouver le programme les deux programmes séparément fonctionne mais quand je l'es fusionne ca fonctionne plus le GPS ne s'affiche pas .

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    #include <Wire.h>
    #include <Adafruit_MPU6050.h>
    #include <Adafruit_Sensor.h>
    #include <math.h>
    #include <Adafruit_GPS.h>
    #include <SoftwareSerial.h>
     
    const int boutonPin = 8; // Broche du bouton poussoir
    Adafruit_MPU6050 mpu1, mpu2; // Deux instances de l'objet Adafruit_MPU6050
    float incl1 = 0;
    float incl2 = 0;
    float inclRef = 0;
    float inclMes = 0;
    const unsigned long intervalleMesure = 3000; // Intervalle entre les mesures en millisecondes
    const float margeInclinaison = 3.0; 
    unsigned long derniereMesure = 0;
     
    // Configuration des broches RX et TX pour la communication avec le module GPS
    SoftwareSerial gpsSerial(7, 6); // RX sur broche 6, TX sur broche 7
     
    // Initialisation de l'objet GPS
    Adafruit_GPS GPS(&gpsSerial);
     
    // Variables pour stocker la latitude et la longitude
    float latitude;
    float longitude;
     
    void setup() {
      // Initialisation de la communication série avec le moniteur série
      Serial.begin(9600);
      // Initialisation de la communication série avec le module GPS
      gpsSerial.begin(9600);
     
      // Initialisation de l'objet GPS
      GPS.begin(9600);
     
      pinMode(boutonPin, INPUT_PULLUP);
     
      Serial.println(F("Initialisation du système"));
     
      // Démarrage du premier MPU6050 à l'adresse 0x68
      if (!mpu1.begin(0x68)) {
        Serial.println("Échec de la détection de la puce MPU6050 (1)");
        while (1) {
          delay(10);
        }
      }
     
      // Démarrage du deuxième MPU6050 à l'adresse 0x69
      if (!mpu2.begin(0x69)) {
        Serial.println("Échec de la détection de la puce MPU6050 (2)");
        while (1) {
          delay(10);
        }
      }
     
      // Configuration des paramètres des MPU6050
      mpu1.setAccelerometerRange(MPU6050_RANGE_16_G);
      mpu1.setGyroRange(MPU6050_RANGE_250_DEG);
      mpu1.setFilterBandwidth(MPU6050_BAND_21_HZ);
     
      mpu2.setAccelerometerRange(MPU6050_RANGE_16_G);
      mpu2.setGyroRange(MPU6050_RANGE_250_DEG);
      mpu2.setFilterBandwidth(MPU6050_BAND_21_HZ);
    }
     
    void loop() {
      // Lecture et affichage des données d'inclinaison
      lectureInclinaison();
     
      // Lecture et affichage des données GPS
      lectureGPS();
     
      delay(2000);
    }
     
    void lectureInclinaison() {
      bool boutonAppuye = !digitalRead(boutonPin);
     
      if (boutonAppuye) {
        inclRef = lireInclinaisonMoyenne();
        delay(1000); // Attendre un court instant avant de continuer
      }
     
      Serial.print("Valeur de référence : ");
      Serial.print(inclRef);
      Serial.println(" degrés");
     
      unsigned long maintenant = millis();
      if (maintenant - derniereMesure >= intervalleMesure) {
        inclMes = lireInclinaisonMoyenne();
        Serial.print("Mesure : ");
        Serial.print(inclMes);
        Serial.println(" degrés");
     
        // Vérifier si la différence avec la valeur de référence dépasse la marge autorisée
        float difference = abs(inclRef - inclMes);
        if (difference > margeInclinaison) {
          Serial.println("Position mauvaise");
        } else {
          Serial.println("Position correcte");
        }
     
        // Mettre à jour le temps de la dernière mesure
        derniereMesure = maintenant;
      }
    }
     
    void lectureGPS() {
      // Lecture des données GPS
      if (GPS.available()) {
        char c = GPS.read();
        // Analyser les données NMEA
        if (GPS.newNMEAreceived()) {
          // Si un nouveau message NMEA est reçu, l'analyser
          if (GPS.parse(GPS.lastNMEA())) {
            // Si le parsing est réussi, vous pouvez accéder aux données GPS
            if (GPS.fix) {
              // Si le module GPS a fixé une position valide
              Serial.print("Latitude: ");
              Serial.print(GPS.latitudeDegrees, 7); // Afficher la latitude
              Serial.print(" Longitude: ");
              Serial.println(GPS.longitudeDegrees, 7); // Afficher la longitude
     
              // Enregistrer la latitude et la longitude dans les variables
              latitude = GPS.latitudeDegrees;
              longitude = GPS.longitudeDegrees;
            } else {
              // Si le module GPS n'a pas encore fixé de position valide
              Serial.println("Veuillez attendre, le signal GPS n'est pas encore fixé.");
            }
          }
        }
      }
    }
     
    float lireInclinaisonMoyenne() {
      float sommeInclinaisons = 0;
      for (int i = 0; i < 5; ++i) {
        readMPU1(); // Lecture des données du premier MPU6050
        readMPU2(); // Lecture des données du deuxième MPU6050
        sommeInclinaisons += ((incl1 + incl2) / 2);
        delay(1000);
      }
      return sommeInclinaisons / 5.0;
    }
     
    void readMPU1() {
      sensors_event_t a, g, temp;
      mpu1.getEvent(&a, &g, &temp);
     
      // Calcul de l'angle d'inclinaison en radians pour le premier MPU6050
      float pitch = atan2(-a.acceleration.x, sqrt(a.acceleration.y * a.acceleration.y + a.acceleration.z * a.acceleration.z));
     
      // Conversion des radians en degrés et affichage de l'angle d'inclinaison
      pitch = -1 * (pitch * 180.0 / M_PI);
      pitch = round(pitch);
      incl1 = pitch;
    }
     
    void readMPU2() {
      sensors_event_t a, g, temp;
      mpu2.getEvent(&a, &g, &temp);
     
      // Calcul de l'angle d'inclinaison en radians pour le deuxième MPU6050
      float pitch = atan2(-a.acceleration.x, sqrt(a.acceleration.y * a.acceleration.y + a.acceleration.z * a.acceleration.z));
     
      // Conversion des radians en degrés et affichage de l'angle d'inclinaison
      pitch = -1 * (pitch * 180.0 / M_PI);
      pitch = round(pitch);
      incl2 = pitch;
    }

  2. #2
    Expert confirmé

    Homme Profil pro
    mad scientist :)
    Inscrit en
    Septembre 2019
    Messages
    2 919
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : mad scientist :)

    Informations forums :
    Inscription : Septembre 2019
    Messages : 2 919
    Par défaut
    Dans combien de forum comptez vous poser la question et faire travailler en parallèle des bénévoles qui vont perdre leur temps si la réponse est donnée entre temps ailleurs ?

    ça ne vous gêne pas moralement ?

    Au moins annoncez la couleur quand vous avez posté ailleurs...
    ...

  3. #3
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2024
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 25
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2024
    Messages : 2
    Par défaut
    Citation Envoyé par Jay M Voir le message
    Dans combien de forum comptez vous poser la question et faire travailler en parallèle des bénévoles qui vont perdre leur temps si la réponse est donnée entre temps ailleurs ?

    ça ne vous gêne pas moralement ?

    Au moins annoncez la couleur quand vous avez posté ailleurs...
    ...


    Je tiens vraiment à m'excuser pour tout désagrément causé. Honnêtement, je ne connaissais pas bien les règles des forums et j'ai posté ma question sur deux forums en pensant que ça augmenterait mes chances d'obtenir une réponse. Maintenant, je réalise que ça peut compliquer les choses et faire perdre du temps à des bénévoles qui essaient de m'aider en parallèle. J'aurais vraiment dû préciser cela dès le début. Je suis vraiment désolé pour cette situation et je promets de faire plus attention à l'avenir.

Discussions similaires

  1. [STM32] Programme GPS pour STM32 carte nucléo
    Par Ho-MattMatt dans le forum Embarqué
    Réponses: 0
    Dernier message: 05/02/2019, 13h32
  2. Programme GPS - Raspberry
    Par Asthior dans le forum Raspberry Pi
    Réponses: 1
    Dernier message: 17/04/2017, 22h05
  3. Création d'un programme GPS sur visual studio
    Par clemmm dans le forum Visual Studio
    Réponses: 5
    Dernier message: 11/06/2014, 23h36
  4. Choix de langage pour programme GPS - émission de donnée par USB
    Par Olfox dans le forum Langages de programmation
    Réponses: 23
    Dernier message: 23/05/2011, 09h17
  5. Programme Delphi de conversion de coordonnées GPS/UTM
    Par furious-kiki dans le forum Delphi
    Réponses: 4
    Dernier message: 10/01/2007, 11h19

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo