Tutoriels

[Projet] Arduino : Créer son propre compteur GPS

Vous avez toujours aimé bidouiller, toucher à tout ? Alors cet article est fait pour vous !

Je vais vous montrer et vous expliquer brièvement comment créer votre compteur GPS a un prix assez bas. Prenez bien en compte que cela n’a pas était fait par un professionnel, des améliorations dans le code ou dans le montage sont certainement possible, mais le tout fonctionne comme ça. Libre à vous d’améliorer et d’optimiser le tout!

I) Les composants

L’avantage d’Arduino c’est qu’il est possible de vous procurer un grand nombre de composants à un prix très bas (par contre il ne faut pas être pressé pour la livraison). Il est également possible d’acheter des cartes non officielles mais fonctionnant parfaitement bien du fait que Arduino est Open-Source, donc tout le monde peut créer sa carte.

Voici donc la liste des composants utilisés pour ce projet, ainsi que les liens d’achats (libres à vous de modifier certains composants pour avoir exactement ce que vous voulez) :

  • Une Arduino Pro Micro : Ebay –> Très utile car la taille est très réduite. Cependant si vous comptez rajouter des composants, optez pour une carte plus grande avec un plus grand nombre de pins. L’utilisation d’une Arduino Uno ou Mega 2560 est tout à fait possible également.
  • Puce GPS : GY-GPS6MV GPS AMP2.5 –> Un GPS avec antenne intégré pour un prix assez raisonnable. Pour les fans de marque, il y a la puce Adafruit qui est légèrement plus chère. Pour ce projet, j’utiliserai la librairie TinyGPS++ qui propose de nombreuses options pour gérer le GPS.
  • Une breadboard (platine d’essais): eud.dx.com –> Pour les phases de test il est utile de prendre une grande breadboard afin d’avoir de la place pour faire vos connexions. Au final une breadboard plus petite sera utilisée : ebay.fr
  • Capteur température étanche : DS18B20 –> Un capteur facile d’utilisation, peu chère et assez performant pour notre projet.
  • Ecran OLED : 0.96″ 128×64 I2C –> L’écran sera surement petit pour certains d’entre vous, n’hésitez pas à en changer.
  • Des fils : male-femelle ou male-male –> C’est incontournable afin de réaliser vos branchements.

Ensuite il vous faut télécharger l’IDE Arduino sur le site officiel. Branchez votre Arduino, sélectionner votre carte et votre port série dans l’onglet « outils ».

Sans titre

II) Brèves explications

Le GPS :

Le GPS fonctionne à 9600 bauds et envoie une trame du type NMEA qui ressemble à ce qui suit :

$GPRMC,194509.000,A,4042.6142,N,07400.4168,W,2.03,221.11,160412,,,A*77

  • Temps
  • Date
  • Longitude
  • Latitude
  • Altitude
  • Vitesse estimée
  • Type de fix (en fonction de nombre de satellites)

Ne vous inquiétez pas si vous ne comprenez pas le fonctionnement précis de cette trame, car la librairie TinyGPS++ va s’occuper pour nous de nous traduire tout ce charabia en donnée exploitable et compréhensible. Si vous voulez plus d’informations sur l’analyse de la trame, c’est par ici !

L’écran OLED I2C :

L’avantage des écrans I2C c’est l’utilisation réduite de pins d’affichage, seulement 2 (sans compter VCC et GND), c’est considérablement réduit comparer à un écran LCD. Son fonctionnement est plutôt simple, téléchargez la librairie Adafruit et amusez vous ! Pour l’affichage de texte à l’écran, la commande est la suivante :

display.print(« Hello World »);

Capteur de température :

Le DS18B20 est un classique dans le monde du DIY (Do It Yourself) car son utilisation est très facile et sa plage d’utilisation assez intéressante (de -55°C a +125°C). La librairie OneWire est disponible sur le site Arduino.

Dans notre montage final ce sera le seul composant nécessitant une résistance de 4.7 Kohms entre la pin de data et celle de VCC (alimentation, 5V en l’occurrence).

III) Montage des composants

Ce que je vais vous dire est logique, mais mieux vaut le dire !

Tous les composants utilisés auront besoin d’être connecté au 5V (ou 3.3V) et au GND (la terre) pour fonctionner. Voilà ce qui a de commun à chaque composant, passons maintenant aux spécificités de chacun.

Le GPS :

Le GPS utilise 4 pins, les 2 VCC et GND et ensuite TX et RX. Ces deux dernières sont respectivement le signal de transmission et celui de réception. Dans notre cas seulement le TX nous intéresse. Pour que votre Arduino puisse recevoir les données, vous devez brancher le TX sur du RX. Sur une Arduino Mega (comme sur la photo ci dessous) il y a déjà des pins RX1-TX1, RX2-TX2 et RX3-TX3. Sur l’Arduino Uno (celle que j’utilise actuellement dans le projet « final) j’utilise la pin 6 en tant que RX.

20150209_213043

L’écran OLED I2C :

Pour l’écran, c’est également 4 pins. Les deux spécifiques sont SDA et SCL qui correspondent au signal de données et au signal d’horloge. Elles seront branchées sur les pins 8 et 9.

20150209_212921

Capteur de température :

Notre DS18B20 utilise seulement 3 pins. La pin de donnée utilisée dans notre cas sera la numéro 10. Pour vous y retrouvez, le fil noir est celui pour GND, le rouge pour VCC et le jaune (ou bleu ou autres cela dépend) pour les DATA.

DS18S20-hookup-400x237

Comme vous aurez pu le remarquer, il est difficile de connecter les différents composants sur la même carte en même temps. Effectivement, et c’est pour cela que nous allons utiliser une breadboard afin de déporter les connexions de la carte.

20150209_213127

Et voici un schéma de son fonctionnement avec des codes couleurs :

breadboard2

Voilà un des premiers jets avec tous les composants branchés :

20150201_164101

Je vous mets ensuite quelques photos du montage plus ou moins final, avec une Arduino Uno, une boîte de dérivation et une breadboard plus petite :

20150209_213333
20150209_213449

 
10959842_10206295389609560_4150929585075539013_n

IV) Sketch Arduino

Voilà maintenant le plus intéressant, le sketch (ou code) Arduino !

Avant de vous le donner, voici une liste des fonctionnalités :

  • Compteur de vitesse
  • Affichage de l’heure avec le module RTC du GPS
  • Température extérieure
  • Vitesse moyenne
  • Vitesse maximale

Vous retrouverez le lien sur Dropbox. J’ai commenté un maximum le code, mais n’hésitez pas à laisser un commentaire si vous avez besoin d’aide. Et bon bidouillage !

Photo de Nathan

Nathan

Rédacteur (Spécialiste Smartphone). Développeur de 28 ans, passionné des nouvelles technologies et de tests en tout genre. Développeur PHP & Python.

Articles similaires

52 commentaires

  1. Bonjour, totalement novice dans le domaine de l Arduino, j ai trouve votre realisation extraordinaire et presque ce que je cherchai , c est a dire un GPS mais marine.
    pour le materiel j ai commande , mais je ne sais quand je vais le recevoir !!!!!!!!
    une carte Arduino Nano (tres petite) avec cable USB
    un ecran afficheur oled SH1106
    un GPS neo 6m avec petite antenne
    un convertisseur 12V (batterie bateau) en 5 V
    un bouton poussoir pour changer les differents affichages
    Par contre , je souhaiterai que la vitesse soit en KNT(vitesse en noeuds), le cap (en degre)la position,la vitesse maxi depuis la mise en service, la moyenne , la distance parcourue, l heure t la date;
    Pouvez vous me dire si cela est possible ?avec ce materiel? Les modifications dans le sketch seront elles importantes et faciles a faire pour un Super debutant?
    Je pense installer l ensemble dans une boite electrique etanche avec decoupege de la partie ecran
    je vous remercie beaucoup pour votre aide et vos conseils

  2. bonjour Nathan ,je me présente je m’appelle Jerome je travail dans un lycée en tant que technicien audiovisuel …j’ai refait tout ton montage de GPS ,je suis débutant en Arduino..j’ai remplacé l’écran par un oled 0.96″ et j’ai inclus toute les bibliothèque necessaire .cependant j’ai une erreur qui apparée  » ‘display’ was not declared in this scope » aurrai tu une idée ,je te joint le programme…
    c’est dans le dernier paragraphe a la fin du programme « ligne qui pose problème
    en espérant que tu peux m’aider ..
    cordialement merci

    https://pastebin.com/hNXmypfa

    1. Bonjour Jérome,
      Pour la prochaine fois, penses à faire un pastebin plutôt que copy/paste ton code brut dans un espace commentaire, c’est pas très lisible 😉

      Pour ton erreur, tu es sur que ton objet « display » est bien défini ?

      1. j’ai cree mon compte sur pastbin

        sur le programme apparai pas

        includ u8glib.h
        includ tinygps.h
        includ softwareserial.h
        includ onewire.h

    2. je viens de m’apercevoir qu’au début du programme, dans mon commentaire, il manquait les bibliothèque du début…
      cdlt

      #include
      #include
      #include
      #include
      //#include
      #define SDA_PIN 8
      #define SCL_PIN 9
      //Adafruit_ssd1306syp display(SDA_PIN,SCL_PIN);
      #define U8glib display(SDA_PIN,SCL_PIN);
      #define DS18B20 0x28

  3. bonjour
    j’ai refait votre projet exactement pareil mais j’ai pris 1 Un écran OLED 128 x 64 mais en 1.3 pouces
    et quand j’allume l’arduino l’écran sallume en blanc avec quelque point noir le probléme pourrai venir de l’ecran plus grand ?
    merci d’avance

  4. bonjour je suis intéresser par votre projet mes le lien Adafruit est HS pourriez vous le mettre a jour ?
    merci

      1. bonjour
        merci pour le lien
        j’ai refait votre projet exactement pareil mais j’ai pris 1 Un écran OLED 128 x 64 mais en 1.3 pouces
        et quand j’allume l’arduino l’écran sallume en blanc avec quelque point noir le probléme pourrai venir de l’ecran plus grand ?

  5. Bonjour Nathan

    Merci pour la réponse, c’est cool ! Et je ne l’avais pas vu avant…
    Je me doutais un peu que c’était un capteur de température externe.

    J’ai fait tout le montage, tout marche nickel mais, le nombre de satellites reste toujours à zéro…
    Gloups…
    J’utilise une carte UNO Arduino, un écran Oled et le module GY-NEO6MV2 GPS, donc tout pareil !
    La librairie du GPS est TinyGPS++ (V1.0.2).

    Si vous avez une idée, je suis preneur !
    Il ne me manque juste çà.

    Pour info, vous utilisez quelle version de TinyGPS++ ?

    Au fait, il y a une erreur dans vos explications. Au niveau du capteur de température, vous indiquez le branchement sur la borne 10 (ce qui est vrai) mais sur le schéma, le fils bleu est branché sur la prise 2.

    Cordialement,
    Howard

    1. Avez-vous essayé en extérieur ? Pas forcément étonnant qu’ils restent à 0 si vous êtes en intérieur !

      Pour TinyGPS++, je ne saurais vous dire la version utilisée, le projet commence à dater et je n’ai plus les composants sous la main :/

      Pour l’erreur que vous mentionnez, j’ai précisez « dans notre cas nous utilisons la borne 10 », afin de préciser que ce n’est pas la 2 comme ,sur le schéma (le schéma n’est pas de moi c’est pour ça)

      1. Super top rapide, merci !

        En extérieur, c’est pareil ! Mais à l’intérieur, j’ai toutes les autres données, donc le capteur doit être ok.
        Ok pour le schéma et la borne 10 😉

  6. Bonjour Nathan

    Projet super top, bravo !

    Mais à quoi sert le gros câble noir se terminant par un cylindre brillant, et visible sur les dernières photos du post ?
    J’ai tout re-lu et je ne vois pas à quoi çà sert…
    Peut-être lié au capteur de température…

    Cordialement,
    Howard

  7. BONJOUR JE SUIS BLOQUE PAR MON ECRAN QUI FAIT DES PETITS POINT AVEC TON CODE/*MON ARDUINO EST UNE LEONARDO ET MON ECRAN EST AZDelivery ⭐⭐⭐⭐⭐ Un écran OLED 128 x 64 px ; 0,96 Pouces pour Arduino, Raspberry Pi et microcontrôleur MODELE : AZOLED12864-1000*/

    MERCI D AVANCE POUR TA REPONSE

    1. attention l’ecran doit etre un 128*64 et non un 128*32!!!!!!!!!!!!!!!!!!!!!!!!!!!
      la bibliotheque Adafruit_ssd1306syp.h ne prends pas en charge l’ecran i2c 128*32

  8. Bonjour, je suis actuellement en premiere année d’école d’ingénieur et souhaite réaliser un tel projet. Cependant je dispose d’une carte est-elle compatible avec ce code ?

    Merci

  9. bonjour,j’ai un project qui pour but de calculer la vitesse d’une voiture et L’envoyé au telepilote,j’ai une carte arduino uno ,un gps SIM 800 et Hrph Nouveau Module GPS GYNEO6MV2 Carte SIM NEO-6M GY-NEO6MV2 avec Antenne pour Arduino et le kit complet de l’arduino.
    j’aurai besoin que de la vitesse de la voiture.
    comme je suis debutant dans arduino j’aurai besoin d’un sketch(code)
    svp.dans mon mail si possible svp
    cordialement

  10. Bonjour
    je voudrais telecharger ton programme mais je n’arrive pas car moi j’ai juste besoin de trouver la vitesse grace au gps merci si tu peux m’aider me renvoyer un lien avec le meme code ou bien d’en refaire un autre merci de ton aide

  11. Bonjour Nathan, je reveil un peu le sujet mais je me suis lancé dans ton tuto car j’adore l’idée!
    Aujourd’hui je suis bloqué dans la boucle  » if (gps.location.isValid()) » , la led de mon gps clignote en rouge et je n’arrive pas à trouver une doc qui explique ce que ça veut dire. Est ce que tu pourrais m’aider ?

    J’utilise les même composants que toi et une adruino uno V1

  12. Bonjour Nathan lorsque je lance le programme, il affiche dans le moniteur série : localisation INVALID plusieurs fois. je comprends pas pourquoi.Peux tu répondre a mon problème; Merci

  13. Bonjour Nathan je souhaite réaliser un compteur de vitesse mais le problème c’est que je possède une Ecran I2C LCD grove et donc la classe display. … qui est pour ton écran convient mais ne marche pas pour l’écran I2C LCD grove (sparking) j’aimerais une réponse. Merci

  14. Bonsoir, j’ai un petit soucis, mon ecrans affiche pleins de points partout au lieu d’afficher normalement. il marche tip top avec le script de test adafruit. pouriez vous m’aider? tout à l’air bien branché et correctement, pas d’erreur de compilation :/

  15. Bonjour

    Je trouve le sujet génial je suis un grand fan et j’ai réussi à réunir tout le matos nécessaire pour réaliser ce projet mais le problème est que je possède une carte Arduino Nano et que quand j’essaie de téléverser le programme dans la carte il me dit que ce programme n’est pas compatible avec ma carte et j’espérais que vous sauriez m’éclairer sur quelle ligne je dois modifier pour arriver à téléverser le programme ?

    Merci beaucoup

  16. Bonjour,
    votre code arduino m’intéresse mais malheureusement le lien DropBox ne fonctionne pas.
    D’avance merci

    1. Sans informations plus précises : quel capteur GPS, quelle carte, quels branchements etc… Je suis dans l’incapacité de vous aider

  17. Bonjour 🙂
    Je suis une étudiante en Licence Fondamentale en Informatique , je suis en train de faire mon projet de fin d’étude qui a comme titre « Logiciel compteur de vitesse GPS sous Windows CE avec statistique de conduite pour ordinateur de bord » .
    DESCRIPTION DU SUJET : La fonction du compteur de vitesse classique est de permettre au conducteur de connaitre la
    vitesse instantanée de son véhicule .Il est très utile pour permettre au conducteur de maîtriser la vitesse de son véhicule par
    rapport aux limites imposées par la signalisation ou le code de la route . Le logiciel compteur de vitesse par GPS permet en plus
    d’avoir une traçabilité sur les parcours suivie par le véhicule , des informations complémentaires tel que :temps de départ ,
    durée du parcours , vitesse maximal, vitesse moyenne ….
    Il permet l’indication du lieu du véhicule sur une mappe. Il permet aussi d’afficher une boussole pour indiquer l’orientation du
    véhicule . Le logiciel permettra d’avoir différents modes d’affichage de ces informations par simples clic sur l’écran tactile.

    Mon problème 🙁 je veux faire tous ça mais je n’arrive pas à lire le port où les informations – qui sont captées par l’antenne – sont stockées .

    Aidez-moi SVP :'( C’est ma dernière chance pour avoir mon diplôme :'(
    Merci d’avance .

  18. Bonjour Nathan. Ton programme est très intéressant mais je dois l’utiliser pour la navigation en voilier .
    Est il possible d’afficher la vitesse en noeuds ?
    La vitesse étant faible en voilier, la précision du shield gps que tu propose est elle suffisante à vitesse réduite ?

    1. Alors d’abords merci 🙂
      Pour la vitesse en noeud, un petit coup d’oeil sur la doc TinyGPS++ te permet de répondre à ta question –> Oui en remplaçant tout les « gps.speed.kmph(); » par « gps.speed.knots(); » et en remplacant le « int vitesse » par un « double vitesse »

      Pour la précision je ne préfère pas te dire de bêtise car je ne m’en rappel plus du tout.. Si tu as peur de tester avec cette puce GPS, je te laisse te tourner vers une solution Adafruit (un peu plus coûteuse mais plus performante) :
      Lien pour l’achat : https://goo.gl/ci7v0D
      Lien pour la doc : http://goo.gl/Zhdvv6

      Au plaisir 🙂

      1. Bonjour nathan ,
        merci pour ces précisions. je vais commander tout ça . par contre il y a quelque chose qui me froisse dans ton tuto. tu dis pouvoir récupérer les données du GPS sans passer part le port série ( tu utilise la pin 6 en guise de TX). Cette information est importante pour moi car mon projet est évolutif et je vais avoir besoin de renvoyer le nmea a un afficheur(sondeur compatible nmea) et à mon pc (via apc 220) . ce qui implique d’avoir plusieurs pin serie disponibles( hors j’ai une carte qui ne comporte que 1 liaison serie (leonardo)). Peut on éviter de passer par le série en utilisant les autres entrées ? merci encore .

      2. Malheureusement tu es obligé de passer par les ports séries, il n’y à aucune autre solution à ma connaissance. Je te conseille de te diriger vers une Mega du coup, qui dispose de plusieurs liaisons séries

  19. Bonjour,
    ce projet est intéressant, mais il semblerait que le sketch ne soit plus sur dropbox, y a t-il moyen d’avoir un lien qui fonctionne ? Merci d’avance ! 😉

  20. bonsoir
    je travaille su un projet de securité de navigation avion.
    je ne cherche pas a stocker les points d’une navigation mais
    d’afficher le cap et la distance d’un point geographique (terrain)
    C’est facile pour un point en entrant les coordonnées en ‘dur’ gans le pgm
    mais je souhaite avoir le choix entre disons 5 points differents sans manipulations excessives.
    comment peut on faire ? – ecran sensitif – recuperation sur SD ??
    merci de votre aide
    mik

    1. Ecran sensitif, ou alors un simple bouton qui te permet de naviguer entre plusieurs points préalablement définis que tu stockes sur une carte SD dans un fichier texte. Par exemple, tu mets tous les points que tu veux dans un fichier texte (1 par ligne). Ensuite tu lis le fichier txt, tu remplis ensuite un tableau qui contiendra toutes les lignes, et avec le bouton tu pourras naviguer à travers ton tableau pour afficher les différents points. D’autres solutions peuvent être envisagées aussi 🙂

  21. Bonjour,je suis intéressé par cet article pour mon domaine sportif à savoir l’aviron.
    Ne connaissant strictement rien au monde de la programmation, j’aurais voulu savoir comment passé d’une vitesse affiché en km/heure à une vitesse estimée en temps au 500 mètres sur chaque coup rame.

    d’avance merci de vos réponses

    1. Bonjour ,

      Une vitesse et un temps ce n’est pas pareil.

      Pour répondre, en récupérant ta position à un temps donné, puis en la récupérant 500m plus loin tu devrais pouvoir faire chose

      1. Si, un temps sur une distance c’est bien une vitesse.
        Mais il faut avoir fait de l’ergomètre pour comprendre la question de Balmonet…
        Voici la transformation pour afficher (en secondes) la valeur voulue par Balmonet (qu’il restera ensuite à convertir en minutes + secondes) à partir d’une vitesse V donnée en km/h :
        18/V
        Ca vient de la formule V = D/T avec D=500m et un facteur de 3,6 pour transformer la vitesse de km/h à m/s.

  22. Bonjour,je suis intéressé par cet article pour mon domaine sportif à savoir l’aviron.
    Ne connaissant strictement rien au monde de la programmation, j’aurais voulu savoir comment passé d’une vitesse affiché en km/heure à une vitesse estimée en temps au 500 mètres sur chaque coup rame.

    d’avance merci de vos réponses

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Bouton retour en haut de la page