Table des matières:

Enregistreur GPS Arduino : 3 étapes
Enregistreur GPS Arduino : 3 étapes

Vidéo: Enregistreur GPS Arduino : 3 étapes

Vidéo: Enregistreur GPS Arduino : 3 étapes
Vidéo: Arduino GPS Shield Tutorial: Distance Calculator 2024, Juillet
Anonim
Enregistreur GPS Arduino
Enregistreur GPS Arduino
Enregistreur GPS Arduino
Enregistreur GPS Arduino

Salut les gars, Je deviens super excité pour les petits projets qui permettent aux gens de comprendre beaucoup plus la technologie que nous avons tous les jours.

Ce projet concerne le breakout GPS et la journalisation SD. J'ai beaucoup appris rien qu'en construisant ce truc.

Il y a beaucoup de notions que vous allez acquérir en suivant ce tutoriel, et bien plus en suivant le lien que je fournis pour approfondir les sujets.

Alors, qu'est-ce que c'est ? Simple: est un traceur GPS qui enregistre les positions (avec l'altitude aussi), la vitesse et la date/l'heure sur une microSD.

Ce dont vous aurez besoin:

- Arduino Nano (j'ai en fait utilisé un UNO pour construire le croquis, mais ils sont identiques !) un 5x7cm)- Fils

Tous ces composants sont assez bon marché, à l'exception du module GPS. C'est environ 30-40 dollars et c'est la partie la plus chère. Même un nouveau jeu de fers à souder pourrait coûter moins cher.

Existe aussi un shield Adafruit avec modules GPS et carte SD ensemble. Si vous souhaitez l'utiliser, gardez à l'esprit qu'il est conçu pour Arduino UNO, vous aurez donc besoin d'un UNO et non d'un Nano. Il n'y a pas de différence dans le croquis cependant.

Allons plus loin…

Étape 1: Connexion des composants

Composants de connexion
Composants de connexion
Composants de connexion
Composants de connexion
Composants de connexion
Composants de connexion
Composants de connexion
Composants de connexion

Eh bien, après avoir obtenu les composants, vous devrez les connecter. Ici vous pouvez trouver les schémas fritzing qui sont assez clairs. Cependant, voici également le brochage:

Sortie MicroSD

5V -> 5VGND -> GnnCLK -> D13DO -> D12DI -> D11CS -> D4 (Si vous utilisez le bouclier, celui-ci est intégré au D10)

Déploiement GPS

Vin -> 5VGnn -> GnnRx -> D2Tx -> D3

Petites notes sur ces modules: Ces deux petits garçons communiquent par des chemins différents avec l'Arduino. Le GPS utilise une série TTL, du même type que nous utilisons lorsque nous communiquons avec Arduino via Serial Monitor, c'est pourquoi nous devons déclarer via une bibliothèque une nouvelle série (Tx et Rx) car le GPS veut utiliser le 9600 par défaut, et nous voulez l'utiliser non plus. Le module GPS diffuse toujours et constamment des données, s'il est branché. C'est la partie délicate à gérer, car si nous lisons une phrase et que nous l'imprimons, nous pourrions perdre la suivante, qui est également nécessaire. Nous devons le garder à l'esprit lors du codage!

La MicroSD communique via SPI (Serial Peripheral Interface), une autre façon de communiquer avec la carte. Ce type de module utilise toujours CLK sur le D13, DO sur le D12 et DI sur le D11. Parfois, ces connexions ont des noms différents comme CLK = SCK ou SCLK (Serial Clock), DO = DOUT, SIMO, SDO, SO, MTSR (tous ceux-ci indiquent Master Output) et DI = SOMI, SDI, MISO, MRST (Master Input). Enfin, nous avons le CS ou SS qui indique la broche où nous envoyons ce que nous voulons écrire dans la MicroSD. Si vous souhaitez utiliser deux modules SPI différents, il vous suffit de différencier cette broche afin de les utiliser tous les deux. Par exemple, un écran LCD ET un MicroSd comme celui que nous utilisons. Cela devrait fonctionner également en utilisant deux écrans LCD différents connectés à différents CS.

Soudez ces pièces ensemble dans le tableau et vous êtes prêt à télécharger le croquis !

Comme vous pouvez le voir sur le croquis, j'ai soudé des connecteurs femelles dupont à la place du composant direct, c'est parce qu'à l'avenir je souhaiterais peut-être réutiliser le composant ou en changer un.

J'ai aussi soudé le module GPS avec les connecteurs dans le mauvais sens, c'était de ma faute et je ne voulais pas, mais ça marche et je ne veux pas risquer de le casser en essayant de dessouder ces petits salauds ! Il suffit de souder de la bonne manière et tout ira bien !

Voici une vidéo de soudure utile: Guide de soudure pour débutantUne vidéo sur le dessoudage

Chaîne Youtube d'Adafruit, beaucoup de choses intéressantes là-bas !

Lorsque vous soudez, essayez d'utiliser juste la quantité de métal dont vous avez besoin, sinon vous allez faire des dégâts. N'ayez pas peur de le faire, commencez peut-être par quelque chose de moins cher, et continuez à souder des trucs différents. Le bon matériau fait aussi la différence !

Étape 2: le croquis

Tout d'abord, bien sûr, nous importons la bibliothèque et construisons leurs objets avec lesquels travailler: SPI.h est pour communiquer avec les modules SPI, SD est la bibliothèque MicroSD et Adafruit_GPS est la bibliothèque du module GPS. SoftwareSerial.h sert à créer un port série via un logiciel. La syntaxe est "mySerial(TxPin, RxPin);". L'objet GPS doit être pointé sur une série (entre parenthèses). Voici les liens des bibliothèques pour le breakout GPS Adafruit, le breakout MicroSD (pour faire un travail propre, vous devez également formater la SD avec ce logiciel de l'association SD) et le Bibliothèque série logicielle (elle devrait être incluse dans l'IDE).

REMARQUE: j'ai rencontré un problème lorsque j'ai essayé d'ajouter beaucoup d'informations dans un fichier ou d'utiliser plus de deux fichiers dans l'esquisse. Je n'ai pas formaté la SD avec ce logiciel, cela pourrait peut-être résoudre le problème. Aussi, j'ai essayé d'ajouter un autre capteur dans l'appareil, un BMP280 (module I2C), sans succès. Il semble que l'utilisation du module I2C rend le croquis fou ! J'ai déjà posé la question sur le forum Adafruit, mais je n'ai toujours pas de réponse.

#include "SPI.h"#include "SD.h"#include "Adafruit_GPS.h"#include "SoftwareSerial.h" SoftwareSerial mySerial(3, 2); Adafruit_GPS GPS(&mySerial);

Maintenant, nous avons besoin de toutes nos variables: les deux chaînes servent à lire les deux phrases dont nous avons besoin pour calculer un tas d'informations utiles à partir du GPS. Le caractère sert à stocker les phrases avant de les analyser, les flottants servent à calculer les coordonnées en degrés (le GPS envoie les coordonnées d'utilisation en degrés et minutes, nous en avons besoin en degrés pour permettre la lecture dans Google Earth). Le chipSelect est la broche où l'on branche le CS de la carte MicroSD. Dans ce cas, c'est D4, mais si vous utilisez un shield SD, vous devrez mettre D10 ici. La variable de fichier est celle qui stockera les informations du fichier que nous utilisons lors de l'esquisse.

Chaîne NMEA1;

Chaîne NMEA2; caractère c; deg flottant; float degWhole; float degDec; int chipSelect = 4; Fichier mySensorData;

Maintenant, nous déclarons quelques fonctions fo pour rendre le croquis un peu plus élégant et moins désordonné:

Ils font fondamentalement la même chose: lire des phrases NMEA. clearGPS() ignore trois phrases et readGPS() en enregistre deux dans les variables.

Voyons comment: Une boucle while contrôle s'il y a de nouvelles phrases NMEA sur le module et lit le flux GPS jusqu'à ce qu'il y en ait une. Lorsqu'une nouvelle phrase est présente, nous sortons de la boucle while, où la phrase est réellement lue, analysée et stockée dans les premières variables NMEA. On fait tout de suite la même chose pour le suivant, car le GPS est en streaming en permanence, il n'attend pas qu'on soit prêt, on n'a pas le temps de l'imprimer tout de suite

C'est très important! Ne faites rien avant d'avoir stocké les deux phrases, sinon la seconde finirait par être corrompue ou tout simplement fausse.

Après avoir obtenu deux phrases, nous les imprimons dans la série pour contrôler que cela se passe bien.

void readGPS() {

clearGPS(); while(!GPS.newNMEAreceived()) { c=GPS.read(); } GPS.parse(GPS.lastNMEA()); NMEA1=GPS.lastNMEA(); while(!GPS.newNMEAreceived()) { c=GPS.read(); } GPS.parse(GPS.lastNMEA()); NMEA2=GPS.lastNMEA(); Serial.println(NMEA1); Serial.println(NMEA2); } void clearGPS() { while(!GPS.newNMEAreceived()) { c=GPS.read(); } GPS.parse(GPS.lastNMEA()); while(!GPS.newNMEAreceived()) { c=GPS.read(); } GPS.parse(GPS.lastNMEA());w while(!GPS.newNMEAreceived()) { c=GPS.read(); } GPS.parse(GPS.lastNMEA()); }

Eh bien, maintenant que nous sommes tous prêts, nous pouvons passer à travers la configuration ():

Premièrement: nous ouvrons la communication sur Serial 115200 pour Arduino PC et sur 9600 pour module GPS Arduino. Deuxièmement: nous envoyons trois commandes au module GPS: la première est de fermer la mise à jour de l'antenne, la seconde est de demander uniquement les chaînes RMC et GGA (nous allons utiliser uniquement celles qui contiennent toutes les informations dont vous auriez besoin. un GPS), la troisième et dernière commande consiste à régler le taux de mise à jour à 1HZ, suggéré par Adafruit.

Après cela, nous définissons la broche D10 sur OUTPUT, si et seulement si la broche CS de votre modèle SD est différente de D10. Immédiatement après, placez le CS sur le module SD sur la broche chipSelect.

Nous exécutons les fonctions readGPS() qui incluent le cleanGPS().

Il est maintenant temps d'écrire quelque chose dans les fichiers ! Si le fichier est déjà sur la carte SD, ajoutez-y un horodatage. De cette façon, nous n'avons pas besoin de garder une trace des sessions ou d'effacer les fichiers à chaque fois. Avec un horodatage écrit dans la fonction de configuration, nous sommes sûrs de n'ajouter une séparation dans les fichiers qu'une seule fois par session.

REMARQUE: La bibliothèque SD prend au sérieux l'ouverture et la fermeture du fichier à chaque fois ! Gardez-le en tête et fermez-le à chaque fois ! Pour en savoir plus sur la bibliothèque, suivez ce lien.

Ok, nous sommes vraiment prêts à obtenir le cœur de la partie stream-and-log du sketch.

void setup() {

Serial.begin(115200); GPS.begin(9600); //Envoyer des commandes au module GPS GPS.sendCommand("$PGCMD, 33, 0*6D"); GPS.sendCommand(PMTK_SET_NMEA_OUTPUT_RMCGGA); GPS.sendCommand(PMTK_SET_NMEA_UPDATE_1HZ); retard(1000); // uniquement si la broche CS de votre module SD n'est pas sur la broche D10

pinMode(10, SORTIE);

SD.begin(chipSelect); lireGPS(); if (SD.exists("NMEA.txt")) { mySensorData = SD.open("NMEA.txt", FILE_WRITE); mySensorData.println(""); mySensorData.print("*** "); mySensorData.print(GPS.day); mySensorData.print("."); mySensorData.print(GPS.month); mySensorData.print("."); mySensorData.print(GPS.year); mySensorData.print(" -- "); mySensorData.print(GPS.heure); mySensorData.print(":"); mySensorData.print(GPS.minute); mySensorData.print(":"); mySensorData.print(GPS.seconds); mySensorData.println(" ***"); mySensorData.close(); } if (SD.exists("GPSData.txt")) { mySensorData = SD.open("GPSData.txt", FILE_WRITE); mySensorData.println(""); mySensorData.println(""); mySensorData.print("*** "); mySensorData.print(GPS.day); mySensorData.print("."); mySensorData.print(GPS.month); mySensorData.print("."); mySensorData.print(GPS.year); mySensorData.print(" -- "); mySensorData.print(GPS.heure); mySensorData.print(":"); mySensorData.print(GPS.minute); mySensorData.print(":"); mySensorData.print(GPS.seconds); mySensorData.println(" ***"); mySensorData.close(); }}

Maintenant, nous obtenons le cœur du croquis.

C'est hyper simple, en effet.

Nous allons lire le flux GPS avec la fonction readGPS(), puis nous contrôlons si nous avons un fix égal à 1, ce qui signifie que nous sommes connectés à un satellite. Si nous l'avons, nous allons écrire nos informations dans les fichiers. Dans le premier fichier "NMEA.txt", nous n'écrivons que les phrases brutes. Dans le deuxième fichier, "GPDData.txt", nous ajoutons les coordonnées (converties avec les fonctions que nous avons vues auparavant) et l'altitude. Ces informations suffisent à compiler un fichier.kml pour créer un chemin sur Google Earth. Notez que nous fermons les fichiers à chaque fois que nous les ouvrons pour écrire quelque chose !

boucle vide() {

lireGPS(); // Condizione if che controlla se l'antenna ha segnale. Se si, procede con la scrittura dei dati. if(GPS.fix==1) { //Ne sauvegarder les données que si nous avons un correctif mySensorData = SD.open("NMEA.txt", FILE_WRITE); //Apre il file per le frasi NMEA grezze mySensorData.println(NMEA1); //Scrive prima NMEA sul file mySensorData.println(NMEA2); //Scrive seconda NMEA sul file mySensorData.close(); //Chiude fichier!!

mySensorData = SD.open("GPSData.txt", FILE_WRITE);

// Convertir et écrire la longueur convLong(); mySensorData.print(deg, 4); // Enregistre les coordonnées dans le fichier grad sul mySensorData.print(", "); // Scrive una virgola par separare i data Serial.print(deg); Serial.print(", "); // Convertir et écrire la latitude convLati(); mySensorData.print(deg, 4); // Enregistre les coordonnées dans le fichier grad sul mySensorData.print(", "); // Scrive una virgola par separare i data Serial.print(deg); Serial.print(", "); // Scrive l'altitude mySensorData.print(GPS.altitude); mySensorData.print(" "); Serial.println(GPS.altitude); mySensorData.close(); } }

Maintenant que nous avons tous terminé, vous pouvez télécharger le croquis, construire l'appareil et en profiter !

Notez que vous devez l'utiliser avec la carte GPS face au ciel afin d'obtenir un fix=1, ou vous pouvez y brancher une antenne externe.

N'oubliez pas non plus que si vous avez une solution, le voyant rouge clignote toutes les 15 secondes, sinon, beaucoup plus rapidement (une fois toutes les 2-3 secondes).

Si vous souhaitez en savoir plus sur les phrases NMEA, suivez simplement l'étape suivante de ce guide.

Étape 3: Les phrases NMEA et le fichier.kml

L'appareil et le croquis sont terminés, ils fonctionnent bien. Gardez à l'esprit que pour obtenir un correctif (pour avoir une connexion avec des satellites), la cassure doit faire face au ciel.

Le petit voyant rouge clignote toutes les 15 secondes lorsque vous avez une solution

Si vous voulez mieux comprendre les phrases NMEA, vous pouvez lire plus loin.

Dans le sketch nous n'utilisons que deux phrases, le GGA et le RMC. Ce ne sont que quelques phrases que le module GPS diffuse.

Voyons ce qu'il y a dans ces chaînes:

$GPRMC, 123519, A, 4807.038, N, 01131.000, E, 022.4, 084.4, 230394, 003.1, W*6A

RMC = Phrase minimale recommandée C 123519 = Correction prise à 12:35:19 UTC A = Statut A=actif ou V=Vide 4807.038, N = Latitude 48 deg 07.038' N 01131.000, E = Longitude 11 deg 31.000' E 022.4 = Vitesse au-dessus du sol en nœuds 084.4 = Angle de route en degrés Vrai 230394 = Date - 23 mars 1994 003.1, W = Variation magnétique *6A = Les données de la somme de contrôle, commencent toujours par *

$GPGGA, 123519, 4807.038, N, 01131.000, E, 1, 08, 0.9, 545,4, M, 46,9, M,, *47

GGA Global Positioning System Fix Data 123519 Correction prise à 12:35:19 UTC 4807.038, N Latitude 48 deg 07.038' N 01131.000, E Longitude 11 deg 31.000' E 1 Qualité de la correction: 0 = invalide; 1 = repère GPS (SPS); 2 = repère DGPS; 3 = correction PPS; 4 = Cinématique en temps réel; 5 = RTK flottant; 6 = estimé (à l'estime) (élément 2.3); 7 = Mode d'entrée manuel; 8 = Mode simulation; 08 Nombre de satellites suivis 0,9 Dilution horizontale de la position 545,4, M Altitude, Mètres, au-dessus du niveau moyen de la mer 46,9, M Hauteur du géoïde (niveau moyen de la mer) au-dessus de l'ellipsoïde WGS84 (champ vide) temps en secondes depuis la dernière mise à jour DGPS (champ vide) Numéro d'identification de la station DGPS *47 les données de la somme de contrôle, commencent toujours par *

Comme vous pouvez le voir, il y a beaucoup plus d'informations que ce dont vous avez besoin. En utilisant la bibliothèque d'Adafruit, vous pouvez appeler certains d'entre eux, comme GPS.latitude ou GPS.lat (latitude et hémisphère lat), ou GPS.day/month/year/hour/minute/seconds/milliseconds… site Web pour en savoir plus. Ce n'est pas si clair, mais en suivant quelques conseils dans le guide des modules GPS, vous pourriez trouver ce dont vous avez besoin.

Que pouvons-nous faire avec les fichiers que nous avons ? Facile: compilez un fichier kml pour afficher un chemin sur Google Earth. Pour cela, il suffit de copier/coller le code que vous trouverez en suivant ce lien (sous le paragraphe Chemin), de mettre vos coordonnées du fichier GPDData.txt entre les balises, de sauvegarder le fichier avec l'extension.kml et de le charger sur Google Earth.

NOTE: Le langage de balisage.kml est simple, si vous savez déjà ce qu'est un langage de balisage, prenez le temps de lire le lien précédent et la documentation à l'intérieur, c'est en fait intéressant !

L'utilisation du kml consiste à connaître ses balises et ses arguments. Je n'ai trouvé que le guide de Google, celui que j'ai lié avant et l'essentiel est de définir le style entre les balises et de l'appeler avec le signe # quand il est temps d'écrire les coordonnées.

Le fichier que j'ai ajouté dans cette section est un.kml dans lequel vous pouvez simplement coller vos coordonnées. pensez à coller avec cette syntaxe: longitude, latitude, altitude

Conseillé: