Съдържание:

Arduino GPS регистратор: 3 стъпки
Arduino GPS регистратор: 3 стъпки

Видео: Arduino GPS регистратор: 3 стъпки

Видео: Arduino GPS регистратор: 3 стъпки
Видео: How To Make Arduino GPS Logger With Google Map Display On GPSVisualizer 2024, Ноември
Anonim
Arduino GPS регистратор
Arduino GPS регистратор
Arduino GPS регистратор
Arduino GPS регистратор

Здравейте, момчета!

Изключвам се за малки проекти, които позволяват на хората да разберат много повече от технологиите, които имаме всеки ден.

Този проект е за пробив на GPS и регистриране на SD. Научих много, просто изграждайки тези неща.

Има много идеи, които ще спечелите след този урок, и много повече, като следвате връзката, която предоставям, за да се задълбочите в темите.

И така, какво е това? Прост: Това е GPS тракер, който регистрира позиции (с надморска височина също), скорост и дата/час на microSD.

Какво ще ви трябва:

- Arduino Nano (всъщност използвах UNO за изграждане на скицата, но те са същите!)- Adafruit ultimate GPS пробив- MicroSD карта пробив- Инструменти за запояване (всичко, което ви е необходимо за спойка)- Universal Stripboard (използвах a 5x7cm)- Проводници

Всички тези компоненти са доста евтини, с изключение на GPS модула. Това е около 30-40 долара и е най-скъпата част. Дори нов комплект за поялник може да струва по -малко.

Съществува и щит Adafruit с модули GPS и SD карта заедно. Ако искате да го използвате, имайте предвид, че е направен за Arduino UNO, следователно ще ви трябва UNO, а не Nano. Все пак няма разлика в скицата.

Да отидем по -нататък…

Стъпка 1: Свързване на компоненти

Свързване на компоненти
Свързване на компоненти
Свързване на компоненти
Свързване на компоненти
Свързване на компоненти
Свързване на компоненти
Свързване на компоненти
Свързване на компоненти

Е, след като получите компонентите, ще трябва да ги свържете. Тук можете да намерите доста ясни схеми за фризиране. Ето и разпилката:

Пробив на MicroSD

5V -> 5VGND -> GnnCLK -> D13DO -> D12DI -> D11CS -> D4 (Ако използвате щита, това е вградено в D10)

GPS пробив

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

Малки бележки за тези модули: Тези две малки момчета комуникират по различни пътища с Arduino. GPS използват TTL Serial, същия вид, който използваме, когато комуникираме с Arduino чрез Serial Monitor, затова трябва да декларираме чрез библиотека нов сериен (Tx и Rx), защото GPS иска да използва 9600 по подразбиране и ние искате да го използвате. GPS модулът винаги и постоянно предава данни, ако е включен. Това е трудната част, с която трябва да се справим, защото ако прочетем изречение и след това го отпечатаме, можем да загубим следващото, което също е необходимо. Трябва да го имаме предвид при кодирането!

MicroSD комуникира чрез SPI (сериен периферен интерфейс), друг начин за комуникация с платката. Тези видове модули използват винаги CLK на D13, DO на D12 и DI на D11. Понякога тези връзки имат различно име, като CLK = SCK или SCLK (сериен часовник), DO = DOUT, SIMO, SDO, SO, MTSR (всички посочват главен изход) и DI = SOMI, SDI, MISO, MRST (главен вход). Накрая имаме CS или SS, който показва пина, където изпращаме това, което искаме да напишем в MicroSD. Ако искате да използвате два различни SPI модула, просто трябва да различите този щифт, за да ги използвате и двата. Например LCD екран И MicroSd като този, който използваме. Той трябва да работи и с два различни LCD дисплея, свързани към различни CS.

Запояйте тези части заедно в дъската и сте готови да качите скицата!

Както можете да видите на скицата, аз запоявам някои dupont женски съединители вместо директния компонент, това е така, защото в бъдеще може да искам да използвам повторно компонента или да го променя.

Също така запоявах GPS модула с конекторите в грешна посока, това беше моята вина и не исках, но работи и не искам да рискувам да го счупя, опитвайки се да изваря тези малки копелета! Просто запоявайте по правилния начин и всичко ще бъде наред!

Ето няколко полезни видео за спойка: Ръководство за запояване за начинаещи Видео за разпаяване

Youf канал на Adafruit, има много интересни неща!

Когато запоявате, опитайте се да използвате само необходимото количество метал, в противен случай ще направите бъркотия. Не се страхувайте да го направите, може би започнете с нещо не толкова скъпо и след това запазете различни спойки. Правилният материал също прави разликата!

Стъпка 2: Скицата

Първо, разбира се, импортираме библиотеката и изграждаме техните обекти за работа: SPI.h е за комуникация с SPI модули, SD е библиотеката MicroSD и Adafruit_GPS е библиотеката на GPS модула. SoftwareSerial.h е за създаване на сериен порт чрез софтуер. Синтаксисът е „mySerial (TxPin, RxPin);“. GPS обектът трябва да бъде посочен към сериен (в скобите). Ето връзките на библиотеките за Adafruit GPS пробив, MicroSD пробив (за да свършите чиста работа, трябва също да форматирате SD с този софтуер от SD асоциацията) и Софтуерна серийна библиотека (тя трябва да бъде включена в IDE).

ЗАБЕЛЕЖКА: Срещнах се с някакъв проблем, когато се опитвах да добавя много информация в един файл или използвах повече от два файла в скицата. Не форматирах SD с този софтуер, може би това би могло да реши проблема. Също така се опитах да добавя друг сензор в устройството, BMP280 (I2C модул), но без успех. Изглежда, че използването на I2C модул прави скицата полудяла! Вече се питах за това във форума на Adafruit, но все още не получих отговор.

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

Сега имаме нужда от всички наши променливи: Двата низа са за четене на двете изречения, от които се нуждаем, за да изчислим куп полезна информация от GPS. Char е за запас на изреченията, преди да ги анализира, поплавъците са за изчисляване на координатите в градуси (GPS изпраща координати за използване в градуси и минути, ние се нуждаем от тях в градуси, за да четем в Google Earth). ChipSelect е щифтът, където включваме CS на MicroSD картата. В този случай е D4, но ако използвате SD щит, ще трябва да поставите D10 тук. Променливата на файла е тази, която ще съхранява информацията за файла, който използваме по време на скицата.

Низ NMEA1;

Низ NMEA2; char c; поплавък градус; поплавък degWhole; float degDec; int chipSelect = 4; Файл mySensorData;

Сега декларираме няколко fo функции, за да направим скицата малко по -елегантна и по -малко разхвърляна:

Те правят основно същото: четат изречения от NMEA. clearGPS () игнорира три изречения и readGPS () записва две от тях в променливите.

Нека да видим как: Цикълът while контролира дали има нови NMEA изречения в модула и чете GPS потока, докато има такъв. Когато има ново изречение, ние сме извън цикъла while, където изречението всъщност се чете, анализира и съхранява в първите променливи на NMEA. Веднага правим същото за следващия, защото GPS непрекъснато се излъчва, не чака да сме готови, нямаме време да го отпечатаме веднага

Това е много важно! Не правете нищо, преди да запасите и двете изречения, в противен случай второто в крайна сметка ще бъде повредено или просто погрешно.

След като получим две изречения, ги отпечатваме в поредицата, за да контролираме дали всичко върви добре.

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 ()); }

Е, сега, когато сме готови, можем да преминем през setup ():

Първо: отваряме комуникация на Serial 115200 за Arduino PC и на 9600 за GPS модул Arduino. Второ: изпращаме три команди към GPS модула: първата е да затворим актуализацията на антената, втората е да поискаме само RMC и GGA низ (ще използваме само тези, които имат цялата информация, от която някога ще имате нужда a GPS), третата и последна команда е да зададете скоростта на актуализиране на 1HZ, предложена от Adafruit.

След това задаваме извода D10 на OUTPUT, ако и само ако, CS пина на вашия SD модел е различен от D10. Веднага след това настройте CS на SD модула на чипа Изберете щифт.

Изпълняваме функциите readGPS (), които включват cleanGPS ().

Сега е време да напишете нещо във файловете! Ако файлът вече е в SD картата, добавете времева отметка към тях. По този начин не е нужно да следим сесиите или да изтриваме файловете всеки път. С времева отметка, написана във функцията за настройка, ние сме сигурни, че просто ще добавим разделяне във файловете само веднъж на сесия.

ЗАБЕЛЕЖКА: SD библиотеката е доста сериозна за отваряне и затваряне на файла всеки път! Имайте го предвид и го затваряйте всеки път! За да научите за библиотеката, следвайте тази връзка.

Добре, наистина сме готови да получим ядрото на поточната и регистрационната част на скицата.

void setup () {

Serial.begin (115200); GPS.бегин (9600); // Изпращане на команди до GPS модула GPS.sendCommand ("$ PGCMD, 33, 0*6D"); GPS.sendCommand (PMTK_SET_NMEA_OUTPUT_RMCGGA); GPS.sendCommand (PMTK_SET_NMEA_UPDATE_1HZ); забавяне (1000); // само ако CS щифтът на вашия SD модул не е на пин D10

pinMode (10, OUTPUT);

SD.begin (chipSelect); readGPS (); 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.месец); mySensorData.print ("."); mySensorData.print (GPS.година); mySensorData.print (" -"); mySensorData.print (GPS.час); mySensorData.print (":"); mySensorData.print (GPS.minute); mySensorData.print (":"); mySensorData.print (GPS.секунди); 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.месец); mySensorData.print ("."); mySensorData.print (GPS.година); mySensorData.print (" -"); mySensorData.print (GPS.час); mySensorData.print (":"); mySensorData.print (GPS.minute); mySensorData.print (":"); mySensorData.print (GPS.секунди); mySensorData.println ("***"); mySensorData.close (); }}

Сега получаваме ядрото на скицата.

Наистина е супер просто.

Ще четем GPS потока с функцията readGPS (), след което контролираме, ако имаме корекция, равна на 1, t означава, че сме свързани със сателит e. Ако го получим, ще запишем информацията си във файловете. В първия файл "NMEA.txt" пишем само необработените изречения. Във втория файл "GPDData.txt" добавяме координатите (преобразувани с функциите, които видяхме преди) и надморската височина. Тези данни са достатъчни за компилиране на.kml файл, за да се създаде път в Google Земя. Имайте предвид, че затваряме файловете всеки път, когато го отваряме, за да напишем нещо!

void loop () {

readGPS (); // Condizione if che controlla se l'antenna ha segnale. Se si, procede con la scrittura dei dati. if (GPS.fix == 1) {// Запазваме данни само ако имаме поправка mySensorData = SD.open ("NMEA.txt", FILE_WRITE); // Апрелиране на файл за NMEA грешка mySensorData.println (NMEA1); // Scrive prima NMEA sul файл mySensorData.println (NMEA2); // Scrive seconda NMEA sul файл mySensorData.close (); // Chiude файл !!

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

// Преобразуване на скрипт на надлъжен convLong (); mySensorData.print (град, 4); // Скрийте координатите в градирания файл mySensorData.print (","); // Scrive una virgola per separare and dati Serial.print (deg); Serial.print (","); // Преобразуване на скрипт на латинудин convLati (); mySensorData.print (град, 4); // Скрийте координатите в градирания файл mySensorData.print (","); // Scrive una virgola per separare and dati Serial.print (deg); Serial.print (","); // Scrive l'altitudine mySensorData.print (GPS.вътрешна височина); mySensorData.print (""); Serial.println (GPS.вътрешна височина); mySensorData.close (); }}

Сега, когато сме готови, можете да качите скицата, да изградите устройството и да му се насладите!

Имайте предвид, че трябва да го използвате с GPS борад, обърнат към небето, за да получите fix = 1, или можете да включите към него външна антена.

Също така, имайте предвид, че ако имате поправка, червената светлина мига на всеки 15 секунди, ако не го правите, много по-бързо (веднъж на всеки 2-3 секунди).

Ако искате да научите нещо повече за изреченията на NMEA, просто следвайте следващата стъпка от това ръководство.

Стъпка 3: Изреченията на NMEA и.kml файл

Устройството и скицата са пълни, работят добре. Имайте предвид, че за да получите корекция (за да имате връзка със спътници) пробивът трябва да е обърнат към небето.

Малката червена лампичка мига на всеки 15 секунди, когато получите корекция

Ако искате да разберете по -добре изреченията на NMEA, можете да прочетете по -нататък.

В скицата използваме само две изречения, GGA и RMC. Те са само няколко изречения, които GPS модулът излъчва.

Нека да видим какво има в този низ:

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

RMC = Препоръчително минимално изречение C 123519 = Поправка, взета в 12:35:19 UTC A = Статус A = активен или V = Празнота 4807.038, N = Географска ширина 48 градуса 07.038 'N 01131.000, E = Географска дължина 11 градуса 31.000' E 022.4 = Скорост над земята в възли 084.4 = ъгъл на следа в градуси Вярно 230394 = Дата - 23 март 1994 г. 003.1, W = Магнитна вариация *6A = Данните за контролната сума, винаги започват с *

$ GPGGA, 123519, 4807.038, N, 01131.000, E, 1, 08, 0.9, 545.4, M, 46.9, M,, *47

Данни за фиксиране на глобалната система за позициониране на GGA 123519 Поправка, взета в 12:35:19 UTC 4807.038, N Географска широчина 48 градуса 07.038 'N 01131.000, E Географска дължина 11 градуса 31.000' E 1 Качество на фиксиране: 0 = невалидно; 1 = GPS fix (SPS); 2 = DGPS fix; 3 = PPS корекция; 4 = Кинематично в реално време; 5 = поплавък RTK; 6 = прогнозно (мъртва сметка) (2.3 функция); 7 = Ръчен режим на въвеждане; 8 = режим на симулация; 08 Брой проследявани спътници 0.9 Хоризонтално разреждане на позиция 545.4, M Надморска височина, Метри, над средното морско равнище 46.9, M Височина на геоид (средно морско равнище) над елипсоида WGS84 (празно поле) време в секунди от последната актуализация на DGPS (празно поле) Идентификационен номер на станцията DGPS *47 данните за контролната сума, винаги започват с *

Както можете да видите, там има много повече информация от това, от което се нуждаете. Използвайки библиотеката на Adafruit, можете да се обадите на някои от тях, като GPS.latitude или GPS.lat (географска ширина и ширина на полукълбото), или GPS.day/month/year/hour/minute/seconds/milliseconds… Погледнете Adafruit уебсайт, за да научите нещо повече. Не е толкова ясно, но следвайки някои съвети в ръководството за GPS модулите, можете да намерите това, от което се нуждаете.

Какво можем да направим с файловете, които имаме? Лесно: компилирайте kml файл, за да покажете път в Google Земя. За да го направите, просто копирайте/прекарайте кода, който ще намерите след тази връзка (под параграфа Път), поставете координатите си от файла GPDData.txt между етикетите, запазете файла с.kml разширение и го заредете на Google Земя.

ЗАБЕЛЕЖКА:.kml езикът за маркиране е прост, ако вече знаете какво е език за маркиране, отделете време да прочетете предишната връзка и документация вътре, всъщност е интересно!

Използването на kml означава да знаете неговите тагове и аргументи. Намерих само ръководството от Google, този, който свързвах преди, и съществената част е да дефинирам стила между маркерите и да го извикам със знак #, когато е време да напиша координатите.

Файлът, който добавих в този раздел, е.kml, в който можете просто да поставите координатите си. не забравяйте да поставите с този синтаксис: дължина, ширина, надморска височина

Препоръчано: