Mundarija:

Arduino GPS logger: 3 qadam
Arduino GPS logger: 3 qadam

Video: Arduino GPS logger: 3 qadam

Video: Arduino GPS logger: 3 qadam
Video: Arduino в космосе. Часть 3. Запускаем платы в стратосферу. С GPRS-шилдом, GPS-трекером и DS18b20 2024, Iyul
Anonim
Arduino GPS logger
Arduino GPS logger
Arduino GPS logger
Arduino GPS logger

Salom do'stlar, Men odamlarga har kuni bizda mavjud bo'lgan ko'p texnologiyalarni tushunishga imkon beradigan kichik loyihalar uchun juda hayajonlanaman.

Bu loyiha GPS -ning uzilishi va SD -ni qayd etish bilan bog'liq. Men bu narsalarni qurishda ko'p narsani o'rgandim.

Mavzularga chuqurroq kirish uchun men ushbu qo'llanmaga rioya qilgan holda ko'p narsalarni olaman va men bergan havolani bosib o'taman.

Xo'sh, bu nima? Oddiy: microSD -da pozitsiyalarni (balandlik bilan), tezlik va sana/vaqtni qayd qiladigan GPS -kuzatuvchi.

Sizga nima kerak bo'ladi:

- Arduino Nano (men eskizni tuzish uchun UNO-dan foydalandim, lekin ular bir xil!)- Adafruit-ning GPS-ning yakuniy buzilishi- MicroSD-kartaning buzilishi- Lehimlash asboblari (lehim uchun sizga kerak bo'lgan hamma narsa)- Universal stripboard (men ishlatganman) 5x7 sm)- simlar

Bu komponentlarning barchasi GPS modulidan tashqari ancha arzon. Bu taxminan 30-40 dollar va eng qimmat qismi. Hatto yangi lehimli temir to'plami ham arzonroq bo'lishi mumkin.

GPS va SD -karta modullari bilan birga Adafruit qalqoni ham mavjud. Agar siz undan foydalanmoqchi bo'lsangiz, Arduino UNO uchun yaratilganini unutmang, shuning uchun sizga nano emas, balki UNO kerak. Eskizda hech qanday farq yo'q.

Keling, yana boraylik …

1 -qadam: Komponentlarni ulash

Komponentlarni ulash
Komponentlarni ulash
Komponentlarni ulash
Komponentlarni ulash
Komponentlarni ulash
Komponentlarni ulash
Komponentlarni ulash
Komponentlarni ulash

Xo'sh, komponentlarni olganingizdan so'ng, ularni ulashingiz kerak bo'ladi. Bu erda siz juda aniq sxemalarni topishingiz mumkin. Biroq, bu erda pinout ham bor:

MicroSD buzilishi

5V -> 5VGND -> GnnCLK -> D13DO -> D12DI -> D11CS -> D4 (agar siz qalqondan foydalansangiz, bu D10 -da o'rnatilgan)

GPS buzilishi

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

Bu modul haqida kichik eslatmalar: Bu ikki kichkina bola Arduino bilan turli yo'llar bilan muloqot qilmoqda. GPS TTL Serial -dan foydalanadi, biz Arduino bilan Serial Monitor orqali bog'lanamiz, shuning uchun biz kutubxona orqali yangi seriyali (Tx va Rx) e'lon qilishimiz kerak, chunki GPS 9600 -ni sukut bo'yicha ishlatmoqchi. undan ham foydalanmoqchiman. GPS moduli, agar ulangan bo'lsa, har doim va doimo ma'lumotlarni uzatadi. Bu muammoning eng qiyin qismi, chunki agar biz jumlani o'qib, uni chop qilmasak, keyingisini yo'qotib qo'yishimiz mumkin. Kodlashda buni yodda tutishimiz kerak!

MicroSD karta bilan aloqa qilishning boshqa usuli - SPI (Serial Periferik Interface) orqali muloqot qiladi. Bunday modul har doim D13da CLK, D12da DO va D11da DI ni ishlatadi. Ba'zida bu ulanishlar boshqacha nomga ega: CLK = SCK yoki SCLK (Serial Clock), DO = DOUT, SIMO, SDO, SO, MTSR (barchasi Master Outputni ko'rsatadi) va DI = SOMI, SDI, MISO, MRST (Master Input). Oxir -oqibat bizda MicroSD -da yozmoqchi bo'lgan narsani yuboradigan PIN -kodni ko'rsatadigan CS yoki SS mavjud. Agar siz ikki xil SPI modulidan foydalanmoqchi bo'lsangiz, ikkalasini ham ishlatish uchun bu pinni farqlashingiz kifoya. Masalan, LCD displey va biz foydalanadigan MicroSd. Turli CS -larga ulangan ikki xil LCD displey yordamida ham ishlashi kerak.

Bu qismlarni taxtaga lehimlang va siz eskizni yuklashga tayyormiz!

Eskizda ko'rib turganingizdek, men to'g'ridan -to'g'ri komponent o'rniga bir nechta dupontli ayol konnektorlarini lehimlayman, chunki kelajakda men komponentni qayta ishlatishni yoki birini o'zgartirishni xohlayman.

Men ham GPS modulini ulagichlar bilan noto'g'ri yo'nalishda lehimladim, bu mening aybim edi va men xohlamadim, lekin u ishlaydi va men o'sha pichoqlarni qirib tashlashga urinib, uni sindirish xavfini xohlamayman! Faqat to'g'ri tarzda lehimlang va hammasi yaxshi bo'ladi!

Bu erda foydali lehim videosi: yangi boshlanuvchilar uchun lehim qo'llanmasiDoldurish haqida video

Adafruit Youtube kanali, u erda juda ko'p qiziqarli narsalar!

Lehimlashganda, kerakli miqdordagi metallni ishlatishga harakat qiling, aks holda siz tartibsizlikka uchraysiz. Buni qilishdan qo'rqmang, ehtimol unchalik qimmat bo'lmagan narsadan boshlang va har xil narsalarni lehimlang. To'g'ri material ham farq qiladi!

2 -qadam: eskiz

Birinchidan, albatta, biz kutubxonani import qilamiz va ular bilan ishlash uchun ob'ektlarini quramiz: SPI.h - SPI modullari bilan bog'lanish uchun, SD - MicroSD kutubxonasi va Adafruit_GPS - GPS moduli kutubxonasi. SoftwareSerial.h dasturiy ta'minot orqali ketma -ket port yaratish uchun mo'ljallangan. Sintaksis "mySerial (TxPin, RxPin);". GPS obyekti ketma -ket ko'rsatilishi kerak (qavs ichida). Bu erda kutubxonalarning Adafruit GPS -ning uzilishi, MicroSD -ning uzilishi (toza ishni bajarish uchun SD -ni SD -assotsiatsiyasining ushbu dasturi bilan formatlash kerak) va Dasturiy ta'minot seriyali kutubxonasi (u IDEga kiritilishi kerak).

QAYD: Ko'p ma'lumotni bitta faylga qo'shishga yoki eskizda ikkitadan ortiq fayllardan foydalanishga urinayotganda menda muammo yuzaga keldi. Men SD -ni ushbu dasturiy ta'minot bilan formatlamadim, ehtimol bu muammoni hal qilishi mumkin. Bundan tashqari, men qurilmaga BMP280 (I2C moduli) sensorini qo'shishga harakat qildim, lekin muvaffaqiyatsiz. I2C modulidan foydalanish eskizni aqldan ozdiradiganga o'xshaydi! Men bu haqda Adafruit forumida aytganman, lekin men hali ham javob olmadim.

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

Endi biz barcha o'zgaruvchilarga muhtojmiz: ikkita satr GPS -dan foydali ma'lumotlarni to'plash uchun kerak bo'lgan ikkita jumlani o'qish uchun. Belgilar jumlalarni tahlil qilishdan oldin yig'ish uchun mo'ljallangan, suzuvchilar koordinatalarni graduslar bo'yicha hisoblash uchun mo'ljallangan (GPS foydalanish koordinatalarini daraja va daqiqalarda yuboradi, biz ularni Google Earthda o'qish uchun daraja bo'yicha kerak). ChipSelect - bu MicroSD kartasining CS -ni ulaydigan pin. Bu holda D4, lekin agar siz SD qalqoni ishlatayotgan bo'lsangiz, D10 ni bu erga qo'yishingiz kerak bo'ladi. Fayl o'zgaruvchisi biz eskiz paytida biz foydalanayotgan fayl ma'lumotlarini saqlaydi.

NMEA1 qatori;

NMEA2 qatori; char v; float deg; float degWhole; float degDec; int chipSelect = 4; MySensorData faylini;

Endi biz eskizni yanada oqlangan va tartibsizroq qilish uchun ikkita funktsiyani e'lon qilamiz:

Ular ham xuddi shunday qilishadi: NMEA jumlalarini o'qish. clearGPS () uchta jumlani e'tiborsiz qoldiradi va readGPS () ikkitasini o'zgaruvchiga saqlaydi.

Keling, qanday qilib ko'raylik: modulda yangi NMEA jumlalari mavjudligini va GPS oqimi mavjud bo'lguncha o'qilishini vaqtinchalik halqa boshqaradi. Agar yangi jumla mavjud bo'lsa, biz vaqt oralig'idan chiqamiz, bu erda jumla o'qiladi, tahlil qilinadi va birinchi NMEA o'zgaruvchilarida to'planadi. Biz keyingi ish uchun ham xuddi shunday qilamiz, chunki GPS doimiy ravishda oqadi, bizni tayyor bo'lishimizni kutmaydi, uni darhol chop etishga vaqtimiz yo'q.

Bu juda muhim! Ikkala jumlani yig'ishdan oldin hech narsa qilmang, aks holda ikkinchisi oxir -oqibat buzilgan yoki noto'g'ri bo'ladi.

Ikkita jumlaga ega bo'lgandan so'ng, biz ularni ketma -ket chop etamiz, bu yaxshi ketayotganini nazorat qiladi.

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

Xo'sh, endi hamma tayyor, biz sozlash () orqali o'tishimiz mumkin:

Birinchisi: Arduino shaxsiy kompyuter uchun 115200 seriyali va Arduino GPS moduli uchun 9600. Ikkinchidan, biz GPS moduliga uchta buyruq yuboramiz: birinchisi - antennani yangilashni o'chirish, ikkinchisi - faqat RMC va GGA satrini so'rash uchun (biz faqat sizga kerak bo'lgan barcha ma'lumotlarga ega bo'lganlardan foydalanamiz. a GPS), uchinchi va oxirgi buyruq - Adafruit tomonidan tavsiya etilgan yangilanish tezligini 1 Gts ga o'rnatish.

Shundan so'ng, biz D10 pinini OUTPUT ga o'rnatdik, agar sizning SD -modulingizning CS -pinasi D10 -dan boshqacha bo'lsa. Darhol, chipni tanlash uchun SD -modulga CS -ni o'rnating.

Biz cleanGPS () ni o'z ichiga olgan readGPS () funktsiyalarini bajaramiz.

Endi fayllarga biror narsa yozish vaqti keldi! Agar fayl allaqachon Sd kartasida bo'lsa, ularga vaqt tamg'asini qo'shing. Shunday qilib, har safar sessiyalarni kuzatib borish yoki fayllarni o'chirish shart emas. O'rnatish funktsiyasida vaqt tamg'asi yozilgan bo'lsa, biz har seansda bir marta fayllarga ajratish qo'shamiz.

QAYD: SD kutubxonasi har safar faylni ochish va yopish masalasiga jiddiy qaraydi! Buni yodda saqlang va har safar yoping! Kutubxona haqida bilish uchun ushbu havolaga o'ting.

To'g'ri, biz hammamiz eskizning oqim va log qismining yadrosini olishga tayyormiz.

bo'sh o'rnatish () {

Serial.begin (115200); GPS.begin (9600); // GPS.sendCommand GPS moduliga buyruqlar yuborish ("$ PGCMD, 33, 0*6D"); GPS.sendCommand (PMTK_SET_NMEA_OUTPUT_RMCGGA); GPS.sendCommand (PMTK_SET_NMEA_UPDATE_1HZ); kechikish (1000); // faqat sizning SD modulingizning CS pin D10 pinida bo'lmasa

pinMod (10, OUTPUT);

SD.begin (chipSelect); o'qingGPS (); agar (SD.exists ("NMEA.txt"))) {mySensorData = SD.open ("NMEA.txt", FILE_WRITE); mySensorData.println (""); mySensorData.print ("***"); mySensorData.print (GPS.day); mySensorData.print ("."); mySensorData.print (GPS.oy); mySensorData.print ("."); mySensorData.print (GPS.yil); mySensorData.print (" -"); mySensorData.print (GPS.hour); mySensorData.print (":"); mySensorData.print (GPS.minute); mySensorData.print (":"); mySensorData.print (GPS.sekund); mySensorData.println ("***"); mySensorData.close (); } agar (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.oy); mySensorData.print ("."); mySensorData.print (GPS.yil); mySensorData.print (" -"); mySensorData.print (GPS.hour); mySensorData.print (":"); mySensorData.print (GPS.minute); mySensorData.print (":"); mySensorData.print (GPS.sekund); mySensorData.println ("***"); mySensorData.close (); }}

Endi biz eskizning asosiy qismini olamiz.

Bu juda oddiy, haqiqatan ham.

Biz GPS oqimini readGPS () funktsiyasi bilan o'qiymiz, lekin bizda 1 ga teng tuzatish bo'lsa, biz yo'ldosh bilan bog'langanligimizni bildiradi. Agar biz buni bilib olsak, biz ma'lumotni fayllarga yozamiz. "NMEA.txt" birinchi faylida biz faqat xom jumlalarni yozamiz. Ikkinchi faylda, "GPDData.txt", biz koordinatalarni (biz ko'rgan vazifalar bilan o'zgartirilgan) va balandlikni qo'shamiz. Bu ma'lumotlar Google Earthda yo'l yaratish uchun.kml faylini tuzish uchun etarli. E'tibor bering, biz har safar biror narsani yozish uchun fayllarni yopamiz!

void loop () {

o'qingGPS (); // Condizione, agar che controlla se l'antenna ha segnale. Bu, albatta, yozilgan. if (GPS.fix == 1) {// Ma'lumotni faqat bizda tuzatish bo'lsa saqlang mySensorData = SD.open ("NMEA.txt", FILE_WRITE); // NMEA uchun faylni ishga tushirish mySensorData.println (NMEA1); // MySensorData.println (NMEA2) faylini NMEA buyrug'i bilan skrive qiling; // MySensorData.close () ni NMEA -ga ajratib oling. // Chiude fayli !!

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

// Konvertatsiya qilish uzunlamasına convLong (); mySensorData.print (daraja, 4); // MySensorData.print (",") faylidagi koordinatalarni skrive qiling; // Skrive a virgola per separare i dati Serial.print (daraja); Serial.print (","); // Konvertatsiya qilish kenglikdagi convLati (); mySensorData.print (daraja, 4); // MySensorData.print (",") faylidagi koordinatani skrive qiling; // Skrive a virgola per separare i dati Serial.print (daraja); Serial.print (","); // Stsive l'altitudine mySensorData.print (GPS.altitude); mySensorData.print (""); Serial.println (GPS. balandligi); mySensorData.close (); }}

Hammasi tugagach, siz eskizni yuklashingiz, qurilmani yasashingiz va zavq olishingiz mumkin!

E'tibor bering, siz tuzatish = 1 ni olish uchun uni GPS borad bilan osmonga qaragan holda ishlatishingiz kerak yoki unga tashqi antennani ulashingiz mumkin.

Shuni ham yodda tutingki, agar tuzatish bo'lsa, qizil chiroq har 15 soniyada yonib-o'chib turadi, agar bo'lmasa, ancha tezroq (har 2-3 soniyada bir marta).

Agar siz NMEA jumlalari haqida ko'proq bilmoqchi bo'lsangiz, ushbu qo'llanmaning keyingi bosqichini bajaring.

3 -qadam: NMEA jumlalari va.kml fayli

Qurilma va eskiz to'liq, ular yaxshi ishlamoqda. Shuni yodda tutingki, tuzatish olish uchun (yo'ldoshlar bilan aloqa o'rnatish uchun) buzilish osmonga qarashi kerak.

Kichkina qizil chiroq har 15 soniyada yonib -o'chadi

Agar siz NMEA jumlalarini yaxshiroq tushunishni istasangiz, qo'shimcha o'qishingiz mumkin.

Eskizda biz faqat ikkita jumlani ishlatamiz, GGA va RMC. Bu GPS moduli uzatayotgan bir nechta jumlalar.

Keling, bu satrda nima borligini ko'rib chiqaylik:

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

RMC = Tavsiya etilgan minimal jumla C 123519 = 12:35:19 da tuzatilgan UTC A = Status A = faol yoki V = Bo'sh joy 4807.038, N = Kenglik 48 gradus 07.038 'N 01131.000, E = Uzunlik 11 daraja 31.000' E 022.4 = Tezlik tugunlarda er ustidan 084.4 = Kuzatuv burchagi gradusda 230394 = Sana - 1994 yil 23 mart 003.1, V = Magnit o'zgarishi *6A = Tekshirish yig'indisi ma'lumotlari har doim *bilan boshlanadi

$ 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 12:35:19 da olingan UTC 4807.038, N Latitude 48 deg 07.038 'N 01131.000, E Uzunlik 11 gradus 31.000' E 1 Tuzatish sifati: 0 = yaroqsiz; 1 = GPS tuzatish (SPS); 2 = DGPS tuzatish; 3 = PPS tuzatish; 4 = Haqiqiy vaqtda kinematik; 5 = Float RTK; 6 = taxminiy (o'lik hisob) (2.3 xususiyati); 7 = qo'lda kiritish rejimi; 8 = Simulyatsiya rejimi; 08 Kuzatilayotgan sun'iy yo'ldoshlar soni 0.9 545.4 pozitsiyasining gorizontal seyreltilishi, M balandligi, metr, o'rtacha dengiz sathidan 46.9, M WGS84 ellipsoididan (bo'sh maydon) geoid balandligi (bo'sh maydon) oxirgi DGPS yangilanishidan keyin (bo'sh maydon)) DGPS stantsiyasining identifikatsiya raqami *47 checksum ma'lumotlari har doim *bilan boshlanadi

Ko'rib turganingizdek, sizga kerak bo'lgan narsalar haqida ko'proq ma'lumot bor. Adafruit kutubxonasidan foydalanib, siz ulardan ba'zilariga qo'ng'iroq qilishingiz mumkin, masalan GPS.latitude yoki GPS.lat (kenglik va yarim shar) yoki GPS.day/month/year/hour/minute/seconds/milliseconds… Adafruit -ga qarang. ko'proq narsani bilish uchun veb -sayt. Bu aniq emas, lekin GPS modullari qo'llanmasidagi ba'zi maslahatlarga amal qilib, sizga kerakli narsani topa olasiz.

Bizda mavjud fayllar bilan nima qilishimiz mumkin? Oson: Google Earth -dagi yo'lni ko'rsatish uchun kml faylini tuzing. Buni amalga oshirish uchun ushbu havola orqali topiladigan kodni nusxa ko'chiring/qo'ying (yo'l paragrafi ostida), koordinatalaringizni GPDData.txt faylidan teglar orasiga qo'ying, faylni.kml kengaytmasi bilan saqlang va yuklang. Google Earth.

QAYD:.kml belgilash tili oddiy, agar siz belgilash tili nima ekanligini bilsangiz, oldingi havola va hujjatlarni ichidagi o'qish uchun vaqt ajrating, bu juda qiziq!

Kml -dan foydalanish uning teglari va argumentlarini bilishdir. Men faqat Google -dan ko'rsatma topdim, men ilgari bog'laganman va asosiy qismi - bu teglar orasidagi uslubni aniqlash va koordinatalarni yozish vaqti kelganida uni # belgisi bilan chaqirish.

Men bu bo'limga qo'shgan fayl.kml bo'lib, siz faqat koordinatalaringizni joylashtirishingiz mumkin. Ushbu sintaksisni joylashtirishni unutmang: uzunlik, kenglik, balandlik

Tavsiya: