Talaan ng mga Nilalaman:

Arduino GPS Logger: 3 Mga Hakbang
Arduino GPS Logger: 3 Mga Hakbang

Video: Arduino GPS Logger: 3 Mga Hakbang

Video: Arduino GPS Logger: 3 Mga Hakbang
Video: This sprocket carries extra water!! #mtb #mountainbike #shorts 2024, Hulyo
Anonim
Arduino GPS Logger
Arduino GPS Logger
Arduino GPS Logger
Arduino GPS Logger

Magandang araw kaibigan, Nagiging sobrang paglabas ako para sa maliliit na proyekto na nagpapahintulot sa mga tao na tunay na maunawaan ang higit pa sa teknolohiya na mayroon tayo sa araw-araw.

Ang proyektong ito ay tungkol sa breakout ng GPS at pag-log sa SD. Marami akong natutunan sa pagbuo lamang ng bagay na ito.

Mayroong maraming mga ideya na makakakuha ka ng pagsunod sa tutorial na ito, at higit pa sa pagsunod sa link na ibibigay ko upang lumalim sa mga paksa.

Kaya, ano ito Simple: Ay isang tracker ng GPS na nag-log ng mga posisyon (na may altitude din), bilis at petsa / oras sa isang microSD.

Ano ang kakailanganin mo:

- Arduino Nano (Gumamit talaga ako ng isang UNO upang maitayo ang sketch, ngunit pareho lang sila!) - Adafruit ultimate GPS breakout- MicroSD card breakout- Mga tool sa pag-solder (lahat ng kakailanganin mo para sa solder) - Universal Stripboard (Ginamit ko isang 5x7cm) - Mga Wires

Ang lahat ng mga bahagi ay medyo mura maliban sa module ng GPS. Iyon ay tungkol sa 30-40 dolyar at Ay ang pinakamahal na bahagi. Kahit na isang bagong hanay ng bakal na bakal ay maaaring mas mababa ang gastos.

Mayroon ding isang kalasag na Adafruit na may mga module ng GPS at SD card na magkasama. Kung nais mong gamitin ito, tandaan na ginawa para sa Arduino UNO, samakatuwid kakailanganin mo ng isang UNO at hindi isang Nano. Gayunpaman, walang pagkakaiba sa sketch.

Malayo pa tayo …

Hakbang 1: Pagkonekta sa Mga Bahagi

Kumokonekta na Mga Bahagi
Kumokonekta na Mga Bahagi
Kumokonekta na Mga Bahagi
Kumokonekta na Mga Bahagi
Kumokonekta na Mga Bahagi
Kumokonekta na Mga Bahagi
Kumokonekta na Mga Bahagi
Kumokonekta na Mga Bahagi

Kaya, pagkatapos mong makuha ang mga sangkap, kakailanganin mong ikonekta ang mga ito. Mahahanap mo rito ang mga nakakagulat na iskema na medyo malinaw. Gayunpaman, din sa kanya ang pinout:

Breakout ng MicroSD

5V -> 5VGND -> GnnCLK -> D13DO -> D12DI -> D11CS -> D4 (Kung gumagamit ka ng kalasag na binuo ito sa D10)

GPS breakout

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

Mga maliliit na tala tungkol sa modyul na iyon: Ang dalawang maliit na batang lalaki ay nakikipag-usap sa iba't ibang mga landas sa Arduino. Gumagamit ang GPS ng isang TTL Serial, ang parehong uri na ginagamit namin kapag nakikipag-usap kami sa Arduino sa pamamagitan ng Serial Monitor, na kung bakit kailangan naming ideklara sa pamamagitan ng isang library ang isang bagong serial (Tx at Rx) dahil nais ng GPS na gamitin ang 9600 bilang default, at kami gusto mo ring gamitin ito. Ang module ng GPS ay palaging at patuloy na streaming data, kung naka-plug. Ito ang nakakalito na bahagi upang harapin, sapagkat kung binabasa natin ang isang pangungusap at kaysa mailimbag ito, maaaring mawala sa atin ang susunod, kailangan din iyon. Dapat nating isaisip ito kapag nag-coding!

Nakikipag-usap ang MicroSD sa pamamagitan ng SPI (Serial Peripheral Interface), isa pang paraan upang makipag-usap sa board. Ang mga uri ng paggamit ng module na iyon ay laging CLK sa D13, DO sa D12 at DI sa D11. Minsan ang mga koneksyon na iyon ay may iba't ibang pangalan tulad ng CLK = SCK o SCLK (Serial Clock), DO = DOUT, SIMO, SDO, KAYA, MTSR (lahat ng mga nagpapahiwatig ng Master Output) at DI = SOMI, SDI, MISO, MRST (Master Input). Sa wakas mayroon kaming CS o SS na nagpapahiwatig ng pin kung saan ipinapadala namin ang nais naming isulat sa MicroSD. Kung nais mong gumamit ng dalawang magkakaibang mga module ng SPI, kakaiba mo lamang ang pin na ito upang magamit ang pareho. Halimbawa, ang LCD screen AT isang MicroSd tulad ng ginagamit namin. Dapat itong gumana din gamit ang dalawang magkakaibang mga LCD na konektado sa iba't ibang mga CS.

Maghinang ng bahaging ito sa board at handa ka nang i-upload ang sketch!

Tulad ng nakikita mo sa sketch, naghihinang ako ng ilang mga dupont na babaeng konektor sa halip na direktang sangkap, iyon ay dahil sa hinaharap baka gusto kong muling gamitin ang sangkap o baguhin ang isa.

Naghinang din ako ng module ng GPS na may mga konektor sa maling direksyon, iyon ang aking kasalanan at hindi ko ginusto, ngunit gumagana ito at hindi ko nais na ipagsapalaran upang masubukan itong subukang wasakin ang mga maliit na bastard na iyon! Maghinang lamang sa tamang paraan at magiging maayos ang lahat!

Narito ang ilang kapaki-pakinabang na video ng panghinang: Patnubay sa paghihinang para sa nagsisimula Isang video tungkol sa disyerto

Adafruit Youtube channel, maraming mga kagiliw-giliw na bagay doon!

Kapag naghinang ka, subukang gamitin lamang ang dami ng metal na kailangan mo, kung hindi man ay gagawa ka ng gulo. Huwag matakot na gawin ito, marahil ay magsimula sa isang bagay na hindi gaanong mahal, at kaysa mapanatili ang magkakaibang bagay. Ang tamang materyal ay gumagawa din ng pagkakaiba!

Hakbang 2: Ang Sketch

Una, syempre, ini-import namin ang silid-aklatan at itinatayo ang kanilang mga bagay upang gumana sa: SPI.h ay para makipag-usap sa mga module ng SPI, ang SD ay ang MicroSD library at ang Adafruit_GPS ay ang silid aklatan ng module ng GPS. Ang SoftwareSerial.h ay para sa paglikha ng isang serial port sa pamamagitan ng software. Ang syntax ay "mySerial (TxPin, RxPin);". Ang object ng GPS ay kailangang ituro sa isang serial (sa mga bracket). Narito ang mga link ng mga aklatan para sa breakout ng Adafruit GPS, ang breakout ng MicroSD (upang makagawa ng isang malinis na trabaho dapat mo ring i-format ang SD gamit ang software na ito mula sa SD associate) at ang Software Serial library (dapat itong isama sa IDE).

TANDAAN: Naharap ko ang ilang problema kapag sinusubukang idagdag ang maraming impormasyon sa isang file o gumagamit ng higit sa dalawang mga file sa sketch. Hindi ko na-format ang SD sa software na iyon, marahil ay maaaring malutas ang problema. Gayundin, sinubukan kong magdagdag ng isa pang sensor sa aparato, isang BMP280 (I2C module), nang walang anumang tagumpay. Tila tulad ng paggamit ng I2C module ay ginagawang mabaliw ang sketch! Na-aked ko na ang tungkol dito sa forum ng Adafruit, ngunit wala pa rin akong sagot.

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

Ngayon kailangan namin ang lahat ng aming mga variable: Ang dalawang mga string ay para sa pagbabasa ng dalawang mga pangungusap na kailangan namin upang makalkula ang isang grupo ng mga kapaki-pakinabang na impormasyon mula sa GPS. Ang char ay para sa stock ng mga pangungusap bago i-parse ang mga ito, ang float ay para makalkula ang mga coordinate sa degree (GPS magpadala ng mga coordinate sa paggamit sa mga degree at minuto, kailangan namin ito sa mga degree para hayaan ang basahin sa google Earth). Ang chipSelect ay ang pin kung saan isaksak namin ang CS ng MicroSD card. Sa kasong ito ay D4, ngunit kung gumagamit ka ng isang SD kalasag, kailangan mong ilagay ang D10 dito. Ang variable ng file ay ang mag-i-stock ng impormasyon ng file na ginagamit namin sa panahon ng sketch.

String NMEA1;

String NMEA2; char c; float deg; float degWhole; float degDec; int chipSelect = 4; I-file ang mySensorData;

Ngayon ay idinedeklara namin ang isang pagpapaandar ng mag-asawa upang gawing mas matikas at hindi gulo ang sketch:

Karaniwan ang ginagawa nila: nagbabasa ng mga pangungusap na NMEA. Ang clearGPS () ay hindi pinapansin ang tatlong mga pangungusap at ang readGPS () ay nai-save ang dalawa sa mga ito sa mga variable.

Tingnan natin kung paano: Kinokontrol ng isang habang loop kung may mga bagong pangungusap na NMEA sa module at binabasa ang stream ng GPS hanggang sa mayroong isa. Kapag ang isang bagong pangungusap ay naroroon, kami ay nasa labas ng habang loop, kung saan ang pangungusap ay talagang binasa, na-parse at naka-stock sa unang mga variable ng NMEA. Agad naming ginagawa ang pareho para sa susunod, dahil ang GPS ay patuloy na dumadaloy, hindi ito naghihintay na maging handa kami, wala kaming oras upang mai-print ito kaagad

Ito ay napakahalaga! Huwag gumawa ng anumang bagay bago ka mag-stock ng parehong mga pangungusap, kung hindi man ang pangalawa ay sa kalaunan ay masira o mali lamang.

Matapos kaming makakuha ng dalawang pangungusap, nai-print namin ang mga ito sa serial upang makontrol na magiging maayos.

walang bisa ang readGPS () {

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

Sa gayon, ngayong handa na tayong lahat, makalusot tayo sa pag-set up ():

Una: binuksan namin ang komunikasyon sa Serial 115200 para sa Arduino PC at sa 9600 para sa module ng GPS na Arduino. Pangalawa: nagpapadala kami ng tatlong mga utos sa module ng GPS: ang una ay isara ang pag-update ng antena, ang pangalawa ay para sa pagtatanong lamang ng RMC at GGA string (gagamitin lamang namin ang mga iyon, na mayroong lahat ng impormasyong kakailanganin mo mula sa isang GPS), ang pangatlo at huling utos ay upang itakda ang rate ng pag-update sa 1HZ, na iminungkahi ng Adafruit.

Pagkatapos nito ay itinakda namin ang pin na D10 sa OUTPUT, kung, at kung lamang, ang CS pin ng iyong SD modele ay iba sa D10. Kaagad pagkatapos, itakda ang CS sa SD module sa chipSelect pin.

Pinatakbo namin ang mga pagpapaandar na readGPS () na kasama ang cleanGPS ().

Ngayon ay oras na upang magsulat ng isang bagay sa mga file! Kung ang file ay nasa Sd card na, idagdag ang isang timestamp sa kanila. Sa ganitong paraan hindi namin kailangang subaybayan ang mga session o burahin ang mga file sa bawat oras. Sa isang timestamp na nakasulat sa loob ng pag-andar ng pag-setup, sigurado kaming magdagdag lamang ng isang paghihiwalay sa mga file nang isang beses bawat sesyon.

TANDAAN: Ang SD library ay medyo seryoso tungkol sa buksan at isara ang file sa bawat oras! Isaisip at isara ito tuwing oras! Upang malaman ang tungkol sa library sundin ang link na ito.

Ok, talagang handa kaming lahat upang makuha ang core ng stream-and-log na bahagi ng sketch.

walang bisa ang pag-setup () {

Serial.begin (115200); GPS.begin (9600); // Magpadala ng mga utos sa module ng GPS na GPS.sendCommand ("$ PGCMD, 33, 0 * 6D"); GPS.sendCommand (PMTK_SET_NMEA_OUTPUT_RMCGGA); GPS.sendCommand (PMTK_SET_NMEA_UPDATE_1HZ); pagkaantala (1000); // lamang kung ang CS pin ng iyong module ng SD ay wala sa pin D10

pinMode (10, OUTPUT);

SD.begin (chipSelect); readGPS (); kung (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.hour); mySensorData.print (":"); mySensorData.print (GPS.minute); mySensorData.print (":"); mySensorData.print (GPS.seconds); mySensorData.println ("***"); mySensorData.close (); } kung (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.hour); mySensorData.print (":"); mySensorData.print (GPS.minute); mySensorData.print (":"); mySensorData.print (GPS.seconds); mySensorData.println ("***"); mySensorData.close (); }}

