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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Directeur technique
    Inscrit en
    Janvier 2021
    Messages
    159
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Directeur technique

    Informations forums :
    Inscription : Janvier 2021
    Messages : 159
    Par défaut Projet Arduino avec GPS Neo 7M
    Tout d'abord Bonjour a tous,

    je suis en cours de développement d'un projet commercial,
    je cherche quelqu'un qui pourrais m'aider a développer un système GPS ...
    en fait j'ai besoin d'un signal TTL en sortie d'un module avec un GPS qui selon "un perimetre défini " en cas de dépassement de ce dernier ma sortie passe du niveau Haut au niveau bas ou inversement.
    Ex: si par rapport a la position inisialisé par un poussoir (point de ref) le GPS sort d'un perimetre de 100 metres de rayon, ma sortie passe d'un etat a un autre.

    Merci d'avance

    Philippe

  2. #2
    Expert confirmé

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

    Informations professionnelles :
    Activité : mad scientist :)

    Informations forums :
    Inscription : Septembre 2019
    Messages : 2 908
    Par défaut
    Quel Arduino envisagez vous pour ce projet ? comment allez vous gérer l'envoi de SMS?
    Vous parlez de l'existence d'une alarme qui envoie un texto. Est-ce avec un Arduino? pouvez vous réutiliser le même système et greffer le GPS dessus?

    ----
    Dans le cadre d'un projet à objectif "sauver la planète", J'ai donné un coup de main au code qui utilisait des cartes SIMCom SIM7000E. Elles offrent l'avantage d'intégrer la communication réseau pour l'IoT (LTE CAT-M1(eMTC) et NB-IoT) et un GPS assez précis sur la même puce. En l'accrochant à un Arduino Micro ça permet de faire un produit assez petit et bien intégré, peu consommateur de courant si on gère des phases de "sleep". On peut ensuite se connecter à internet à travers le LTE pour envoyer de l'information. Le GPS est relativement stable, si on ne bouge pas, on reçoit globalement la même valeur (en le laissant au repos sur ma table dans mon bureau, même pas sous une fenêtre, il captait bien les satellites et "bouge" de moins de 4m). ça devrait le faire pour détecter donc un vrai mouvement de 20, 50 ou 100m par rapport à une position d'origine.

    L'inconvénient c'est qu'il est difficile (impossible ?) de trouver des cartes SIM de ce type en tant que particulier. Il faut être une entreprise, donc pas pour nous les "bricoleurs du dimanche".

  3. #3
    Expert confirmé

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

    Informations professionnelles :
    Activité : mad scientist :)

    Informations forums :
    Inscription : Septembre 2019
    Messages : 2 908
    Par défaut
    je ne comprend pas l'utilisation....
    Le module GPS que vous avez communique par liaison série.

    Si on ne fait rien, par défaut dès qu'on le branche il émet sur sa pin Tx à 9600 bauds des trames dites "NMEA" qui ressemblent à cela

    $GPRMC,045103.000,A,3014.1984,N,09749.2872,W,0.67,161.46,030913,,,A*7C\r\n
    $GPGGA,045104.000,3014.1985,N,09749.2873,W,1,09,1.2,211.6,M,-22.5,M,,0000*62\r\n
    $GPRMC,045200.000,A,3014.3820,N,09748.9514,W,36.88,65.02,030913,,,A*77\r\n
    ...
    le GPRMC ou GPGGA que vous avez au début définit le type de la trame.

    Le module émet 5 trames différentes toutes les secondes (GGA, GSA, GSV, RMC, VTG)

    La trame très courante pour les bateaux est la GPRMC (Recommended Minimum Navigation Information), qui donne l'heure, la latitude, la longitude, la date, ainsi que la vitesse et la route sur le fond mais pas l'altitude (puisque par définition le bateau est sans doute au niveau de la mer - sauf sur les lacs bien sûr)

    Tel que codé, j'écoute et je traite toutes les trames sortantes. ça prend du temps et de l'énergie pour rien puisque plusieurs informations sont répétées dans les différentes trames.

    On pourrait configurer le module GPS pour lui dire que l'on ne veut QUE les trames GPRMC puisque ça nous suffit dans le cas d'usage. Pour configurer le module, c'est là qu'on utilise l'autre partie de la liaison série: on envoie sur la pin Rx, à 9600 bauds des commandes.

    Pour ce faire, soit on configure le module avant de le mettre dans le système, il y a u-center, un soft pour PC pour cela, soit on profite de l'arduino pour envoyer des commandes de configuration quand l'Arduino démarre.

    ==> c'est dans ce dernier cadre que la liaison Arduino --> Rx(GPS) pourrait servir à quelque chose.

    Concernant l'adaptation de tension: le composant qui fait le GPS est en 3.3V. les pin Tx et Rx émettent et reçoivent des '1' en envoyant/recevant 3.3V.

    Votre Arduino lui est un système qui fonctionne sous 5V (Une pin à '1' est à 5V).

    Quand le GPS émet depuis son Tx un '1', la pin Arduino reçoit donc 3.3V. Ce n'est pas 5V mais c'est suffisant pour être reconnu comme un 1 par l'arduino, c'est pour cela que la communication du GPS -> Arduino fonctionne.

    Par contre si votre Arduino envoie un '1' à la pin Rx(GPS), on va balancer 5V vers un module qui ne supporte que 3.3V... ça risque de griller la pin, voire le module (sauf si le module fait l'adaptation).

    ----

    Au final, si ça vous va comme cela, même si on traite plus d'information que nécessaire, pas besoin de relier la pin D3(nano) au Rx(GPS) - comme cela pas besoin non plus de rajouter un étage d'adaptation de tension. (et donc pas besoin de router les 3.3V non plus sur la carte, sauf pour usage ultérieur)

    Je ne vois pas le routage vers Vin sur votre carte.

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

    Informations professionnelles :
    Activité : Directeur technique

    Informations forums :
    Inscription : Janvier 2021
    Messages : 159
    Par défaut Jay M
    Jay M est pointu....
    NMEA je connais bien par contre (tout le matos de Nav est en NMEA 2000

    il n'y a pas de routage sur le Vin...
    je coupe le GND via un NPN de mon enfance ... un pepere qui marche le feu... 2N2222!

    mais bon, le directeur technique qui me fait les PCB ... ma persuadé de faire ces cartes en double couche et CMS...
    mais comme j'aime bien savoir ci sa tourne rond... UV, perchlorure perçage... et apres on produit...

    Ah oui petite reflection..: je vois que Jay M ne quitte pas ce qui le branche un Dimanche...

    PS: si tu a des idées tu peux ...

    bon pour la voix..

    je t'explique... (ah pardon je tutoie! réflexe de méditerranéen...)

    les mec sur de petit bateau... 10;15 voir 18 metres sorte en mer avec maman....
    mais quand il rentre au port, pour un peu que du Rosé est egaillé la journée ... pour amarer c'est plus pareil...

    donc radar de recul... j'ai des capteur ultra son "Sick" qui detecte a 8 m
    le bidule sort du 0-10 v ou du 0-5mA

    l'idée c'est d'annoncer (par haut parleur ) la distance par palier d'1 metre...
    pour les "2 metres, Stop" c'est une distance qui permet de ne pas toucher le quai, et qui est suffisamment proche pour la passerelle hydraulique (je parle encore une fois de petit bateau max 25M)

    mon obsession c'est "petit, autonome, et non invasif! pas de trou pas de fil...

  5. #5
    Expert confirmé

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

    Informations professionnelles :
    Activité : mad scientist :)

    Informations forums :
    Inscription : Septembre 2019
    Messages : 2 908
    Par défaut
    PETIT RAJOUT:

    j'ai vu que vous aviez commandé des Arduino Uno. ce n'est pas le materiel le plus intégré.

    Ils n'ont qu'un seul port Série matériel et le GPS NEO-7M communiquant en Série, il faudra utiliser soit SoftwareSerial, soit se passer du moniteur série pour débuguer et si vous voulez rajouter un Module de communication par SMS type SIM800 ou SIM900, ça va compliquer les choses, il faudra sans doute encore un port série supplémentaire

    Une Arduino Mega (ou MEGA mini si la place est un souci) offre 4 ports séries matériels ce qui devrait grandement simplifier le développement

    ---
    EDIT:

    OK... je devrais tout lire en détail avant d'écrire...


    j'ai vu que vous dites "1 sortie qui me donne un niveau bas si possible ou haut" donc je suppose que vous allez interfacer cela avec votre système existant et donc on peut supposer qu'il n'y a pas à se soucier de l'envoi du SMS?

    Dans ce cas une fois le développement stabilisé, vous pourriez prendre un Arduino Nano ou Micro et utiliser le port Série matériel pour le GPS.

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

    Informations professionnelles :
    Activité : Directeur technique

    Informations forums :
    Inscription : Janvier 2021
    Messages : 159
    Par défaut Jay M
    Bonjour Jay M.

    toutes la partie SMS est complete et fonctionne depuis 1 an..
    a tel point que j'offre 1 an de com a mes clients...(sms et data)
    oui le GPS vient ce greffer sur le systeme existant (c'est une option)
    concernant le materiel (sachant que je n'y connais rien en arduino et autre ... j'ai suivi un peu la faune des forum qui travail beaucoup sur arduino...
    moi ce que je cherche c'est ce que j'ai décri....
    tans que le truc est precis a 5 ou 6 metre....

  7. #7
    Expert confirmé

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

    Informations professionnelles :
    Activité : mad scientist :)

    Informations forums :
    Inscription : Septembre 2019
    Messages : 2 908
    Par défaut
    j'en ai aussi plein les tiroirs des 2N2222

    donc radar de recul... j'ai des capteur ultra son "Sick" qui detecte a 8 m
    le bidule sort du 0-10 v ou du 0-5mA

    l'idée c'est d'annoncer (par haut parleur ) la distance par palier d'1 metre...
    pour les "2 metres, Stop" c'est une distance qui permet de ne pas toucher le quai, et qui est suffisamment proche pour la passerelle hydraulique (je parle encore une fois de petit bateau max 25M)

    mon obsession c'est "petit, autonome, et non invasif! pas de trou pas de fil...
    OK - l'Arduino ne saura pas lire du 0-10V mais avec une petite adaptation de tension (pont diviseur ou autre dont nous avons déjà parlé) vous pouvez ramener cela à 0-5V. L'arduino dispose d'un ADC qui saura alors traiter cela.

    ==> On peut donc considérer que c'est simple de lire la distance fourni par le Sick.

    Ensuite il faut faire la sortie audio. Si vous avez un Arduino Nano dédié à ce petit boîtier, ce projet propose les chiffres de 0 à 9 en anglais généré en audio (mono, 8KHz) en utilisant cette bibliothèque PCM. La sortie audio s'effectue sur la pin 11 de l'Arduino sous forme de modulation 0/5V.

    Sinon il y a l'option de jouer des fichiers MP3 avec un DFPlayer Mini MP3 Player. Vous enregistrez des fichiers audio au format MP3 (des fichiers qui disent 8 m, 7 m, .... Attention, Stop) que vous numérotez et stockez sur une petite carte SD et l'arduino va jouer un fichier donné en fonction de la distance lue.

    Dans les 2 cas le volume de sortie est assez faible donc il faut bricoler un étage d'amplification pour sortir sur un haut parleur digne de ce nom


    ----
    PS/ pour le tu, c'est OK, en anglais on n'a que le YOU... J'ai juste appris le français avec le "vous" quand on connait pas son interlocuteur et à mon âge, même avec les pratiques des réseaux sociaux, ça ne vient pas tout seul - mais je n'ai pas de souci avec le tu

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

    Informations professionnelles :
    Activité : Directeur technique

    Informations forums :
    Inscription : Janvier 2021
    Messages : 159
    Par défaut Jay M
    j'ai du mal a suivre... tu a quel age?


    oui pour le diviseur..
    l'etage Bf c'est facile... un TDA a la con.. un hp water proof genre 10W et hip hop

    l'arduino Nano a du mal a discuter avec mon ordi un peu comme le premier... par contre avec l'ordi de mon fils ca roule apparement

    ma porte ou est instable...

  9. #9
    Expert confirmé

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

    Informations professionnelles :
    Activité : mad scientist :)

    Informations forums :
    Inscription : Septembre 2019
    Messages : 2 908
    Par défaut
    Citation Envoyé par Stantedy Voir le message
    j'ai du mal a suivre... tu as quel age?
    hint: J'ai été vacciné contre le COVID la semaine dernière et je ne suis pas un professionnel de santé ni jugé à haut risque

    l'arduino Nano a du mal a discuter avec mon ordi un peu comme le premier.
    vous avez un anti-virus?

  10. #10
    Expert confirmé

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

    Informations professionnelles :
    Activité : mad scientist :)

    Informations forums :
    Inscription : Septembre 2019
    Messages : 2 908
    Par défaut
    OK dans ce cas ce n'est pas très compliqué à écrire un premier jet, en utilisant des bibliothèques existantes. Il conviendra de rendre tout cela robuste

    Attention je n'ai pas vérifié les conditions de licences, certaines sont dites contaminantes (par exemple en LGPL v3, si vous utilisez une de ces bibliothèques vous pourrez avoir à mettre l'intégralité du code de votre produit en open source)

    le câblage:

    - un module Dip Switch x 4, connectés sur les pins 4, 5, 6, 7
    - un bouton momentané connecté sur la pin 8
    ==> La connexion des ces éléments se fait : pin Arduino --- bouton --- GND

    Votre Module GPS doit être alimenté, et son GND connecté au GND de l'Arduino.
    La pin Tx du GPS doit être connecté à la pin 4 de l'Arduino (EDIT: erreur car conflit avec le dip switch, voir le code dans le post plus récent)
    La pin Rx du GPS doit être connecté à la pin 3 de l'Arduino

    - la pin d'alerte est sur 8. HIGH par défaut, elle passe à LOW.

    -------------------------

    Voici un bout de code, absolument non testé car je n'ai pas ce GPS sous la main ni envie d'aller courir dehors pour voir si ça fonctionne car il fait nuit, il pleut et il fait froid

    Ça compile cependant et ce n'est pas trop compliqué à lire donc il y a des chances que ça tombe en marche

    il y'a deux bibliothèques non standard à installer:

    SimpleBouton Library : http://forum.arduino.cc/index.php?topic=375232.0
    TinyGPS++ library : https://github.com/mikalhart/TinyGPSPlus


    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
    // 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 = 4; // 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---But---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;
     
    // --------------------------------------------------------------
     
    #include <simpleBouton.h>
    simpleBouton boutonPosition(recordPositionPin);
     
    #include <TinyGPS++.h>
    TinyGPSPlus gps;
     
    double recordedLatitude;
    double recordedLongitude;
    bool   recordedPosition = false;
     
     
    // The haversine formula determines the great-circle distance between two points on a sphere given their longitudes and latitudes
    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; // in m, approximates earth to a sphere with radius is 6372795m
    }
     
    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);
        } 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;
              Serial.print(F("alert distance = ")); Serial.println(distance);
            }
          } else {
            if (alert) {
              Serial.print(F("Distance back in range : "));
              Serial.println(distance);
              digitalWrite(alertPin, HIGH);
            }
            alert = false;
          }
        }
      }
    }
     
    void setup() {
      for (auto& p : dipSwitchPins) pinMode(p, INPUT_PULLUP);
      pinMode(alertPin, OUTPUT);
      digitalWrite(alertPin, HIGH); // will go low in case of Alert
      Serial.begin(115200);
      gpsSerial.begin(GPSBaud);
    }
     
    void loop() {
      checkUserAction();
      if (feedGPS()) checkPosition();
    }
    Le fonctionnement est simple:

    - compilez et chargez le code dans votre Arduino

    - vous allumez le système. Pour tester, conservez la console Série ouverte à 115200 bauds sur votre PC, il y aura des affichages.

    - vous réglez les dip switches sous forme "binaire", une valeur entre 0 et 15. La distance de déclenchement retenue est le résultat de la formule 20 + 6 x valeur. Par exemple si vous mettez tous les switches sur 0000, la valeur est 0 et donc le déclenchement se fait si vous dépassez 20m. Si vous mettez les switches à 1011 (11 en décimal) la distance sera 20 + 6x11 = 86m. Si tous les switches sont actifs, la valeur est 15 et donc la distance 100m. La formule est facilement modifiable dans le code (fonction maxDistance()). On peut changer les Dip Switches quand on veut, ça modifiera la distance utilisée directement.

    - vous appuyez sur le bouton pendant au moins 2 secondes pour enregistrer la dernière position connue du GPS comme référence

    voilà c'est en route, la pin d'alerte passe à LOW en cas de dépassement de la distance et revient à HIGH si vous retournez à la bonne position (ou enregistrez une nouvelle position de référence)

    Des affichages s'effectuent à chaque nouvelle position obtenue par le GPS.

    évolutions sans doute nécessaires:
    - un voyant pour confirmer que le GPS obtient des coordonnées (éventuellement utiliser la LED intégrée LED_BUILTIN)
    - un beep (piezo) pour confirmer la bonne prise en compte de la position de référence?
    - une alerte sonore en même temps que la notification?
    - éliminer toute la connexion sur Serial pour la dédier au GPS
    - consommation électrique? est-ce un problème, faut-il améliorer le fonctionnement?
    - envoyer une alerte en cas de perte du signal GPS pendant trop longtemps?

    Je vous laisse essayer

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

    Informations professionnelles :
    Activité : Directeur technique

    Informations forums :
    Inscription : Janvier 2021
    Messages : 159
    Par défaut Jay M
    Oh Pu...n!

    c'est extra mega super top!

    j'essaie ca tout a l'heure!!!

    si c'est ok... peux on utiliser des arduino plus petit? genre nano ou micro?

    conso... on s'en fou

    le buzer j'y ai pensé...

    la perte de Gps en bord de mer trés peu de chance

    je vais peux etre avoir besoin de vous pour la Prog car je n'ai jamais fais ca...
    franchement Felicitation!!!

  12. #12
    Membre confirmé
    Homme Profil pro
    Directeur technique
    Inscrit en
    Janvier 2021
    Messages
    159
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Directeur technique

    Informations forums :
    Inscription : Janvier 2021
    Messages : 159
    Par défaut Jay M
    Re.... (pas beaucoup dormi...)

    pour etre sur qu'on parle bien le meme langage....

    les DIP switch sur 0 il sont ouvert ok?

    Si Pin 4;5;6 et 7 en l'air =20 Metres
    Si Pin 4 et 7 a la masse = 74 Metres
    Si pin 4;5;6 et 7 a la masse=100 Metres

    juste?

    coté électronique:

    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?

    si il est possible de mettre un buzzer qui indique l'activation du systeme ce serais super top

    j'ai telechargé Arduino IDE ainsi que les 2 librairies mais je ne sait pas comment on fait pour les instaler dans le soft arduino....

    est ce que le code est le meme pour un arduino nano ( je suis assez seduit par la petitesse ..)

    merci encore mille fois pour votre aide et votre reactivité....

  13. #13
    Expert confirmé

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

    Informations professionnelles :
    Activité : mad scientist :)

    Informations forums :
    Inscription : Septembre 2019
    Messages : 2 908
    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();
    }

  14. #14
    Membre confirmé
    Homme Profil pro
    Directeur technique
    Inscrit en
    Janvier 2021
    Messages
    159
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Directeur technique

    Informations forums :
    Inscription : Janvier 2021
    Messages : 159
    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??

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

    Informations professionnelles :
    Activité : Directeur technique

    Informations forums :
    Inscription : Janvier 2021
    Messages : 159
    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...

  16. #16
    Membre confirmé
    Homme Profil pro
    Directeur technique
    Inscrit en
    Janvier 2021
    Messages
    159
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Directeur technique

    Informations forums :
    Inscription : Janvier 2021
    Messages : 159
    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....

  17. #17
    Expert confirmé

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

    Informations professionnelles :
    Activité : mad scientist :)

    Informations forums :
    Inscription : Septembre 2019
    Messages : 2 908
    Par défaut
    Plus la tension d’entrée sera élevée plus le régulateur va souffrir..

    un régulateur linéaire est bcp plus efficace

    Je recommande la lecture de ce blog, vous aurez tous les éléments à prendre en compte en fonction des besoins

    Deux articles

    https://riton-duino.blogspot.com/202...ation.html?m=1

    https://riton-duino.blogspot.com/201...s-ldo.html?m=1

  18. #18
    Expert confirmé

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

    Informations professionnelles :
    Activité : mad scientist :)

    Informations forums :
    Inscription : Septembre 2019
    Messages : 2 908
    Par défaut
    Non pas indiscret - j’ai quitté le monde du travail il y a un bon moment maintenant mais impliqué dans de nombreuses activités

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

    Informations professionnelles :
    Activité : Directeur technique

    Informations forums :
    Inscription : Janvier 2021
    Messages : 159
    Par défaut Jay M
    Bonjour Jay

    plein de test....
    super ton code !

    juste besoin de ton experience...
    niveau alim sur le Vin du Nano si je rentre du 12 v on est limite d'aprés le datasheets...

    je jongle un peu niveau alim...

    je rentre soit du 12 ou du 24 (qui monte a 28;29v quand on a un chargeur ou les alternateurs moteurs..
    je doit sortir 5v pour le petit recepteur 433Mhz.
    puis l'alim arduino (qui va me sortir une alim 3.3v pour mon tx 2.4Ghz (bon ca c'est peinard 20mA) les 5 v pour le GPS


    mon idée (pour la place sur le PCB) un 7812 en entrée (alim Cmos et Arduino et un petit 78L05 derrière pour mon 433Mhz
    tu en pense quoi...?

  20. #20
    Modérateur

    Avatar de Vincent PETIT
    Homme Profil pro
    Consultant en Systèmes Embarqués
    Inscrit en
    Avril 2002
    Messages
    3 252
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    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 252
    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+

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