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 :

GPS Arduino programme


Sujet :

Arduino

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Lycéen
    Inscrit en
    Février 2014
    Messages
    74
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Février 2014
    Messages : 74
    Par défaut GPS Arduino programme


    Bonjour, pour notre projet de sciences de l'ingénieur, nous devons créer les programmes d'un GPS sous arduino.

    Nous avons actuellement le programme qui nous permet de récupérer les données du GPS et de les transférer vers notre carte SD, il fonctionne correctement.

    Cependant, nous aimerions rajouter un interrupteur et une led afin de pouvoir lancer le programme lors de l'action de celui-ci et d'avoir une led "témoin".

    Depuis deux semaines nous essayons d'inclure le programme d'un interrupteur + led repris sur internet dans notre programme sans y parvenir, c'est pourquoi nous demandons aux connaisseurs de nous aider à trouver une solution.

    Merci d'avance pour ceux qui voudront bien prendre un peu de temps pour nous aider, voici notre programme actuel:

    Code c++ : 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
    #include <SPI.h>
    #include <Adafruit_GPS.h>
    #include <SoftwareSerial.h>
    #include <SD.h>
    #include <avr/sleep.h>
     
    // Ladyada's logger modified by Bill Greiman to use the SdFat library
    //
    // This code shows how to listen to the GPS module in an interrupt
    // which allows the program to have more 'freedom' - just parse
    // when a new NMEA sentence is available! Then access data when
    // desired.
    //
    // Tested and works great with the Adafruit Ultimate GPS Shield
    // using MTK33x9 chipset
    //    ------> <a href="http://www.adafruit.com/products/" target="_blank">http://www.adafruit.com/products/</a>
    // Pick one up today at the Adafruit electronics shop
    // and help support open source hardware & software! -ada
     
    SoftwareSerial mySerial(8, 7);
    Adafruit_GPS GPS(&mySerial);
     
    // Set GPSECHO to 'false' to turn off echoing the GPS data to the Serial console
    // Set to 'true' if you want to debug and listen to the raw GPS sentences
    #define GPSECHO  true
    /* set to true to only log to SD when GPS has a fix, for debugging, keep it false */
    #define LOG_FIXONLY false 
     
    // Set the pins used
    #define chipSelect 10
    #define ledPin 13
     
    File logfile;
     
    // read a Hex value and return the decimal equivalent
    uint8_t parseHex(char c) {
      if (c < '0')
        return 0;
      if (c <= '9')
        return c - '0';
      if (c < 'A')
        return 0;
      if (c <= 'F')
        return (c - 'A')+10;
    }
     
    // blink out an error code
    void error(uint8_t errno) {
    /*
      if (SD.errorCode()) {
        putstring("SD error: ");
        Serial.print(card.errorCode(), HEX);
        Serial.print(',');
        Serial.println(card.errorData(), HEX);
      }
      */
      while(1) {
        uint8_t i;
        for (i=0; i<errno; i++) {
          digitalWrite(ledPin, HIGH);
          delay(100);
          digitalWrite(ledPin, LOW);
          delay(100);
        }
        for (i=errno; i<10; i++) {
          delay(200);
        }
      }
    }
     
    void setup() {
      // for Leonardos, if you want to debug SD issues, uncomment this line
      // to see serial output
      //while (!Serial);
     
      // connect at 115200 so we can read the GPS fast enough and echo without dropping chars
      // also spit it out
      Serial.begin(115200);
      Serial.println("\r\nUltimate GPSlogger Shield");
      pinMode(ledPin, OUTPUT);
     
      // make sure that the default chip select pin is set to
      // output, even if you don't use it:
      pinMode(10, OUTPUT);
     
      // see if the card is present and can be initialized:
      //if (!SD.begin(chipSelect, 11, 12, 13)) {
      if (!SD.begin(chipSelect)) {      // if you're using an UNO, you can use this line instead
        Serial.println("Card init. failed!");
        error(2);
      }
      char filename[15];
      strcpy(filename, "GPSLOG00.TXT");
      for (uint8_t i = 0; i < 100; i++) {
        filename[6] = '0' + i/10;
        filename[7] = '0' + i%10;
        // create if does not exist, do not open existing, write, sync after write
        if (! SD.exists(filename)) {
          break;
        }
      }
     
      logfile = SD.open(filename, FILE_WRITE);
      if( ! logfile ) {
        Serial.print("Couldnt create "); Serial.println(filename);
        error(3);
      }
      Serial.print("Writing to "); Serial.println(filename);
     
      // connect to the GPS at the desired rate
      GPS.begin(9600);
     
      // uncomment this line to turn on RMC (recommended minimum) and GGA (fix data) including altitude
      //GPS.sendCommand(PMTK_SET_NMEA_OUTPUT_RMCGGA);
      // uncomment this line to turn on only the "minimum recommended" data
      GPS.sendCommand(PMTK_SET_NMEA_OUTPUT_RMCONLY);
      // For logging data, we don't suggest using anything but either RMC only or RMC+GGA
      // to keep the log files at a reasonable size
      // Set the update rate
      GPS.sendCommand(PMTK_SET_NMEA_UPDATE_1HZ);   // 1 or 5 Hz update rate
     
      // Turn off updates on antenna status, if the firmware permits it
      GPS.sendCommand(PGCMD_NOANTENNA);
     
      Serial.println("Ready!");
    }
     
    void loop() {
      char c = GPS.read();
      if (GPSECHO)
         if (c)   Serial.print(c);
     
      // if a sentence is received, we can check the checksum, parse it...
      if (GPS.newNMEAreceived()) {
        // a tricky thing here is if we print the NMEA sentence, or data
        // we end up not listening and catching other sentences!
        // so be very wary if using OUTPUT_ALLDATA and trying to print out data
        //Serial.println(GPS.lastNMEA());   // this also sets the newNMEAreceived() flag to false
     
        if (!GPS.parse(GPS.lastNMEA()))   // this also sets the newNMEAreceived() flag to false
          return;  // we can fail to parse a sentence in which case we should just wait for another
     
        // Sentence parsed!
        Serial.println("OK");
        if (LOG_FIXONLY && !GPS.fix) {
            Serial.print("No Fix");
            return;
        }
     
        // Rad. lets log it!
        Serial.println("Log");
     
        char *stringptr = GPS.lastNMEA();
        uint8_t stringsize = strlen(stringptr);
        if (stringsize != logfile.write((uint8_t *)stringptr, stringsize))    //write the string to the SD file
          error(4);
        if (strstr(stringptr, "RMC"))   logfile.flush();
        Serial.println();
      }
    }
     
     
    /* End code */

  2. #2
    Responsable Arduino et Systèmes Embarqués


    Avatar de f-leb
    Homme Profil pro
    Enseignant
    Inscrit en
    Janvier 2009
    Messages
    13 197
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Janvier 2009
    Messages : 13 197
    Billets dans le blog
    47
    Par défaut
    Bonsoir et bienvenue,


    Citation Envoyé par barbeaua Voir le message
    nous aimerions rajouter un interrupteur et une led afin de pouvoir lancer le programme lors de l'action de celui-ci et d'avoir une led "témoin".
    Quel type d'interrupteur ? Bouton poussoir ? Bascule ?

    Comment est-il câblé ? Résistance de tirage ? Un pt'it schéma peut-être...

    D'où vient le problème d'après toi ? Hardware ou logiciel ? Quel code as-tu utilisé dans le dernier cas ?

    D'après le programme, tu utilises déjà une led sur le port 10 (clignotement de la led en cas d'erreur), tu veux utiliser la même led ou bien une autre ?

  3. #3
    Membre confirmé
    Homme Profil pro
    Lycéen
    Inscrit en
    Février 2014
    Messages
    74
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Février 2014
    Messages : 74
    Par défaut
    Bonsoir,
    C'est un interrupteur bascule, on ne sait pas encore comment le cabler mais on y a pas encore réfléchi car on arrive pas à compiler notre programme sous arduino. On a essayé plusieurs modifications dans notre programme mais la compilation est toujours impossible du fait des nombreuses erreurs créées par notre modification. N'étant pas expert en programmation, on a donc essayé de "mettre en commun" notre programme ainsi qu'un programme interrupteur trouvé sur le net: http://wiki.t-o-f.info/Arduino/Exemp...upteurEtUneDEL . On aimerai ajouter une led sans utiliser celle qui clignote.
    Pour le GPS on s'est appuyés sur ce tuto: http://learn.adafruit.com/adafruit-u...hield/overview
    Merci de votre intérêt
    En espérant pouvoir profiter de votre aide

  4. #4
    Responsable Arduino et Systèmes Embarqués


    Avatar de f-leb
    Homme Profil pro
    Enseignant
    Inscrit en
    Janvier 2009
    Messages
    13 197
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Janvier 2009
    Messages : 13 197
    Billets dans le blog
    47
    Par défaut
    Bonsoir,

    On a essayé plusieurs modifications dans notre programme mais la compilation est toujours impossible du fait des nombreuses erreurs créées par notre modification. N'étant pas expert en programmation, on a donc essayé de "mettre en commun" notre programme ainsi qu'un programme interrupteur trouvé sur le net:
    Hé bien il faut nous montrer le programme modifié en le postant ici en nous indiquant les messages d'erreur.

  5. #5
    Membre confirmé
    Homme Profil pro
    Lycéen
    Inscrit en
    Février 2014
    Messages
    74
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Février 2014
    Messages : 74
    Par défaut ça semble fonctionner
    Voici notre programme, il semble se compiler on aimerai faire les branchements sur le pin 2 et 3 du bouton et de la led afin de tester, pouvez vous nous aidez pour les brancher?
    Cordialement

    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
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    #include <SPI.h>
    #include <Adafruit_GPS.h>
    #include <SoftwareSerial.h>
    #include <SD.h>
    #include <avr/sleep.h>
     
    // Ladyada's logger modified by Bill Greiman to use the SdFat library
    //
    // This code shows how to listen to the GPS module in an interrupt
    // which allows the program to have more 'freedom' - just parse
    // when a new NMEA sentence is available! Then access data when
    // desired.
    //
    // Tested and works great with the Adafruit Ultimate GPS Shield
    // using MTK33x9 chipset
    //    ------> <a href="http://www.adafruit.com/products/" target="_blank">http://www.adafruit.com/products/</a>
    // Pick one up today at the Adafruit electronics shop 
    // and help support open source hardware & software! -ada
     
    SoftwareSerial mySerial(8, 7);
    Adafruit_GPS GPS(&mySerial);
     
    // Set GPSECHO to 'false' to turn off echoing the GPS data to the Serial console
    // Set to 'true' if you want to debug and listen to the raw GPS sentences
    #define GPSECHO  true
    /* set to true to only log to SD when GPS has a fix, for debugging, keep it false */
    #define LOG_FIXONLY false  
     
    // Set the pins used
    #define chipSelect 10
    #define ledPin 13
     
    const int buttonPin = 2;     // the number of the pushbutton pin
    const int led = 3;      // the number of the LED pin
     
    // variables will change:
    int buttonState = 0;         // variable for reading the pushbutton status
     
    File logfile;
     
    // read a Hex value and return the decimal equivalent
    uint8_t parseHex(char c) {
      if (c < '0')
        return 0;
      if (c <= '9')
        return c - '0';
      if (c < 'A')
        return 0;
      if (c <= 'F')
        return (c - 'A')+10;
    }
     
    // blink out an error code
    void error(uint8_t errno) {
    /*
      if (SD.errorCode()) {
        putstring("SD error: ");
        Serial.print(card.errorCode(), HEX);
        Serial.print(',');
        Serial.println(card.errorData(), HEX);
      }
      */
      while(1) {
        uint8_t i;
        for (i=0; i<errno; i++) {
          digitalWrite(ledPin, HIGH);
          delay(100);
          digitalWrite(ledPin, LOW);
          delay(100);
        }
        for (i=errno; i<10; i++) {
          delay(200);
        }
      }
    }
     
    void setup() {
     
     // initialize the LED pin as an output:
      pinMode(led, OUTPUT);      
      // initialize the pushbutton pin as an input:
      pinMode(buttonPin, INPUT);     
     
      // for Leonardos, if you want to debug SD issues, uncomment this line
      // to see serial output
      //while (!Serial);
     
      // connect at 115200 so we can read the GPS fast enough and echo without dropping chars
      // also spit it out
      Serial.begin(115200);
      Serial.println("\r\nUltimate GPSlogger Shield");
      pinMode(ledPin, OUTPUT);
     
      // make sure that the default chip select pin is set to
      // output, even if you don't use it:
      pinMode(10, OUTPUT);
     
      // see if the card is present and can be initialized:
      //if (!SD.begin(chipSelect, 11, 12, 13)) {
      if (!SD.begin(chipSelect)) {      // if you're using an UNO, you can use this line instead
        Serial.println("Card init. failed!");
        error(2);
      }
      char filename[15];
      strcpy(filename, "GPSLOG00.TXT");
      for (uint8_t i = 0; i < 100; i++) {
        filename[6] = '0' + i/10;
        filename[7] = '0' + i%10;
        // create if does not exist, do not open existing, write, sync after write
        if (! SD.exists(filename)) {
          break;
        }
      }
     
      logfile = SD.open(filename, FILE_WRITE);
      if( ! logfile ) {
        Serial.print("Couldnt create "); Serial.println(filename);
        error(3);
      }
      Serial.print("Writing to "); Serial.println(filename);
     
      // connect to the GPS at the desired rate
      GPS.begin(9600);
     
      // uncomment this line to turn on RMC (recommended minimum) and GGA (fix data) including altitude
      //GPS.sendCommand(PMTK_SET_NMEA_OUTPUT_RMCGGA);
      // uncomment this line to turn on only the "minimum recommended" data
      GPS.sendCommand(PMTK_SET_NMEA_OUTPUT_RMCONLY);
      // For logging data, we don't suggest using anything but either RMC only or RMC+GGA
      // to keep the log files at a reasonable size
      // Set the update rate
      GPS.sendCommand(PMTK_SET_NMEA_UPDATE_1HZ);   // 1 or 5 Hz update rate
     
      // Turn off updates on antenna status, if the firmware permits it
      GPS.sendCommand(PGCMD_NOANTENNA);
     
      Serial.println("Ready!");
    }
     
    void loop() {
       // read the state of the pushbutton value:
      buttonState = digitalRead(buttonPin);
     
      // check if the pushbutton is pressed.
      // if it is, the buttonState is HIGH:
      if (buttonState == HIGH) {     
        // turn LED on:    
        digitalWrite(led, HIGH);
     
        char c = GPS.read();
      if (GPSECHO)
         if (c)   Serial.print(c);
     
      // if a sentence is received, we can check the checksum, parse it...
      if (GPS.newNMEAreceived()) {
        // a tricky thing here is if we print the NMEA sentence, or data
        // we end up not listening and catching other sentences! 
        // so be very wary if using OUTPUT_ALLDATA and trying to print out data
        //Serial.println(GPS.lastNMEA());   // this also sets the newNMEAreceived() flag to false
     
        if (!GPS.parse(GPS.lastNMEA()))   // this also sets the newNMEAreceived() flag to false
          return;  // we can fail to parse a sentence in which case we should just wait for another
     
        // Sentence parsed! 
        Serial.println("OK");
        if (LOG_FIXONLY && !GPS.fix) {
            Serial.print("No Fix");
            return;
        }
     
        // Rad. lets log it!
        Serial.println("Log");
     
        char *stringptr = GPS.lastNMEA();
        uint8_t stringsize = strlen(stringptr);
        if (stringsize != logfile.write((uint8_t *)stringptr, stringsize))    //write the string to the SD file
          error(4);
        if (strstr(stringptr, "RMC"))   logfile.flush();
        Serial.println();
      }
    }
    else {
        // turn LED off:
        digitalWrite(led, LOW); 
      }
    }
     
    /* End code */

  6. #6
    Responsable Arduino et Systèmes Embarqués


    Avatar de f-leb
    Homme Profil pro
    Enseignant
    Inscrit en
    Janvier 2009
    Messages
    13 197
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Janvier 2009
    Messages : 13 197
    Billets dans le blog
    47
    Par défaut
    Pour les branchements, le schéma de ton lien convient très bien, il suffit de mettre l'interrupteur à la pin 2 au lieu de 7 et c'est tout.

    Note que lorsque ton interrupteur est ouvert, la pin est à l'état HIGH (tirage au +). Et donc lorsque tu fermes l'interrupteur, la pin bascule à l'état LOW. Il faut en tenir compte dans le programme.

    Code c++ : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
      if (buttonState == HIGH) {     
        // turn LED on:    
        digitalWrite(led, HIGH);
    ici tu allumes la led lorsque tu ouvres l'interrupteur, donc l'effet inverse de ce que tu recherches je pense.

    Tu vas peut-être aussi avoir des problèmes de "rebonds", à voir...

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. 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
  2. Programmation série C pour dialoguer avec GPS
    Par azmodai dans le forum Linux
    Réponses: 2
    Dernier message: 10/12/2010, 13h26
  3. Réponses: 5
    Dernier message: 10/12/2008, 23h00
  4. Réponses: 6
    Dernier message: 03/05/2008, 10h29
  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