Nakukuha na namin ang core ng sketch.

Ito ay sobrang simple, talaga.

Babasahin namin ang stream ng GPS na may function na readGPS (), kaysa makontrol namin kung mayroon kaming pag-aayos na katumbas ng 1, ibig sabihin ng sumbrero na nakakonekta tayo sa isang satellit e. Kung nakuha namin ito, isusulat namin ang aming mga infos sa mga file. Sa unang file na "NMEA.txt", isinusulat lamang namin ang mga hilaw na pangungusap. Sa pangalawang file, "GPDData.txt", ikinakabit namin ang mga coordinate (na-convert gamit ang mga pag-andar na nakita namin dati) at ang altitude. Ang mga impormasyong iyon ay sapat na upang makatipon ng isang.kml file upang lumikha ng isang landas sa Google Earth. Tandaan na isinasara namin ang mga file sa tuwing binubuksan namin ito upang sumulat ng isang bagay!

void loop () {

readGPS (); // Condizione if che controlla se l'antenna ha segnale. Se si, procede con la scrittura dei dati. kung (GPS.fix == 1) {// Mag-save lamang ng data kung mayroon kaming isang fix 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 file !!

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

// Converte e scrive la longitudine convLong (); mySensorData.print (deg, 4); // Scrive le coordinate in gradi sul file mySensorData.print (","); // Scrive una virgola per separare i dati Serial.print (deg); Serial.print (","); // Converte e scrive la latitudine convLati (); mySensorData.print (deg, 4); // Scrive le coordinate in gradi sul file mySensorData.print (","); // Scrive una virgola per separare i dati Serial.print (deg); Serial.print (","); // Scrive l'altitudine mySensorData.print (GPS.altitude); mySensorData.print (""); Serial.println (GPS.altitude); mySensorData.close (); }}

Ngayong tapos na kaming lahat, maaari mong i-upload ang sketch, buuin ang aparato at tangkilikin ito!

Tandaan na kailangan mong gamitin ito sa GPS borad na nakaharap sa kalangitan upang makakuha ng isang pag-aayos = 1, o maaari mong mai-plug dito ang isang panlabas na antena.

Gayundin, tandaan na kung may pag-aayos, ang pulang ilaw ay kumikislap bawat 15 segundo, kung hindi, mas mabilis (minsan bawat 2-3 segundo).

Kung nais mong malaman ang higit pa tungkol sa mga pangungusap ng NMEA, sundin lamang ang susunod na hakbang ng gabay na ito.

Hakbang 3: Ang Mga Pangungusap na NMEA at ang.kml File

Kumpleto ang aparato at ang sketch, gumagana silang mabuti. Tandaan na upang makakuha ng isang pag-aayos (upang magkaroon ng isang koneksyon sa mga satellite) ang breakout ay dapat harapin ang kalangitan.

Ang maliit na pulang ilaw ay kumikislap bawat 15 segundo kapag nakapag-ayos ka

Kung nais mong maunawaan nang mas mahusay ang mga pangungusap ng NMEA, maaari kang magbasa nang higit pa.

Sa sketch ay gumagamit lamang kami ng dalawang pangungusap, ang GGA at ang RMC. Ang mga ito ay isang pares lamang ng mga pangungusap na ang module ng GPS ay streaming.

Tingnan natin kung ano ang nasa string na iyon:

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

RMC = Inirekumendang Minimum na pangungusap C 123519 = Pag-ayos na kinuha sa 12:35:19 UTC A = Katayuan A = aktibo o V = Void 4807.038, N = Latitude 48 deg 07.038 'N 01131.000, E = Longhitud 11 deg 31.000' E 022.4 = Bilis sa lupa sa mga buhol 084.4 = Subaybayan ang anggulo sa degree na True 230394 = Petsa - ika-23 ng Marso 1994 003.1, W = Magnetic Variation * 6A = Ang data ng tsekum, laging nagsisimula sa *

$ 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 Fix taken at 12:35:19 UTC 4807.038, N Latitude 48 deg 07.038 'N 01131.000, E Longitude 11 deg 31.000' E 1 Fix quality: 0 = invalid; 1 = Pag-aayos ng GPS (SPS); 2 = Pag-ayos ng DGPS; 3 = ayusin ang PPS; 4 = Real Time Kinematic; 5 = Float RTK; 6 = tinatayang (patay na pag-isip) (2.3 tampok); 7 = Manu-manong mode ng pag-input; 8 = Simulation mode; 08 Bilang ng mga satellite na sinusubaybayan 0.9 Pahalang na dilution ng posisyon 545.4, M Altitude, Meters, sa itaas ang antas ng dagat 46.9, M Taas ng geoid (ibig sabihin antas ng dagat) sa itaas ng WGS84 ellipsoid (walang laman na patlang) oras sa segundo mula pa noong huling pag-update ng DGPS (walang laman na patlang) DGPS station ID number * 47 ang data ng tsekum, laging nagsisimula sa *

Tulad ng nakikita mo, marami pang impormasyon na kailangan mo doon. Gamit ang library ng Adafruit, maaari kang tumawag sa ilan sa mga ito, tulad ng GPS.latitude o GPS.lat (latitude at lat hemisphere), o GPS.day/month/year/hour/minute/seconds/milliseconds… Tingnan ang Adafruit website upang malaman ang higit pa. Ay hindi masyadong malinaw, ngunit ang pagsunod sa ilang mga pahiwatig sa gabay ng mga module ng GPS, maaari mong makita kung ano ang kailangan mo.

Ano ang magagawa natin sa mga file na nakuha natin? Madali: mag-ipon ng isang kml file upang magpakita ng isang landas sa Google Earth. Upang magawa ito, kopyahin lamang / lampas ang code na mahahanap mong sumusunod sa link na ito (sa ilalim ng Path ng talata), ilagay ang iyong mga coordinate mula sa GPDData.txt file sa pagitan ng mga tag, i-save ang file na may.kml extension at i-load ito Google Earth.

TANDAAN: Ang wika ng markup na.kml ay simple, kung alam mo na kung ano ang isang markup na wika, panatilihin ang iyong oras upang basahin ang nakaraang link at dokumentasyon sa loob, talagang interesante ito!

Ang paggamit ng kml ay tungkol sa alam ang mga tag at argumento nito. Natagpuan ko lamang ang gabay mula sa Google, ang na-link ko dati at ang mahalagang bahagi ay upang tukuyin ang istilo sa pagitan ng mga tag at tawagan ito ng # sign kapag oras na upang isulat ang mga coordinate.

Ang file na idinagdag ko sa seksyon na ito ay isang.kml kung saan maaari mo lamang i-paste ang iyong mga coordinate. tandaan na i-paste gamit ang syntax na ito: longitude, latitude, altitude

Inirerekumendang: