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 :

Projet Arduino avec GPS Neo 7M


Sujet :

Arduino

  1. #21
    Expert confirmé

    Homme Profil pro
    mad scientist :)
    Inscrit en
    Septembre 2019
    Messages
    2 711
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : mad scientist :)

    Informations forums :
    Inscription : Septembre 2019
    Messages : 2 711
    Points : 5 390
    Points
    5 390
    Par défaut
    Bonjour

    Je rajoute le piezo plus tard dans la journée, c’est facile

    Pour installer l’IDE on télécharge depuis le site arduino c’est assez basique

    Pour les bibliothèques - il y a des tutos. Par exemple en français ici ou en anglais sur le site arduino (En gros il faut récupérer le répertoire de la bibliothèque et le mettre dans le répertoire library de votre installation Arduino)

    Pour le Nano c’est sans souci, ce sera exactement le même code. Un bon choix si la consommation n’est pas un problème.

    Pour les dip switches et le boutons, le câblage attendu est le suivant

    Pin arduino ——— patte1 switch [ bouton] patte 2 switch ——— GND

    Il n’y a rien de flottant car le code met la pin Arduino en pull-up ce qui fait que l’arduino voit HIGH quand le bouton n’est pas appuyé et LOW quand le bouton est appuyé ou le dip switch activé.

    Si vous voulez dégager le dip switch et mettre un composant piloté par télécommande à la place, il faut obtenir le même comportement: l’activation doit relier la pin à GND.

    Ensuite POUR ces dip switches, OUI vos calculs sont corrects. Je les lis comme des 0 et 1 d’un octet. 0 si on n’a pas activé le switch, 1 s’il est relié à GND. Comme j’en ai 4, les valeurs en binaires vont de 0000 à 1111, c’est à dire une valeur de 0 à 15. La formule dans le code - prise pour aller entre 20 et 100m, c’est 20+6 x valeur. Donc si valeur vaut 0 (les 4 switches non reliés à GND) on est à 20m, si les 4 switches sont reliés à GND la valeur est 15 et donc on est à 20+6x15=100m et entre les deux on avance par pas de 6m. Par exemple si vous voulez 50m c’est 20+30 donc il faut faire 30 = 6 x la valeur des switches, donc il faut mettre 5 sur les switches, soit 0110

    On ne peut pas avoir toutes les valeurs, juste un incrément de 6 en 6 depuis 20.

    Une télécommande ne gère pas de timing cependant, elle envoie juste un code. Donc si c’est l’interface souhaitée, soit il faut simuler une mise à GND pendant au moins 2 secondes, soit on ne peut pas conserver l’approche (qui était là pour éviter une fausse manip et s’assurer autant que faire se peut de l’arrivée d’un nouveau fix GPS, souvent toutes les secondes) d’attendre 2 secondes avant de valider.



    EDIT: j'ai rajouté le code pour l'alerte sonore, ce n'est que quelques lignes. J'ai connecté un simple petit piezo sur la pin 9 de l'arduino. pin 9 --- (piezo +) [piezo] (piezo -) ---- GND

    J'ai aussi changé les pins utilisés pour le port Software Serial à 2 et 3 au lieu de 3 et 4 car j'ai vu que j'utilisais 4 pour les dip switch aussi. Donc vous devriez avoir:

    • pin 0 et 1 : rien de branché pour le moment
    • pin 2 et 3: connexion du GPS
    • pin 4,5,6,7 les 4 pattes du dip switch x 4
    • pin 8 le bouton de mémorisation de position
    • pin 9 la pin d'alerte
    • pin 10 la patte + du piezo



    Voici le code
    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
    // Library Required on top of the Arduino environment. Those Library are the property of their respective owners
    //  SimpleBouton Library  : http://forum.arduino.cc/index.php?topic=375232.0
    //  TinyGPS++ library     : https://github.com/mikalhart/TinyGPSPlus
     
    /*
      --------------------------------------------------------------
      KEEP THIS INFORMATION IF YOU USE THIS CODE
     
      Copyright (c) 2021 Jay For the Developpez.com forum
      https://www.developpez.net/forums/d2100922/general-developpement/programmation-systeme/embarque/arduino/projet-arduino-gps-neo-7m/
     
      Licenses for libraires included in this program apply
     
      This program is free software; you can redistribute it and/or
      modify it under the terms of the GNU Lesser General Public
      License as published by the Free Software Foundation; either
      version 2.1 of the License, or (at your option) any later version.
     
      This program is distributed in the hope that it will be useful,
      but WITHOUT ANY WARRANTY; without even the implied warranty of
      MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
      Lesser General Public License for more details.
     
      You should have received a copy of the GNU Lesser General Public
      License along with this library; if not, write to the Free Software
      Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
     
      --------------------------------------------------------------
    */
     
    // ======== CONFIGURATION DU HARDWARE ============
     
    // if you use an Arduino with only one Serial port, uncomment this line
    #define USE_SW_SERIAL
     
    #ifdef USE_SW_SERIAL
    #include <SoftwareSerial.h>
    const uint8_t RXPin = 2; // the arduino pin on which to receive serial data from your GPS
    const uint8_t TXPin = 3; // the arduino pin on which to transmit serial data to your GPS
    SoftwareSerial gpsSerial(RXPin, TXPin);
    #else
    #define gpsSerial Serial1   // otherwise define here which Hardware Serial Port to use
    #endif
     
    // define your GPS baud rate (9600 is the default for GPS Neo 7M)
    const uint32_t GPSBaud = 9600;
     
     
    // the pins to set the alert distance  20 + 6 x bitMask (bitMask from LSB to MSB).
    // eg if dip config is 1001 that's 9 in decimal, distance will be 20 + 9x6 = 74m.
    // min distance = 20m, max distance with bitMaks @1111 = 100m
    const uint8_t dipSwitchPins[] = {4, 5, 6, 7};
    const uint8_t nbDipSwitches = sizeof dipSwitchPins / sizeof dipSwitchPins[0];
     
    // button to record position, wired as : pin---BP---GND
    const uint8_t recordPositionPin = 8;
     
    // the pin triggering the alert. HIGH by default, turns LOW when distance is above threshold
    const uint8_t alertPin = 9;
     
    // the pin for the sound (a simple piezo) pin --- (piezo +) [piezo] (piezo -) ---- GND
    const uint8_t piezoPin = 10;
     
    // --------------------------------------------------------------
     
    #include <simpleBouton.h>
    simpleBouton boutonPosition(recordPositionPin);
     
    #include <TinyGPS++.h>
    TinyGPSPlus gps;
     
    double recordedLatitude;
    double recordedLongitude;
    bool   recordedPosition = false;
     
    double HaversineDistance(const double lat1, const double long1,  const double lat2, const double long2)
    {
      double latRad1 = radians(lat1);
      double latRad2 = radians(lat2);
      double lonRad1 = radians(long1);
      double lonRad2 = radians(long2);
     
      double half_diffLa = (latRad2 - latRad1) / 2.0;
      double s_half_diffLa = sin(half_diffLa);
     
      double half_doffLo = (lonRad2 - lonRad1) / 2.0;
      double s_half_doffLo = sin(half_doffLo);
     
      double computation = asin(sqrt(s_half_diffLa * s_half_diffLa + cos(latRad1) * cos(latRad2) * s_half_doffLo * s_half_doffLo));
      return 2.0 * 6372795.0 * computation;
    }
     
    bool feedGPS()
    {
      bool gotFix = false;
      while (gpsSerial.available() > 0)
        if (gps.encode(gpsSerial.read())) {
          gotFix = true;
          break;
        }
      return gotFix;
    }
     
    uint32_t maxDistance()
    {
      uint8_t dipSwitchByte = 0;
      for (uint8_t i = 0; i < nbDipSwitches; i++)
        if (digitalRead(dipSwitchPins[i]) == LOW) bitSet(dipSwitchByte, i);
      return 20ul + 6 * dipSwitchByte; //  dipSwitchByte between 0 and 15 => distance between 20+0=20 and 20+6*15=100
    }
     
    void checkUserAction()
    {
      static bool recordingAttempt = false;
      uint32_t duree = boutonPosition.dureeEnfonce();
      boutonPosition.actualiser();
      if (boutonPosition.vientDEtreEnfonce()) recordingAttempt = true;
      if (recordingAttempt && (boutonPosition.vientDEtreRelache() || (duree > 2000))) {
        if (gps.location.isValid()) {
          recordedLatitude  = gps.location.lat();
          recordedLongitude = gps.location.lng();
          recordedPosition = true;
          recordingAttempt = false;
          Serial.print(F("Recorded Position = "));
          Serial.print(recordedLatitude, 6); Serial.write(','); Serial.println(recordedLongitude, 6);
          tone(piezoPin, 1000, 200);
        } else {
          Serial.println(F("Can't record position, no valid fix"));
        }
      }
    }
     
    void checkPosition()
    {
      static bool alert = false;
      if (gps.location.isValid()) {
        Serial.print(F("Position: ")); Serial.print(gps.location.lat());
        Serial.write(','); Serial.println(gps.location.lng());
     
        if (recordedPosition) {
          double distance = HaversineDistance(gps.location.lat(), gps.location.lng(), recordedLatitude, recordedLongitude);
          Serial.print(F("Distance from position: ")); Serial.print(distance); Serial.println(F(" m"));
     
          if (distance >= maxDistance()) {
            if (!alert) {
              digitalWrite(alertPin, LOW);
              alert = true;
              tone(piezoPin, 600, 100);
              delay(120);
              tone(piezoPin, 300, 100);
              Serial.print(F("alert distance = ")); Serial.println(distance);
            }
          } else {
            if (alert) {
              digitalWrite(alertPin, HIGH);
              tone(piezoPin, 300, 100);
              delay(120);
              tone(piezoPin, 600, 100);
              Serial.print(F("Distance back in range : ")); Serial.println(distance);
            }
            alert = false;
          }
        }
      }
    }
     
    void setup() {
      for (auto& p : dipSwitchPins) pinMode(p, INPUT_PULLUP);
      pinMode(alertPin, OUTPUT);
      pinMode(piezoPin, OUTPUT);
      digitalWrite(alertPin, HIGH); // will go low in case of Alert
      Serial.begin(115200);
      gpsSerial.begin(GPSBaud);
    }
     
    void loop() {
      checkUserAction();
      if (feedGPS()) checkPosition();
    }

  2. #22
    Expert confirmé

    Homme Profil pro
    mad scientist :)
    Inscrit en
    Septembre 2019
    Messages
    2 711
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : mad scientist :)

    Informations forums :
    Inscription : Septembre 2019
    Messages : 2 711
    Points : 5 390
    Points
    5 390
    Par défaut
    en plus du post précédent, je reviens sur votre explication:

    j'active le système via une télécommande 4 boutons

    le récepteur a donc 4 sorties
    la 1;2 et 3 passent par une porte OU qui va me piloter un transistor d'alim du arduino et du GPS
    en meme temps a travers un 555 je génère un pulse de 2 seconde pour initialiser le point de ref

    la voie 1 ne fait que ca
    résultat le système tourne mais les entrées 4;5;6 et 7 sont en l'air donc 20Metres
    la voie 2 va attaquer 2 entrées de commande d'un 4066 (c'est un quadruple inter Cmos)
    ces 2 inter vont me mettre a la masse la pin 4 et 7 de l'arduino
    donc 74 Mètres
    la voie 3 attaque 2 autres inter du 4066 qui me met en plus de la voie 2 les pin 5 et 6 a la masse
    donc si 4;5;6 et 7 sont a la masse =100 Mètres
    la voie 4 qui ne passe pas par la porte OU me désactive le systeme

    quand pensez vous?
    - je ne comprends pas le ;2 et 3 de votre premier paragraphe mais j'entends que si vous appuyez sur le premier bouton ça active l'alimentation de l'Arduino et du GPS. Il leur faut un peu de temps pour démarrer et pour que le GPS acquiert un fix, donc il ne faut pas générer un pulse de 2 secondes (un front HIGH - LOW 2s - HIGH) immédiatement.

    ==> Si votre fonctionnement c'est d'activer automatiquement l'enregistrement du premier fix obtenu (c'est à dire qu'on n'a plus besoin du bouton pour définir le fix) on peut virer le bouton et laisser l'arduino gérer cela. L'appui sur votre télécommande allume l'arduino et le GPS. L'arduino démarre, obtient un fix GPS et s'en sert comme référence et se met en mode de surveillance tout seul. Pour changer le fix de référence il faudra éteindre et rallumer le système.

    Concernant les distances, j'ai choisi les dip switches car c'est ce que vous proposiez dans un de vos premiers posts. Si vous ne souhaitez avoir que 3 distances possibles, il nous suffit de 2 pins.

    - [en l'air / en l'air] --> 20m
    - [GND / en l'air] --> 50m ===> voie 2 de la télécommande
    - [en l'air /GND] --> 100m ===> voie 3 de la télécommande

    là encore c'est facile à changer, il suffit de modifier la fonction maxDistance() pour qu'elle décide de la distance de référence en lisant ces 2 pins.

    La voie 4 de la télécommande devrait servir à éteindre le système, ce qui a pour conséquence de le désactiver. ou est-ce que envisagez vous un mode allumé mais inactif? (à quoi ça servirait?)

  3. #23
    Futur Membre du Club
    Homme Profil pro
    Directeur technique
    Inscrit en
    Janvier 2021
    Messages
    158
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Directeur technique

    Informations forums :
    Inscription : Janvier 2021
    Messages : 158
    Points : 5
    Points
    5
    Par défaut Jay M
    Bon je vais attaquer l'animal...

    j'ai vu qu'il y avais un temps pour l'acquisition sat...
    parce que dans mon idée le systeme est off jusqu'a ce qu'on appuie sur le bouton 1;2 ou 3 de la telecommande
    le bouton 4 coupe l'alim de l'arduino et du GPS
    pour que vous compreniez mieux le concept.... tout le systeme est sans fil... et sans que ce soit invasif a l'instalation
    la telecommande est etanche, petite et design... elle est simplement collé au double face.

    pour ce qui est du temps les 2 seconde et le temps d'aquisition c'est possible dans le faire dans le code??

  4. #24
    Futur Membre du Club
    Homme Profil pro
    Directeur technique
    Inscrit en
    Janvier 2021
    Messages
    158
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Directeur technique

    Informations forums :
    Inscription : Janvier 2021
    Messages : 158
    Points : 5
    Points
    5
    Par défaut Jay M
    oui en fait j'ai mal ecris pour les voie 1;2 et 3...
    la 1 ou la 2 ou la 3 me servent a alimenter l'arduino et le GPS
    en gros je passe par une porte OU et en sortie, via un transistor de commutation j'alimente l'arduino et le Gps
    si j'appuie sur le bouton 4 (donc voie 4) qui ne passe pas par la porte, mon transistor est bloqué donc plus d'alim.

    concernant le systeme de micro DIL, ca laisse de la latitude pour les réglage
    je les remplace donc par un circuit integré 4066 (c'est un quadruple interrupteur électronique)
    resultat: voie 1, on est d'accord on met aucune pin a la masse donc 20Metres
    Voie 2 , je met 0110 ce qui me fait 56 metres
    voie 3, je met 1111 ce qui me fait 100m

    le buzzer c'est top car le mec sait que le systeme est en route
    donc la je sais pas...
    peut etre qu'on envoi un bip et que l'arduino gere l'acquisition et le point de ref?

    j'ai installé les librairies, comment je met votre code?
    et pour l'alim du GPS je me branche en 5 v sur l'arduino?
    et pour finir... je me sert pas de RX TX du GPS? je ne saisie pas le branchement et je ne voudrais pas faire de conneries...

  5. #25
    Modérateur

    Avatar de Vincent PETIT
    Homme Profil pro
    Consultant en Systèmes Embarqués
    Inscrit en
    Avril 2002
    Messages
    3 190
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Consultant en Systèmes Embarqués
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Avril 2002
    Messages : 3 190
    Points : 11 573
    Points
    11 573
    Par défaut
    Bonjour à tous
    Citation Envoyé par Stantedy
    pour ce qui est du temps les 2 seconde et le temps d'aquisition c'est possible dans le faire dans le code??
    Si j'ai bien compris ton argumentaire, oui les tempo peuvent être intégrés dans le micro qui possède des "Timer" internes un peu comme le NE555. Il n'est donc pas nécessaire de passer par de l'électronique externe.

    Je parle d'expérience aussi je recommande vivement de trouver un moyen visuel (une LED qui clignote ?) pour montrer que le micro est en attente de réception des satellites parce qu'une fois tout en place sur le terrain, on ne sait plus différentier un appareil en panne d'un appareil qui attend la communication avec le satellite.

    A+
    La science ne nous apprend rien : c'est l'expérience qui nous apprend quelque chose.
    Richard Feynman

  6. #26
    Futur Membre du Club
    Homme Profil pro
    Directeur technique
    Inscrit en
    Janvier 2021
    Messages
    158
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Directeur technique

    Informations forums :
    Inscription : Janvier 2021
    Messages : 158
    Points : 5
    Points
    5
    Par défaut jay M
    alors j'ai branché TXD (GPS) sur 3 et RXD sur 2

    quand au code je sais pas ou je le met (j'ai fait un copier)
    et apres je sais pas....
    meme pour lancer le programme je sais pas....

  7. #27
    Expert confirmé

    Homme Profil pro
    mad scientist :)
    Inscrit en
    Septembre 2019
    Messages
    2 711
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : mad scientist :)

    Informations forums :
    Inscription : Septembre 2019
    Messages : 2 711
    Points : 5 390
    Points
    5 390
    Par défaut
    OK donc le fonctionnement devient encore plus simple et est le suivant:

    * L'utilisateur choisit le bouton 1 2 ou 3 de la télécommande
    - votre montage matériel alimente l'Arduino+GPS au travers d'un transistor
    - fixe la distance en mettant 2 pins comme il faut à "GND" ou "en l'air" (20m, 50m, 100m)

    * L'utilisateur choisit le bouton 4 et ça coupe l'alimentation Arduino+GPS, tout s'éteint, on sort de supervision.

    Une fois allumé, l'Arduino attend d'obtenir un fix GPS. Le premier fix obtenu est utilisé comme point de référence. Dès le second fix obtenu l'Arduino se met à comparer la variation de position et passe une pin à LOW si la distance est supérieure au seuil déterminé.

    oui c'est simple de modifier le code pour cela, on peut même se passer de la bibliothèque SimpleBouton alors puisqu'on n'en a plus

    les connexions:

    • pin 0 et 1 : rien de branché pour le moment
    • pin 2 et 3: connexion du GPS
    • pin 4,5 les 2 pattes de réglage de distance
    • pin 9 la pin d'alerte (HIGH = OK, LOW = Alerte)
    • pin 10 la patte + du piezo


    Pour la distance le code dit que si [Pin5, Pin4] sont

    - [en l'air / en l'air] --> 20m ===> voie 1 de la télécommande
    - [en l'air / GND] --> 50m ===> voie 2 de la télécommande
    - [GND / en l'air] --> 100m ===> voie 3 de la télécommande

    (si vous mettez [GND / GND] ce sera aussi 20m)

    - Lors de l'allumage le système fait un petit beep aigu pour dire qu'il est allumé
    - Lors du premier fix le système fait un double beep pour dire qu'il est en service
    - Lors du franchissement de seuil, le système passe la pin 9 à LOW et fait un double beep grave
    - Si retour dans la zone de seuil, le système repasse la pin 9 à HIGH et fait un double beep grave/aigu

    à vous de capturer le front HIGH -> LOW de la pin d'alerte. (on pourrait faire le contraire, LOW par défaut et HIGH en cas d'alerte, il suffit d'échanger les valeurs dans le code).

    Voici le code:

    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
    // if you use an Arduino with only one Serial port, uncomment this line
    #define USE_SW_SERIAL
     
    #ifdef USE_SW_SERIAL
    #include <SoftwareSerial.h>
    const uint8_t RXPin = 2; // the arduino pin on which to receive serial data from your GPS
    const uint8_t TXPin = 3; // the arduino pin on which to transmit serial data to your GPS
    SoftwareSerial gpsSerial(RXPin, TXPin);
    #else
    #define gpsSerial Serial1   // otherwise define here which Hardware Serial Port to use
    #endif
     
    // define your GPS baud rate (9600 is the default for GPS Neo 7M)
    const uint32_t GPSBaud = 9600;
     
    // The pins setting the distance threshold
    const uint8_t pinDistance1 = 4;
    const uint8_t pinDistance2 = 5;
     
    // the pin triggering the alert. HIGH by default, turns LOW when distance is above threshold
    const uint8_t alertPin = 9;
     
    // the pin for the sound (a simple piezo) pin --- (piezo +) [piezo] (piezo -) ---- GND
    const uint8_t piezoPin = 10;
     
    // --------------------------------------------------------------
     
    #include <TinyGPS++.h>  // download from   https://github.com/mikalhart/TinyGPSPlus
    TinyGPSPlus gps;
    double recordedLatitude;
    double recordedLongitude;
     
    double HaversineDistance(const double lat1, const double long1,  const double lat2, const double long2)
    {
      double latRad1 = radians(lat1);
      double latRad2 = radians(lat2);
      double lonRad1 = radians(long1);
      double lonRad2 = radians(long2);
     
      double half_diffLa = (latRad2 - latRad1) / 2.0;
      double s_half_diffLa = sin(half_diffLa);
     
      double half_doffLo = (lonRad2 - lonRad1) / 2.0;
      double s_half_doffLo = sin(half_doffLo);
     
      double computation = asin(sqrt(s_half_diffLa * s_half_diffLa + cos(latRad1) * cos(latRad2) * s_half_doffLo * s_half_doffLo));
      return 2.0 * 6372795.0 * computation;
    }
     
    bool feedGPS()
    {
      bool gotFix = false;
      while (gpsSerial.available() > 0)
        if (gps.encode(gpsSerial.read())) {
          gotFix = true;
          break;
        }
      return gotFix;
    }
     
    uint32_t maxDistance()
    {
      uint8_t dipSwitchByte = (digitalRead(pinDistance2) << 1) | digitalRead(pinDistance1);
      switch (dipSwitchByte) {
        case 0b10: return 50;   // 50m
        case 0b01: return 100;  // 100m
      }
      return 20;   // 20m
    }
     
    void checkPosition()
    {
      static bool firstFix = true;
      static bool alert = false;
     
      if (gps.location.isValid()) {
        Serial.print(F("Position: ")); Serial.print(gps.location.lat());
        Serial.write(','); Serial.println(gps.location.lng());
     
        if (firstFix) {
          recordedLatitude  = gps.location.lat();
          recordedLongitude = gps.location.lng();
          tone(piezoPin, 1000, 200);
          delay(210);
          tone(piezoPin, 1000, 200);
          firstFix = false;
          Serial.print(F("Recorded Position = "));
          Serial.print(recordedLatitude, 6); Serial.write(','); Serial.print(recordedLongitude, 6);
          Serial.print(F("\t(Alerte @"));
          Serial.print(maxDistance()); Serial.println(F(" m)"));
        } else {
          //  we already recorded our start position
          double distance = HaversineDistance(gps.location.lat(), gps.location.lng(), recordedLatitude, recordedLongitude);
          Serial.print(F("Distance from origin: ")); Serial.print(distance); Serial.print(F(" m\t(Alerte @"));
          Serial.print(maxDistance()); Serial.println(F(" m)"));
     
          if (distance >= maxDistance()) {
            if (!alert) {
              digitalWrite(alertPin, LOW);
              alert = true;
              tone(piezoPin, 300, 100);
              delay(120);
              tone(piezoPin, 100, 100);
              Serial.print(F("alert distance = ")); Serial.println(distance);
            }
          } else {
            if (alert) {
              digitalWrite(alertPin, HIGH);
              tone(piezoPin, 300, 100);
              delay(120);
              tone(piezoPin, 600, 100);
              Serial.print(F("Distance back in range : ")); Serial.println(distance);
            }
            alert = false;
          }
        }
      }
    }
     
    void setup() {
      pinMode(pinDistance1, INPUT_PULLUP);
      pinMode(pinDistance2, INPUT_PULLUP);
      pinMode(alertPin, OUTPUT);
      pinMode(piezoPin, OUTPUT);
      digitalWrite(alertPin, HIGH); // will go low in case of Alert
      Serial.begin(115200);
      gpsSerial.begin(GPSBaud);
      tone(piezoPin, 2000, 100);
    }
     
    void loop() {
      if (feedGPS()) checkPosition();
    }
    totalement non testé of course

  8. #28
    Futur Membre du Club
    Homme Profil pro
    Directeur technique
    Inscrit en
    Janvier 2021
    Messages
    158
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Directeur technique

    Informations forums :
    Inscription : Janvier 2021
    Messages : 158
    Points : 5
    Points
    5
    Par défaut Jay M
    je sais que je suis penible...
    l'arduino est branché (voir le post precedent)
    je sais pas ou je doit mettre le code et quoi faire dans l'arduino IDE....

  9. #29
    Expert confirmé

    Homme Profil pro
    mad scientist :)
    Inscrit en
    Septembre 2019
    Messages
    2 711
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : mad scientist :)

    Informations forums :
    Inscription : Septembre 2019
    Messages : 2 711
    Points : 5 390
    Points
    5 390
    Par défaut
    lisez un tuto, il y en a plein sur internet.
    Par exemple celui là est bien fait

    il vous faut maitriser les bases sinon ça va être très difficile

  10. #30
    Futur Membre du Club
    Homme Profil pro
    Directeur technique
    Inscrit en
    Janvier 2021
    Messages
    158
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Directeur technique

    Informations forums :
    Inscription : Janvier 2021
    Messages : 158
    Points : 5
    Points
    5
    Par défaut Jay M
    concernant le cablage du GPS c'est bon?
    votre fichier code je l'enregistre en fichier texte?
    ou je le colle dans la fenetre de l'arduino ide?

  11. #31
    Futur Membre du Club
    Homme Profil pro
    Directeur technique
    Inscrit en
    Janvier 2021
    Messages
    158
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Directeur technique

    Informations forums :
    Inscription : Janvier 2021
    Messages : 158
    Points : 5
    Points
    5
    Par défaut Jay M
    ca me met des message d'erreur en rouge dans la fenetre du bas....

    oui en fait c'est bien si c'est pour aprendre mais si il faut produire vite c'est pas fait pour....Nom : Capture.PNG
Affichages : 142
Taille : 27,8 Ko

  12. #32
    Expert confirmé

    Homme Profil pro
    mad scientist :)
    Inscrit en
    Septembre 2019
    Messages
    2 711
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : mad scientist :)

    Informations forums :
    Inscription : Septembre 2019
    Messages : 2 711
    Points : 5 390
    Points
    5 390
    Par défaut
    je ne sais pas ce que vous avez fait...

    - il faut installer l'IDE
    - il faut installer la bibliothèque TinyGPSPlus. Suivez le tuto
    - il faut effectuer les branchements comme indiqués
    - il faut connecter l'Arduino sur un port série
    - vous lancez l'IDE et ouvrez un projet vierge
    - vous copiez dans cette fenêtre mon code
    - vous allez dans le menu Outils et choisissez dans le sous menu "Type de carte" Arduino Uno
    - vous allez dans le menu Outils et choisissez dans les sous menu "Port" le port série sur lequel l'Arduino est connecté

    - vous clickez sur l'icône flèche vers la droite en haut à gauche de la fenêtre pour compiler et charger le code dans votre Arduino
    - des trucs vont défiler dans la zone en dessous du code. Il y aura un peu d'orange car la bibliothèque TinyGPSPlus n'est pas super propre
    - vous devriez voir dans la barre verte entre le code et la résultat de la compilation "Téléversement terminé"
    - vous clickez sur la petite loupe en haut à droite de la fenêtre de code, ça ouvre la console série

    Nom : IDE.png
Affichages : 106
Taille : 517,3 Ko



    - Vous devriez entendre un beep car ça redémarre l'Arduino
    - vous sélectionnez dans le menu déroulant en bas à droite (à côté de 'Effacer la sortie") la valeur 115200
    - vous devriez voir défiler des trucs si le GPS fonctionne et entendre un double beep lors de la première acquisition de position

  13. #33
    Futur Membre du Club
    Homme Profil pro
    Directeur technique
    Inscrit en
    Janvier 2021
    Messages
    158
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Directeur technique

    Informations forums :
    Inscription : Janvier 2021
    Messages : 158
    Points : 5
    Points
    5
    Par défaut
    Citation Envoyé par Jay M Voir le message
    je ne sais pas ce que vous avez fait...

    - il faut installer l'IDE
    - il faut installer la bibliothèque TinyGPSPlus. Suivez le tuto
    - il faut effectuer les branchements comme indiqués
    - il faut connecter l'Arduino sur un port série
    - vous lancez l'IDE et ouvrez un projet vierge
    - vous copiez dans cette fenêtre mon code
    - vous allez dans le menu Outils et choisissez dans le sous menu "Type de carte" Arduino Uno
    - vous allez dans le menu Outils et choisissez dans les sous menu "Port" le port série sur lequel l'Arduino est connecté

    - vous clickez sur l'icône flèche vers la droite en haut à gauche de la fenêtre pour compiler et charger le code dans votre Arduino
    - des trucs vont défiler dans la zone en dessous du code. Il y aura un peu d'orange car la bibliothèque TinyGPSPlus n'est pas super propre
    - vous devriez voir dans la barre verte entre le code et la résultat de la compilation "Téléversement terminé"

    - vous clickez sur la petite loupe en haut à droite de la fenêtre de code, ça ouvre la console série
    - Vous devriez entendre un beep car ça redémarre l'Arduino
    - vous sélectionnez dans le menu déroulant en bas à droite (à côté de 'Effacer la sortie") la valeur 115200
    - vous devriez voir défiler des trucs si le GPS fonctionne et entendre un double beep lors de la première acquisition de position

    J'ai bien suivi la procedure, j'ai un message d'erreur je vous met une capture d'écran...
    Images attachées Images attachées  

  14. #34
    Expert confirmé

    Homme Profil pro
    mad scientist :)
    Inscrit en
    Septembre 2019
    Messages
    2 711
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : mad scientist :)

    Informations forums :
    Inscription : Septembre 2019
    Messages : 2 711
    Points : 5 390
    Points
    5 390
    Par défaut
    il faut virer le code par défaut qui est dans la fenêtre qui s'ouvre - un truc du genre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    void setup() {
      // put your setup code here, to run once:
     
    }
     
    void loop() {
      // put your main code here, to run repeatedly:
     
    }
    et remplacer cela par mon code. il faut vraiment que la fenêtre soit toute vide avant de coller dedans mon code

  15. #35
    Futur Membre du Club
    Homme Profil pro
    Directeur technique
    Inscrit en
    Janvier 2021
    Messages
    158
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Directeur technique

    Informations forums :
    Inscription : Janvier 2021
    Messages : 158
    Points : 5
    Points
    5
    Par défaut
    J'ai effectué fichier nouveau, j'ai effacé le code par défaut, j'ai inséré votre code, et en retour j'ai ce message (capture écran)

    Nom : Capture2.PNG
Affichages : 107
Taille : 30,3 Ko

  16. #36
    Modérateur

    Avatar de Vincent PETIT
    Homme Profil pro
    Consultant en Systèmes Embarqués
    Inscrit en
    Avril 2002
    Messages
    3 190
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Consultant en Systèmes Embarqués
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Avril 2002
    Messages : 3 190
    Points : 11 573
    Points
    11 573
    Par défaut
    Retire cette phrase #define USE_SW_SERIAL tout en bas du programme, Jay l'a déjà placé en haut de son code, ne laisse que l'accolade

    C'est un reste de copier/coller précédent.
    La science ne nous apprend rien : c'est l'expérience qui nous apprend quelque chose.
    Richard Feynman

  17. #37
    Futur Membre du Club
    Homme Profil pro
    Directeur technique
    Inscrit en
    Janvier 2021
    Messages
    158
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Directeur technique

    Informations forums :
    Inscription : Janvier 2021
    Messages : 158
    Points : 5
    Points
    5
    Par défaut Vincent
    Merci Vincent
    je vais essayé... mais je t'avoue que arduino me semble super complexe...
    si un client me prend 10 GPS je me vois mal galeré 1 semaine pour programmé un truc a 10 euro...
    ou alors il faut que je paye quelqu’un pour me les programmer a l'avance....

  18. #38
    Expert confirmé

    Homme Profil pro
    mad scientist :)
    Inscrit en
    Septembre 2019
    Messages
    2 711
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : mad scientist :)

    Informations forums :
    Inscription : Septembre 2019
    Messages : 2 711
    Points : 5 390
    Points
    5 390
    Par défaut
    téléchargez le .zip ci joint, décompressez le, allez dans le répertoire et faites un double click sur le fichier GPSAlarm.ino

    pour préparer 10 arduino vous les connectez à tour de rôle une fois à votre PC et cliquez le bouton de téléchargement.... Une fois le cod chargé, c'est bon....
    ce n'est pas insurmontable à mon avis.
    Fichiers attachés Fichiers attachés

  19. #39
    Futur Membre du Club
    Homme Profil pro
    Directeur technique
    Inscrit en
    Janvier 2021
    Messages
    158
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Directeur technique

    Informations forums :
    Inscription : Janvier 2021
    Messages : 158
    Points : 5
    Points
    5
    Par défaut Jay M
    Donc

    on a fait beeper le systeme...
    la config est avec le poussoir mais il ne sert plus a rien comme on a dit c'est bien ca?

    les dip switch sont tous ouvert (donc 20 Metres)

    j'ai un beep a la mise en route
    je fait une vingtaine de metre et j'ai un bip aigu et grave a la suite ...
    je continu a m'eloigner puis je reviens sur mes pas et quand je rentre a peux pres dans la zone ca rebeep ...

    3 choses me preocupe...
    j'ai cablé le GPS TXD et RXD vers l'arduino comme convenu mais le TXD va en 3 ou en 2 ou cela n'a pas d'importance?
    peux on voir a l'ecran si le systeme travail car j'ai ouvert le moniteur serie mais j'ai un ecran blanc...
    et comment je fait avec l'arduino nano, pareil? meme cablage?

  20. #40
    Expert confirmé

    Homme Profil pro
    mad scientist :)
    Inscrit en
    Septembre 2019
    Messages
    2 711
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : mad scientist :)

    Informations forums :
    Inscription : Septembre 2019
    Messages : 2 711
    Points : 5 390
    Points
    5 390
    Par défaut
    oui dans ce code il n'y a pas de bouton, dès que l'arduino s'allume il attend un fix GPS et l'utilise comme référence

    comme expliqué:

    - un beep quand l'arduino boot
    - un double beep quand il a son premier fix GPS qui sert de référence
    - un double beep grave quand il sort de sa zone
    - un double beep différent quand vous revenez dans la zone

    peut on voir a l'ecran si le systeme travaille car j'ai ouvert le moniteur série mais j'ai un ecran blanc...
    Dans la console série normalement de l'info va défiler, mais il faut qu'elle soit réglée à 115200 bauds et que vous ayez bien sûr choisi le port série sur lequel l'Arduino est connecté
    Nom : serie.png
Affichages : 126
Taille : 104,7 Ko

    l'ouverture de la console Arduino reboot l'arduino donc c'est normal si vous entendez un beep et que ça recommence

    --------------------------------------------
    j'ai cablé le GPS TXD et RXD vers l'arduino comme convenu mais le TXD va en 3 ou en 2 ou cela n'a pas d'importance?
    si c'est important ! Tx du GPS vers pin 2 de l'arduino et Rx du GPS vers pin 3 de l'Arduino

    --------------------------------------------
    et comment je fais avec l'arduino nano, pareil? meme cablage?
    Oui tout pareil ce sont les mêmes pins. Pour télécharger le code il faut juste choisir dans le menu Arduino Nano au lieu de Uno

Discussions similaires

  1. Projet Arduino avec GPS Neo 7M
    Par Stantedy dans le forum Embarqué
    Réponses: 7
    Dernier message: 20/01/2021, 15h34
  2. probleme avec mon projet arduino test de satisfaction
    Par julien77320 dans le forum Arduino
    Réponses: 8
    Dernier message: 20/08/2019, 21h35
  3. Projet Web sur tablette avec GPS
    Par splifferwolf dans le forum Autres systèmes
    Réponses: 0
    Dernier message: 28/09/2015, 11h36
  4. comment structurer une modél. UML - projet J2EE avec pattern
    Par RocketArena dans le forum Architecture
    Réponses: 18
    Dernier message: 20/07/2007, 19h20
  5. projet .war avec Eclipse
    Par CapToMatteo dans le forum Eclipse Java
    Réponses: 6
    Dernier message: 20/04/2004, 14h38

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